Skip to content

Commit 56d66ac

Browse files
committed
Add webhook validation for GCP spot instances
1 parent 5b90003 commit 56d66ac

File tree

2 files changed

+32
-0
lines changed

2 files changed

+32
-0
lines changed

pkg/webhooks/machine_webhook.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1280,6 +1280,14 @@ func validateGCP(m *machinev1beta1.Machine, config *admissionConfig) (bool, []st
12801280
errs = append(errs, field.Invalid(field.NewPath("providerSpec", "restartPolicy"), providerSpec.RestartPolicy, fmt.Sprintf("restartPolicy must be either %s or %s.", machinev1beta1.RestartPolicyNever, machinev1beta1.RestartPolicyAlways)))
12811281
}
12821282

1283+
if providerSpec.ProvisioningModel != nil && *providerSpec.ProvisioningModel != machinev1beta1.GCPSpotInstance {
1284+
errs = append(errs, field.Invalid(field.NewPath("providerSpec", "provisioningModel"), *providerSpec.ProvisioningModel, fmt.Sprintf("provisioningModel must be %q or omit for standard provisioning", machinev1beta1.GCPSpotInstance)))
1285+
}
1286+
1287+
if providerSpec.Preemptible && providerSpec.ProvisioningModel != nil && *providerSpec.ProvisioningModel == machinev1beta1.GCPSpotInstance {
1288+
errs = append(errs, field.Forbidden(field.NewPath("providerSpec", "provisioningModel"), fmt.Sprintf("preemptible cannot be used together with %q provisioning model", machinev1beta1.GCPSpotInstance)))
1289+
}
1290+
12831291
if len(providerSpec.GPUs) != 0 || strings.HasPrefix(providerSpec.MachineType, "a2-") {
12841292
if providerSpec.OnHostMaintenance == machinev1beta1.MigrateHostMaintenanceType {
12851293
errs = append(errs, field.Forbidden(field.NewPath("providerSpec", "onHostMaintenance"), fmt.Sprintf("When GPUs are specified or using machineType with pre-attached GPUs(A2 machine family), onHostMaintenance must be set to %s.", machinev1beta1.TerminateHostMaintenanceType)))

pkg/webhooks/machine_webhook_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4130,6 +4130,30 @@ func TestValidateGCPProviderSpec(t *testing.T) {
41304130
expectedError: "",
41314131
expectedWarnings: []string{"providerSpec.value: Unsupported value: \"randomField-1\": Unknown field (randomField-1) will be ignored"},
41324132
},
4133+
{
4134+
testCase: "with valid provisioningModel Spot",
4135+
modifySpec: func(p *machinev1beta1.GCPMachineProviderSpec) {
4136+
p.ProvisioningModel = ptr.To(machinev1beta1.GCPSpotInstance)
4137+
},
4138+
expectedOk: true,
4139+
},
4140+
{
4141+
testCase: "with invalid provisioningModel",
4142+
modifySpec: func(p *machinev1beta1.GCPMachineProviderSpec) {
4143+
p.ProvisioningModel = ptr.To(machinev1beta1.GCPProvisioningModelType("InvalidModel"))
4144+
},
4145+
expectedOk: false,
4146+
expectedError: "providerSpec.provisioningModel: Invalid value: \"InvalidModel\": provisioningModel must be \"Spot\" or omit for standard provisioning",
4147+
},
4148+
{
4149+
testCase: "with both preemptible and provisioningModel Spot",
4150+
modifySpec: func(p *machinev1beta1.GCPMachineProviderSpec) {
4151+
p.Preemptible = true
4152+
p.ProvisioningModel = ptr.To(machinev1beta1.GCPSpotInstance)
4153+
},
4154+
expectedOk: false,
4155+
expectedError: "providerSpec.provisioningModel: Forbidden: preemptible cannot be used together with \"Spot\" provisioning model",
4156+
},
41334157
}
41344158

41354159
secret := &corev1.Secret{

0 commit comments

Comments
 (0)