Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions controllers/resourcesummary_collection.go
Original file line number Diff line number Diff line change
Expand Up @@ -647,30 +647,43 @@ 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 {
if summary.ReleaseName == driftedCharts[j].ReleaseName &&
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,
Expand Down
39 changes: 39 additions & 0 deletions controllers/resourcesummary_collection_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand Down
Loading