This is an automated email from the ASF dual-hosted git repository.

miaoliyao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/shardingsphere-on-cloud.git


The following commit(s) were added to refs/heads/main by this push:
     new 78f4bc7  refactor(controller): change chaos deletion to finalizer 
rather than ownreference
     new ac6fab1  Merge pull request #337 from moomman/add-finalizer
78f4bc7 is described below

commit 78f4bc7aed73d9457945d60725bde129cd579c22
Author: moonman <[email protected]>
AuthorDate: Fri May 5 14:58:14 2023 +0800

    refactor(controller): change chaos deletion to finalizer rather than 
ownreference
---
 .../controllers/shardingsphere_chaos_controller.go | 82 +++++++++++++++++++---
 .../pkg/kubernetes/chaosmesh/builder.go            | 13 +---
 .../pkg/kubernetes/chaosmesh/chaosmesh.go          | 34 +++++++++
 3 files changed, 108 insertions(+), 21 deletions(-)

diff --git 
a/shardingsphere-operator/pkg/controllers/shardingsphere_chaos_controller.go 
b/shardingsphere-operator/pkg/controllers/shardingsphere_chaos_controller.go
index 1a56743..f20b999 100644
--- a/shardingsphere-operator/pkg/controllers/shardingsphere_chaos_controller.go
+++ b/shardingsphere-operator/pkg/controllers/shardingsphere_chaos_controller.go
@@ -24,6 +24,8 @@ import (
        "strings"
        "time"
 
+       "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
+
        
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
        sschaos 
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/pkg/kubernetes/chaosmesh"
        
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/pkg/kubernetes/configmap"
@@ -48,6 +50,7 @@ import (
 const (
        ShardingSphereChaosControllerName = "shardingsphere-chaos-controller"
        VerifyJobCheck                    = "Verify"
+       SSChaosFinalizeName               = 
"shardingsphere.apache.org/finalizer"
 )
 
 type JobCondition string
@@ -80,6 +83,7 @@ func (r *ShardingSphereChaosReconciler) Reconcile(ctx 
context.Context, req ctrl.
        logger := r.Log.WithValues(ShardingSphereChaosControllerName, 
req.NamespacedName)
 
        ssChaos, err := r.getRuntimeChaos(ctx, req.NamespacedName)
+
        if err != nil {
                if apierrors.IsNotFound(err) {
                        return ctrl.Result{RequeueAfter: defaultRequeueTime}, 
nil
@@ -89,8 +93,8 @@ func (r *ShardingSphereChaosReconciler) Reconcile(ctx 
context.Context, req ctrl.
                return ctrl.Result{Requeue: true}, err
        }
 
-       if !ssChaos.ObjectMeta.DeletionTimestamp.IsZero() {
-               return ctrl.Result{}, nil
+       if err := r.finalize(ctx, ssChaos); err != nil {
+               return ctrl.Result{Requeue: true}, err
        }
 
        logger.Info("start reconcile chaos")
@@ -125,6 +129,58 @@ func (r *ShardingSphereChaosReconciler) 
getRuntimeChaos(ctx context.Context, nam
        return rt, err
 }
 
+// nolint:nestif
+func (r *ShardingSphereChaosReconciler) finalize(ctx context.Context, chao 
*v1alpha1.ShardingSphereChaos) error {
+       if chao.ObjectMeta.DeletionTimestamp.IsZero() {
+               if !controllerutil.ContainsFinalizer(chao, SSChaosFinalizeName) 
{
+                       controllerutil.AddFinalizer(chao, SSChaosFinalizeName)
+                       if err := r.Update(ctx, chao); err != nil {
+                               return err
+                       }
+               }
+       } else if controllerutil.ContainsFinalizer(chao, SSChaosFinalizeName) {
+               if err := r.deleteExternalResources(ctx, chao); err != nil {
+                       return err
+               }
+
+               controllerutil.RemoveFinalizer(chao, SSChaosFinalizeName)
+               if err := r.Update(ctx, chao); err != nil {
+                       return err
+               }
+       }
+
+       return nil
+}
+
+func (r *ShardingSphereChaosReconciler) deleteExternalResources(ctx 
context.Context, chao *v1alpha1.ShardingSphereChaos) error {
+       nameSpacedName := types.NamespacedName{Namespace: chao.Namespace, Name: 
chao.Name}
+       if chao.Spec.EmbedChaos.PodChaos != nil {
+               podchao, err := r.getPodChaosByNamespacedName(ctx, 
nameSpacedName)
+               if err != nil {
+                       return err
+               }
+               if podchao != nil {
+                       if err := r.Chaos.DeletePodChaos(ctx, podchao); err != 
nil {
+                               return err
+                       }
+               }
+       }
+
+       if chao.Spec.EmbedChaos.NetworkChaos != nil {
+               networkchao, err := r.getNetworkChaosByNamespacedName(ctx, 
nameSpacedName)
+               if err != nil {
+                       return err
+               }
+               if networkchao != nil {
+                       if err := r.Chaos.DeleteNetworkChaos(ctx, networkchao); 
err != nil {
+                               return err
+                       }
+               }
+       }
+
+       return nil
+}
+
 func (r *ShardingSphereChaosReconciler) reconcileChaos(ctx context.Context, 
chaos *v1alpha1.ShardingSphereChaos) error {
        logger := r.Log.WithValues("reconcile shardingspherechaos", 
fmt.Sprintf("%s/%s", chaos.Namespace, chaos.Name))
 
@@ -189,7 +245,6 @@ func (r *ShardingSphereChaosReconciler) updatePodChaos(ctx 
context.Context, chao
                return err
        }
 
-       r.Events.Event(chaos, "Normal", "applied", fmt.Sprintf("podChaos %s", 
"new changes updated"))
        return nil
 }
 
@@ -210,7 +265,7 @@ func (r *ShardingSphereChaosReconciler) 
updateNetWorkChaos(ctx context.Context,
        if err != nil {
                return err
        }
-       r.Events.Event(chaos, "Normal", "applied", fmt.Sprintf("networkChaos 
%s", "new changes updated"))
+
        return nil
 }
 
@@ -283,6 +338,17 @@ func (r *ShardingSphereChaosReconciler) reconcileJob(ctx 
context.Context, chaos
 }
 
 func (r *ShardingSphereChaosReconciler) reconcileStatus(ctx context.Context, 
chaos *v1alpha1.ShardingSphereChaos) error {
+       namespacedName := types.NamespacedName{
+               Name:      chaos.Name,
+               Namespace: chaos.Namespace,
+       }
+       chaos, err := r.getRuntimeChaos(ctx, namespacedName)
+       if err != nil {
+               if apierrors.IsNotFound(err) {
+                       return nil
+               }
+               return err
+       }
        r.setDefaultStatus(chaos)
 
        req := getInjectRequirement(chaos)
@@ -312,10 +378,7 @@ func (r *ShardingSphereChaosReconciler) 
reconcileStatus(ctx context.Context, cha
        }
 
        // sts := setRtStatus(chaos)
-       rt, err := r.getRuntimeChaos(ctx, types.NamespacedName{
-               Name:      chaos.Name,
-               Namespace: chaos.Namespace,
-       })
+       rt, err := r.getRuntimeChaos(ctx, namespacedName)
        if err != nil {
                return err
        }
@@ -589,7 +652,6 @@ func (r *ShardingSphereChaosReconciler) updateJob(ctx 
context.Context, requireme
                if err := r.Delete(ctx, cur); err != nil && 
!apierrors.IsNotFound(err) {
                        return err
                }
-               // r.Events.Event(chao, "Normal", "Updated", "job Updated")
        }
        return nil
 }
@@ -665,6 +727,8 @@ func (r *ShardingSphereChaosReconciler) createJob(ctx 
context.Context, requireme
                        return err
                }
        }
+
+       r.Events.Event(chao, "Normal", "Created", fmt.Sprintf("%s job created", 
requirement))
        return nil
 }
 
diff --git a/shardingsphere-operator/pkg/kubernetes/chaosmesh/builder.go 
b/shardingsphere-operator/pkg/kubernetes/chaosmesh/builder.go
index 19986c9..16ad0fb 100644
--- a/shardingsphere-operator/pkg/kubernetes/chaosmesh/builder.go
+++ b/shardingsphere-operator/pkg/kubernetes/chaosmesh/builder.go
@@ -145,12 +145,6 @@ func NewPodChaos(ssChao *v1alpha1.ShardingSphereChaos) 
(PodChaos, error) {
        pcb.SetContainerSelector(containerSelector)
        podChao := pcb.Build()
 
-       // FIXME
-       /*
-               if err := ctrl.SetControllerReference(ssChao, podChao, 
c.r.Scheme()); err != nil {
-                       return nil, err
-               }
-       */
        return podChao, nil
 }
 
@@ -250,12 +244,7 @@ func NewNetworkChaos(ssChao *v1alpha1.ShardingSphereChaos) 
(NetworkChaos, error)
        ncb.SetTcParameter(*tcParams)
 
        networkChao := ncb.Build()
-       // FIXME
-       /*
-               if err := ctrl.SetControllerReference(ssChao, networkChao, 
c.r.Scheme()); err != nil {
-                       return nil, err
-               }
-       */
+
        return networkChao, nil
 }
 
diff --git a/shardingsphere-operator/pkg/kubernetes/chaosmesh/chaosmesh.go 
b/shardingsphere-operator/pkg/kubernetes/chaosmesh/chaosmesh.go
index 30a006c..8aebab7 100644
--- a/shardingsphere-operator/pkg/kubernetes/chaosmesh/chaosmesh.go
+++ b/shardingsphere-operator/pkg/kubernetes/chaosmesh/chaosmesh.go
@@ -19,6 +19,7 @@ package chaosmesh
 
 import (
        "context"
+       "reflect"
 
        
"github.com/apache/shardingsphere-on-cloud/shardingsphere-operator/api/v1alpha1"
        chaosmeshapi "github.com/chaos-mesh/chaos-mesh/api/v1alpha1"
@@ -69,9 +70,11 @@ type Getter interface {
 type Setter interface {
        CreatePodChaos(context.Context, *v1alpha1.ShardingSphereChaos) error
        UpdatePodChaos(context.Context, PodChaos, 
*v1alpha1.ShardingSphereChaos) error
+       DeletePodChaos(context.Context, PodChaos) error
 
        CreateNetworkChaos(context.Context, *v1alpha1.ShardingSphereChaos) error
        UpdateNetworkChaos(context.Context, NetworkChaos, 
*v1alpha1.ShardingSphereChaos) error
+       DeleteNetworkChaos(context.Context, NetworkChaos) error
 }
 
 type getter struct {
@@ -145,11 +148,27 @@ func (cs setter) UpdatePodChaos(ctx context.Context, 
podChaos PodChaos, sschaos
        if !ok {
                return ErrConvert
        }
+       if reflect.DeepEqual(s.Spec, t.Spec) {
+               return nil
+       }
        t.Spec = s.Spec
 
        return cs.Client.Update(ctx, t)
 }
 
+// DeletePodChaos deletes a pod chaos
+func (cs setter) DeletePodChaos(ctx context.Context, chao PodChaos) error {
+       podChao, ok := chao.(*chaosmeshapi.PodChaos)
+       if !ok {
+               return ErrConvert
+       }
+       if err := cs.Client.Delete(ctx, podChao); err != nil {
+               return err
+       }
+
+       return nil
+}
+
 // CreateNetworkChaos creates a new network chaos
 func (cs setter) CreateNetworkChaos(ctx context.Context, sschaos 
*v1alpha1.ShardingSphereChaos) error {
        nc, err := NewNetworkChaos(sschaos)
@@ -173,7 +192,22 @@ func (cs setter) UpdateNetworkChaos(ctx context.Context, 
networkChaos NetworkCha
        if !ok {
                return ErrConvert
        }
+       if reflect.DeepEqual(s.Spec, t.Spec) {
+               return nil
+       }
        t.Spec = s.Spec
 
        return cs.Client.Update(ctx, t)
 }
+
+func (cs setter) DeleteNetworkChaos(ctx context.Context, chao NetworkChaos) 
error {
+       networkChaos, ok := chao.(*chaosmeshapi.NetworkChaos)
+       if !ok {
+               return ErrConvert
+       }
+       if err := cs.Client.Delete(ctx, networkChaos); err != nil {
+               return err
+       }
+
+       return nil
+}

Reply via email to