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
+}