@@ -20,9 +20,11 @@ import (
20
20
"github.com/golang/mock/gomock"
21
21
. "github.com/onsi/ginkgo/v2"
22
22
. "github.com/onsi/gomega"
23
+ "k8s.io/apimachinery/pkg/api/errors"
23
24
infrav1 "sigs.k8s.io/cluster-api-provider-cloudstack/api/v1beta2"
24
25
"sigs.k8s.io/cluster-api-provider-cloudstack/pkg/cloud"
25
26
dummies "sigs.k8s.io/cluster-api-provider-cloudstack/test/dummies/v1beta2"
27
+ clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
26
28
"sigs.k8s.io/controller-runtime/pkg/client"
27
29
)
28
30
@@ -32,9 +34,6 @@ var _ = Describe("CloudStackFailureDomainReconciler", func() {
32
34
dummies .SetDummyVars ()
33
35
SetupTestEnvironment () // Must happen before setting up managers/reconcilers.
34
36
Ω (FailureDomainReconciler .SetupWithManager (k8sManager )).Should (Succeed ()) // Register CloudStack FailureDomainReconciler.
35
- })
36
-
37
- It ("Should set failure domain Status.Ready to true." , func () {
38
37
// Modify failure domain name the same way the cluster controller would.
39
38
dummies .CSFailureDomain1 .Name = dummies .CSFailureDomain1 .Name + "-" + dummies .CSCluster .Name
40
39
@@ -49,14 +48,200 @@ var _ = Describe("CloudStackFailureDomainReconciler", func() {
49
48
arg1 .(* infrav1.CloudStackZoneSpec ).Network .Type = cloud .NetworkTypeShared
50
49
}).MinTimes (1 )
51
50
52
- tempfd := & infrav1.CloudStackFailureDomain {}
51
+ })
52
+
53
+ It ("Should set failure domain Status.Ready to true." , func () {
54
+ assertFailureDomainCreated ()
55
+ })
56
+ It ("Should delete failure domain if no VM under this failure domain." , func () {
57
+ assertFailureDomainCreated ()
58
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
59
+
60
+ assertFailureDomainNotExisted ()
61
+ })
62
+
63
+ It ("Should return error if spec.replicas < 2." , func () {
64
+ assertFailureDomainCreated ()
65
+ var specReplicas int32 = 1
66
+ var statusReplicas int32 = 1
67
+ var statusReadyReplicas int32 = 1
68
+ var statusReady = true
69
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , & statusReadyReplicas , & statusReady )
70
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
71
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
72
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
73
+
74
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
75
+
76
+ CAPIMachine := & clusterv1.Machine {}
77
+ Eventually (func () bool {
78
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
79
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err == nil {
80
+ return CAPIMachine .DeletionTimestamp .IsZero ()
81
+ }
82
+ return false
83
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
84
+ })
85
+
86
+ It ("Should return error if status.replicas < spec.replicas." , func () {
87
+ assertFailureDomainCreated ()
88
+ var specReplicas int32 = 2
89
+ var statusReplicas int32 = 1
90
+ var statusReadyReplicas int32 = 1
91
+ var statusReady = true
92
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , & statusReadyReplicas , & statusReady )
93
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
94
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
95
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
96
+
97
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
98
+
99
+ CAPIMachine := & clusterv1.Machine {}
100
+ Eventually (func () bool {
101
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
102
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err == nil {
103
+ return CAPIMachine .DeletionTimestamp .IsZero ()
104
+ }
105
+ return false
106
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
107
+ })
108
+
109
+ It ("Should return error if status.ready is false." , func () {
110
+ assertFailureDomainCreated ()
111
+ var specReplicas int32 = 2
112
+ var statusReplicas int32 = 2
113
+ var statusReadyReplicas int32 = 2
114
+ var statusReady = false
115
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , & statusReadyReplicas , & statusReady )
116
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
117
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
118
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
119
+
120
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
121
+
122
+ CAPIMachine := & clusterv1.Machine {}
123
+ Eventually (func () bool {
124
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
125
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err == nil {
126
+ return CAPIMachine .DeletionTimestamp .IsZero ()
127
+ }
128
+ return false
129
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
130
+ })
131
+
132
+ It ("Should return error if status.readyReplicas <> status.replicas." , func () {
133
+ assertFailureDomainCreated ()
134
+ var specReplicas int32 = 2
135
+ var statusReplicas int32 = 2
136
+ var statusReadyReplicas int32 = 1
137
+ var statusReady = true
138
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , & statusReadyReplicas , & statusReady )
139
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
140
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
141
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
142
+
143
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
144
+
145
+ CAPIMachine := & clusterv1.Machine {}
146
+ Eventually (func () bool {
147
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
148
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err == nil {
149
+ return CAPIMachine .DeletionTimestamp .IsZero ()
150
+ }
151
+ return false
152
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
153
+ })
154
+
155
+ // simulate owner is kubeadmcontrolplane
156
+ It ("Should delete machine if spec.replicas > 1." , func () {
157
+ assertFailureDomainCreated ()
158
+ var specReplicas int32 = 2
159
+ var statusReplicas int32 = 2
160
+ var statusReadyReplicas int32 = 2
161
+ var statusReady = true
162
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , & statusReadyReplicas , & statusReady )
163
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
164
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
165
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
166
+
167
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
168
+
169
+ CAPIMachine := & clusterv1.Machine {}
53
170
Eventually (func () bool {
54
- key := client .ObjectKeyFromObject (dummies .CSFailureDomain1 )
55
- if err := k8sClient .Get (ctx , key , tempfd ); err == nil {
56
- return tempfd .Status .Ready
171
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
172
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err != nil {
173
+ return errors .IsNotFound (err )
174
+ }
175
+ return false
176
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
177
+ })
178
+
179
+ // simulate owner is etcdadmcluster
180
+ It ("Should delete machine if status.readyReplica does not exist." , func () {
181
+ assertFailureDomainCreated ()
182
+ var specReplicas int32 = 2
183
+ var statusReplicas int32 = 2
184
+ var statusReady = true
185
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , nil , & statusReady )
186
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
187
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
188
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
189
+
190
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
191
+
192
+ CAPIMachine := & clusterv1.Machine {}
193
+ Eventually (func () bool {
194
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
195
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err != nil {
196
+ return errors .IsNotFound (err )
197
+ }
198
+ return false
199
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
200
+ })
201
+
202
+ // simulate owner is machineset
203
+ It ("Should delete machine if status.ready does not exist." , func () {
204
+ assertFailureDomainCreated ()
205
+ var specReplicas int32 = 2
206
+ var statusReplicas int32 = 2
207
+ var statusReadyReplicas int32 = 2
208
+ setCSMachineOwnerCRD (dummies .CSMachineOwner , & specReplicas , & statusReplicas , & statusReadyReplicas , nil )
209
+ setCAPIMachineAndCSMachineCRDs (dummies .CSMachine1 , dummies .CAPIMachine )
210
+ setMachineOwnerReference (dummies .CSMachine1 , dummies .CSMachineOwnerReference )
211
+ labelMachineFailuredomain (dummies .CSMachine1 , dummies .CSFailureDomain1 )
212
+
213
+ Ω (k8sClient .Delete (ctx , dummies .CSFailureDomain1 ))
214
+
215
+ CAPIMachine := & clusterv1.Machine {}
216
+ Eventually (func () bool {
217
+ key := client.ObjectKey {Namespace : dummies .ClusterNameSpace , Name : dummies .CAPIMachine .Name }
218
+ if err := k8sClient .Get (ctx , key , CAPIMachine ); err != nil {
219
+ return errors .IsNotFound (err )
57
220
}
58
221
return false
59
222
}, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
60
223
})
61
224
})
62
225
})
226
+
227
+ func assertFailureDomainCreated () {
228
+ tempfd := & infrav1.CloudStackFailureDomain {}
229
+ Eventually (func () bool {
230
+ key := client .ObjectKeyFromObject (dummies .CSFailureDomain1 )
231
+ if err := k8sClient .Get (ctx , key , tempfd ); err == nil {
232
+ return tempfd .Status .Ready
233
+ }
234
+ return false
235
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
236
+ }
237
+
238
+ func assertFailureDomainNotExisted () {
239
+ tempfd := & infrav1.CloudStackFailureDomain {}
240
+ Eventually (func () bool {
241
+ key := client .ObjectKeyFromObject (dummies .CSFailureDomain1 )
242
+ if err := k8sClient .Get (ctx , key , tempfd ); err != nil {
243
+ return true
244
+ }
245
+ return false
246
+ }, timeout ).WithPolling (pollInterval ).Should (BeTrue ())
247
+ }
0 commit comments