From cfcafa2e4664cb7e0ee1dc2c87ca5bb2c8bc0006 Mon Sep 17 00:00:00 2001 From: Yusuke KUOKA Date: Fri, 24 Aug 2018 17:01:20 +0900 Subject: [PATCH] feat: set array Fixes #148 --- README.md | 7 ++++++- state/state.go | 14 +++++++++++--- state/state_test.go | 20 ++++++++++++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6872d845..0324e75a 100644 --- a/README.md +++ b/README.md @@ -70,9 +70,14 @@ releases: domain: {{ requiredEnv "PLATFORM_ID" }}.my-domain.com scheme: {{ env "SCHEME" | default "https" }} set: - # single value load from a local file, --set-file foo.config=path/to/file + # single value loaded from a local file, translates to --set-file foo.config=path/to/file - name: foo.config file: path/to/file + # set a single array value in an array, translates to --set bar[0]={1,2} + - name: bar[0] + values: + - 1 + - 2 # will attempt to decrypt it using helm-secrets plugin secrets: - vault_secret.yaml diff --git a/state/state.go b/state/state.go index 9562236d..79a24994 100644 --- a/state/state.go +++ b/state/state.go @@ -79,9 +79,10 @@ type ReleaseSpec struct { // SetValue are the key values to set on a helm release type SetValue struct { - Name string `yaml:"name"` - Value string `yaml:"value"` - File string `yaml:"file"` + Name string `yaml:"name"` + Value string `yaml:"value"` + File string `yaml:"file"` + Values []string `yaml:"values"` } // CreateFromTemplateFile loads the helmfile from disk and processes the template @@ -753,6 +754,13 @@ func (state *HelmState) namespaceAndValuesFlags(helm helmexec.Interface, basePat flags = append(flags, "--set", fmt.Sprintf("%s=%s", escape(set.Name), escape(set.Value))) } else if set.File != "" { flags = append(flags, "--set-file", fmt.Sprintf("%s=%s", escape(set.Name), set.File)) + } else if len(set.Values) > 0 { + items := make([]string, len(set.Values)) + for i, raw := range set.Values { + items[i] = escape(raw) + } + v := strings.Join(items, ",") + flags = append(flags, "--set", fmt.Sprintf("%s={%s}", escape(set.Name), v)) } } } diff --git a/state/state_test.go b/state/state_test.go index d48178d6..555e45f5 100644 --- a/state/state_test.go +++ b/state/state_test.go @@ -708,6 +708,26 @@ func TestHelmState_SyncReleases(t *testing.T) { helm: &mockHelmExec{}, wantReleases: []mockRelease{{"releaseName", []string{"--set", "foo=FOO", "--set-file", "bar=path/to/bar", "--set", "baz=BAZ"}}}, }, + { + name: "set single array value in an array", + releases: []ReleaseSpec{ + { + Name: "releaseName", + Chart: "foo", + SetValues: []SetValue{ + { + Name: "foo.bar[0]", + Values: []string{ + "A", + "B", + }, + }, + }, + }, + }, + helm: &mockHelmExec{}, + wantReleases: []mockRelease{{"releaseName", []string{"--set", "foo.bar[0]={A,B}"}}}, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {