Skip to content

Commit cffab07

Browse files
authored
fix: check if parameter references exist in experiment parameters (#1726)
* fix: check if parameter references exist in experiment parameters * Fix validator test * Update some comments and test descriptions * Check trial parameter reference only when experiment parameters are not empty * Add a test for the case 'spec.parameters' is mepty
1 parent 16e0574 commit cffab07

File tree

2 files changed

+39
-0
lines changed

2 files changed

+39
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,11 @@ func (g *DefaultValidator) validateTrialTemplate(instance *experimentsv1beta1.Ex
265265
return fmt.Errorf("unable to parse spec.trialTemplate: %v", err)
266266
}
267267

268+
experimentParameterNames := make(map[string]bool)
269+
for _, parameter := range instance.Spec.Parameters {
270+
experimentParameterNames[parameter.Name] = true
271+
}
272+
268273
trialParametersNames := make(map[string]bool)
269274
trialParametersRefs := make(map[string]bool)
270275

@@ -286,6 +291,13 @@ func (g *DefaultValidator) validateTrialTemplate(instance *experimentsv1beta1.Ex
286291
trialParametersNames[parameter.Name] = true
287292
trialParametersRefs[parameter.Reference] = true
288293

294+
// Check if parameter reference exist in experiment parameters
295+
if len(experimentParameterNames) > 0 {
296+
if _, ok := experimentParameterNames[parameter.Reference]; !ok {
297+
return fmt.Errorf("parameter reference %v does not exist in spec.parameters: %v", parameter.Reference, instance.Spec.Parameters)
298+
}
299+
}
300+
289301
// Check if trialParameters contains all substitution for Trial template
290302
if !strings.Contains(trialTemplateStr, fmt.Sprintf(consts.TrialTemplateParamReplaceFormat, parameter.Name)) {
291303
return fmt.Errorf("parameter name: %v in spec.trialParameters not found in spec.trialTemplate: %v", parameter.Name, trialTemplateStr)

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,8 @@ spec:
392392
validTemplate2 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
393393
validTemplate3 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
394394
validTemplate4 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
395+
validTemplate5 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
396+
validTemplate6 := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(validJobStr, nil)
395397

396398
missedParameterTemplate := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(missedParameterJobStr, nil)
397399
oddParameterTemplate := p.EXPECT().GetTrialTemplate(gomock.Any()).Return(oddParameterJobStr, nil)
@@ -406,6 +408,8 @@ spec:
406408
validTemplate2,
407409
validTemplate3,
408410
validTemplate4,
411+
validTemplate5,
412+
validTemplate6,
409413
missedParameterTemplate,
410414
oddParameterTemplate,
411415
invalidParameterTemplate,
@@ -524,6 +528,27 @@ spec:
524528
Err: true,
525529
testDescription: "Duplicate reference in Trial parameters",
526530
},
531+
// Trial template contains Trial parameters which weren't referenced from spec.parameters
532+
{
533+
Instance: func() *experimentsv1beta1.Experiment {
534+
i := newFakeInstance()
535+
i.Spec.TrialTemplate.TrialParameters[1].Reference = "wrong-ref"
536+
return i
537+
}(),
538+
Err: true,
539+
testDescription: "Trial template contains Trial parameters which weren't referenced from spec.parameters",
540+
},
541+
// Trial template contains Trial parameters when spec.parameters is empty
542+
{
543+
Instance: func() *experimentsv1beta1.Experiment {
544+
i := newFakeInstance()
545+
i.Spec.Parameters = nil
546+
i.Spec.TrialTemplate.TrialParameters[1].Reference = "wrong-ref"
547+
return i
548+
}(),
549+
Err: false,
550+
testDescription: "Trial template contains Trial parameters when spec.parameters is empty",
551+
},
527552
// Trial Template doesn't contain parameter from trialParameters
528553
// missedParameterTemplate case
529554
{
@@ -1019,13 +1044,15 @@ func newFakeInstance() *experimentsv1beta1.Experiment {
10191044
},
10201045
Parameters: []experimentsv1beta1.ParameterSpec{
10211046
{
1047+
Name: "lr",
10221048
ParameterType: experimentsv1beta1.ParameterTypeInt,
10231049
FeasibleSpace: experimentsv1beta1.FeasibleSpace{
10241050
Max: "5",
10251051
Min: "1",
10261052
},
10271053
},
10281054
{
1055+
Name: "num-layers",
10291056
ParameterType: experimentsv1beta1.ParameterTypeCategorical,
10301057
FeasibleSpace: experimentsv1beta1.FeasibleSpace{
10311058
List: []string{"1", "2", "3"},

0 commit comments

Comments
 (0)