From e29046d59838e0c65e2ea40678603eff4a714c0b Mon Sep 17 00:00:00 2001 From: Gianluca Mardente Date: Fri, 18 Sep 2026 19:00:07 +0200 Subject: [PATCH] fix: pull-mode Helm ignoring createNamespace: false Pull-mode Helm staging never threaded HelmOptions.InstallOptions.CreateNamespace into the staged ConfigurationBundle, so createNamespace: false was silently ignored and sveltos-applier always created the release namespace. --- controllers/export_test.go | 1 + controllers/handlers_helm.go | 4 ++- controllers/handlers_helm_test.go | 52 +++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) diff --git a/controllers/export_test.go b/controllers/export_test.go index 2e828d3a..0a649e0c 100644 --- a/controllers/export_test.go +++ b/controllers/export_test.go @@ -110,6 +110,7 @@ var ( CollectContent = collectContent CollectReferencedObjects = collectReferencedObjects PrepareBundleSettersWithResourceInfo = prepareBundleSettersWithResourceInfo + PrepareBundleSettersWithHelmInfo = prepareBundleSettersWithHelmInfo UndeployStaleResources = undeployStaleResources GetDeployedGroupVersionKinds = getDeployedGroupVersionKinds GetSecret = getSecret diff --git a/controllers/handlers_helm.go b/controllers/handlers_helm.go index 60158159..b5c37b9b 100644 --- a/controllers/handlers_helm.go +++ b/controllers/handlers_helm.go @@ -5794,10 +5794,12 @@ func prepareBundleSettersWithHelmInfo(currentChart *configv1beta1.HelmChart, isU setters := make([]pullmode.BundleOption, 0) timeout := getTimeoutValue(currentChart.Options) + skipNamespaceCreation := !getCreateNamespaceHelmValue(currentChart.Options) setters = append(setters, pullmode.WithTimeout(&timeout), pullmode.WithReleaseInfo(currentChart.ReleaseNamespace, currentChart.ReleaseName, - currentChart.RepositoryURL, rInfo.ChartVersion, rInfo.Icon, isUninstall, isLast)) + currentChart.RepositoryURL, rInfo.ChartVersion, rInfo.Icon, isUninstall, isLast), + pullmode.WithResourceInfo("", "", "", 0, skipNamespaceCreation, false)) return setters } diff --git a/controllers/handlers_helm_test.go b/controllers/handlers_helm_test.go index f2478806..1424e65c 100644 --- a/controllers/handlers_helm_test.go +++ b/controllers/handlers_helm_test.go @@ -42,6 +42,7 @@ import ( "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/types" "k8s.io/klog/v2/textlogger" + "k8s.io/utils/ptr" clusterv1 "sigs.k8s.io/cluster-api/api/core/v1beta2" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client/fake" @@ -54,6 +55,7 @@ import ( "github.com/projectsveltos/addon-controller/pkg/scope" libsveltosv1beta1 "github.com/projectsveltos/libsveltos/api/v1beta1" "github.com/projectsveltos/libsveltos/lib/clusterproxy" + "github.com/projectsveltos/libsveltos/lib/pullmode" ) var _ = Describe("HandlersHelm", func() { @@ -3095,6 +3097,56 @@ var _ = Describe("getHelmUpgradeClient Force", func() { }) }) +var _ = Describe("prepareBundleSettersWithHelmInfo", func() { + It("sets SkipNamespaceCreation when createNamespace is false", func() { + currentChart := &configv1beta1.HelmChart{ + ReleaseName: randomString(), + ReleaseNamespace: randomString(), + RepositoryURL: randomString(), + Options: &configv1beta1.HelmOptions{ + InstallOptions: configv1beta1.HelmInstallOptions{ + CreateNamespace: ptr.To(false), + }, + }, + } + rInfo := &controllers.ReleaseInfo{ + ChartVersion: randomString(), + } + + setters := controllers.PrepareBundleSettersWithHelmInfo(currentChart, false, true, rInfo) + + bundleOptions := &pullmode.BundleOptions{} + for _, setter := range setters { + setter(bundleOptions) + } + + Expect(bundleOptions.ReleaseNamespace).To(Equal(currentChart.ReleaseNamespace)) + Expect(bundleOptions.ReleaseName).To(Equal(currentChart.ReleaseName)) + Expect(bundleOptions.SkipNamespaceCreation).To(BeTrue()) + }) + + It("leaves SkipNamespaceCreation false when createNamespace is not set (default)", func() { + currentChart := &configv1beta1.HelmChart{ + ReleaseName: randomString(), + ReleaseNamespace: randomString(), + RepositoryURL: randomString(), + Options: &configv1beta1.HelmOptions{}, + } + rInfo := &controllers.ReleaseInfo{ + ChartVersion: randomString(), + } + + setters := controllers.PrepareBundleSettersWithHelmInfo(currentChart, false, true, rInfo) + + bundleOptions := &pullmode.BundleOptions{} + for _, setter := range setters { + setter(bundleOptions) + } + + Expect(bundleOptions.SkipNamespaceCreation).To(BeFalse()) + }) +}) + var _ = Describe("locateChartWithTimeout", func() { It("returns the result once locateFn returns", func() { expectedPath := randomString()