@@ -22,6 +22,7 @@ import (
22
22
"time"
23
23
24
24
"github.com/go-logr/logr"
25
+ "github.com/pkg/errors"
25
26
26
27
"github.com/IBM-Cloud/power-go-client/power/models"
27
28
@@ -34,11 +35,14 @@ import (
34
35
ctrl "sigs.k8s.io/controller-runtime"
35
36
"sigs.k8s.io/controller-runtime/pkg/client"
36
37
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
38
+ "sigs.k8s.io/controller-runtime/pkg/handler"
39
+ "sigs.k8s.io/controller-runtime/pkg/source"
37
40
38
41
capiv1beta1 "sigs.k8s.io/cluster-api/api/v1beta1"
39
42
capierrors "sigs.k8s.io/cluster-api/errors"
40
43
"sigs.k8s.io/cluster-api/util"
41
44
"sigs.k8s.io/cluster-api/util/conditions"
45
+ "sigs.k8s.io/cluster-api/util/predicates"
42
46
43
47
infrav1beta2 "sigs.k8s.io/cluster-api-provider-ibmcloud/api/v1beta2"
44
48
"sigs.k8s.io/cluster-api-provider-ibmcloud/cloud/scope"
@@ -157,13 +161,6 @@ func (r *IBMPowerVSMachineReconciler) Reconcile(ctx context.Context, req ctrl.Re
157
161
return r .reconcileNormal (machineScope )
158
162
}
159
163
160
- // SetupWithManager creates a new IBMPowerVSMachine controller for a manager.
161
- func (r * IBMPowerVSMachineReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
162
- return ctrl .NewControllerManagedBy (mgr ).
163
- For (& infrav1beta2.IBMPowerVSMachine {}).
164
- Complete (r )
165
- }
166
-
167
164
func (r * IBMPowerVSMachineReconciler ) reconcileDelete (scope * scope.PowerVSMachineScope ) (_ ctrl.Result , reterr error ) {
168
165
scope .Info ("Handling deleted IBMPowerVSMachine" )
169
166
@@ -299,3 +296,76 @@ func (r *IBMPowerVSMachineReconciler) reconcileNormal(machineScope *scope.PowerV
299
296
}
300
297
return ctrl.Result {}, nil
301
298
}
299
+
300
+ // IBMPowerVSClusterToIBMPowerVSMachines is a handler.ToRequestsFunc to be used to enqeue requests for reconciliation
301
+ // of IBMPowerVSMachines.
302
+ func (r * IBMPowerVSMachineReconciler ) IBMPowerVSClusterToIBMPowerVSMachines (ctx context.Context ) handler.MapFunc {
303
+ log := ctrl .LoggerFrom (ctx )
304
+ return func (mapCtx context.Context , o client.Object ) []ctrl.Request {
305
+ result := []ctrl.Request {}
306
+
307
+ c , ok := o .(* infrav1beta2.IBMPowerVSCluster )
308
+ if ! ok {
309
+ log .Error (errors .Errorf ("expected a IBMPowerVSCluster but got a %T" , o ), "failed to get IBMPowerVSMachines for IBMPowerVSCluster" )
310
+ return nil
311
+ }
312
+
313
+ cluster , err := util .GetOwnerCluster (mapCtx , r .Client , c .ObjectMeta )
314
+ switch {
315
+ case apierrors .IsNotFound (err ) || cluster == nil :
316
+ return result
317
+ case err != nil :
318
+ log .Error (err , "failed to get owning cluster" )
319
+ return result
320
+ }
321
+
322
+ labels := map [string ]string {capiv1beta1 .ClusterNameLabel : cluster .Name }
323
+ machineList := & capiv1beta1.MachineList {}
324
+ if err := r .List (mapCtx , machineList , client .InNamespace (c .Namespace ), client .MatchingLabels (labels )); err != nil {
325
+ log .Error (err , "failed to list Machines" )
326
+ return nil
327
+ }
328
+ for _ , m := range machineList .Items {
329
+ if m .Spec .InfrastructureRef .Name == "" {
330
+ continue
331
+ }
332
+ name := client.ObjectKey {Namespace : m .Namespace , Name : m .Spec .InfrastructureRef .Name }
333
+ result = append (result , ctrl.Request {NamespacedName : name })
334
+ }
335
+
336
+ return result
337
+ }
338
+ }
339
+
340
+ // SetupWithManager creates a new IBMVPCMachine controller for a manager.
341
+ func (r * IBMPowerVSMachineReconciler ) SetupWithManager (ctx context.Context , mgr ctrl.Manager ) error {
342
+ controller , err := ctrl .NewControllerManagedBy (mgr ).
343
+ For (& infrav1beta2.IBMPowerVSMachine {}).
344
+ WithEventFilter (predicates .ResourceNotPaused (ctrl .LoggerFrom (ctx ))).
345
+ Watches (
346
+ & capiv1beta1.Machine {},
347
+ handler .EnqueueRequestsFromMapFunc (util .MachineToInfrastructureMapFunc (infrav1beta2 .GroupVersion .WithKind ("IBMPowerVSMachine" ))),
348
+ ).
349
+ Watches (
350
+ & infrav1beta2.IBMPowerVSCluster {},
351
+ handler .EnqueueRequestsFromMapFunc (r .IBMPowerVSClusterToIBMPowerVSMachines (ctx )),
352
+ ).
353
+ Build (r )
354
+ if err != nil {
355
+ return errors .Wrap (err , "error creating controller" )
356
+ }
357
+
358
+ clusterToObjectFunc , err := util .ClusterToTypedObjectsMapper (r .Client , & infrav1beta2.IBMPowerVSMachineList {}, mgr .GetScheme ())
359
+ if err != nil {
360
+ return errors .Wrap (err , "failed to create mapper for Cluster to GCPMachines" )
361
+ }
362
+ // Add a watch on capiv1beta1.Cluster object for unpause & ready notifications.
363
+ if err := controller .Watch (
364
+ source .Kind (mgr .GetCache (), & capiv1beta1.Cluster {}),
365
+ handler .EnqueueRequestsFromMapFunc (clusterToObjectFunc ),
366
+ predicates .ClusterUnpausedAndInfrastructureReady (ctrl .LoggerFrom (ctx )),
367
+ ); err != nil {
368
+ return errors .Wrap (err , "failed adding a watch for ready clusters" )
369
+ }
370
+ return nil
371
+ }
0 commit comments