Skip to content

Commit b4506f8

Browse files
authored
Merge pull request #4656 from giantswarm/validate-spot-mixed-instances
✨ Prevent users setting values that are invalid configuration on AWS
2 parents a1b6f35 + 99ddc99 commit b4506f8

File tree

2 files changed

+44
-0
lines changed

2 files changed

+44
-0
lines changed

exp/api/v1beta2/awsmachinepool_webhook.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,13 @@ func (r *AWSMachinePool) validateAdditionalSecurityGroups() field.ErrorList {
108108
}
109109
return allErrs
110110
}
111+
func (r *AWSMachinePool) validateSpotInstances() field.ErrorList {
112+
var allErrs field.ErrorList
113+
if r.Spec.AWSLaunchTemplate.SpotMarketOptions != nil && r.Spec.MixedInstancesPolicy != nil {
114+
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec.awsLaunchTemplate.spotMarketOptions"), "either spec.awsLaunchTemplate.spotMarketOptions or spec.mixedInstancesPolicy should be used"))
115+
}
116+
return allErrs
117+
}
111118

112119
// ValidateCreate will do any extra validation when creating a AWSMachinePool.
113120
func (r *AWSMachinePool) ValidateCreate() (admission.Warnings, error) {
@@ -120,6 +127,7 @@ func (r *AWSMachinePool) ValidateCreate() (admission.Warnings, error) {
120127
allErrs = append(allErrs, r.Spec.AdditionalTags.Validate()...)
121128
allErrs = append(allErrs, r.validateSubnets()...)
122129
allErrs = append(allErrs, r.validateAdditionalSecurityGroups()...)
130+
allErrs = append(allErrs, r.validateSpotInstances()...)
123131

124132
if len(allErrs) == 0 {
125133
return nil, nil
@@ -140,6 +148,7 @@ func (r *AWSMachinePool) ValidateUpdate(old runtime.Object) (admission.Warnings,
140148
allErrs = append(allErrs, r.Spec.AdditionalTags.Validate()...)
141149
allErrs = append(allErrs, r.validateSubnets()...)
142150
allErrs = append(allErrs, r.validateAdditionalSecurityGroups()...)
151+
allErrs = append(allErrs, r.validateSpotInstances()...)
143152

144153
if len(allErrs) == 0 {
145154
return nil, nil

exp/api/v1beta2/awsmachinepool_webhook_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,20 @@ func TestAWSMachinePoolValidateCreate(t *testing.T) {
139139
},
140140
wantErr: false,
141141
},
142+
{
143+
name: "Should fail if both spot market options or mixed instances policy are set",
144+
pool: &AWSMachinePool{
145+
Spec: AWSMachinePoolSpec{
146+
MixedInstancesPolicy: &MixedInstancesPolicy{
147+
Overrides: []Overrides{{InstanceType: "t3.medium"}},
148+
},
149+
AWSLaunchTemplate: AWSLaunchTemplate{
150+
SpotMarketOptions: &infrav1.SpotMarketOptions{MaxPrice: aws.String("0.1")},
151+
},
152+
},
153+
},
154+
wantErr: true,
155+
},
142156
}
143157
for _, tt := range tests {
144158
t.Run(tt.name, func(t *testing.T) {
@@ -252,6 +266,27 @@ func TestAWSMachinePoolValidateUpdate(t *testing.T) {
252266
},
253267
wantErr: false,
254268
},
269+
{
270+
name: "Should fail update if both spec.awsLaunchTemplate.SpotMarketOptions and spec.MixedInstancesPolicy are passed in AWSMachinePool spec",
271+
old: &AWSMachinePool{
272+
Spec: AWSMachinePoolSpec{
273+
MixedInstancesPolicy: &MixedInstancesPolicy{
274+
Overrides: []Overrides{{InstanceType: "t3.medium"}},
275+
},
276+
},
277+
},
278+
new: &AWSMachinePool{
279+
Spec: AWSMachinePoolSpec{
280+
MixedInstancesPolicy: &MixedInstancesPolicy{
281+
Overrides: []Overrides{{InstanceType: "t3.medium"}},
282+
},
283+
AWSLaunchTemplate: AWSLaunchTemplate{
284+
SpotMarketOptions: &infrav1.SpotMarketOptions{MaxPrice: pointer.String("0.1")},
285+
},
286+
},
287+
},
288+
wantErr: true,
289+
},
255290
}
256291
for _, tt := range tests {
257292
t.Run(tt.name, func(t *testing.T) {

0 commit comments

Comments
 (0)