Skip to content

Commit 85ed836

Browse files
authored
Merge pull request #1987 from shiftstack/issue1986
🐛 Fix v1alpha7 machine restorer and test
2 parents 4e2150f + a2ba9c5 commit 85ed836

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)