@@ -207,3 +207,50 @@ func PatchNodeCondition(ctx context.Context, input PatchNodeConditionInput) {
207
207
node .Status .Conditions = append (node .Status .Conditions , input .NodeCondition )
208
208
Expect (patchHelper .Patch (ctx , node )).To (Succeed ())
209
209
}
210
+
211
+ // MachineStatusCheck is a type that operates a status check on a Machine
212
+ type MachineStatusCheck func (p * clusterv1.Machine ) error
213
+
214
+ // WaitForMachineStatusCheckInput is the input for WaitForMachineStatusCheck.
215
+ type WaitForMachineStatusCheckInput struct {
216
+ Machine * clusterv1.Machine
217
+ StatusChecks []MachineStatusCheck
218
+ WaitForMachineIntervals []interface {}
219
+ }
220
+
221
+ // WaitForMachineStatusCheck waits for the specified status to be true for the machine.
222
+ func WaitForMachineStatusCheck (ctx context.Context , input WaitForMachineStatusCheckInput ) {
223
+ Expect (ctx ).NotTo (BeNil (), "ctx is required for WaitForMachineStatusCheck" )
224
+ Expect (input .Machine ).ToNot (BeNil (), "Invalid argument. input.Machine can't be nil when calling WaitForMachineStatusCheck" )
225
+ Expect (input .StatusChecks ).ToNot (BeEmpty (), "Invalid argument. input.StatusCheck can't be empty when calling WaitForMachineStatusCheck" )
226
+
227
+ Eventually (func () (bool , error ) {
228
+ for _ , statusCheck := range input .StatusChecks {
229
+ err := statusCheck (input .Machine )
230
+ if err != nil {
231
+ return false , err
232
+ }
233
+ }
234
+ return true , nil
235
+ }, input .WaitForMachineIntervals ... ).Should (BeTrue ())
236
+ }
237
+
238
+ // MachineNodeRefCheck is a MachineStatusCheck ensuring that a NodeRef is assigned to the machine
239
+ func MachineNodeRefCheck () MachineStatusCheck {
240
+ return func (machine * clusterv1.Machine ) error {
241
+ if machine .Status .NodeRef == nil {
242
+ return errors .Errorf ("NodeRef is not assigned to the machine %s/%s" , machine .Namespace , machine .Name )
243
+ }
244
+ return nil
245
+ }
246
+ }
247
+
248
+ // MachinePhaseCheck is a MachineStatusCheck ensuring that a machines is in the expected phase
249
+ func MachinePhaseCheck (expectedPhase string ) MachineStatusCheck {
250
+ return func (machine * clusterv1.Machine ) error {
251
+ if machine .Status .Phase != expectedPhase {
252
+ return errors .Errorf ("Machine %s/%s is not in phase %s" , machine .Namespace , machine .Name , expectedPhase )
253
+ }
254
+ return nil
255
+ }
256
+ }
0 commit comments