From 008b88700a85b5bcb58af9c3433d2d39e03020a6 Mon Sep 17 00:00:00 2001 From: Hidde Beydals Date: Thu, 14 Dec 2023 15:02:46 +0100 Subject: [PATCH] controller: reset field managers for `v2beta1` Signed-off-by: Hidde Beydals --- internal/controller/helmrelease_controller.go | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/internal/controller/helmrelease_controller.go b/internal/controller/helmrelease_controller.go index 653295783..46267df91 100644 --- a/internal/controller/helmrelease_controller.go +++ b/internal/controller/helmrelease_controller.go @@ -55,6 +55,7 @@ import ( "github.com/fluxcd/pkg/runtime/predicates" sourcev1 "github.com/fluxcd/source-controller/api/v1beta2" + "github.com/fluxcd/helm-controller/api/v2beta1" v2 "github.com/fluxcd/helm-controller/api/v2beta2" intacl "github.com/fluxcd/helm-controller/internal/acl" "github.com/fluxcd/helm-controller/internal/action" @@ -142,12 +143,17 @@ func (r *HelmReleaseReconciler) Reconcile(ctx context.Context, req ctrl.Request) start := time.Now() log := ctrl.LoggerFrom(ctx) - // Fetch the HelmRelease + // Fetch the HelmRelease. obj := &v2.HelmRelease{} if err := r.Get(ctx, req.NamespacedName, obj); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } + // Conditionally reset the field managers for the object. + if err := r.resetFieldManagers(ctx, obj); err != nil { + return ctrl.Result{}, err + } + // Initialize the patch helper with the current version of the object. patchHelper := patch.NewSerialPatcher(obj, r.Client) @@ -663,6 +669,25 @@ func (r *HelmReleaseReconciler) waitForHistoryCacheSync(obj *v2.HelmRelease) wai } } +// resetFieldManagers resets the field managers for the given v2beta2.HelmRelease +// when any of the fields are reported as v2beta1.HelmRelease fields. +// This is required to prevent any conversion conflicts when newly added fields +// are not present in the v2beta1.HelmRelease, or when the v2beta1.HelmRelease +// is eventually removed. +// xref: https://github.com/kubernetes/kubernetes/issues/111937 +func (r *HelmReleaseReconciler) resetFieldManagers(ctx context.Context, obj *v2.HelmRelease) error { + for _, f := range obj.GetManagedFields() { + if f.APIVersion == v2beta1.GroupVersion.String() { + if err := r.Client.Patch(ctx, obj, client.RawPatch(types.MergePatchType, []byte(`{"metadata":{"managedFields": [{}]}}`))); err != nil { + return err + } + controllerutil.RemoveFinalizer(obj, v2beta1.HelmReleaseFinalizer) + break + } + } + return nil +} + func (r *HelmReleaseReconciler) requestsForHelmChartChange(ctx context.Context, o client.Object) []reconcile.Request { hc, ok := o.(*sourcev1.HelmChart) if !ok {