diff --git a/controllers/resourcesummary_collection.go b/controllers/resourcesummary_collection.go index 3fcc7e32..99505255 100644 --- a/controllers/resourcesummary_collection.go +++ b/controllers/resourcesummary_collection.go @@ -647,19 +647,20 @@ func resetResourceSummaryStatus(ctx context.Context, remoteClient client.Client, // markDriftedHelmCharts sets NeedsRedeploy on the HelmReleaseSummaries entries matching // driftedCharts (by release name/namespace), so shouldUpgrade can later scope the redeploy // to only those charts instead of the whole Helm feature. If driftedCharts is empty (e.g. an -// older drift-detection-manager that doesn't report chart ownership yet), every chart is -// marked, same as today's behavior, so drift is never silently missed. +// older drift-detection-manager that doesn't report chart ownership yet), or none of the reported +// charts is a chart of this ClusterSummary (e.g. an older sveltos-applier that reports the +// ConfigurationGroup instead of the Helm releases), every chart is marked, so drift is never +// silently missed. func markDriftedHelmCharts(clusterSummary *configv1beta1.ClusterSummary, driftedCharts []libsveltosv1beta1.HelmChartRef, logger logr.Logger) { if len(driftedCharts) == 0 { logger.V(logs.LogDebug).Info("no chart-scoped drift info available, marking all charts for redeploy") - for i := range clusterSummary.Status.HelmReleaseSummaries { - clusterSummary.Status.HelmReleaseSummaries[i].NeedsRedeploy = true - } + markAllHelmChartsForRedeploy(clusterSummary) return } + matched := false for i := range clusterSummary.Status.HelmReleaseSummaries { summary := &clusterSummary.Status.HelmReleaseSummaries[i] for j := range driftedCharts { @@ -667,10 +668,22 @@ func markDriftedHelmCharts(clusterSummary *configv1beta1.ClusterSummary, summary.ReleaseNamespace == driftedCharts[j].ReleaseNamespace { summary.NeedsRedeploy = true + matched = true break } } } + + if !matched { + logger.V(logs.LogDebug).Info("reported drifted charts do not match any chart, marking all charts for redeploy") + markAllHelmChartsForRedeploy(clusterSummary) + } +} + +func markAllHelmChartsForRedeploy(clusterSummary *configv1beta1.ClusterSummary) { + for i := range clusterSummary.Status.HelmReleaseSummaries { + clusterSummary.Status.HelmReleaseSummaries[i].NeedsRedeploy = true + } } func getListOfClusterWithDriftDetectionDeployed(ctx context.Context, c client.Client, diff --git a/controllers/resourcesummary_collection_test.go b/controllers/resourcesummary_collection_test.go index 88073d7c..159bad78 100644 --- a/controllers/resourcesummary_collection_test.go +++ b/controllers/resourcesummary_collection_test.go @@ -397,6 +397,45 @@ var _ = Describe("ResourceSummary Collection", func() { } }) + It("markDriftedHelmCharts marks only the reported charts", func() { + driftedChart := configv1beta1.HelmChartSummary{ReleaseName: randomString(), ReleaseNamespace: randomString()} + otherChart := configv1beta1.HelmChartSummary{ReleaseName: randomString(), ReleaseNamespace: randomString()} + clusterSummary := &configv1beta1.ClusterSummary{ + Status: configv1beta1.ClusterSummaryStatus{ + HelmReleaseSummaries: []configv1beta1.HelmChartSummary{driftedChart, otherChart}, + }, + } + + driftedCharts := []libsveltosv1beta1.HelmChartRef{ + {ReleaseName: driftedChart.ReleaseName, ReleaseNamespace: driftedChart.ReleaseNamespace}, + } + controllers.MarkDriftedHelmCharts(clusterSummary, driftedCharts, textlogger.NewLogger(textlogger.NewConfig())) + + Expect(clusterSummary.Status.HelmReleaseSummaries[0].NeedsRedeploy).To(BeTrue()) + Expect(clusterSummary.Status.HelmReleaseSummaries[1].NeedsRedeploy).To(BeFalse()) + }) + + It("markDriftedHelmCharts marks every chart when no reported chart matches a chart of the ClusterSummary", func() { + clusterSummary := &configv1beta1.ClusterSummary{ + Status: configv1beta1.ClusterSummaryStatus{ + HelmReleaseSummaries: []configv1beta1.HelmChartSummary{ + {ReleaseName: randomString(), ReleaseNamespace: randomString()}, + {ReleaseName: randomString(), ReleaseNamespace: randomString()}, + }, + }, + } + + // What an agent that does not know the Helm releases reports: a name that is not a release + driftedCharts := []libsveltosv1beta1.HelmChartRef{ + {ReleaseName: randomString(), ReleaseNamespace: randomString()}, + } + controllers.MarkDriftedHelmCharts(clusterSummary, driftedCharts, textlogger.NewLogger(textlogger.NewConfig())) + + for i := range clusterSummary.Status.HelmReleaseSummaries { + Expect(clusterSummary.Status.HelmReleaseSummaries[i].NeedsRedeploy).To(BeTrue()) + } + }) + It("isResourceSummaryInstalledCached caches positive result", func() { controllers.ResetResourceSummaryInstalledCache()