Skip to content

Commit 2fab372

Browse files
committed
webhook to validate marketType field
1 parent 57f828a commit 2fab372

File tree

2 files changed

+70
-0
lines changed

2 files changed

+70
-0
lines changed

pkg/webhooks/machine_webhook.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,10 @@ func validateAWS(m *machinev1beta1.Machine, config *admissionConfig) (bool, []st
788788
}
789789
}
790790

791+
if providerSpec.MarketType == "" && providerSpec.SpotMarketOptions != nil && providerSpec.CapacityReservationID != "" {
792+
errs = append(errs, field.Invalid(field.NewPath("providerSpec", "capacityReservationId"), providerSpec.CapacityReservationID, "spotMarketOptions and capacityReservationID may not be used together"))
793+
}
794+
791795
// TODO(alberto): Validate providerSpec.BlockDevices.
792796
// https://github.com/openshift/cluster-api-provider-aws/pull/299#discussion_r433920532
793797

@@ -2429,5 +2433,13 @@ func validateAWSInstanceMarketType(providerSpec *machinev1beta1.AWSMachineProvid
24292433
if providerSpec.MarketType == machinev1beta1.MarketTypeCapacityBlock && len(providerSpec.CapacityReservationID) == 0 {
24302434
return errors.New("capacityReservationID is required when CapacityBlock is provided")
24312435
}
2436+
if providerSpec.MarketType == machinev1beta1.MarketTypeSpot && providerSpec.CapacityReservationID != "" {
2437+
return errors.New("invalid marketType: marketType set to Spot and capacityReservationID may not be used together")
2438+
}
2439+
switch providerSpec.MarketType {
2440+
case "", machinev1beta1.MarketTypeOnDemand, machinev1beta1.MarketTypeSpot, machinev1beta1.MarketTypeCapacityBlock:
2441+
default:
2442+
return fmt.Errorf("invalid marketType: %s valid values are: %s, %s, %s and omitted", providerSpec.MarketType, machinev1beta1.MarketTypeOnDemand, machinev1beta1.MarketTypeSpot, machinev1beta1.MarketTypeCapacityBlock)
2443+
}
24322444
return nil
24332445
}

pkg/webhooks/machine_webhook_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,64 @@ func TestMachineCreation(t *testing.T) {
198198
},
199199
expectedError: "admission webhook \"validation.machine.machine.openshift.io\" denied the request: providerSpec.capacityReservationId: Invalid value: \"cr-123\": invalid value for capacityReservationId: \"cr-123\", it must start with 'cr-' and be exactly 20 characters long with 17 hexadecimal characters",
200200
},
201+
{
202+
name: "with invalid MarketType provided",
203+
platformType: osconfigv1.AWSPlatformType,
204+
clusterID: "aws-cluster",
205+
providerSpecValue: &kruntime.RawExtension{
206+
Object: &machinev1beta1.AWSMachineProviderConfig{
207+
AMI: machinev1beta1.AWSResourceReference{
208+
ID: ptr.To[string]("ami"),
209+
},
210+
MarketType: "invalid",
211+
},
212+
},
213+
expectedError: fmt.Sprintf("invalid marketType: invalid valid values are: %s, %s, %s and omitted", machinev1beta1.MarketTypeOnDemand, machinev1beta1.MarketTypeSpot, machinev1beta1.MarketTypeCapacityBlock),
214+
},
215+
{
216+
name: "with MarketType empty value provided",
217+
platformType: osconfigv1.AWSPlatformType,
218+
clusterID: "aws-cluster",
219+
providerSpecValue: &kruntime.RawExtension{
220+
Object: &machinev1beta1.AWSMachineProviderConfig{
221+
AMI: machinev1beta1.AWSResourceReference{
222+
ID: ptr.To[string]("ami"),
223+
},
224+
MarketType: "",
225+
},
226+
},
227+
expectedError: "",
228+
},
229+
{
230+
name: "with MarketType Spot and CapacityReservationID value provided",
231+
platformType: osconfigv1.AWSPlatformType,
232+
clusterID: "aws-cluster",
233+
providerSpecValue: &kruntime.RawExtension{
234+
Object: &machinev1beta1.AWSMachineProviderConfig{
235+
AMI: machinev1beta1.AWSResourceReference{
236+
ID: ptr.To[string]("ami"),
237+
},
238+
MarketType: machinev1beta1.MarketTypeSpot,
239+
CapacityReservationID: "cr-12345678901234567",
240+
},
241+
},
242+
expectedError: "invalid marketType: marketType set to Spot and capacityReservationID may not be used together",
243+
},
244+
{
245+
name: "with CapacityReservationID and SpotMarketOptions are provided",
246+
platformType: osconfigv1.AWSPlatformType,
247+
clusterID: "aws-cluster",
248+
providerSpecValue: &kruntime.RawExtension{
249+
Object: &machinev1beta1.AWSMachineProviderConfig{
250+
AMI: machinev1beta1.AWSResourceReference{
251+
ID: ptr.To[string]("ami"),
252+
},
253+
SpotMarketOptions: &machinev1beta1.SpotMarketOptions{},
254+
CapacityReservationID: "cr-12345678901234567",
255+
},
256+
},
257+
expectedError: "spotMarketOptions and capacityReservationID may not be used together",
258+
},
201259
{
202260
name: "with MarketType set to MarketTypeCapacityBlock and spotMarketOptions are specified",
203261
platformType: osconfigv1.AWSPlatformType,

0 commit comments

Comments
 (0)