Skip to content

Commit b56542d

Browse files
Fix network/image webhook validations (#523)
Signed-off-by: Prajyot-Parab <[email protected]>
1 parent b6ebb5f commit b56542d

10 files changed

+50
-11
lines changed

api/v1beta1/common.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ limitations under the License.
1616

1717
package v1beta1
1818

19+
import "k8s.io/apimachinery/pkg/util/validation/field"
20+
1921
func defaultIBMPowerVSMachineSpec(spec *IBMPowerVSMachineSpec) {
2022

2123
if spec.Memory == "" {
@@ -52,11 +54,11 @@ func validateIBMPowerVSProcType(spec IBMPowerVSMachineSpec) (bool, IBMPowerVSMac
5254
return false, spec
5355
}
5456

55-
func validateIBMPowerVSNetwork(network IBMPowerVSResourceReference) (bool, IBMPowerVSResourceReference) {
56-
if network.ID != nil && network.Name != nil {
57-
return false, network
57+
func validateIBMPowerVSResourceReference(res IBMPowerVSResourceReference, resType string) (bool, *field.Error) {
58+
if res.ID != nil && res.Name != nil {
59+
return false, field.Invalid(field.NewPath("spec", resType), res, "Only one of "+resType+" - ID or Name may be specified")
5860
}
59-
return true, IBMPowerVSResourceReference{}
61+
return true, nil
6062
}
6163

6264
func defaultIBMVPCMachineSpec(spec *IBMVPCMachineSpec) {

api/v1beta1/ibmpowervscluster_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ type IBMPowerVSClusterSpec struct {
3535
// Important: Run "make" to regenerate code after modifying this file
3636

3737
// ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed
38+
// +kubebuilder:validation:MinLength=1
3839
ServiceInstanceID string `json:"serviceInstanceID"`
3940

4041
// Network is the reference to the Network to use for this cluster.

api/v1beta1/ibmpowervscluster_webhook.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,8 @@ func (r *IBMPowerVSCluster) validateIBMPowerVSCluster() error {
8282
}
8383

8484
func (r *IBMPowerVSCluster) validateIBMPowerVSClusterNetwork() *field.Error {
85-
if res, net := validateIBMPowerVSNetwork(r.Spec.Network); !res {
86-
return field.Invalid(field.NewPath("spec", "network"), net, "Only one of Network - ID or Name may be specified")
85+
if res, err := validateIBMPowerVSResourceReference(r.Spec.Network, "Network"); !res {
86+
return err
8787
}
8888
return nil
8989
}

api/v1beta1/ibmpowervsmachine_types.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type IBMPowerVSMachineSpec struct {
3737
// Important: Run "make" to regenerate code after modifying this file
3838

3939
// ServiceInstanceID is the id of the power cloud instance where the vsi instance will get deployed
40+
// +kubebuilder:validation:MinLength=1
4041
ServiceInstanceID string `json:"serviceInstanceID"`
4142

4243
// SSHKey is the name of the SSH key pair provided to the vsi for authenticating users
@@ -74,10 +75,12 @@ type IBMPowerVSMachineSpec struct {
7475
// a validation error.
7576
type IBMPowerVSResourceReference struct {
7677
// ID of resource
78+
// +kubebuilder:validation:MinLength=1
7779
// +optional
7880
ID *string `json:"id,omitempty"`
7981

8082
// Name of resource
83+
// +kubebuilder:validation:MinLength=1
8184
// +optional
8285
Name *string `json:"name,omitempty"`
8386
}

api/v1beta1/ibmpowervsmachine_webhook.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ func (r *IBMPowerVSMachine) validateIBMPowerVSMachine() error {
7878
if err := r.validateIBMPowerVSMachineNetwork(); err != nil {
7979
allErrs = append(allErrs, err)
8080
}
81+
if err := r.validateIBMPowerVSMachineImage(); err != nil {
82+
allErrs = append(allErrs, err)
83+
}
8184
if len(allErrs) == 0 {
8285
return nil
8386
}
@@ -102,8 +105,15 @@ func (r *IBMPowerVSMachine) validateIBMPowerVSMachineProcType() *field.Error {
102105
}
103106

104107
func (r *IBMPowerVSMachine) validateIBMPowerVSMachineNetwork() *field.Error {
105-
if res, net := validateIBMPowerVSNetwork(r.Spec.Network); !res {
106-
return field.Invalid(field.NewPath("spec", "network"), net, "Only one of Network - ID or Name may be specified")
108+
if res, err := validateIBMPowerVSResourceReference(r.Spec.Network, "Network"); !res {
109+
return err
110+
}
111+
return nil
112+
}
113+
114+
func (r *IBMPowerVSMachine) validateIBMPowerVSMachineImage() *field.Error {
115+
if res, err := validateIBMPowerVSResourceReference(r.Spec.Image, "Image"); !res {
116+
return err
107117
}
108118
return nil
109119
}

api/v1beta1/ibmpowervsmachinetemplate_webhook.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplate() error {
7878
if err := r.validateIBMPowerVSMachineTemplateNetwork(); err != nil {
7979
allErrs = append(allErrs, err)
8080
}
81+
if err := r.validateIBMPowerVSMachineTemplateImage(); err != nil {
82+
allErrs = append(allErrs, err)
83+
}
8184
if len(allErrs) == 0 {
8285
return nil
8386
}
@@ -102,8 +105,15 @@ func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateProcType()
102105
}
103106

104107
func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateNetwork() *field.Error {
105-
if res, net := validateIBMPowerVSNetwork(r.Spec.Template.Spec.Network); !res {
106-
return field.Invalid(field.NewPath("spec", "template", "spec", "network"), net, "Only one of Network - ID or Name may be specified")
108+
if res, err := validateIBMPowerVSResourceReference(r.Spec.Template.Spec.Network, "Network"); !res {
109+
return err
110+
}
111+
return nil
112+
}
113+
114+
func (r *IBMPowerVSMachineTemplate) validateIBMPowerVSMachineTemplateImage() *field.Error {
115+
if res, err := validateIBMPowerVSResourceReference(r.Spec.Template.Spec.Image, "Image"); !res {
116+
return err
107117
}
108118
return nil
109119
}

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsclusters.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,14 +126,17 @@ spec:
126126
properties:
127127
id:
128128
description: ID of resource
129+
minLength: 1
129130
type: string
130131
name:
131132
description: Name of resource
133+
minLength: 1
132134
type: string
133135
type: object
134136
serviceInstanceID:
135137
description: ServiceInstanceID is the id of the power cloud instance
136138
where the vsi instance will get deployed
139+
minLength: 1
137140
type: string
138141
required:
139142
- network

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachines.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,11 @@ spec:
193193
properties:
194194
id:
195195
description: ID of resource
196+
minLength: 1
196197
type: string
197198
name:
198199
description: Name of resource
200+
minLength: 1
199201
type: string
200202
type: object
201203
memory:
@@ -207,9 +209,11 @@ spec:
207209
properties:
208210
id:
209211
description: ID of resource
212+
minLength: 1
210213
type: string
211214
name:
212215
description: Name of resource
216+
minLength: 1
213217
type: string
214218
type: object
215219
procType:
@@ -226,6 +230,7 @@ spec:
226230
serviceInstanceID:
227231
description: ServiceInstanceID is the id of the power cloud instance
228232
where the vsi instance will get deployed
233+
minLength: 1
229234
type: string
230235
sshKey:
231236
description: SSHKey is the name of the SSH key pair provided to the

config/crd/bases/infrastructure.cluster.x-k8s.io_ibmpowervsmachinetemplates.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,11 @@ spec:
150150
properties:
151151
id:
152152
description: ID of resource
153+
minLength: 1
153154
type: string
154155
name:
155156
description: Name of resource
157+
minLength: 1
156158
type: string
157159
type: object
158160
memory:
@@ -164,9 +166,11 @@ spec:
164166
properties:
165167
id:
166168
description: ID of resource
169+
minLength: 1
167170
type: string
168171
name:
169172
description: Name of resource
173+
minLength: 1
170174
type: string
171175
type: object
172176
procType:
@@ -183,6 +187,7 @@ spec:
183187
serviceInstanceID:
184188
description: ServiceInstanceID is the id of the power cloud
185189
instance where the vsi instance will get deployed
190+
minLength: 1
186191
type: string
187192
sshKey:
188193
description: SSHKey is the name of the SSH key pair provided

controllers/ibmpowervscluster_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ var _ = Describe("IBMPowerVSClusterReconciler", func() {
4141
Log: klogr.New(),
4242
}
4343

44-
instance := &v1beta1.IBMPowerVSCluster{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}}
44+
instance := &v1beta1.IBMPowerVSCluster{ObjectMeta: metav1.ObjectMeta{Name: "foo", Namespace: "default"}, Spec: v1beta1.IBMPowerVSClusterSpec{ServiceInstanceID: "foo"}}
4545

4646
// Create the IBMPowerVSCluster object and expect the Reconcile to be created
4747
Expect(k8sClient.Create(ctx, instance)).To(Succeed())

0 commit comments

Comments
 (0)