@@ -20,12 +20,14 @@ import (
20
20
"context"
21
21
"reflect"
22
22
23
+ "github.com/presslabs/controller-util/meta"
23
24
"github.com/presslabs/controller-util/syncer"
24
25
appsv1 "k8s.io/api/apps/v1"
25
26
corev1 "k8s.io/api/core/v1"
26
27
policyv1beta1 "k8s.io/api/policy/v1beta1"
27
28
rbacv1 "k8s.io/api/rbac/v1"
28
29
"k8s.io/apimachinery/pkg/api/errors"
30
+ "k8s.io/apimachinery/pkg/labels"
29
31
"k8s.io/apimachinery/pkg/runtime"
30
32
"k8s.io/client-go/tools/record"
31
33
ctrl "sigs.k8s.io/controller-runtime"
@@ -38,6 +40,8 @@ import (
38
40
clustersyncer "github.com/radondb/radondb-mysql-kubernetes/mysqlcluster/syncer"
39
41
)
40
42
43
+ var clusterFinalizer string = "mysqlcluster-finalizer"
44
+
41
45
// MysqlClusterReconciler reconciles a MysqlCluster object
42
46
type MysqlClusterReconciler struct {
43
47
client.Client
@@ -99,7 +103,17 @@ func (r *MysqlClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
99
103
}
100
104
}
101
105
}()
102
-
106
+ // Add finalizer if is not added on the resource.
107
+ if ! meta .HasFinalizer (& instance .ObjectMeta , clusterFinalizer ) {
108
+ meta .AddFinalizer (& instance .ObjectMeta , clusterFinalizer )
109
+ if err = r .Update (ctx , instance .Unwrap ()); err != nil {
110
+ return ctrl.Result {}, err
111
+ }
112
+ }
113
+ if ! instance .ObjectMeta .DeletionTimestamp .IsZero () {
114
+ // Delete all the backup cr
115
+ return ctrl.Result {}, r .deleteAllBackup (ctx , req , instance .Unwrap ())
116
+ }
103
117
mysqlCMSyncer := clustersyncer .NewMysqlCMSyncer (r .Client , instance )
104
118
if err = syncer .Sync (ctx , mysqlCMSyncer , r .Recorder ); err != nil {
105
119
return ctrl.Result {}, err
@@ -157,3 +171,36 @@ func (r *MysqlClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
157
171
Owns (& policyv1beta1.PodDisruptionBudget {}).
158
172
Complete (r )
159
173
}
174
+
175
+ // Delte all backup cr
176
+ func (r * MysqlClusterReconciler ) deleteAllBackup (ctx context.Context , req ctrl.Request , instance * apiv1alpha1.MysqlCluster ) error {
177
+ log := log .FromContext (ctx ).WithName ("controllers" ).WithName ("MysqlCluster" )
178
+ if ! meta .HasFinalizer (& instance .ObjectMeta , clusterFinalizer ) {
179
+ return nil
180
+ }
181
+ defer func () {
182
+ meta .RemoveFinalizer (& instance .ObjectMeta , clusterFinalizer )
183
+ // Update resource so it will remove the finalizer.
184
+ if err := r .Update (ctx , instance ); err != nil {
185
+ log .Error (err , "failed to update cluster" )
186
+ }
187
+ }()
188
+ labelSet := labels.Set {"cluster" : instance .Name }
189
+ backuplist := apiv1alpha1.BackupList {}
190
+ if err := r .List (ctx ,
191
+ & backuplist ,
192
+ & client.ListOptions {
193
+ Namespace : instance .Namespace ,
194
+ LabelSelector : labelSet .AsSelector (),
195
+ },
196
+ ); err != nil {
197
+ return err
198
+ }
199
+ for _ , bcp := range backuplist .Items {
200
+ if err := r .Delete (context .TODO (), & bcp ); err != nil {
201
+ log .Error (err , "failed to delete a backup" , "backup" , bcp )
202
+ }
203
+ }
204
+
205
+ return nil
206
+ }
0 commit comments