diff --git a/internal/go-configmap/cli.go b/internal/go-configmap/cli.go index d467cfc9c32..23fb2e147d9 100644 --- a/internal/go-configmap/cli.go +++ b/internal/go-configmap/cli.go @@ -27,6 +27,17 @@ func (c *Map) SetFromCLIArgs(key string, args ...string) error { return nil } + // Some args might be coming from env vars that are specifying multiple values + // in a single string. We expand those cases by splitting every args with whitespace + // Example: args=["e1 e2", "e3"] -> args=["e1","e2","e3"] + argsExpantion := func(values []string) []string { + result := []string{} + for _, v := range values { + result = append(result, strings.Split(v, " ")...) + } + return result + } + args = argsExpantion(args) // in case of schemaless configuration, we don't know the type of the setting // we will save it as a string or array of strings if len(c.schema) == 0 { diff --git a/internal/go-configmap/configuration_test.go b/internal/go-configmap/configuration_test.go index c9c025cb3ce..5dbb10ecd6f 100644 --- a/internal/go-configmap/configuration_test.go +++ b/internal/go-configmap/configuration_test.go @@ -79,10 +79,22 @@ func TestApplyEnvVars(t *testing.T) { c.Set("foo", "bar") c.Set("fooz.bar", "baz") c.Set("answer", 42) + c.Set("array", []string{}) c.InjectEnvVars([]string{"APP_FOO=app-bar", "APP_FOOZ_BAR=app-baz"}, "APP") require.Equal(t, "app-bar", c.Get("foo")) require.Equal(t, "app-baz", c.Get("fooz.bar")) require.Equal(t, 42, c.Get("answer")) + + c.InjectEnvVars([]string{"APP_ARRAY=e1 e2 e3"}, "APP") + require.Equal(t, []string{"e1", "e2", "e3"}, c.GetStringSlice("array")) + + // Test env containing array values with typed schema + { + m := configmap.New() + m.SetKeyTypeSchema("array", []string{}) + m.InjectEnvVars([]string{"APP_ARRAY=e1 e2 e3"}, "APP") + require.Equal(t, []string{"e1", "e2", "e3"}, m.GetStringSlice("array")) + } } func TestMerge(t *testing.T) {