From 56b844c5aa6e33f880de4fe35cba2e0294a5bbfd Mon Sep 17 00:00:00 2001 From: Andrei Pavlov Date: Thu, 8 Aug 2024 18:32:19 +0700 Subject: [PATCH 1/2] Apply finalizer for Management object Signed-off-by: Andrei Pavlov --- api/v1alpha1/management_types.go | 2 ++ internal/controller/management_controller.go | 11 ++++++++++- internal/controller/release_controller.go | 12 +++++++----- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/api/v1alpha1/management_types.go b/api/v1alpha1/management_types.go index 8734f6bc7..6f5de43d1 100644 --- a/api/v1alpha1/management_types.go +++ b/api/v1alpha1/management_types.go @@ -30,6 +30,8 @@ const ( ManagementName = "hmc" ManagementNamespace = "hmc-system" + + ManagementFinalizer = "hmc.mirantis.com/management" ) // ManagementSpec defines the desired state of Management diff --git a/internal/controller/management_controller.go b/internal/controller/management_controller.go index f0b5239a2..cb1e5a882 100644 --- a/internal/controller/management_controller.go +++ b/internal/controller/management_controller.go @@ -28,10 +28,11 @@ import ( "k8s.io/client-go/rest" ctrl "sigs.k8s.io/controller-runtime" "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" hmc "github.com/Mirantis/hmc/api/v1alpha1" - certmanager "github.com/Mirantis/hmc/internal/certmanager" + "github.com/Mirantis/hmc/internal/certmanager" "github.com/Mirantis/hmc/internal/helm" ) @@ -56,6 +57,14 @@ func (r *ManagementReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, err } + finalizersUpdated := controllerutil.AddFinalizer(management, hmc.ManagementFinalizer) + if finalizersUpdated { + if err := r.Client.Update(ctx, management); err != nil { + return ctrl.Result{}, fmt.Errorf("failed to update Management %s/%s: %w", management.Namespace, management.Name, err) + } + return ctrl.Result{}, nil + } + // TODO: this should be implemented in admission controller instead if changed := applyDefaultCoreConfiguration(management); changed { l.Info("Applying default core configuration") diff --git a/internal/controller/release_controller.go b/internal/controller/release_controller.go index 9344f62a8..cd85321de 100644 --- a/internal/controller/release_controller.go +++ b/internal/controller/release_controller.go @@ -19,9 +19,6 @@ import ( "fmt" "time" - hmc "github.com/Mirantis/hmc/api/v1alpha1" - "github.com/Mirantis/hmc/internal/build" - "github.com/Mirantis/hmc/internal/helm" hcv2 "github.com/fluxcd/helm-controller/api/v2" "github.com/fluxcd/pkg/apis/meta" sourcev1 "github.com/fluxcd/source-controller/api/v1" @@ -31,6 +28,10 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/log" + + hmc "github.com/Mirantis/hmc/api/v1alpha1" + "github.com/Mirantis/hmc/internal/build" + "github.com/Mirantis/hmc/internal/helm" ) const ( @@ -101,8 +102,9 @@ func (p *Poller) ensureManagement(ctx context.Context) error { l := log.FromContext(ctx) mgmtObj := &hmc.Management{ ObjectMeta: metav1.ObjectMeta{ - Name: hmc.ManagementName, - Namespace: hmc.ManagementNamespace, + Name: hmc.ManagementName, + Namespace: hmc.ManagementNamespace, + Finalizers: []string{hmc.ManagementFinalizer}, }, } err := p.Get(ctx, client.ObjectKey{ From 7675a90985bb9ec011f882c04c3918f0797f5a99 Mon Sep 17 00:00:00 2001 From: Andrei Pavlov Date: Thu, 8 Aug 2024 18:39:44 +0700 Subject: [PATCH 2/2] Split Management reconcile into Update and Delete Signed-off-by: Andrei Pavlov --- internal/controller/management_controller.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/internal/controller/management_controller.go b/internal/controller/management_controller.go index cb1e5a882..afcdade21 100644 --- a/internal/controller/management_controller.go +++ b/internal/controller/management_controller.go @@ -45,18 +45,29 @@ type ManagementReconciler struct { func (r *ManagementReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { l := log.FromContext(ctx).WithValues("ManagementController", req.NamespacedName) + log.IntoContext(ctx, l) l.Info("Reconciling Management") - management := &hmc.Management{} if err := r.Get(ctx, req.NamespacedName, management); err != nil { if apierrors.IsNotFound(err) { - l.Info("Management config not found, ignoring since object must be deleted") + l.Info("Management not found, ignoring since object must be deleted") return ctrl.Result{}, nil } l.Error(err, "Failed to get Management") return ctrl.Result{}, err } + if !management.DeletionTimestamp.IsZero() { + l.Info("Deleting Management") + return r.Delete(ctx, management) + } + + return r.Update(ctx, management) +} + +func (r *ManagementReconciler) Update(ctx context.Context, management *hmc.Management) (ctrl.Result, error) { + l := log.FromContext(ctx) + finalizersUpdated := controllerutil.AddFinalizer(management, hmc.ManagementFinalizer) if finalizersUpdated { if err := r.Client.Update(ctx, management); err != nil { @@ -132,6 +143,10 @@ func (r *ManagementReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, nil } +func (r *ManagementReconciler) Delete(_ context.Context, _ *hmc.Management) (ctrl.Result, error) { + return ctrl.Result{}, nil +} + type component struct { hmc.Component // helm release dependencies