diff --git a/pkg/action/install.go b/pkg/action/install.go index 50df13c05..1acd6622d 100644 --- a/pkg/action/install.go +++ b/pkg/action/install.go @@ -442,11 +442,22 @@ func (i *Install) RunWithContext(ctx context.Context, ch ci.Charter, vals map[st return nil, err } - if _, err := i.cfg.KubeClient.Create( - resourceList, - kube.ClientCreateOptionServerSideApply(i.ServerSideApply, false)); err != nil && !apierrors.IsAlreadyExists(err) { + namespaceExist := false + _, err = i.cfg.KubeClient.Get(resourceList, false) + if err == nil { + namespaceExist = true + } else if !apierrors.IsNotFound(err) { return nil, err } + + if !namespaceExist { + if _, err := i.cfg.KubeClient.Create( + resourceList, + kube.ClientCreateOptionServerSideApply(i.ServerSideApply, false)); err != nil && !apierrors.IsAlreadyExists(err) { + return nil, err + } + } + } // If Replace is true, we need to supersede the last release. diff --git a/pkg/action/install_test.go b/pkg/action/install_test.go index e4d2b7376..b5aa0fcbb 100644 --- a/pkg/action/install_test.go +++ b/pkg/action/install_test.go @@ -1297,3 +1297,41 @@ func TestInstallRelease_WaitOptionsPassedDownstream(t *testing.T) { // Verify that WaitOptions were passed to GetWaiter is.NotEmpty(failer.RecordedWaitOptions, "WaitOptions should be passed to GetWaiter") } + +func TestInstall_CreateNamespaceAlreadyExists(t *testing.T) { + is := assert.New(t) + + // Namespace already exists in cluster + config := actionConfigFixtureWithDummyResources(t, createDummyResourceList(true)) + + instAction := installActionWithConfig(config) + instAction.CreateNamespace = true + instAction.Namespace = "spaced" + + resi, err := instAction.Run(buildChart(), nil) + is.NoError(err) + + res, err := releaserToV1Release(resi) + is.NoError(err) + is.Equal("spaced", res.Namespace) + is.Equal("Install complete", res.Info.Description) +} + +func TestInstall_CreateNamespaceNotExists(t *testing.T) { + is := assert.New(t) + + // Empty cluster state, thats mean namespace not present + config := actionConfigFixture(t) + + instAction := installActionWithConfig(config) + instAction.CreateNamespace = true + instAction.Namespace = "spaced" + + resi, err := instAction.Run(buildChart(), nil) + is.NoError(err) + + res, err := releaserToV1Release(resi) + is.NoError(err) + is.Equal("spaced", res.Namespace) + is.Equal("Install complete", res.Info.Description) +}