@@ -366,7 +366,7 @@ func undeployHelmChartsInPullMode(ctx context.Context, c client.Client, clusterS
366366 if err != nil {
367367 return err
368368 }
369- setters := prepareSetters (clusterSummary , libsveltosv1beta1 .FeatureHelm , profileRef , nil )
369+ setters := prepareSetters (clusterSummary , libsveltosv1beta1 .FeatureHelm , profileRef , nil , true )
370370
371371 // If charts have pre/post delete hooks, those need to be deployed. A ConfigurationGroup to deploy those
372372 // is created. If this does not exist yet assume we still have to deploy those.
@@ -2207,73 +2207,64 @@ func updateChartsInClusterConfiguration(ctx context.Context, c client.Client, cl
22072207func undeployStaleReleases (ctx context.Context , c client.Client , clusterSummary * configv1beta1.ClusterSummary ,
22082208 kubeconfig string , logger logr.Logger ) ([]configv1beta1.ReleaseReport , error ) {
22092209
2210- chartManager , err := chartmanager . GetChartManagerInstance (ctx , c )
2210+ staleReleases , err := getStaleReleases (ctx , c , clusterSummary , logger )
22112211 if err != nil {
2212+ logger .V (logs .LogInfo ).Error (err , "failed to get list of stale helm releases" )
22122213 return nil , err
22132214 }
22142215
2215- managedHelmReleases := chartManager .GetManagedHelmReleases (clusterSummary )
2216-
2217- // Build map of current referenced helm charts
2218- currentlyReferencedReleases := make (map [string ]bool )
2219- for i := range clusterSummary .Spec .ClusterProfileSpec .HelmCharts {
2220- currentChart := & clusterSummary .Spec .ClusterProfileSpec .HelmCharts [i ]
2221- currentlyReferencedReleases [chartManager .GetReleaseKey (currentChart .ReleaseNamespace , currentChart .ReleaseName )] = true
2216+ chartManager , err := chartmanager .GetChartManagerInstance (ctx , c )
2217+ if err != nil {
2218+ return nil , err
22222219 }
22232220
22242221 reports := make ([]configv1beta1.ReleaseReport , 0 )
22252222
2226- for i := range managedHelmReleases {
2227- releaseKey := chartManager .GetReleaseKey (managedHelmReleases [i ].Namespace , managedHelmReleases [i ].Name )
2228- if _ , ok := currentlyReferencedReleases [releaseKey ]; ! ok {
2229- logger .V (logs .LogInfo ).Info (fmt .Sprintf ("helm release %s (namespace %s) used to be managed but not referenced anymore" ,
2230- managedHelmReleases [i ].Name , managedHelmReleases [i ].Namespace ))
2231-
2232- _ , err := getReleaseInfo (managedHelmReleases [i ].Name ,
2233- managedHelmReleases [i ].Namespace , kubeconfig , & registryClientOptions {}, false )
2234- if err != nil {
2235- if errors .Is (err , driver .ErrReleaseNotFound ) {
2236- continue
2237- }
2238- return nil , err
2223+ for i := range staleReleases {
2224+ _ , err := getReleaseInfo (staleReleases [i ].Name ,
2225+ staleReleases [i ].Namespace , kubeconfig , & registryClientOptions {}, false )
2226+ if err != nil {
2227+ if errors .Is (err , driver .ErrReleaseNotFound ) {
2228+ continue
22392229 }
2230+ return nil , err
2231+ }
22402232
2241- if clusterSummary .Spec .ClusterProfileSpec .SyncMode != configv1beta1 .SyncModeDryRun {
2242- // If another ClusterSummary is queued to manage this chart in this cluster, do not uninstall.
2243- // Let the other ClusterSummary take it over.
2244-
2245- currentChart := & configv1beta1.HelmChart {
2246- ReleaseNamespace : managedHelmReleases [i ].Namespace ,
2247- ReleaseName : managedHelmReleases [i ].Name ,
2248- }
2249- otherRegisteredClusterSummaries := chartManager .GetRegisteredClusterSummariesForChart (
2250- clusterSummary .Spec .ClusterNamespace , clusterSummary .Spec .ClusterName ,
2251- clusterSummary .Spec .ClusterType , currentChart )
2252- if len (otherRegisteredClusterSummaries ) > 1 {
2253- // Immediately unregister so next inline ClusterSummary can take this over
2254- chartManager .UnregisterClusterSummaryForChart (clusterSummary , currentChart )
2255- err = requeueAllOtherClusterSummaries (ctx , c , clusterSummary .Spec .ClusterNamespace ,
2256- otherRegisteredClusterSummaries , logger )
2257- if err != nil {
2258- // TODO: Handle errors to prevent bad state. ClusterSummary no longer manage the chart,
2259- // but no other ClusterSummary instance has been requeued.
2260- return nil , err
2261- }
2233+ if clusterSummary .Spec .ClusterProfileSpec .SyncMode != configv1beta1 .SyncModeDryRun {
2234+ // If another ClusterSummary is queued to manage this chart in this cluster, do not uninstall.
2235+ // Let the other ClusterSummary take it over.
22622236
2263- continue
2264- }
2237+ currentChart := & configv1beta1.HelmChart {
2238+ ReleaseNamespace : staleReleases [i ].Namespace ,
2239+ ReleaseName : staleReleases [i ].Name ,
22652240 }
2241+ otherRegisteredClusterSummaries := chartManager .GetRegisteredClusterSummariesForChart (
2242+ clusterSummary .Spec .ClusterNamespace , clusterSummary .Spec .ClusterName ,
2243+ clusterSummary .Spec .ClusterType , currentChart )
2244+ if len (otherRegisteredClusterSummaries ) > 1 {
2245+ // Immediately unregister so next inline ClusterSummary can take this over
2246+ chartManager .UnregisterClusterSummaryForChart (clusterSummary , currentChart )
2247+ err = requeueAllOtherClusterSummaries (ctx , c , clusterSummary .Spec .ClusterNamespace ,
2248+ otherRegisteredClusterSummaries , logger )
2249+ if err != nil {
2250+ // TODO: Handle errors to prevent bad state. ClusterSummary no longer manage the chart,
2251+ // but no other ClusterSummary instance has been requeued.
2252+ return nil , err
2253+ }
22662254
2267- if err := uninstallRelease (ctx , clusterSummary , managedHelmReleases [i ].Name ,
2268- managedHelmReleases [i ].Namespace , kubeconfig , & registryClientOptions {}, nil , logger ); err != nil {
2269- return nil , err
2255+ continue
22702256 }
2257+ }
22712258
2272- reports = append (reports , configv1beta1.ReleaseReport {
2273- ReleaseNamespace : managedHelmReleases [i ].Namespace , ReleaseName : managedHelmReleases [i ].Name ,
2274- Action : string (configv1beta1 .UninstallHelmAction ),
2275- })
2259+ if err := uninstallRelease (ctx , clusterSummary , staleReleases [i ].Name ,
2260+ staleReleases [i ].Namespace , kubeconfig , & registryClientOptions {}, nil , logger ); err != nil {
2261+ return nil , err
22762262 }
2263+
2264+ reports = append (reports , configv1beta1.ReleaseReport {
2265+ ReleaseNamespace : staleReleases [i ].Namespace , ReleaseName : staleReleases [i ].Name ,
2266+ Action : string (configv1beta1 .UninstallHelmAction ),
2267+ })
22772268 }
22782269
22792270 return reports , nil
@@ -4445,7 +4436,14 @@ func commitStagedResourcesForDeployment(ctx context.Context, clusterSummary *con
44454436 return err
44464437 }
44474438
4448- setters := prepareSetters (clusterSummary , libsveltosv1beta1 .FeatureHelm , profileRef , configurationHash )
4439+ staleReleases , err := getStaleReleases (ctx , getManagementClusterClient (), clusterSummary , logger )
4440+ if err != nil {
4441+ logger .V (logs .LogInfo ).Error (err , "failed to get list of stale helm releases" )
4442+ return err
4443+ }
4444+
4445+ // if a stale helm release is being deleted, run the pre/post delete checks
4446+ setters := prepareSetters (clusterSummary , libsveltosv1beta1 .FeatureHelm , profileRef , configurationHash , len (staleReleases ) != 0 )
44494447 // Commit deployment
44504448 return pullmode .CommitStagedResourcesForDeployment (ctx , getManagementClusterClient (),
44514449 clusterSummary .Spec .ClusterNamespace , clusterSummary .Spec .ClusterName , configv1beta1 .ClusterSummaryKind ,
@@ -4569,3 +4567,35 @@ func removeCachedData(settings *cli.EnvSettings, name, repoURL string, registryO
45694567
45704568 _ = repoAddOrUpdate (settings , name , repoURL , registryOptions , logger )
45714569}
4570+
4571+ // getStaleReleases returns releases which used to be managed by the ClusterSummary but are not referenced anymore
4572+ func getStaleReleases (ctx context.Context , c client.Client , clusterSummary * configv1beta1.ClusterSummary ,
4573+ logger logr.Logger ) ([]chartmanager.HelmReleaseInfo , error ) {
4574+
4575+ chartManager , err := chartmanager .GetChartManagerInstance (ctx , c )
4576+ if err != nil {
4577+ return nil , err
4578+ }
4579+
4580+ managedHelmReleases := chartManager .GetManagedHelmReleases (clusterSummary )
4581+
4582+ // Build map of current referenced helm charts
4583+ currentlyReferencedReleases := make (map [string ]bool )
4584+ for i := range clusterSummary .Spec .ClusterProfileSpec .HelmCharts {
4585+ currentChart := & clusterSummary .Spec .ClusterProfileSpec .HelmCharts [i ]
4586+ currentlyReferencedReleases [chartManager .GetReleaseKey (currentChart .ReleaseNamespace , currentChart .ReleaseName )] = true
4587+ }
4588+
4589+ staleReleases := make ([]chartmanager.HelmReleaseInfo , 0 )
4590+
4591+ for i := range managedHelmReleases {
4592+ releaseKey := chartManager .GetReleaseKey (managedHelmReleases [i ].Namespace , managedHelmReleases [i ].Name )
4593+ if _ , ok := currentlyReferencedReleases [releaseKey ]; ! ok {
4594+ logger .V (logs .LogInfo ).Info (fmt .Sprintf ("helm release %s (namespace %s) used to be managed but not referenced anymore" ,
4595+ managedHelmReleases [i ].Name , managedHelmReleases [i ].Namespace ))
4596+ staleReleases = append (staleReleases , managedHelmReleases [i ])
4597+ }
4598+ }
4599+
4600+ return staleReleases , nil
4601+ }
0 commit comments