Skip to content

Commit a2ba9c5

Browse files
committed
Fix v1alpha7 machine restorer and test
The v1alpha7 machine spec restorer was missing the exclusion for ProviderID and InstanceID was missing, and the test which was supposed to ensure it worked was broken. This fixes both.
1 parent 4e2150f commit a2ba9c5

File tree

2 files changed

+46
-19
lines changed

2 files changed

+46
-19
lines changed

api/v1alpha7/conversion_test.go

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -166,22 +166,24 @@ func TestFuzzyConversion(t *testing.T) {
166166
func TestMachineConversionControllerSpecFields(t *testing.T) {
167167
// This tests that we still do field restoration when the controller modifies ProviderID and InstanceID in the spec
168168

169-
g := gomega.NewWithT(t)
170-
scheme := runtime.NewScheme()
171-
g.Expect(AddToScheme(scheme)).To(gomega.Succeed())
172-
g.Expect(infrav1.AddToScheme(scheme)).To(gomega.Succeed())
173-
169+
// Define an initial state which cannot be converted losslessly. We add
170+
// an IdentityRef with a Kind, which has been removed in v1beta1.
174171
testMachine := func() *OpenStackMachine {
175172
return &OpenStackMachine{
176-
Spec: OpenStackMachineSpec{},
173+
Spec: OpenStackMachineSpec{
174+
IdentityRef: &OpenStackIdentityReference{
175+
Kind: "InvalidKind",
176+
Name: "test-name",
177+
},
178+
},
177179
}
178180
}
179181

180182
tests := []struct {
181-
name string
182-
modifyUp func(*infrav1.OpenStackMachine)
183-
testAfter func(*OpenStackMachine)
184-
expectNetworkDiff bool
183+
name string
184+
modifyUp func(*infrav1.OpenStackMachine)
185+
testAfter func(gomega.Gomega, *OpenStackMachine)
186+
expectIdentityRefDiff bool
185187
}{
186188
{
187189
name: "No change",
@@ -191,47 +193,52 @@ func TestMachineConversionControllerSpecFields(t *testing.T) {
191193
modifyUp: func(up *infrav1.OpenStackMachine) {
192194
up.Spec.Flavor = "new-flavor"
193195
},
194-
testAfter: func(after *OpenStackMachine) {
196+
testAfter: func(g gomega.Gomega, after *OpenStackMachine) {
195197
g.Expect(after.Spec.Flavor).To(gomega.Equal("new-flavor"))
196198
},
197-
expectNetworkDiff: true,
199+
expectIdentityRefDiff: true,
198200
},
199201
{
200202
name: "Set ProviderID",
201203
modifyUp: func(up *infrav1.OpenStackMachine) {
202204
up.Spec.ProviderID = pointer.String("new-provider-id")
203205
},
204-
testAfter: func(after *OpenStackMachine) {
206+
testAfter: func(g gomega.Gomega, after *OpenStackMachine) {
205207
g.Expect(after.Spec.ProviderID).To(gomega.Equal(pointer.String("new-provider-id")))
206208
},
207-
expectNetworkDiff: false,
209+
expectIdentityRefDiff: false,
208210
},
209211
{
210212
name: "Set InstanceID",
211213
modifyUp: func(up *infrav1.OpenStackMachine) {
212214
up.Spec.InstanceID = pointer.String("new-instance-id")
213215
},
214-
testAfter: func(after *OpenStackMachine) {
216+
testAfter: func(g gomega.Gomega, after *OpenStackMachine) {
215217
g.Expect(after.Spec.InstanceID).To(gomega.Equal(pointer.String("new-instance-id")))
216218
},
217-
expectNetworkDiff: false,
219+
expectIdentityRefDiff: false,
218220
},
219221
{
220222
name: "Set ProviderID and non-ignored change",
221223
modifyUp: func(up *infrav1.OpenStackMachine) {
222224
up.Spec.ProviderID = pointer.String("new-provider-id")
223225
up.Spec.Flavor = "new-flavor"
224226
},
225-
testAfter: func(after *OpenStackMachine) {
227+
testAfter: func(g gomega.Gomega, after *OpenStackMachine) {
226228
g.Expect(after.Spec.ProviderID).To(gomega.Equal(pointer.String("new-provider-id")))
227229
g.Expect(after.Spec.Flavor).To(gomega.Equal("new-flavor"))
228230
},
229-
expectNetworkDiff: true,
231+
expectIdentityRefDiff: true,
230232
},
231233
}
232234

233235
for _, tt := range tests {
234236
t.Run(tt.name, func(t *testing.T) {
237+
g := gomega.NewWithT(t)
238+
scheme := runtime.NewScheme()
239+
g.Expect(AddToScheme(scheme)).To(gomega.Succeed())
240+
g.Expect(infrav1.AddToScheme(scheme)).To(gomega.Succeed())
241+
235242
before := testMachine()
236243

237244
up := infrav1.OpenStackMachine{}
@@ -245,7 +252,14 @@ func TestMachineConversionControllerSpecFields(t *testing.T) {
245252
g.Expect(after.ConvertFrom(&up)).To(gomega.Succeed())
246253

247254
if tt.testAfter != nil {
248-
tt.testAfter(&after)
255+
tt.testAfter(g, &after)
256+
}
257+
258+
g.Expect(after.Spec.IdentityRef).ToNot(gomega.BeNil())
259+
if tt.expectIdentityRefDiff {
260+
g.Expect(after.Spec.IdentityRef.Kind).ToNot(gomega.Equal("InvalidKind"))
261+
} else {
262+
g.Expect(after.Spec.IdentityRef.Kind).To(gomega.Equal("InvalidKind"))
249263
}
250264
})
251265
}

api/v1alpha7/openstackmachine_conversion.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,19 @@ var v1alpha7OpenStackMachineRestorer = conversion.RestorerFor[*OpenStackMachine]
6666
return &c.Spec
6767
},
6868
restorev1alpha7MachineSpec,
69+
conversion.HashedFilterField[*OpenStackMachine, OpenStackMachineSpec](func(s *OpenStackMachineSpec) *OpenStackMachineSpec {
70+
// Despite being spec fields, ProviderID and InstanceID
71+
// are both set by the machine controller. If these are
72+
// the only changes to the spec, we still want to
73+
// restore the rest of the spec to its original state.
74+
if s.ProviderID != nil || s.InstanceID != nil {
75+
f := *s
76+
f.ProviderID = nil
77+
f.InstanceID = nil
78+
return &f
79+
}
80+
return s
81+
}),
6982
),
7083
}
7184

0 commit comments

Comments
 (0)