Skip to content

Commit 0f56c50

Browse files
authored
L4LBMeta CR's finalizer (#75)
Bug Fixes: - Added a finalizer to L4LBMeta CRs to address a bug where L4LBs were not properly deleted when a namespace was deleted due to issues arising from the L4LBMetas already being removed
1 parent 873b7a0 commit 0f56c50

File tree

5 files changed

+61
-27
lines changed

5 files changed

+61
-27
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ k8s
2626
.netrc
2727
testbin
2828
config/samples
29+
.vscode

controllers/l4lb_controller.go

+10-19
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929

3030
k8sv1alpha1 "github.com/netrisai/netris-operator/api/v1alpha1"
3131
"github.com/netrisai/netris-operator/netrisstorage"
32-
"github.com/netrisai/netriswebapi/http"
3332
api "github.com/netrisai/netriswebapi/v2"
3433
)
3534

@@ -94,13 +93,15 @@ func (r *L4LBReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
9493

9594
if l4lb.DeletionTimestamp != nil {
9695
logger.Info("Go to delete")
97-
_, err := r.deleteL4LB(l4lb, l4lbMeta)
96+
result, err := r.deleteL4LB(l4lb, l4lbMeta)
9897
if err != nil {
9998
logger.Error(fmt.Errorf("{deleteL4LB} %s", err), "")
10099
return u.patchL4LBStatus(l4lb, "Failure", err.Error())
101100
}
102-
logger.Info("L4LB deleted")
103-
return ctrl.Result{}, nil
101+
if result.IsZero() {
102+
logger.Info("L4LB deleted")
103+
}
104+
return result, nil
104105
}
105106

106107
if l4lbMustUpdateAnnotations(l4lb) {
@@ -159,6 +160,7 @@ func (r *L4LBReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
159160
}
160161

161162
l4lbMeta.Spec.L4LBCRGeneration = l4lb.GetGeneration()
163+
l4lbMeta.SetFinalizers([]string{"resource.k8s.netris.ai/delete"})
162164

163165
l4lbCreateCtx, l4lbCreateCancel := context.WithTimeout(cntxt, contextTimeout)
164166
defer l4lbCreateCancel()
@@ -172,19 +174,6 @@ func (r *L4LBReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
172174
}
173175

174176
func (r *L4LBReconciler) deleteL4LB(l4lb *k8sv1alpha1.L4LB, l4lbMeta *k8sv1alpha1.L4LBMeta) (ctrl.Result, error) {
175-
if l4lbMeta != nil && l4lbMeta.Spec.ID > 0 && !l4lbMeta.Spec.Reclaim {
176-
reply, err := r.Cred.L4LB().Delete(l4lbMeta.Spec.ID)
177-
if err != nil {
178-
return ctrl.Result{}, fmt.Errorf("{deleteL4LB} %s", err)
179-
}
180-
resp, err := http.ParseAPIResponse(reply.Data)
181-
if err != nil {
182-
return ctrl.Result{}, err
183-
}
184-
if resp.Meta.StatusCode != 200 && !resp.IsSuccess {
185-
fmt.Printf("{deleteL4LB} %s\n", resp.Message)
186-
}
187-
}
188177
return r.deleteCRs(l4lb, l4lbMeta)
189178
}
190179

@@ -194,9 +183,11 @@ func (r *L4LBReconciler) deleteCRs(l4lb *k8sv1alpha1.L4LB, l4lbMeta *k8sv1alpha1
194183
if err != nil {
195184
return ctrl.Result{}, fmt.Errorf("{deleteCRs} %s", err)
196185
}
186+
} else {
187+
return r.deleteL4LBCR(l4lb)
197188
}
198189

199-
return r.deleteL4LBCR(l4lb)
190+
return ctrl.Result{RequeueAfter: requeueInterval}, nil
200191
}
201192

202193
func (r *L4LBReconciler) deleteL4LBCR(l4lb *k8sv1alpha1.L4LB) (ctrl.Result, error) {
@@ -217,7 +208,7 @@ func (r *L4LBReconciler) deleteL4LBMetaCR(l4lbMeta *k8sv1alpha1.L4LBMeta) (ctrl.
217208
if err := r.Delete(ctx, l4lbMeta.DeepCopyObject(), &client.DeleteOptions{}); err != nil {
218209
return ctrl.Result{}, fmt.Errorf("{deleteL4LBMetaCR} %s", err)
219210
}
220-
return ctrl.Result{}, nil
211+
return ctrl.Result{RequeueAfter: requeueInterval}, nil
221212
}
222213

223214
// SetupWithManager .

controllers/l4lbmeta_controller.go

+37-4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,43 @@ func (r *L4LBMetaReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
6969
logger := r.Log.WithValues("name", fmt.Sprintf("%s/%s", req.NamespacedName.Namespace, l4lbMeta.Spec.L4LBName))
7070
debugLogger = logger.V(int(zapcore.WarnLevel))
7171

72+
if l4lbMeta.DeletionTimestamp != nil {
73+
if l4lbMeta.Spec.ID > 0 && !l4lbMeta.Spec.Reclaim {
74+
reply, err := r.Cred.L4LB().Delete(l4lbMeta.Spec.ID)
75+
if err != nil {
76+
return ctrl.Result{}, fmt.Errorf("{deleteL4LB} %s", err)
77+
}
78+
resp, err := http.ParseAPIResponse(reply.Data)
79+
if err != nil {
80+
return ctrl.Result{}, err
81+
}
82+
if !resp.IsSuccess && resp.Message != "Invalid load balancer" {
83+
return ctrl.Result{}, fmt.Errorf(resp.Message)
84+
}
85+
}
86+
87+
l4lbMeta.SetFinalizers(nil)
88+
l4lbCtx, l4lbCancel := context.WithTimeout(cntxt, contextTimeout)
89+
defer l4lbCancel()
90+
err := r.Update(l4lbCtx, l4lbMeta.DeepCopyObject(), &client.UpdateOptions{})
91+
if client.IgnoreNotFound(err) != nil {
92+
return ctrl.Result{RequeueAfter: requeueInterval}, fmt.Errorf("{DeleteL4LBMetaCR Finalizer} %s", err)
93+
}
94+
95+
return ctrl.Result{}, nil
96+
}
97+
98+
if l4lbMeta.GetFinalizers() == nil {
99+
l4lbMeta.SetFinalizers([]string{"resource.k8s.netris.ai/delete"})
100+
l4lbCtx, l4lbCancel := context.WithTimeout(cntxt, contextTimeout)
101+
defer l4lbCancel()
102+
err := r.Patch(l4lbCtx, l4lbMeta.DeepCopyObject(), client.Merge, &client.PatchOptions{})
103+
if err != nil {
104+
logger.Error(fmt.Errorf("{Patch L4LBMeta Finalizer} %s", err), "")
105+
return ctrl.Result{RequeueAfter: requeueInterval}, nil
106+
}
107+
}
108+
72109
u := uniReconciler{
73110
Client: r.Client,
74111
Logger: logger,
@@ -91,10 +128,6 @@ func (r *L4LBMetaReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
91128
return ctrl.Result{}, err
92129
}
93130

94-
if l4lbMeta.DeletionTimestamp != nil {
95-
return ctrl.Result{}, nil
96-
}
97-
98131
if l4lbMeta.Spec.ID == 0 {
99132
debugLogger.Info("ID Not found in meta")
100133
if l4lbMeta.Spec.Imported {

lbwatcher/lb_watcher.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,7 @@ func deleteL4LBs(cl client.Client, lbs []k8sv1alpha1.L4LB) []error {
205205
func deleteL4LB(cl client.Client, lb k8sv1alpha1.L4LB) error {
206206
ctx, cancel := context.WithTimeout(cntxt, contextTimeout)
207207
defer cancel()
208-
return cl.Delete(ctx, lb.DeepCopyObject(), &client.DeleteOptions{})
208+
return client.IgnoreNotFound(cl.Delete(ctx, lb.DeepCopyObject(), &client.DeleteOptions{}))
209209
}
210210

211211
func updateL4LBs(cl client.Client, lbs []k8sv1alpha1.L4LB, ipAuto map[string]string) []error {
@@ -387,7 +387,9 @@ func (w *Watcher) generateLoadBalancers(clientset *kubernetes.Clientset, autoIPs
387387
}
388388

389389
for _, pod := range podList.Items {
390-
hostIPs[pod.Status.HostIP] = 1
390+
if pod.Status.HostIP != "" {
391+
hostIPs[pod.Status.HostIP] = 1
392+
}
391393
}
392394

393395
var lbIPs []lbIP

lbwatcher/services.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
3030
"k8s.io/client-go/tools/record"
3131
"k8s.io/client-go/tools/reference"
32+
"sigs.k8s.io/controller-runtime/pkg/client"
3233
)
3334

3435
func getServices(clientset *kubernetes.Clientset, namespace string) (*v1.ServiceList, error) {
@@ -87,12 +88,18 @@ func createEvent(clientset *kubernetes.Clientset, recorder record.EventRecorder,
8788
defer cancel()
8889
service, err := clientset.CoreV1().Services(namespace).Get(ctx, name, metav1.GetOptions{})
8990
if err != nil {
90-
return fmt.Errorf("{createEvent} %s", err)
91+
if client.IgnoreNotFound(err) != nil {
92+
return fmt.Errorf("{createEvent GetService} %s", err)
93+
}
94+
return nil
9195
}
9296

9397
ref, err := reference.GetReference(scheme.Scheme, service)
9498
if err != nil {
95-
return fmt.Errorf("{createEvent} %s", err)
99+
if client.IgnoreNotFound(err) != nil {
100+
return fmt.Errorf("{createEvent GetReference} %s", err)
101+
}
102+
return nil
96103
}
97104
recorder.Event(ref, v1.EventTypeWarning, reason, message)
98105

0 commit comments

Comments
 (0)