Skip to content

Commit 2501df3

Browse files
committed
Added vSphere provisioning mode support to data disks
1 parent 801f2ab commit 2501df3

File tree

3 files changed

+79
-8
lines changed

3 files changed

+79
-8
lines changed

pkg/controller/vsphere/reconciler.go

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,18 +1245,34 @@ func createDataDisks(s *machineScope, devices object.VirtualDeviceList) ([]types
12451245
for i, dataDisk := range s.providerSpec.DataDisks {
12461246
klog.V(2).InfoS("Adding disk", "name", dataDisk.Name, "spec", dataDisk)
12471247

1248+
backing := &types.VirtualDiskFlatVer2BackingInfo{
1249+
DiskMode: string(types.VirtualDiskModePersistent),
1250+
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
1251+
FileName: "",
1252+
},
1253+
}
1254+
1255+
// Set provisioning type for the new data disk.
1256+
// Currently, if ThinProvisioned is not set, GOVC will set default to false. We may want to change this behavior
1257+
// to match what template image OS disk has configured to make them match if not set.
1258+
switch dataDisk.ProvisioningMode {
1259+
case machinev1.ProvisioningModeThin:
1260+
backing.ThinProvisioned = types.NewBool(true)
1261+
case machinev1.ProvisioningModeThick:
1262+
backing.ThinProvisioned = types.NewBool(false)
1263+
case machinev1.ProvisioningModeEagerlyZeroed:
1264+
backing.ThinProvisioned = types.NewBool(false)
1265+
backing.EagerlyScrub = types.NewBool(true)
1266+
default:
1267+
klog.V(2).Infof("No provisioning type detected. Leaving configuration empty.")
1268+
}
1269+
12481270
dev := &types.VirtualDisk{
12491271
VirtualDevice: types.VirtualDevice{
12501272
// Key needs to be unique and cannot match another new disk being added. So we'll use the index as an
12511273
// input to NewKey. NewKey() will always return same value since our new devices are not part of devices yet.
1252-
Key: devices.NewKey() - int32(i),
1253-
Backing: &types.VirtualDiskFlatVer2BackingInfo{
1254-
DiskMode: string(types.VirtualDiskModePersistent),
1255-
ThinProvisioned: types.NewBool(true),
1256-
VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{
1257-
FileName: "",
1258-
},
1259-
},
1274+
Key: devices.NewKey() - int32(i),
1275+
Backing: backing,
12601276
ControllerKey: controller.GetVirtualController().Key,
12611277
},
12621278
CapacityInKB: int64(dataDisk.SizeGiB) * 1024 * 1024,

pkg/webhooks/machine_webhook.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,13 @@ var (
131131

132132
// vSphereDataDiskNamePattern is used to validate the name of a data disk
133133
vSphereDataDiskNamePattern = regexp.MustCompile(`^[a-zA-Z0-9]([-_a-zA-Z0-9]*[a-zA-Z0-9])?$`)
134+
135+
// validProvisioningModes lists all valid data disk provisioning modes
136+
validProvisioningModes = []machinev1beta1.ProvisioningMode{
137+
machinev1beta1.ProvisioningModeThin,
138+
machinev1beta1.ProvisioningModeThick,
139+
machinev1beta1.ProvisioningModeEagerlyZeroed,
140+
}
134141
)
135142

136143
const (
@@ -1569,6 +1576,17 @@ func validateVSphereDataDisks(dataDisks []machinev1beta1.VSphereDisk) field.Erro
15691576
if disk.SizeGiB > maxVSphereDataDiskSize {
15701577
errs = append(errs, field.Invalid(diskPath.Child("sizeGiB"), disk.SizeGiB, fmt.Sprintf("data disk size (GiB) must not exceed %d", maxVSphereDataDiskSize)))
15711578
}
1579+
1580+
// Validate provisioning modes
1581+
if len(disk.ProvisioningMode) > 0 {
1582+
validModesSet := sets.NewString()
1583+
for _, m := range validProvisioningModes {
1584+
validModesSet.Insert(string(m))
1585+
}
1586+
if !validModesSet.Has(string(disk.ProvisioningMode)) {
1587+
errs = append(errs, field.NotSupported(diskPath, disk.ProvisioningMode, validModesSet.List()))
1588+
}
1589+
}
15721590
}
15731591

15741592
return errs

pkg/webhooks/machine_webhook_test.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4432,6 +4432,43 @@ func TestValidateVSphereProviderSpec(t *testing.T) {
44324432
}(),
44334433
expectedError: "providerSpec.disks[0].name: Invalid value: \"Bad #Name\": data disk name must consist only of alphanumeric characters, hyphens and underscores, and must start and end with an alphanumeric character.",
44344434
},
4435+
{
4436+
testCase: "with data disk configured with provisioning mode",
4437+
modifySpec: func(p *machinev1beta1.VSphereMachineProviderSpec) {
4438+
p.DataDisks = []machinev1beta1.VSphereDisk{
4439+
{
4440+
Name: "Disk1",
4441+
SizeGiB: 10,
4442+
ProvisioningMode: machinev1beta1.ProvisioningModeThin,
4443+
},
4444+
}
4445+
},
4446+
expectedOk: true,
4447+
featureGatesEnabled: func() map[string]bool {
4448+
fg := make(map[string]bool)
4449+
fg[string(features.FeatureGateVSphereMultiDisk)] = true
4450+
return fg
4451+
}(),
4452+
},
4453+
{
4454+
testCase: "with data disk configured with invalid provisioning mode",
4455+
modifySpec: func(p *machinev1beta1.VSphereMachineProviderSpec) {
4456+
p.DataDisks = []machinev1beta1.VSphereDisk{
4457+
{
4458+
Name: "Disk1",
4459+
SizeGiB: 10,
4460+
ProvisioningMode: "Fat",
4461+
},
4462+
}
4463+
},
4464+
expectedOk: false,
4465+
featureGatesEnabled: func() map[string]bool {
4466+
fg := make(map[string]bool)
4467+
fg[string(features.FeatureGateVSphereMultiDisk)] = true
4468+
return fg
4469+
}(),
4470+
expectedError: "providerSpec.disks[0]: Unsupported value: \"Fat\": supported values: \"EagerlyZeroed\", \"Thick\", \"Thin\"",
4471+
},
44354472
}
44364473

44374474
secret := &corev1.Secret{

0 commit comments

Comments
 (0)