Skip to content

Commit 7f1afbd

Browse files
Don't check if trial's metadata is in spec.parameters (#1848)
* do not check trial parameter in experiment parameters if it's trial's metadata * revert unnecessary change * add handle Labels[label] and Annotations[annotation] * fix test description
1 parent bc5b82b commit 7f1afbd

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed

pkg/controller.v1beta1/consts/const.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,4 +179,14 @@ var (
179179
DefaultKatibDBManagerServiceIP = env.GetEnvOrDefault(DefaultKatibDBManagerServiceIPEnvName, "katib-db-manager")
180180
// DefaultKatibDBManagerServicePort is the default Port of Katib DB Manager
181181
DefaultKatibDBManagerServicePort = env.GetEnvOrDefault(DefaultKatibDBManagerServicePortEnvName, "6789")
182+
183+
// List of all valid keys of trial metadata for substitution in Trial template
184+
TrialTemplateMetaKeys = []string{
185+
TrialTemplateMetaKeyOfName,
186+
TrialTemplateMetaKeyOfNamespace,
187+
TrialTemplateMetaKeyOfKind,
188+
TrialTemplateMetaKeyOfAPIVersion,
189+
TrialTemplateMetaKeyOfAnnotations,
190+
TrialTemplateMetaKeyOfLabels,
191+
}
182192
)

pkg/webhook/v1beta1/experiment/validator/validator.go

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -311,8 +311,10 @@ func (g *DefaultValidator) validateTrialTemplate(instance *experimentsv1beta1.Ex
311311

312312
// Check if parameter reference exist in experiment parameters
313313
if len(experimentParameterNames) > 0 {
314-
if _, ok := experimentParameterNames[parameter.Reference]; !ok {
315-
return fmt.Errorf("parameter reference %v does not exist in spec.parameters: %v", parameter.Reference, instance.Spec.Parameters)
314+
if !isMetaKey(parameter.Reference) {
315+
if _, ok := experimentParameterNames[parameter.Reference]; !ok {
316+
return fmt.Errorf("parameter reference %v does not exist in spec.parameters: %v", parameter.Reference, instance.Spec.Parameters)
317+
}
316318
}
317319
}
318320

@@ -481,3 +483,31 @@ func (g *DefaultValidator) validateMetricsCollector(inst *experimentsv1beta1.Exp
481483

482484
return nil
483485
}
486+
487+
func isMetaKey(parameter string) bool {
488+
// Check if parameter is trial metadata reference as ${trailSpec.Name}, ${trialSpec.Labels[label]}, etc. used for substitution
489+
match := regexp.MustCompile(consts.TrialTemplateMetaReplaceFormatRegex).FindStringSubmatch(parameter)
490+
isMeta := false
491+
if len(match) > 0 {
492+
matchedKey := match[1]
493+
if contains(consts.TrialTemplateMetaKeys, matchedKey) {
494+
isMeta = true
495+
} else {
496+
// Check if it's Labels[label] or Annotations[annotation]
497+
subMatch := regexp.MustCompile(consts.TrialTemplateMetaParseFormatRegex).FindStringSubmatch(matchedKey)
498+
if len(subMatch) == 3 && contains(consts.TrialTemplateMetaKeys, subMatch[1]) {
499+
isMeta = true
500+
}
501+
}
502+
}
503+
return isMeta
504+
}
505+
506+
func contains(slice []string, item string) bool {
507+
for _, s := range slice {
508+
if s == item {
509+
return true
510+
}
511+
}
512+
return false
513+
}

pkg/webhook/v1beta1/experiment/validator/validator_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,9 @@ spec:
415415
validTemplate4 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
416416
validTemplate5 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
417417
validTemplate6 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
418+
validTemplate7 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
419+
validTemplate8 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
420+
validTemplate9 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
418421

419422
missedParameterTemplate := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(missedParameterJobStr, nil)
420423
oddParameterTemplate := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(oddParameterJobStr, nil)
@@ -431,6 +434,9 @@ spec:
431434
validTemplate4,
432435
validTemplate5,
433436
validTemplate6,
437+
validTemplate7,
438+
validTemplate8,
439+
validTemplate9,
434440
missedParameterTemplate,
435441
oddParameterTemplate,
436442
invalidParameterTemplate,
@@ -570,6 +576,34 @@ spec:
570576
Err: false,
571577
testDescription: "Trial template contains Trial parameters when spec.parameters is empty",
572578
},
579+
// Trial template contains Trial metadata parameter substitution
580+
{
581+
Instance: func() *experimentsv1beta1.Experiment {
582+
i := newFakeInstance()
583+
i.Spec.TrialTemplate.TrialParameters[1].Reference = "${trialSpec.Name}"
584+
return i
585+
}(),
586+
Err: false,
587+
testDescription: "Trial template contains Trial metadata reference as parameter",
588+
},
589+
{
590+
Instance: func() *experimentsv1beta1.Experiment {
591+
i := newFakeInstance()
592+
i.Spec.TrialTemplate.TrialParameters[1].Reference = "${trialSpec.Annotations[test-annotation]}"
593+
return i
594+
}(),
595+
Err: false,
596+
testDescription: "Trial template contains Trial annotation reference as parameter",
597+
},
598+
{
599+
Instance: func() *experimentsv1beta1.Experiment {
600+
i := newFakeInstance()
601+
i.Spec.TrialTemplate.TrialParameters[1].Reference = "${trialSpec.Labels[test-label]}"
602+
return i
603+
}(),
604+
Err: false,
605+
testDescription: "Trial template contains Trial's label reference as parameter",
606+
},
573607
// Trial Template doesn't contain parameter from trialParameters
574608
// missedParameterTemplate case
575609
{

0 commit comments

Comments
 (0)