Skip to content

Commit 6713b34

Browse files
Merge pull request #3 from mesosphere/dont-check-trial-metadata-in-spec-parameters
Fix: Handle "Annotations" and "Labels" trial's metadata references
2 parents 99ce98f + 72db2a5 commit 6713b34

File tree

2 files changed

+42
-4
lines changed

2 files changed

+42
-4
lines changed

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

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

312312
// Check if parameter reference exist in experiment parameters
313313
if len(experimentParameterNames) > 0 {
314-
// Check if parameter is trial metadata
315-
regex := regexp.MustCompile(consts.TrialTemplateMetaReplaceFormatRegex)
316-
match := regex.FindStringSubmatch(parameter.Reference)
317-
if !(len(match) > 0 && contains(consts.TrialTemplateMetaKeys, match[1])) {
314+
if !isMetaKey(parameter.Reference) {
318315
if _, ok := experimentParameterNames[parameter.Reference]; !ok {
319316
return fmt.Errorf("parameter reference %v does not exist in spec.parameters: %v", parameter.Reference, instance.Spec.Parameters)
320317
}
@@ -487,6 +484,25 @@ func (g *DefaultValidator) validateMetricsCollector(inst *experimentsv1beta1.Exp
487484
return nil
488485
}
489486

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+
490506
func contains(slice []string, item string) bool {
491507
for _, s := range slice {
492508
if s == item {

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,8 @@ spec:
416416
validTemplate5 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
417417
validTemplate6 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
418418
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)
419421

420422
missedParameterTemplate := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(missedParameterJobStr, nil)
421423
oddParameterTemplate := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(oddParameterJobStr, nil)
@@ -433,6 +435,8 @@ spec:
433435
validTemplate5,
434436
validTemplate6,
435437
validTemplate7,
438+
validTemplate8,
439+
validTemplate9,
436440
missedParameterTemplate,
437441
oddParameterTemplate,
438442
invalidParameterTemplate,
@@ -582,6 +586,24 @@ spec:
582586
Err: false,
583587
testDescription: "Trial template contains Trial metadata reference as parameter",
584588
},
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+
},
585607
// Trial Template doesn't contain parameter from trialParameters
586608
// missedParameterTemplate case
587609
{

0 commit comments

Comments
 (0)