Skip to content

Commit 9a99dfa

Browse files
authored
🌡️ add module resource finalizer (#842)
1 parent 2606e76 commit 9a99dfa

File tree

3 files changed

+49
-21
lines changed

3 files changed

+49
-21
lines changed

cyclops-ctrl/api/v1alpha1/module_types.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ const (
5252

5353
AddonModuleLabel = "cyclops-ui.com/addon"
5454
MCPServerModuleLabel = "cyclops-ui.com/mcp-server"
55+
56+
ResourceFinalizer = "cyclops-ui.com/module-resources"
5557
)
5658

5759
type TemplateRef struct {

cyclops-ctrl/internal/mapper/modules.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,9 @@ func RequestToModule(req dto.Module) (cyclopsv1alpha1.Module, error) {
3636
ObjectMeta: metav1.ObjectMeta{
3737
Name: req.Name,
3838
Annotations: annotations,
39+
Finalizers: []string{
40+
cyclopsv1alpha1.ResourceFinalizer,
41+
},
3942
},
4043
Spec: cyclopsv1alpha1.ModuleSpec{
4144
TargetNamespace: mapTargetNamespace(req.Namespace),

cyclops-ctrl/internal/modulecontroller/module_controller.go

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import (
2828

2929
"github.com/go-logr/logr"
3030
"helm.sh/helm/v3/pkg/chart"
31-
apierrors "k8s.io/apimachinery/pkg/api/errors"
3231
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
3332
"k8s.io/apimachinery/pkg/runtime"
3433
"k8s.io/apimachinery/pkg/types"
@@ -37,6 +36,7 @@ import (
3736
ctrl "sigs.k8s.io/controller-runtime"
3837
"sigs.k8s.io/controller-runtime/pkg/client"
3938
"sigs.k8s.io/controller-runtime/pkg/controller"
39+
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
4040
"sigs.k8s.io/controller-runtime/pkg/log"
4141

4242
cyclopsv1alpha1 "github.com/cyclops-ui/cyclops/cyclops-ctrl/api/v1alpha1"
@@ -107,33 +107,34 @@ func (r *ModuleReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctr
107107

108108
var module cyclopsv1alpha1.Module
109109
err := r.Get(ctx, req.NamespacedName, &module)
110-
if apierrors.IsNotFound(err) {
111-
r.logger.Info("delete module", "namespaced name", req.NamespacedName)
112-
resources, err := r.kubernetesClient.GetResourcesForModule(req.Name)
113-
if err != nil {
110+
if err != nil {
111+
if client.IgnoreNotFound(err) != nil {
114112
r.logger.Error(err, "error on get module resources", "namespaced name", req.NamespacedName)
115-
r.monitor.OnFailedReconciliation()
116-
return ctrl.Result{}, err
117113
}
114+
return ctrl.Result{}, client.IgnoreNotFound(err)
115+
}
118116

119-
for _, resource := range resources {
120-
if err := r.kubernetesClient.Delete(resource); err != nil {
121-
r.logger.Error(
122-
err,
123-
"error on delete module while deleting resource",
124-
"module namespaced name",
125-
req.NamespacedName,
126-
"resource namespaced name",
127-
fmt.Sprintf("%s/%s", resource.GetNamespace(), resource.GetName()),
128-
)
117+
if module.GetDeletionTimestamp() != nil {
118+
if controllerutil.ContainsFinalizer(&module, cyclopsv1alpha1.ResourceFinalizer) {
119+
if err := r.finalizeModule(module); err != nil {
120+
return ctrl.Result{}, err
129121
}
130-
}
131122

123+
controllerutil.RemoveFinalizer(&module, cyclopsv1alpha1.ResourceFinalizer)
124+
err := r.Update(ctx, &module)
125+
if err != nil {
126+
return ctrl.Result{}, err
127+
}
128+
}
132129
return ctrl.Result{}, nil
133130
}
134-
if err != nil {
135-
r.monitor.OnFailedReconciliation()
136-
return ctrl.Result{}, err
131+
132+
if !controllerutil.ContainsFinalizer(&module, cyclopsv1alpha1.ResourceFinalizer) {
133+
controllerutil.AddFinalizer(&module, cyclopsv1alpha1.ResourceFinalizer)
134+
err = r.Update(ctx, &module)
135+
if err != nil {
136+
return ctrl.Result{}, err
137+
}
137138
}
138139

139140
if len(module.Labels) != 0 && module.Labels[cyclopsv1alpha1.ModuleManagerLabel] == "mcp" {
@@ -431,6 +432,28 @@ func (r *ModuleReconciler) mergeChildrenGVRs(existing, current []cyclopsv1alpha1
431432
return merged
432433
}
433434

435+
func (r *ModuleReconciler) finalizeModule(module cyclopsv1alpha1.Module) error {
436+
resources, err := r.kubernetesClient.GetResourcesForModule(module.Name)
437+
if err != nil {
438+
return err
439+
}
440+
441+
for _, resource := range resources {
442+
if err := r.kubernetesClient.Delete(resource); err != nil {
443+
r.logger.Error(
444+
err,
445+
"error finalizing module: failed to delete module",
446+
"module",
447+
module.Name,
448+
"resource namespaced name",
449+
fmt.Sprintf("%s/%s", resource.GetNamespace(), resource.GetName()),
450+
)
451+
}
452+
}
453+
454+
return nil
455+
}
456+
434457
func (r *ModuleReconciler) setStatus(
435458
ctx context.Context,
436459
module cyclopsv1alpha1.Module,

0 commit comments

Comments
 (0)