From aaef5c98f8aea0ce77c6e903438a4febdf8e13d8 Mon Sep 17 00:00:00 2001 From: Simon Bouchard Date: Fri, 25 Apr 2025 15:51:50 -0400 Subject: [PATCH] Resolve linter issue due to cognitive complexity Signed-off-by: Simon Bouchard --- pkg/state/state.go | 146 +++++++++++++++++++++++---------------------- 1 file changed, 76 insertions(+), 70 deletions(-) diff --git a/pkg/state/state.go b/pkg/state/state.go index cfb41e45..8216b806 100644 --- a/pkg/state/state.go +++ b/pkg/state/state.go @@ -1050,76 +1050,7 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme m.Unlock() } } else if release.UpdateStrategy == "reinstall" || release.UpdateStrategy == "reinstallIfForbidden" { - syncSuccessful := false - if release.UpdateStrategy == "reinstallIfForbidden" { - if err := helm.SyncRelease(context, release.Name, chart, release.Namespace, flags...); err != nil { - st.logger.Debugf("reinstallIfForbidden update strategy - sync failed: %s", err.Error()) - // Only fail if a different error than forbidden updates - if !strings.Contains(err.Error(), "Forbidden: updates") { - st.logger.Debugf("reinstallIfForbidden update strategy - sync failed not due to Fobidden updates") - m.Lock() - affectedReleases.Failed = append(affectedReleases.Failed, release) - m.Unlock() - relErr = newReleaseFailedError(release, err) - } - } else { - st.logger.Debugf("reinstallIfForbidden update strategy - sync success") - syncSuccessful = true - m.Lock() - affectedReleases.Upgraded = append(affectedReleases.Upgraded, release) - m.Unlock() - installedVersion, err := st.getDeployedVersion(context, helm, release) - if err != nil { // err is not really impacting so just log it - st.logger.Debugf("getting deployed release version failed: %v", err) - } else { - release.installedVersion = installedVersion - } - } - } - // Don't attempt to reinstall if a sync was successful - if !syncSuccessful { - st.logger.Debugf("reinstallIfForbidden update strategy - reinstalling...") - installed, err := st.isReleaseInstalled(context, helm, *release) - if err != nil { - relErr = newReleaseFailedError(release, err) - } - if installed { - var args []string - if release.Namespace != "" { - args = append(args, "--namespace", release.Namespace) - } - args = st.appendDeleteWaitFlags(args, release) - deletionFlags := st.appendConnectionFlags(args, release) - m.Lock() - if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, release) - relErr = newReleaseFailedError(release, err) - } else if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, release) - relErr = newReleaseFailedError(release, err) - } else if _, err := st.triggerReleaseEvent("postuninstall", nil, release, "sync"); err != nil { - affectedReleases.Failed = append(affectedReleases.Failed, release) - relErr = newReleaseFailedError(release, err) - } - m.Unlock() - } - if err := helm.SyncRelease(context, release.Name, chart, release.Namespace, flags...); err != nil { - m.Lock() - affectedReleases.Failed = append(affectedReleases.Failed, release) - m.Unlock() - relErr = newReleaseFailedError(release, err) - } else { - m.Lock() - affectedReleases.Reinstalled = append(affectedReleases.Reinstalled, release) - m.Unlock() - installedVersion, err := st.getDeployedVersion(context, helm, release) - if err != nil { // err is not really impacting so just log it - st.logger.Debugf("getting deployed release version failed: %v", err) - } else { - release.installedVersion = installedVersion - } - } - } + relErr = st.performSyncOrReinstallOfRelease(affectedReleases, helm, context, release, chart, m, flags...) } else { if err := helm.SyncRelease(context, release.Name, chart, release.Namespace, flags...); err != nil { m.Lock() @@ -1181,6 +1112,81 @@ func (st *HelmState) SyncReleases(affectedReleases *AffectedReleases, helm helme return nil } +func (st *HelmState) performSyncOrReinstallOfRelease(affectedReleases *AffectedReleases, helm helmexec.Interface, context helmexec.HelmContext, release *ReleaseSpec, chart string, m *sync.Mutex, flags ...string) *ReleaseError { + syncSuccessful := false + if release.UpdateStrategy == "reinstallIfForbidden" { + if err := helm.SyncRelease(context, release.Name, chart, release.Namespace, flags...); err != nil { + st.logger.Debugf("reinstallIfForbidden update strategy - sync failed: %s", err.Error()) + // Only fail if a different error than forbidden updates + if !strings.Contains(err.Error(), "Forbidden: updates") { + st.logger.Debugf("reinstallIfForbidden update strategy - sync failed not due to Fobidden updates") + m.Lock() + affectedReleases.Failed = append(affectedReleases.Failed, release) + m.Unlock() + return newReleaseFailedError(release, err) + } + } else { + st.logger.Debugf("reinstallIfForbidden update strategy - sync success") + syncSuccessful = true + m.Lock() + affectedReleases.Upgraded = append(affectedReleases.Upgraded, release) + m.Unlock() + installedVersion, err := st.getDeployedVersion(context, helm, release) + if err != nil { // err is not really impacting so just log it + st.logger.Debugf("getting deployed release version failed: %v", err) + } else { + release.installedVersion = installedVersion + } + } + } + // Don't attempt to reinstall if a sync was successful or needed a forced reinstall + if !syncSuccessful { + st.logger.Debugf("reinstallIfForbidden update strategy - reinstalling...") + installed, err := st.isReleaseInstalled(context, helm, *release) + if err != nil { + return newReleaseFailedError(release, err) + } + if installed { + var args []string + if release.Namespace != "" { + args = append(args, "--namespace", release.Namespace) + } + args = st.appendDeleteWaitFlags(args, release) + deletionFlags := st.appendConnectionFlags(args, release) + m.Lock() + if _, err := st.triggerReleaseEvent("preuninstall", nil, release, "sync"); err != nil { + affectedReleases.Failed = append(affectedReleases.Failed, release) + return newReleaseFailedError(release, err) + } else if err := helm.DeleteRelease(context, release.Name, deletionFlags...); err != nil { + affectedReleases.Failed = append(affectedReleases.Failed, release) + return newReleaseFailedError(release, err) + } else if _, err := st.triggerReleaseEvent("postuninstall", nil, release, "sync"); err != nil { + affectedReleases.Failed = append(affectedReleases.Failed, release) + return newReleaseFailedError(release, err) + } + m.Unlock() + } + if err := helm.SyncRelease(context, release.Name, chart, release.Namespace, flags...); err != nil { + m.Lock() + affectedReleases.Failed = append(affectedReleases.Failed, release) + m.Unlock() + return newReleaseFailedError(release, err) + } else { + m.Lock() + affectedReleases.Reinstalled = append(affectedReleases.Reinstalled, release) + m.Unlock() + installedVersion, err := st.getDeployedVersion(context, helm, release) + if err != nil { // err is not really impacting so just log it + st.logger.Debugf("getting deployed release version failed: %v", err) + } else { + release.installedVersion = installedVersion + } + } + } + + return nil +} + func (st *HelmState) listReleases(context helmexec.HelmContext, helm helmexec.Interface, release *ReleaseSpec) (string, error) { flags := st.kubeConnectionFlags(release) if release.Namespace != "" {