Skip to content

Commit b892a94

Browse files
author
Johannes Frey
committed
Validate OpenStackMachineTemplate spec.template.spec immutability
Signed-off-by: Johannes Frey <[email protected]>
1 parent b132628 commit b892a94

File tree

2 files changed

+113
-3
lines changed

2 files changed

+113
-3
lines changed

api/v1alpha4/openstackmachinetemplate_webhook.go

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

1919
import (
20-
"errors"
2120
"reflect"
2221

2322
"k8s.io/apimachinery/pkg/runtime"
@@ -27,6 +26,9 @@ import (
2726
"sigs.k8s.io/controller-runtime/pkg/webhook"
2827
)
2928

29+
// OpenStackMachineTemplateImmutableMsg ...
30+
const OpenStackMachineTemplateImmutableMsg = "OpenStackMachineTemplate spec.template.spec field is immutable. Please create a new resource instead. Ref doc: https://cluster-api.sigs.k8s.io/tasks/change-machine-template.html"
31+
3032
func (r *OpenStackMachineTemplate) SetupWebhookWithManager(mgr manager.Manager) error {
3133
return builder.WebhookManagedBy(mgr).
3234
For(r).
@@ -51,9 +53,17 @@ func (r *OpenStackMachineTemplate) ValidateCreate() error {
5153

5254
// ValidateUpdate implements webhook.Validator so a webhook will be registered for the type.
5355
func (r *OpenStackMachineTemplate) ValidateUpdate(old runtime.Object) error {
56+
var allErrs field.ErrorList
5457
oldOpenStackMachineTemplate := old.(*OpenStackMachineTemplate)
55-
if !reflect.DeepEqual(r.Spec, oldOpenStackMachineTemplate.Spec) {
56-
return errors.New("openstackMachineTemplateSpec is immutable")
58+
59+
if !reflect.DeepEqual(r.Spec.Template.Spec, oldOpenStackMachineTemplate.Spec.Template.Spec) {
60+
allErrs = append(allErrs,
61+
field.Invalid(field.NewPath("spec", "template", "spec"), r, OpenStackMachineTemplateImmutableMsg),
62+
)
63+
}
64+
65+
if len(allErrs) != 0 {
66+
return aggregateObjErrors(r.GroupVersionKind().GroupKind(), r.Name, allErrs)
5767
}
5868

5969
return nil
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*
2+
Copyright 2021 The Kubernetes Authors.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package v1alpha4
18+
19+
import (
20+
"testing"
21+
22+
. "github.com/onsi/gomega"
23+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24+
)
25+
26+
func TestOpenStackMachineTemplate_ValidateUpdate(t *testing.T) {
27+
g := NewWithT(t)
28+
29+
tests := []struct {
30+
name string
31+
oldTemplate *OpenStackMachineTemplate
32+
newTemplate *OpenStackMachineTemplate
33+
wantErr bool
34+
}{
35+
{
36+
name: "OpenStackMachineTemplate with immutable spec",
37+
oldTemplate: &OpenStackMachineTemplate{
38+
Spec: OpenStackMachineTemplateSpec{
39+
Template: OpenStackMachineTemplateResource{
40+
Spec: OpenStackMachineSpec{
41+
Flavor: "foo",
42+
Image: "bar",
43+
},
44+
},
45+
},
46+
},
47+
newTemplate: &OpenStackMachineTemplate{
48+
Spec: OpenStackMachineTemplateSpec{
49+
Template: OpenStackMachineTemplateResource{
50+
Spec: OpenStackMachineSpec{
51+
Flavor: "foo",
52+
Image: "NewImage",
53+
},
54+
},
55+
},
56+
},
57+
wantErr: true,
58+
},
59+
{
60+
name: "OpenStackMachineTemplate with mutable metadata",
61+
oldTemplate: &OpenStackMachineTemplate{
62+
Spec: OpenStackMachineTemplateSpec{
63+
Template: OpenStackMachineTemplateResource{
64+
Spec: OpenStackMachineSpec{
65+
Flavor: "foo",
66+
Image: "bar",
67+
},
68+
},
69+
},
70+
ObjectMeta: v1.ObjectMeta{
71+
Name: "foo",
72+
},
73+
},
74+
newTemplate: &OpenStackMachineTemplate{
75+
Spec: OpenStackMachineTemplateSpec{
76+
Template: OpenStackMachineTemplateResource{
77+
Spec: OpenStackMachineSpec{
78+
Flavor: "foo",
79+
Image: "bar",
80+
},
81+
},
82+
},
83+
ObjectMeta: v1.ObjectMeta{
84+
Name: "bar",
85+
},
86+
},
87+
},
88+
}
89+
for _, tt := range tests {
90+
t.Run(tt.name, func(t *testing.T) {
91+
t.Parallel()
92+
err := tt.newTemplate.ValidateUpdate(tt.oldTemplate)
93+
if tt.wantErr {
94+
g.Expect(err).To(HaveOccurred())
95+
} else {
96+
g.Expect(err).NotTo(HaveOccurred())
97+
}
98+
})
99+
}
100+
}

0 commit comments

Comments
 (0)