From 621f20dbb7f3d86a543c32f564fec85747498c92 Mon Sep 17 00:00:00 2001 From: Justin Thompson Date: Mon, 7 Jun 2021 13:15:14 -0600 Subject: [PATCH 1/3] helm repo source --- cmd/wego/add/cmd.go | 2 ++ pkg/cmdimpl/add.go | 62 ++++++++++++++++++++++++++++++++++---- pkg/cmdimpl/add_test.go | 66 ++++++++++++++++++++++++++++++++++++++--- 3 files changed, 120 insertions(+), 10 deletions(-) diff --git a/cmd/wego/add/cmd.go b/cmd/wego/add/cmd.go index 8690e041ed..dc0d41a67d 100644 --- a/cmd/wego/add/cmd.go +++ b/cmd/wego/add/cmd.go @@ -37,6 +37,8 @@ func init() { Cmd.Flags().StringVar(¶ms.Path, "path", "./", "Path of files within git repository") Cmd.Flags().StringVar(¶ms.Branch, "branch", "main", "Branch to watch within git repository") Cmd.Flags().StringVar(¶ms.DeploymentType, "deployment-type", "kustomize", "deployment type [kustomize, helm]") + Cmd.Flags().StringVar(¶ms.HelmRepository, "helm-repository", "", "url of remote helm repository") + Cmd.Flags().StringVar(¶ms.Chart, "chart", "", "Specify chart for --helm-repository source") Cmd.Flags().StringVar(¶ms.PrivateKey, "private-key", filepath.Join(os.Getenv("HOME"), ".ssh", "id_rsa"), "Private key that provides access to git repository") Cmd.Flags().BoolVar(¶ms.DryRun, "dry-run", false, "If set, 'wego add' will not make any changes to the system; it will just display the actions that would have been taken") Cmd.Flags().BoolVar(¶ms.IsPrivate, "private", true, "Set access control on the repo") diff --git a/pkg/cmdimpl/add.go b/pkg/cmdimpl/add.go index c25949a97d..34d8bad1ef 100644 --- a/pkg/cmdimpl/add.go +++ b/pkg/cmdimpl/add.go @@ -48,6 +48,8 @@ type AddParamSet struct { PrivateKey string PrivateKeyPass string DeploymentType string + HelmRepository string + Chart string Namespace string DryRun bool IsPrivate bool @@ -194,7 +196,7 @@ func generateWegoKustomizeManifest() ([]byte, error) { return kustomizeManifest, nil } -func generateSourceManifest() ([]byte, error) { +func generateSourceManifestGit() ([]byte, error) { secretName := params.Name cmd := fmt.Sprintf(`create secret git "%s" \ @@ -235,6 +237,26 @@ func generateSourceManifest() ([]byte, error) { return sourceManifest, nil } +func generateSourceManifestHelm() ([]byte, error) { + if params.Chart == "" { + return nil, fmt.Errorf("chart needs to be set") + } + cmd := fmt.Sprintf(`create source helm %s \ + --url="%s" \ + --interval=30s \ + --export \ + --namespace=%s `, + params.Name, + params.HelmRepository, + params.Namespace) + + sourceManifest, err := fluxops.CallFlux(cmd) + if err != nil { + return nil, wrapError(err, "could not create git source") + } + return sourceManifest, nil +} + func generateKustomizeManifest() ([]byte, error) { cmd := fmt.Sprintf(`create kustomization "%s" \ --path="%s" \ @@ -256,7 +278,7 @@ func generateKustomizeManifest() ([]byte, error) { return kustomizeManifest, nil } -func generateHelmManifest() ([]byte, error) { +func generateHelmManifestGit() ([]byte, error) { cmd := fmt.Sprintf(`create helmrelease %s \ --source="GitRepository/%s" \ --chart="%s" \ @@ -271,6 +293,22 @@ func generateHelmManifest() ([]byte, error) { return fluxops.CallFlux(cmd) } +func generateHelmManifestHelm() ([]byte, error) { + cmd := fmt.Sprintf(`create helmrelease %s \ + --source="HelmRepository/%s" \ + --chart="%s" \ + --interval=5m \ + --export \ + --namespace=%s`, + params.Name, + params.Name, + params.Chart, + params.Namespace, + ) + + return fluxops.CallFlux(cmd) +} + func getOwner() (string, error) { owner, err := fluxops.GetOwnerFromEnv() if err != nil || owner == "" { @@ -433,15 +471,27 @@ func Add(args []string, allParams AddParamSet, deps *AddDependencies) error { } // Create flux custom resources for new repo being added - source, err := generateSourceManifest() - if err != nil { - return wrapError(err, "could not generate source manifest") + var source []byte + if params.HelmRepository != "" { + source, err = generateSourceManifestHelm() + if err != nil { + return wrapError(err, "could not generate source manifest") + } + } else { + source, err = generateSourceManifestGit() + if err != nil { + return wrapError(err, "could not generate source manifest") + } } var appManifests []byte switch params.DeploymentType { case string(DeployTypeHelm): - appManifests, err = generateHelmManifest() + if params.HelmRepository != "" { + appManifests, err = generateHelmManifestHelm() + break + } + appManifests, err = generateHelmManifestGit() case string(DeployTypeKustomize): appManifests, err = generateKustomizeManifest() default: diff --git a/pkg/cmdimpl/add_test.go b/pkg/cmdimpl/add_test.go index 6724225118..5a9432fd5d 100644 --- a/pkg/cmdimpl/add_test.go +++ b/pkg/cmdimpl/add_test.go @@ -173,8 +173,8 @@ func handleGitLsRemote(arglist ...interface{}) ([]byte, []byte, error) { var fakeGitClient = gitfakes.FakeGit{} -var _ = Describe("Test helm manifest", func() { - It("Verify helm manifest files generation ", func() { +var _ = Describe("Test helm manifest from git repo", func() { + It("Verify helm manifest files generation from git ", func() { expected := `create helmrelease simple-name \ --source="GitRepository/simple-name" \ @@ -192,13 +192,71 @@ var _ = Describe("Test helm manifest", func() { fluxops.SetFluxHandler(fakeHandler) - params.Name = "simple-name" params.Name = "simple-name" params.Path = "./my-chart" params.Namespace = "wego-system" - Expect(generateHelmManifest()).Should(Equal([]byte("foo"))) + Expect(generateHelmManifestGit()).Should(Equal([]byte("foo"))) + }) +}) + +var _ = Describe("Test helm manifest from helm repo", func() { + It("Verify helm manifest generation from helm ", func() { + + expected := `create helmrelease simple-name \ + --source="HelmRepository/simple-name" \ + --chart="testchart" \ + --interval=5m \ + --export \ + --namespace=wego-system` + + fakeHandler := &fluxopsfakes.FakeFluxHandler{ + HandleStub: func(args string) ([]byte, error) { + Expect(args).Should(Equal(expected)) + return []byte("foo"), nil + }, + } + + fluxops.SetFluxHandler(fakeHandler) + + params.Name = "simple-name" + params.Namespace = "wego-system" + params.Chart = "testchart" + + Expect(generateHelmManifestHelm()).Should(Equal([]byte("foo"))) }) + +}) + +var _ = Describe("Test helm source from helm repo", func() { + It("Verify helm source generation from helm ", func() { + + _, err := generateSourceManifestHelm() + Expect(err).Should(MatchError("chart needs to be set")) + + expected := `create source helm test \ + --url="https://github.io/testrepo" \ + --interval=30s \ + --export \ + --namespace=wego-system ` + + fakeHandler := &fluxopsfakes.FakeFluxHandler{ + HandleStub: func(args string) ([]byte, error) { + Expect(args).Should(Equal(expected)) + return []byte("foo"), nil + }, + } + + fluxops.SetFluxHandler(fakeHandler) + + params.Name = "test" + params.HelmRepository = "https://github.io/testrepo" + params.Namespace = "wego-system" + params.Chart = "testChart" + + Expect(generateSourceManifestHelm()).Should(Equal([]byte("foo"))) + }) + }) var _ = Describe("Dry Run Add Test", func() { From c6f75ac9813c5bc37924789fc0d429fbadc593a5 Mon Sep 17 00:00:00 2001 From: Justin Thompson Date: Mon, 7 Jun 2021 15:40:28 -0600 Subject: [PATCH 2/3] remove helm-repository, determine deploy type --- cmd/wego/add/cmd.go | 3 +-- pkg/cmdimpl/add.go | 40 +++++++++++++++++++--------------------- pkg/cmdimpl/add_test.go | 5 +---- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/cmd/wego/add/cmd.go b/cmd/wego/add/cmd.go index dc0d41a67d..47e63661b4 100644 --- a/cmd/wego/add/cmd.go +++ b/cmd/wego/add/cmd.go @@ -33,11 +33,10 @@ var Cmd = &cobra.Command{ func init() { Cmd.Flags().StringVar(¶ms.Owner, "owner", "", "Owner of remote git repository") Cmd.Flags().StringVar(¶ms.Name, "name", "", "Name of remote git repository") - Cmd.Flags().StringVar(¶ms.Url, "url", "", "URL of remote git repository") + Cmd.Flags().StringVar(¶ms.Url, "url", "", "URL of remote repository") Cmd.Flags().StringVar(¶ms.Path, "path", "./", "Path of files within git repository") Cmd.Flags().StringVar(¶ms.Branch, "branch", "main", "Branch to watch within git repository") Cmd.Flags().StringVar(¶ms.DeploymentType, "deployment-type", "kustomize", "deployment type [kustomize, helm]") - Cmd.Flags().StringVar(¶ms.HelmRepository, "helm-repository", "", "url of remote helm repository") Cmd.Flags().StringVar(¶ms.Chart, "chart", "", "Specify chart for --helm-repository source") Cmd.Flags().StringVar(¶ms.PrivateKey, "private-key", filepath.Join(os.Getenv("HOME"), ".ssh", "id_rsa"), "Private key that provides access to git repository") Cmd.Flags().BoolVar(¶ms.DryRun, "dry-run", false, "If set, 'wego add' will not make any changes to the system; it will just display the actions that would have been taken") diff --git a/pkg/cmdimpl/add.go b/pkg/cmdimpl/add.go index 34d8bad1ef..bf0bb6534c 100644 --- a/pkg/cmdimpl/add.go +++ b/pkg/cmdimpl/add.go @@ -48,7 +48,6 @@ type AddParamSet struct { PrivateKey string PrivateKeyPass string DeploymentType string - HelmRepository string Chart string Namespace string DryRun bool @@ -238,16 +237,13 @@ func generateSourceManifestGit() ([]byte, error) { } func generateSourceManifestHelm() ([]byte, error) { - if params.Chart == "" { - return nil, fmt.Errorf("chart needs to be set") - } cmd := fmt.Sprintf(`create source helm %s \ --url="%s" \ --interval=30s \ --export \ --namespace=%s `, params.Name, - params.HelmRepository, + params.Url, params.Namespace) sourceManifest, err := fluxops.CallFlux(cmd) @@ -472,33 +468,35 @@ func Add(args []string, allParams AddParamSet, deps *AddDependencies) error { // Create flux custom resources for new repo being added var source []byte - if params.HelmRepository != "" { + var appManifests []byte + + // If chart is set ignore deployment type. Going to revisit later + if params.Chart != "" { source, err = generateSourceManifestHelm() if err != nil { return wrapError(err, "could not generate source manifest") } + appManifests, err = generateHelmManifestHelm() + if err != nil { + return wrapError(err, "error generating manifest") + } } else { source, err = generateSourceManifestGit() if err != nil { return wrapError(err, "could not generate source manifest") } - } - var appManifests []byte - switch params.DeploymentType { - case string(DeployTypeHelm): - if params.HelmRepository != "" { - appManifests, err = generateHelmManifestHelm() - break + switch params.DeploymentType { + case string(DeployTypeHelm): + appManifests, err = generateHelmManifestGit() + case string(DeployTypeKustomize): + appManifests, err = generateKustomizeManifest() + default: + return fmt.Errorf("deployment type not supported: %s", params.DeploymentType) + } + if err != nil { + return wrapError(err, "error generating manifest") } - appManifests, err = generateHelmManifestGit() - case string(DeployTypeKustomize): - appManifests, err = generateKustomizeManifest() - default: - return fmt.Errorf("deployment type not supported: %s", params.DeploymentType) - } - if err != nil { - return wrapError(err, "error generating manifest") } appSubdir := filepath.Join("apps", params.Name) diff --git a/pkg/cmdimpl/add_test.go b/pkg/cmdimpl/add_test.go index 5a9432fd5d..dde42e56a7 100644 --- a/pkg/cmdimpl/add_test.go +++ b/pkg/cmdimpl/add_test.go @@ -231,9 +231,6 @@ var _ = Describe("Test helm manifest from helm repo", func() { var _ = Describe("Test helm source from helm repo", func() { It("Verify helm source generation from helm ", func() { - _, err := generateSourceManifestHelm() - Expect(err).Should(MatchError("chart needs to be set")) - expected := `create source helm test \ --url="https://github.io/testrepo" \ --interval=30s \ @@ -250,7 +247,7 @@ var _ = Describe("Test helm source from helm repo", func() { fluxops.SetFluxHandler(fakeHandler) params.Name = "test" - params.HelmRepository = "https://github.io/testrepo" + params.Url = "https://github.io/testrepo" params.Namespace = "wego-system" params.Chart = "testChart" From 7b9935b512b766bdc722f16f9e62384281d0cd1f Mon Sep 17 00:00:00 2001 From: Justin Thompson Date: Mon, 7 Jun 2021 16:02:21 -0600 Subject: [PATCH 3/3] change test to override --- cmd/wego/add/cmd.go | 2 +- pkg/cmdimpl/add_test.go | 36 +++++++++++++++++++++--------------- 2 files changed, 22 insertions(+), 16 deletions(-) diff --git a/cmd/wego/add/cmd.go b/cmd/wego/add/cmd.go index 47e63661b4..37b4166f3d 100644 --- a/cmd/wego/add/cmd.go +++ b/cmd/wego/add/cmd.go @@ -37,7 +37,7 @@ func init() { Cmd.Flags().StringVar(¶ms.Path, "path", "./", "Path of files within git repository") Cmd.Flags().StringVar(¶ms.Branch, "branch", "main", "Branch to watch within git repository") Cmd.Flags().StringVar(¶ms.DeploymentType, "deployment-type", "kustomize", "deployment type [kustomize, helm]") - Cmd.Flags().StringVar(¶ms.Chart, "chart", "", "Specify chart for --helm-repository source") + Cmd.Flags().StringVar(¶ms.Chart, "chart", "", "Specify chart for helm source") Cmd.Flags().StringVar(¶ms.PrivateKey, "private-key", filepath.Join(os.Getenv("HOME"), ".ssh", "id_rsa"), "Private key that provides access to git repository") Cmd.Flags().BoolVar(¶ms.DryRun, "dry-run", false, "If set, 'wego add' will not make any changes to the system; it will just display the actions that would have been taken") Cmd.Flags().BoolVar(¶ms.IsPrivate, "private", true, "Set access control on the repo") diff --git a/pkg/cmdimpl/add_test.go b/pkg/cmdimpl/add_test.go index dde42e56a7..c9c0751d20 100644 --- a/pkg/cmdimpl/add_test.go +++ b/pkg/cmdimpl/add_test.go @@ -217,13 +217,16 @@ var _ = Describe("Test helm manifest from helm repo", func() { }, } - fluxops.SetFluxHandler(fakeHandler) - - params.Name = "simple-name" - params.Namespace = "wego-system" - params.Chart = "testchart" - - Expect(generateHelmManifestHelm()).Should(Equal([]byte("foo"))) + _ = override.WithOverrides( + func() override.Result { + params.DryRun = false + params.Name = "simple-name" + params.Namespace = "wego-system" + params.Chart = "testchart" + Expect(generateHelmManifestHelm()).Should(Equal([]byte("foo"))) + return override.Result{} + }, + fluxops.Override(fakeHandler)) }) }) @@ -244,14 +247,17 @@ var _ = Describe("Test helm source from helm repo", func() { }, } - fluxops.SetFluxHandler(fakeHandler) - - params.Name = "test" - params.Url = "https://github.io/testrepo" - params.Namespace = "wego-system" - params.Chart = "testChart" - - Expect(generateSourceManifestHelm()).Should(Equal([]byte("foo"))) + _ = override.WithOverrides( + func() override.Result { + params.DryRun = false + params.Name = "test" + params.Url = "https://github.io/testrepo" + params.Namespace = "wego-system" + params.Chart = "testChart" + Expect(generateSourceManifestHelm()).Should(Equal([]byte("foo"))) + return override.Result{} + }, + fluxops.Override(fakeHandler)) }) })