From 8604b9dfe0e9abf8711415701ae0d74e78616c15 Mon Sep 17 00:00:00 2001 From: d-kuro Date: Wed, 11 Oct 2023 13:38:24 +0900 Subject: [PATCH] WIP: stop reconciliation and clustering Signed-off-by: d-kuro --- api/v1beta1/mysqlcluster_types.go | 12 ++-- api/v1beta2/mysqlcluster_types.go | 12 ++-- clustering/process.go | 8 +++ controllers/mysqlcluster_controller.go | 84 ++++++++++++++++++++++++++ pkg/constants/meta.go | 6 +- 5 files changed, 110 insertions(+), 12 deletions(-) diff --git a/api/v1beta1/mysqlcluster_types.go b/api/v1beta1/mysqlcluster_types.go index f78726ac2..0fc9700e3 100644 --- a/api/v1beta1/mysqlcluster_types.go +++ b/api/v1beta1/mysqlcluster_types.go @@ -288,11 +288,13 @@ type MySQLClusterStatus struct { } const ( - ConditionInitialized string = "Initialized" - ConditionAvailable string = "Available" - ConditionHealthy string = "Healthy" - ConditionStatefulSetReady string = "StatefulSetReady" - ConditionReconcileSuccess string = "ReconcileSuccess" + ConditionInitialized string = "Initialized" + ConditionAvailable string = "Available" + ConditionHealthy string = "Healthy" + ConditionStatefulSetReady string = "StatefulSetReady" + ConditionReconcileSuccess string = "ReconcileSuccess" + ConditionReconciliationActive string = "ReconciliationActive" + ConditionClusteringActive string = "ClusteringActive" ) // BackupStatus represents the status of the last successful backup. diff --git a/api/v1beta2/mysqlcluster_types.go b/api/v1beta2/mysqlcluster_types.go index 6a5965431..7f9146a53 100644 --- a/api/v1beta2/mysqlcluster_types.go +++ b/api/v1beta2/mysqlcluster_types.go @@ -602,11 +602,13 @@ type MySQLClusterStatus struct { } const ( - ConditionInitialized string = "Initialized" - ConditionAvailable string = "Available" - ConditionHealthy string = "Healthy" - ConditionStatefulSetReady string = "StatefulSetReady" - ConditionReconcileSuccess string = "ReconcileSuccess" + ConditionInitialized string = "Initialized" + ConditionAvailable string = "Available" + ConditionHealthy string = "Healthy" + ConditionStatefulSetReady string = "StatefulSetReady" + ConditionReconcileSuccess string = "ReconcileSuccess" + ConditionReconciliationActive string = "ReconciliationActive" + ConditionClusteringActive string = "ClusteringActive" ) // BackupStatus represents the status of the last successful backup. diff --git a/clustering/process.go b/clustering/process.go index baa0533d3..95fe95703 100644 --- a/clustering/process.go +++ b/clustering/process.go @@ -266,6 +266,14 @@ func (p *managerProcess) updateStatus(ctx context.Context, ss *StatusSet) error meta.SetStatusCondition(&cluster.Status.Conditions, updateCond(mocov1beta2.ConditionAvailable, available)) meta.SetStatusCondition(&cluster.Status.Conditions, updateCond(mocov1beta2.ConditionHealthy, healthy)) + meta.SetStatusCondition(&cluster.Status.Conditions, + metav1.Condition{ + Type: mocov1beta2.ConditionClusteringActive, + Status: metav1.ConditionTrue, + Reason: "ClusteringActive", + }, + ) + if available == metav1.ConditionTrue { p.metrics.available.Set(1) } else { diff --git a/controllers/mysqlcluster_controller.go b/controllers/mysqlcluster_controller.go index 62eb1089b..806391a59 100644 --- a/controllers/mysqlcluster_controller.go +++ b/controllers/mysqlcluster_controller.go @@ -259,6 +259,13 @@ func (r *MySQLClusterReconciler) reconcileV1(ctx context.Context, req ctrl.Reque return ctrl.Result{}, err } + if cluster.Annotations[constants.AnnClusteringStopped] == "true" { + if err := r.clusteringStopV1(ctx, cluster); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil + } + r.ClusterManager.Update(client.ObjectKeyFromObject(cluster), string(controller.ReconcileIDFromContext(ctx))) return ctrl.Result{}, nil } @@ -1914,12 +1921,89 @@ func (r *MySQLClusterReconciler) updateStatus(ctx context.Context, cluster *moco }, ) + meta.SetStatusCondition(&cluster.Status.Conditions, + metav1.Condition{ + Type: mocov1beta2.ConditionReconciliationActive, + Status: metav1.ConditionTrue, + Reason: "ReconciliationActive", + }, + ) + + if !equality.Semantic.DeepEqual(orig, cluster) { + if err := r.Status().Update(ctx, cluster); err != nil { + return err + } + log.Info("update status successfully") + } + return nil +} + +func (r *MySQLClusterReconciler) clusteringStopV1(ctx context.Context, cluster *mocov1beta2.MySQLCluster) error { + log := crlog.FromContext(ctx) + orig := cluster.DeepCopy() + + if meta.IsStatusConditionFalse(cluster.Status.Conditions, mocov1beta2.ConditionClusteringActive) { + return nil + } + + r.ClusterManager.Stop(types.NamespacedName{Namespace: cluster.Namespace, Name: cluster.Name}) + + for _, cond := range cluster.Status.Conditions { + if cond.Type == mocov1beta2.ConditionAvailable || cond.Type == mocov1beta2.ConditionHealthy { + cond.Status = metav1.ConditionUnknown + meta.SetStatusCondition(&orig.Status.Conditions, cond) + } + } + + meta.SetStatusCondition(&orig.Status.Conditions, + metav1.Condition{ + Type: mocov1beta2.ConditionClusteringActive, + Status: metav1.ConditionFalse, + }, + ) + if !equality.Semantic.DeepEqual(orig, cluster) { if err := r.Status().Update(ctx, cluster); err != nil { return err } log.Info("update status successfully") } + + return nil +} + +func (r *MySQLClusterReconciler) reconciliationStopV1(ctx context.Context, cluster *mocov1beta2.MySQLCluster) error { + log := crlog.FromContext(ctx) + orig := cluster.DeepCopy() + + if meta.IsStatusConditionFalse(cluster.Status.Conditions, mocov1beta2.ConditionClusteringActive) { + return nil + } + + r.ClusterManager.Stop(types.NamespacedName{Namespace: cluster.Namespace, Name: cluster.Name}) + + for _, cond := range cluster.Status.Conditions { + if cond.Type == mocov1beta2.ConditionAvailable || cond.Type == mocov1beta2.ConditionHealthy { + cond.Status = metav1.ConditionUnknown + meta.SetStatusCondition(&orig.Status.Conditions, cond) + } + } + + meta.SetStatusCondition(&orig.Status.Conditions, + metav1.Condition{ + Type: mocov1beta2.ConditionClusteringActive, + Status: metav1.ConditionFalse, + Reason: "ClusteringInactive", + }, + ) + + if !equality.Semantic.DeepEqual(orig, cluster) { + if err := r.Status().Update(ctx, cluster); err != nil { + return err + } + log.Info("update status successfully") + } + return nil } diff --git a/pkg/constants/meta.go b/pkg/constants/meta.go index 87c34c7dc..061284ee7 100644 --- a/pkg/constants/meta.go +++ b/pkg/constants/meta.go @@ -17,8 +17,10 @@ const ( // annotation keys and values const ( - AnnDemote = "moco.cybozu.com/demote" - AnnSecretVersion = "moco.cybozu.com/secret-version" + AnnDemote = "moco.cybozu.com/demote" + AnnSecretVersion = "moco.cybozu.com/secret-version" + AnnClusteringStopped = "moco.cybozu.com/clustering-stopped" + AnnReconciliationStopped = "moco.cybozu.com/reconciliation-stopped" ) // MySQLClusterFinalizer is the finalizer specifier for MySQLCluster.