@@ -56,6 +56,41 @@ type FloatingIPBindingReconciler struct {
5656 DigitaloceanToken string
5757}
5858
59+ func (r * FloatingIPBindingReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
60+ return ctrl .NewControllerManagedBy (mgr ).
61+ For (& digitaloceanv1beta1.FloatingIPBinding {}).
62+ Watches (
63+ & source.Kind {Type : & v1.Node {}},
64+ & handler.EnqueueRequestsFromMapFunc {
65+ ToRequests : handler .ToRequestsFunc (r .nodeToRequest ),
66+ },
67+ ).
68+ Complete (r )
69+ }
70+
71+ func (r * FloatingIPBindingReconciler ) nodeToRequest (nodeMapObject handler.MapObject ) []reconcile.Request {
72+ // Whenever any node every happens reconcile ALL FloatingIPBindings
73+ // List all bindings
74+ var bindings digitaloceanv1beta1.FloatingIPBindingList
75+ err := r .List (context .Background (), & bindings )
76+ if err != nil {
77+ r .Log .Error (err , "Failed to list floating IP bindings" )
78+ return []reconcile.Request {}
79+ }
80+
81+ // Convert FloatingIPBindingList to []reconcile.Request
82+ var reconcileRequests []reconcile.Request
83+ for _ , binding := range bindings .Items {
84+ reconcileRequests = append (reconcileRequests , reconcile.Request {
85+ NamespacedName : types.NamespacedName {
86+ Name : binding .GetName (),
87+ Namespace : binding .GetNamespace (),
88+ },
89+ })
90+ }
91+ return reconcileRequests
92+ }
93+
5994// +kubebuilder:rbac:groups=digitalocean.smirlwebs.com,resources=floatingipbindings,verbs=get;list;watch;create;update;patch;delete
6095// +kubebuilder:rbac:groups=digitalocean.smirlwebs.com,resources=floatingipbindings/status,verbs=get;update;patch
6196// +kubebuilder:rbac:groups="",resources=nodes,verbs=get;watch;list
@@ -64,13 +99,16 @@ func (r *FloatingIPBindingReconciler) Reconcile(req ctrl.Request) (ctrl.Result,
6499 log := r .Log .WithValues ("floatingipbinding" , req .NamespacedName )
65100
66101 // Create a digitalocean client
102+ // TODO: Move to controller set up
67103 client := godo .NewFromToken (r .DigitaloceanToken )
68104
105+ // Get the FloatingIPBinding from Kubernetes
69106 binding , err := r .GetFloatingIPBinding (ctx , log , req .NamespacedName )
70107 if err != nil {
71108 return ctrl.Result {RequeueAfter : RequeueAfter }, err
72109 }
73110
111+ // Get the best node/droplet to assign to the floating IP
74112 droplet , err := r .GetDroplet (ctx , log , client , binding )
75113 if err != nil {
76114 return ctrl.Result {RequeueAfter : RequeueAfter }, err
@@ -80,52 +118,30 @@ func (r *FloatingIPBindingReconciler) Reconcile(req ctrl.Request) (ctrl.Result,
80118 return ctrl.Result {RequeueAfter : RequeueAfter }, err
81119 }
82120
121+ // Assign the droplet to the floating IP if required
83122 err = r .AssignFloatingIP (ctx , log , client , binding , droplet )
84123 if err != nil {
85124 return ctrl.Result {RequeueAfter : RequeueAfter }, err
86125 }
87126
88- return ctrl.Result {}, nil
89- }
90-
91- func (r * FloatingIPBindingReconciler ) SetupWithManager (mgr ctrl.Manager ) error {
92- return ctrl .NewControllerManagedBy (mgr ).
93- For (& digitaloceanv1beta1.FloatingIPBinding {}).
94- Watches (
95- & source.Kind {Type : & v1.Node {}},
96- & handler.EnqueueRequestsFromMapFunc {
97- ToRequests : handler .ToRequestsFunc (r .nodeToRequest ),
98- },
99- ).
100- Complete (r )
101- }
102-
103- func (r * FloatingIPBindingReconciler ) nodeToRequest (nodeMapObject handler.MapObject ) []reconcile.Request {
104-
105- var bindings digitaloceanv1beta1.FloatingIPBindingList
106- err := r .List (context .Background (), & bindings )
127+ // Update status
128+ binding .Status .AssignedDropletID = droplet .ID
129+ binding .Status .AssignedDropletName = droplet .Name
130+ err = r .Status ().Update (ctx , binding )
107131 if err != nil {
108- r . Log . Error (err , "Failed to list floating IP bindings " )
109- return []reconcile. Request {}
132+ log . Error (err , "Failed to update status " )
133+ return ctrl. Result { RequeueAfter : RequeueAfter }, err
110134 }
111135
112- var reconcileRequests []reconcile.Request
113- for _ , binding := range bindings .Items {
114- reconcileRequests = append (reconcileRequests , reconcile.Request {
115- NamespacedName : types.NamespacedName {
116- Name : binding .GetName (),
117- Namespace : binding .GetNamespace (),
118- },
119- })
120- }
121- return reconcileRequests
136+ return ctrl.Result {}, nil
122137}
123138
124139func (r * FloatingIPBindingReconciler ) GetFloatingIPBinding (
125140 ctx context.Context ,
126141 log logr.Logger ,
127142 name types.NamespacedName ,
128143) (* digitaloceanv1beta1.FloatingIPBinding , error ) {
144+ // Get the FloatingIPBinding from Kubernetes
129145 binding := & digitaloceanv1beta1.FloatingIPBinding {}
130146 if err := r .Get (ctx , name , binding ); err != nil {
131147 err = client .IgnoreNotFound (err )
@@ -222,6 +238,7 @@ func (r *FloatingIPBindingReconciler) AssignFloatingIP(
222238 return err
223239 }
224240
241+ // Assign droplet to floating IP if not already assigned
225242 if ip .Droplet != nil && ip .Droplet .ID == droplet .ID {
226243 log .Info ("Droplet is already assigned to floatingIP. Skipping." )
227244 } else {
@@ -234,13 +251,5 @@ func (r *FloatingIPBindingReconciler) AssignFloatingIP(
234251 log .Info ("Assigned droplet to FloatingIP" )
235252 }
236253
237- // Update status
238- binding .Status .AssignedDropletID = droplet .ID
239- binding .Status .AssignedDropletName = droplet .Name
240- err = r .Status ().Update (ctx , binding )
241- if err != nil {
242- log .Error (err , "Failed to update status" )
243- return err
244- }
245254 return nil
246255}
0 commit comments