@@ -20,12 +20,14 @@ import (
2020 "context"
2121 "reflect"
2222
23+ "github.com/presslabs/controller-util/meta"
2324 "github.com/presslabs/controller-util/syncer"
2425 appsv1 "k8s.io/api/apps/v1"
2526 corev1 "k8s.io/api/core/v1"
2627 policyv1beta1 "k8s.io/api/policy/v1beta1"
2728 rbacv1 "k8s.io/api/rbac/v1"
2829 "k8s.io/apimachinery/pkg/api/errors"
30+ "k8s.io/apimachinery/pkg/labels"
2931 "k8s.io/apimachinery/pkg/runtime"
3032 "k8s.io/client-go/tools/record"
3133 ctrl "sigs.k8s.io/controller-runtime"
@@ -38,6 +40,8 @@ import (
3840 clustersyncer "github.com/radondb/radondb-mysql-kubernetes/mysqlcluster/syncer"
3941)
4042
43+ var clusterFinalizer string = "mysqlcluster-finalizer"
44+
4145// MysqlClusterReconciler reconciles a MysqlCluster object
4246type MysqlClusterReconciler struct {
4347 client.Client
@@ -99,7 +103,17 @@ func (r *MysqlClusterReconciler) Reconcile(ctx context.Context, req ctrl.Request
99103 }
100104 }
101105 }()
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+ }
103117 mysqlCMSyncer := clustersyncer .NewMysqlCMSyncer (r .Client , instance )
104118 if err = syncer .Sync (ctx , mysqlCMSyncer , r .Recorder ); err != nil {
105119 return ctrl.Result {}, err
@@ -157,3 +171,36 @@ func (r *MysqlClusterReconciler) SetupWithManager(mgr ctrl.Manager) error {
157171 Owns (& policyv1beta1.PodDisruptionBudget {}).
158172 Complete (r )
159173}
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