Skip to content

Commit 4ea1492

Browse files
authored
Merge pull request #581 from acekingke/fixBackupCrDelete
controller: delete cluster then delete backup cr #570
2 parents 6076749 + 8f12a60 commit 4ea1492

File tree

1 file changed

+48
-1
lines changed

1 file changed

+48
-1
lines changed

controllers/mysqlcluster_controller.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
4246
type 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

Comments
 (0)