Skip to content

Commit c6b86e4

Browse files
Merge pull request #1339 from athiruma/fix/market-type-webhook
OCPBUGS-52464: webhook to validate marketType field
2 parents e4bd10f + 2fab372 commit c6b86e4

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
@@ -790,6 +790,10 @@ func validateAWS(m *machinev1beta1.Machine, config *admissionConfig) (bool, []st
790790
}
791791
}
792792

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

@@ -2445,5 +2449,13 @@ func validateAWSInstanceMarketType(providerSpec *machinev1beta1.AWSMachineProvid
24452449
if providerSpec.MarketType == machinev1beta1.MarketTypeCapacityBlock && len(providerSpec.CapacityReservationID) == 0 {
24462450
return errors.New("capacityReservationID is required when CapacityBlock is provided")
24472451
}
2452+
if providerSpec.MarketType == machinev1beta1.MarketTypeSpot && providerSpec.CapacityReservationID != "" {
2453+
return errors.New("invalid marketType: marketType set to Spot and capacityReservationID may not be used together")
2454+
}
2455+
switch providerSpec.MarketType {
2456+
case "", machinev1beta1.MarketTypeOnDemand, machinev1beta1.MarketTypeSpot, machinev1beta1.MarketTypeCapacityBlock:
2457+
default:
2458+
return fmt.Errorf("invalid marketType: %s valid values are: %s, %s, %s and omitted", providerSpec.MarketType, machinev1beta1.MarketTypeOnDemand, machinev1beta1.MarketTypeSpot, machinev1beta1.MarketTypeCapacityBlock)
2459+
}
24482460
return nil
24492461
}

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)