Skip to content

Commit d9636e5

Browse files
authored
Merge pull request #7 from Smirl/clean-up-1
Better inline comments and status update in Reconcile
2 parents 9a5d9b9 + 234b6b6 commit d9636e5

File tree

1 file changed

+48
-39
lines changed

1 file changed

+48
-39
lines changed

controllers/floatingipbinding_controller.go

Lines changed: 48 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -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

124139
func (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

Comments
 (0)