Skip to content

Commit ee892a3

Browse files
authored
fix(vmop): add validation rules for clone naming (#1522)
Summary This PR enhances the VirtualMachineOperation CRD by adding validation rules to ensure safe and valid resource naming during clone operations. Changes - Added x-kubernetes-validations to the clone.customization section: - namePrefix and nameSuffix, if set, must be 1–59 characters long. - Added validation for nameReplacement: - Each to field must be 1–59 characters long. - Enforced that at least one renaming mechanism is specified: - Either customization.namePrefix, customization.nameSuffix, or at least one entry in nameReplacement must be provided. Signed-off-by: Dmitry Lopatin <[email protected]>
1 parent 215bb55 commit ee892a3

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

api/core/v1alpha2/virtual_machine_operation.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,22 +69,26 @@ type VirtualMachineOperationRestoreSpec struct {
6969
VirtualMachineSnapshotName string `json:"virtualMachineSnapshotName"`
7070
}
7171

72+
// +kubebuilder:validation:XValidation:rule="(has(self.customization) && ((has(self.customization.namePrefix) && size(self.customization.namePrefix) > 0) || (has(self.customization.nameSuffix) && size(self.customization.nameSuffix) > 0))) || (has(self.nameReplacement) && size(self.nameReplacement) > 0)",message="At least one of customization.namePrefix, customization.nameSuffix, or nameReplacement must be set"
7273
// VirtualMachineOperationCloneSpec defines the clone operation.
7374
type VirtualMachineOperationCloneSpec struct {
7475
Mode VMOPRestoreMode `json:"mode"`
7576
// NameReplacement defines rules for renaming resources during cloning.
77+
// +kubebuilder:validation:XValidation:rule="self.all(nr, has(nr.to) && size(nr.to) >= 1 && size(nr.to) <= 59)",message="Each nameReplacement.to must be between 1 and 59 characters"
7678
NameReplacement []NameReplacement `json:"nameReplacement,omitempty"`
7779
// Customization defines customization options for cloning.
7880
Customization *VirtualMachineOperationCloneCustomization `json:"customization,omitempty"`
7981
}
8082

83+
// +kubebuilder:validation:XValidation:rule="!has(self.namePrefix) || (size(self.namePrefix) >= 1 && size(self.namePrefix) <= 59)",message="namePrefix length must be between 1 and 59 characters if set"
84+
// +kubebuilder:validation:XValidation:rule="!has(self.nameSuffix) || (size(self.nameSuffix) >= 1 && size(self.nameSuffix) <= 59)",message="nameSuffix length must be between 1 and 59 characters if set"
8185
// VirtualMachineOperationCloneCustomization defines customization options for cloning.
8286
type VirtualMachineOperationCloneCustomization struct {
8387
// NamePrefix adds a prefix to resource names during cloning.
84-
// Applied to VirtualDisk, VirtualMachineIPAddress, VirtualMachineMACAddress, and Secret resources.
88+
// Applied to VirtualMachine, VirtualDisk, VirtualMachineBlockDeviceAttachment, and Secret resources.
8589
NamePrefix string `json:"namePrefix,omitempty"`
8690
// NameSuffix adds a suffix to resource names during cloning.
87-
// Applied to VirtualDisk, VirtualMachineIPAddress, VirtualMachineMACAddress, and Secret resources.
91+
// Applied to VirtualMachine, VirtualDisk, VirtualMachineBlockDeviceAttachment, and Secret resources.
8892
NameSuffix string `json:"nameSuffix,omitempty"`
8993
}
9094

crds/virtualmachineoperations.yaml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,19 @@ spec:
8181
Applied to VirtualMachine, VirtualDisk, VirtualMachineBlockDeviceAttachment, and Secret resources.
8282
type: string
8383
type: object
84+
x-kubernetes-validations:
85+
- message:
86+
namePrefix length must be between 1 and 59 characters
87+
if set
88+
rule:
89+
"!has(self.namePrefix) || (size(self.namePrefix) >= 1
90+
&& size(self.namePrefix) <= 59)"
91+
- message:
92+
nameSuffix length must be between 1 and 59 characters
93+
if set
94+
rule:
95+
"!has(self.nameSuffix) || (size(self.nameSuffix) >= 1
96+
&& size(self.nameSuffix) <= 59)"
8497
mode:
8598
description: |-
8699
VMOPRestoreMode defines the kind of the restore operation.
@@ -121,9 +134,23 @@ spec:
121134
- to
122135
type: object
123136
type: array
137+
x-kubernetes-validations:
138+
- message: Each nameReplacement.to must be between 1 and 59 characters
139+
rule:
140+
self.all(nr, has(nr.to) && size(nr.to) >= 1 && size(nr.to)
141+
<= 59)
124142
required:
125143
- mode
126144
type: object
145+
x-kubernetes-validations:
146+
- message:
147+
At least one of customization.namePrefix, customization.nameSuffix,
148+
or nameReplacement must be set
149+
rule:
150+
(has(self.customization) && ((has(self.customization.namePrefix)
151+
&& size(self.customization.namePrefix) > 0) || (has(self.customization.nameSuffix)
152+
&& size(self.customization.nameSuffix) > 0))) || (has(self.nameReplacement)
153+
&& size(self.nameReplacement) > 0)
127154
force:
128155
description: |-
129156
Force execution of an operation.

images/virtualization-artifact/pkg/apiserver/api/generated/openapi/zz_generated.openapi.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)