Skip to content

Commit e875709

Browse files
committed
Add image validation for opestack machine
Signed-off-by: smoshiur1237 <[email protected]>
1 parent 6d42cbb commit e875709

File tree

4 files changed

+75
-9
lines changed

4 files changed

+75
-9
lines changed

api/v1beta1/types.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ limitations under the License.
1717
package v1beta1
1818

1919
import (
20+
"k8s.io/apimachinery/pkg/util/validation/field"
2021
"k8s.io/utils/ptr"
2122

2223
"sigs.k8s.io/cluster-api-provider-openstack/pkg/utils/optional"
@@ -75,6 +76,24 @@ func (f *ImageFilter) IsZero() bool {
7576
return f.Name == nil && len(f.Tags) == 0
7677
}
7778

79+
// Validate performs validation on [ImageParam], returning a list of field errors using the provided base path.
80+
// It is intended to be used in the validation webhooks of resources containing [ImageParam].
81+
func (i *ImageParam) Validate(base field.Path) field.ErrorList {
82+
var errors field.ErrorList
83+
// Not possible to validate the image if it is missing
84+
if i == nil {
85+
errors = append(errors, field.Required(&base, "Image is required"))
86+
return errors
87+
}
88+
if i.Filter.Name == nil || i.Filter.Tags == nil {
89+
errors = append(errors, field.Required(base.Child("Image filter"), "Either Name or Tags of image are missing"))
90+
}
91+
if i.ImageRef.Name == "" {
92+
errors = append(errors, field.Required(base.Child("ORC image Referecne"), "ORC image is missing"))
93+
}
94+
return errors
95+
}
96+
7897
type ExternalRouterIPParam struct {
7998
// The FixedIP in the corresponding subnet
8099
FixedIP string `json:"fixedIP,omitempty"`

pkg/webhooks/openstackmachine_webhook.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,18 @@ type openStackMachineWebhook struct{}
4848
var _ webhook.CustomValidator = &openStackMachineWebhook{}
4949

5050
// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type.
51-
func (*openStackMachineWebhook) ValidateCreate(_ context.Context, objRaw runtime.Object) (admission.Warnings, error) {
51+
func (webhook *openStackMachineWebhook) ValidateCreate(_ context.Context, objRaw runtime.Object) (admission.Warnings, error) {
5252
var allErrs field.ErrorList
5353
newObj, err := castToOpenStackMachine(objRaw)
5454
if err != nil {
5555
return nil, err
5656
}
5757

58+
err = webhook.validate(newObj)
59+
if err != nil {
60+
return nil, err
61+
}
62+
5863
if newObj.Spec.RootVolume != nil && newObj.Spec.AdditionalBlockDevices != nil {
5964
for _, device := range newObj.Spec.AdditionalBlockDevices {
6065
if device.Name == "root" {
@@ -73,7 +78,7 @@ func (*openStackMachineWebhook) ValidateCreate(_ context.Context, objRaw runtime
7378
}
7479

7580
// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type.
76-
func (*openStackMachineWebhook) ValidateUpdate(_ context.Context, oldObjRaw, newObjRaw runtime.Object) (admission.Warnings, error) {
81+
func (webhook *openStackMachineWebhook) ValidateUpdate(_ context.Context, oldObjRaw, newObjRaw runtime.Object) (admission.Warnings, error) {
7782
newObj, err := castToOpenStackMachine(newObjRaw)
7883
if err != nil {
7984
return nil, err
@@ -121,7 +126,7 @@ func (*openStackMachineWebhook) ValidateUpdate(_ context.Context, oldObjRaw, new
121126
}
122127

123128
// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type.
124-
func (*openStackMachineWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
129+
func (webhook *openStackMachineWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
125130
return nil, nil
126131
}
127132

@@ -132,3 +137,14 @@ func castToOpenStackMachine(obj runtime.Object) (*infrav1.OpenStackMachine, erro
132137
}
133138
return cast, nil
134139
}
140+
141+
func (webhook *openStackMachineWebhook) validate(newObj *infrav1.OpenStackMachine) error {
142+
var allErrs field.ErrorList
143+
144+
allErrs = append(allErrs, newObj.Spec.Image.Validate(*field.NewPath("Spec", "Image"))...)
145+
146+
if len(allErrs) == 0 {
147+
return nil
148+
}
149+
return apierrors.NewInvalid(infrav1.SchemeGroupVersion.WithKind("OpenStackMachine").GroupKind(), newObj.Name, allErrs)
150+
}

pkg/webhooks/openstackmachinetemplate_webhook.go

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,19 @@ type openStackMachineTemplateWebhook struct{}
4848
var _ webhook.CustomValidator = &openStackMachineTemplateWebhook{}
4949

5050
// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type.
51-
func (*openStackMachineTemplateWebhook) ValidateCreate(_ context.Context, objRaw runtime.Object) (admission.Warnings, error) {
51+
func (webhook *openStackMachineTemplateWebhook) ValidateCreate(_ context.Context, objRaw runtime.Object) (admission.Warnings, error) {
5252
newObj, err := castToOpenStackMachineTemplate(objRaw)
5353
if err != nil {
5454
return nil, err
5555
}
5656

5757
var allErrs field.ErrorList
5858

59+
err = webhook.validate(newObj)
60+
if err != nil {
61+
return nil, err
62+
}
63+
5964
if newObj.Spec.Template.Spec.ProviderID != nil {
6065
allErrs = append(allErrs, field.Forbidden(field.NewPath("spec", "template", "spec", "providerID"), "cannot be set in templates"))
6166
}
@@ -64,7 +69,7 @@ func (*openStackMachineTemplateWebhook) ValidateCreate(_ context.Context, objRaw
6469
}
6570

6671
// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type.
67-
func (*openStackMachineTemplateWebhook) ValidateUpdate(ctx context.Context, oldObjRaw, newObjRaw runtime.Object) (admission.Warnings, error) {
72+
func (webhook *openStackMachineTemplateWebhook) ValidateUpdate(ctx context.Context, oldObjRaw, newObjRaw runtime.Object) (admission.Warnings, error) {
6873
var allErrs field.ErrorList
6974
oldObj, err := castToOpenStackMachineTemplate(oldObjRaw)
7075
if err != nil {
@@ -92,7 +97,7 @@ func (*openStackMachineTemplateWebhook) ValidateUpdate(ctx context.Context, oldO
9297
}
9398

9499
// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type.
95-
func (*openStackMachineTemplateWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
100+
func (webhook *openStackMachineTemplateWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
96101
return nil, nil
97102
}
98103

@@ -103,3 +108,14 @@ func castToOpenStackMachineTemplate(obj runtime.Object) (*infrav1.OpenStackMachi
103108
}
104109
return cast, nil
105110
}
111+
112+
func (webhook *openStackMachineTemplateWebhook) validate(newObj *infrav1.OpenStackMachineTemplate) error {
113+
var allErrs field.ErrorList
114+
115+
allErrs = append(allErrs, newObj.Spec.Template.Spec.Image.Validate(*field.NewPath("Spec", "Template", "Spec", "Image"))...)
116+
117+
if len(allErrs) == 0 {
118+
return nil
119+
}
120+
return apierrors.NewInvalid(infrav1.SchemeGroupVersion.WithKind("OpenStackMachineTemplate").GroupKind(), newObj.Name, allErrs)
121+
}

pkg/webhooks/openstackserver_webhook.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,16 @@ type openStackServerWebhook struct{}
5050
var _ webhook.CustomValidator = &openStackServerWebhook{}
5151

5252
// ValidateCreate implements webhook.CustomValidator so a webhook will be registered for the type.
53-
func (*openStackServerWebhook) ValidateCreate(_ context.Context, objRaw runtime.Object) (admission.Warnings, error) {
53+
func (webhook *openStackServerWebhook) ValidateCreate(_ context.Context, objRaw runtime.Object) (admission.Warnings, error) {
5454
var allErrs field.ErrorList
5555
newObj, err := castToOpenStackServer(objRaw)
5656
if err != nil {
5757
return nil, err
5858
}
59+
err = webhook.validate(newObj)
60+
if err != nil {
61+
return nil, err
62+
}
5963

6064
if newObj.Spec.RootVolume != nil && newObj.Spec.AdditionalBlockDevices != nil {
6165
for _, device := range newObj.Spec.AdditionalBlockDevices {
@@ -75,7 +79,7 @@ func (*openStackServerWebhook) ValidateCreate(_ context.Context, objRaw runtime.
7579
}
7680

7781
// ValidateUpdate implements webhook.CustomValidator so a webhook will be registered for the type.
78-
func (*openStackServerWebhook) ValidateUpdate(ctx context.Context, oldObjRaw, newObjRaw runtime.Object) (admission.Warnings, error) {
82+
func (webhook *openStackServerWebhook) ValidateUpdate(ctx context.Context, oldObjRaw, newObjRaw runtime.Object) (admission.Warnings, error) {
7983
oldObj, err := castToOpenStackServer(oldObjRaw)
8084
if err != nil {
8185
return nil, err
@@ -124,7 +128,7 @@ func (*openStackServerWebhook) ValidateUpdate(ctx context.Context, oldObjRaw, ne
124128
}
125129

126130
// ValidateDelete implements webhook.CustomValidator so a webhook will be registered for the type.
127-
func (*openStackServerWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
131+
func (webhook *openStackServerWebhook) ValidateDelete(_ context.Context, _ runtime.Object) (admission.Warnings, error) {
128132
return nil, nil
129133
}
130134

@@ -135,3 +139,14 @@ func castToOpenStackServer(obj runtime.Object) (*infrav1alpha1.OpenStackServer,
135139
}
136140
return cast, nil
137141
}
142+
143+
func (webhook *openStackServerWebhook) validate(newObj *infrav1alpha1.OpenStackServer) error {
144+
var allErrs field.ErrorList
145+
146+
allErrs = append(allErrs, newObj.Spec.Image.Validate(*field.NewPath("Spec", "Image"))...)
147+
148+
if len(allErrs) == 0 {
149+
return nil
150+
}
151+
return apierrors.NewInvalid(infrav1.SchemeGroupVersion.WithKind("OpenStackServer").GroupKind(), newObj.Name, allErrs)
152+
}

0 commit comments

Comments
 (0)