Skip to content

Commit 77f7986

Browse files
authored
[fix] block credentials deletion until all dependent resources are cleaned up (#498)
* [fix] block credentials deletion until all dependent resources are cleaned up * add creds finalizers for linodemachine * update if confitional * add tests
1 parent f5e267e commit 77f7986

File tree

3 files changed

+64
-5
lines changed

3 files changed

+64
-5
lines changed

controller/linodecluster_controller.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package controller
1818

1919
import (
2020
"context"
21+
"errors"
2122
"fmt"
2223
"net/http"
2324
"time"
@@ -219,6 +220,10 @@ func (r *LinodeClusterReconciler) reconcileDelete(ctx context.Context, logger lo
219220
if clusterScope.LinodeCluster.Spec.Network.NodeBalancerID == nil && clusterScope.LinodeCluster.Spec.Network.LoadBalancerType != lbTypeDNS {
220221
logger.Info("NodeBalancer ID is missing, nothing to do")
221222

223+
if len(clusterScope.LinodeMachines.Items) > 0 {
224+
return errors.New("Waiting for associated LinodeMachine objects to be deleted")
225+
}
226+
222227
if err := clusterScope.RemoveCredentialsRefFinalizer(ctx); err != nil {
223228
logger.Error(err, "failed to remove credentials finalizer")
224229
setFailureReason(clusterScope, cerrs.DeleteClusterError, err, r)
@@ -250,6 +255,10 @@ func (r *LinodeClusterReconciler) reconcileDelete(ctx context.Context, logger lo
250255
clusterScope.LinodeCluster.Spec.Network.ApiserverNodeBalancerConfigID = nil
251256
clusterScope.LinodeCluster.Spec.Network.AdditionalPorts = []infrav1alpha2.LinodeNBPortConfig{}
252257

258+
if len(clusterScope.LinodeMachines.Items) > 0 {
259+
return errors.New("Waiting for associated LinodeMachine objects to be deleted")
260+
}
261+
253262
if err := clusterScope.RemoveCredentialsRefFinalizer(ctx); err != nil {
254263
logger.Error(err, "failed to remove credentials finalizer")
255264
setFailureReason(clusterScope, cerrs.DeleteClusterError, err, r)

controller/linodecluster_controller_test.go

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,19 @@ var _ = Describe("cluster-delete", Ordered, Label("cluster", "cluster-delete"),
360360
},
361361
}
362362

363+
linodeMachine := infrav1alpha2.LinodeMachine{
364+
ObjectMeta: metav1.ObjectMeta{
365+
Name: "test-machine",
366+
Namespace: defaultNamespace,
367+
},
368+
Spec: infrav1alpha2.LinodeMachineSpec{
369+
ProviderID: ptr.To("linode://123"),
370+
},
371+
Status: infrav1alpha2.LinodeMachineStatus{
372+
Addresses: []clusterv1.MachineAddress{},
373+
},
374+
}
375+
363376
ctlrSuite := NewControllerSuite(
364377
GinkgoT(),
365378
mock.MockLinodeClient{},
@@ -383,6 +396,11 @@ var _ = Describe("cluster-delete", Ordered, Label("cluster", "cluster-delete"),
383396
cScope.Client = mck.K8sClient
384397
mck.LinodeClient.EXPECT().DeleteNodeBalancer(gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
385398
}),
399+
Result("cluster deleted", func(ctx context.Context, mck Mock) {
400+
reconciler.Client = mck.K8sClient
401+
err := reconciler.reconcileDelete(ctx, logr.Logger{}, cScope)
402+
Expect(err).NotTo(HaveOccurred())
403+
}),
386404
),
387405
Path(
388406
Call("nothing to do because NB ID is nil", func(ctx context.Context, mck Mock) {
@@ -411,12 +429,40 @@ var _ = Describe("cluster-delete", Ordered, Label("cluster", "cluster-delete"),
411429
Expect(err.Error()).To(ContainSubstring("delete NB error"))
412430
}),
413431
),
432+
Path(
433+
Call("cluster not deleted because some LinodeMachines are yet to be deleted and NB present", func(ctx context.Context, mck Mock) {
434+
cScope.LinodeClient = mck.LinodeClient
435+
cScope.Client = mck.K8sClient
436+
cScope.LinodeCluster.Spec.Network.NodeBalancerID = &nodebalancerID
437+
mck.LinodeClient.EXPECT().DeleteNodeBalancer(gomock.Any(), gomock.Any()).Return(nil).AnyTimes()
438+
cScope.LinodeMachines = infrav1alpha2.LinodeMachineList{
439+
Items: []infrav1alpha2.LinodeMachine{linodeMachine},
440+
}
441+
}),
442+
Result("cluster not deleted because some LinodeMachines are yet to be deleted and NB present", func(ctx context.Context, mck Mock) {
443+
reconciler.Client = mck.K8sClient
444+
err := reconciler.reconcileDelete(ctx, logr.Logger{}, cScope)
445+
Expect(err).To(HaveOccurred())
446+
Expect(err.Error()).To(ContainSubstring("Waiting for associated LinodeMachine objects to be deleted"))
447+
}),
448+
),
449+
Path(
450+
Call("cluster not deleted because some LinodeMachines are yet to be deleted and NB nil", func(ctx context.Context, mck Mock) {
451+
cScope.LinodeClient = mck.LinodeClient
452+
cScope.Client = mck.K8sClient
453+
cScope.LinodeCluster.Spec.Network.NodeBalancerID = nil
454+
cScope.LinodeMachines = infrav1alpha2.LinodeMachineList{
455+
Items: []infrav1alpha2.LinodeMachine{linodeMachine},
456+
}
457+
}),
458+
Result("cluster not deleted because some LinodeMachines are yet to be deleted and NB nil", func(ctx context.Context, mck Mock) {
459+
reconciler.Client = mck.K8sClient
460+
err := reconciler.reconcileDelete(ctx, logr.Logger{}, cScope)
461+
Expect(err).To(HaveOccurred())
462+
Expect(err.Error()).To(ContainSubstring("Waiting for associated LinodeMachine objects to be deleted"))
463+
}),
464+
),
414465
),
415-
Result("cluster deleted", func(ctx context.Context, mck Mock) {
416-
reconciler.Client = mck.K8sClient
417-
err := reconciler.reconcileDelete(ctx, logr.Logger{}, cScope)
418-
Expect(err).NotTo(HaveOccurred())
419-
}),
420466
)
421467
})
422468

templates/infra/linodeMachineTemplate.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ metadata:
66
spec:
77
template:
88
spec:
9+
credentialsRef:
10+
name: ${CLUSTER_NAME}-credentials
911
image: ${LINODE_OS:="linode/ubuntu22.04"}
1012
type: ${LINODE_CONTROL_PLANE_MACHINE_TYPE}
1113
region: ${LINODE_REGION}
@@ -27,6 +29,8 @@ metadata:
2729
spec:
2830
template:
2931
spec:
32+
credentialsRef:
33+
name: ${CLUSTER_NAME}-credentials
3034
image: ${LINODE_OS:="linode/ubuntu22.04"}
3135
type: ${LINODE_MACHINE_TYPE}
3236
region: ${LINODE_REGION}

0 commit comments

Comments
 (0)