From e1d4cff14c072a68bcd559eef6a60f09afa03b19 Mon Sep 17 00:00:00 2001 From: Derek Nola Date: Tue, 2 May 2023 11:18:23 -0700 Subject: [PATCH] Enable FindString to search dotD config files (#7323) * Enable FindString to search dotD config files * Address multiple arg cases Signed-off-by: Derek Nola --- pkg/configfilearg/parser.go | 36 ++++++++++---- pkg/configfilearg/parser_test.go | 49 +++++++++++++++++-- pkg/configfilearg/testdata/data.yaml | 1 + .../testdata/data.yaml.d/01-data.yml | 3 +- 4 files changed, 75 insertions(+), 14 deletions(-) diff --git a/pkg/configfilearg/parser.go b/pkg/configfilearg/parser.go index 764aaf0c6caf..f93e13911b83 100644 --- a/pkg/configfilearg/parser.go +++ b/pkg/configfilearg/parser.go @@ -98,28 +98,46 @@ func (p *Parser) stripInvalidFlags(command string, args []string) ([]string, err func (p *Parser) FindString(args []string, target string) (string, error) { configFile, isSet := p.findConfigFileFlag(args) + var lastVal string if configFile != "" { - bytes, err := readConfigFileData(configFile) + + _, err := os.Stat(configFile) if !isSet && os.IsNotExist(err) { return "", nil } else if err != nil { return "", err } - data := yaml.MapSlice{} - if err := yaml.Unmarshal(bytes, &data); err != nil { + files, err := dotDFiles(configFile) + if err != nil { return "", err } + files = append([]string{configFile}, files...) + for _, file := range files { + bytes, err := readConfigFileData(file) + if err != nil { + return "", err + } - for _, i := range data { - k, v := convert.ToString(i.Key), convert.ToString(i.Value) - if k == target { - return v, nil + data := yaml.MapSlice{} + if err := yaml.Unmarshal(bytes, &data); err != nil { + return "", err + } + for _, i := range data { + k, v := convert.ToString(i.Key), convert.ToString(i.Value) + isAppend := strings.HasSuffix(k, "+") + k = strings.TrimSuffix(k, "+") + if k == target { + if isAppend { + lastVal = lastVal + "," + v + } else { + lastVal = v + } + } } } } - - return "", nil + return lastVal, nil } func (p *Parser) findConfigFileFlag(args []string) (string, bool) { diff --git a/pkg/configfilearg/parser_test.go b/pkg/configfilearg/parser_test.go index 776d43774f17..66faa7586810 100644 --- a/pkg/configfilearg/parser_test.go +++ b/pkg/configfilearg/parser_test.go @@ -221,6 +221,7 @@ func Test_UnitParser_findConfigFileFlag(t *testing.T) { func Test_UnitParser_Parse(t *testing.T) { testDataOutput := []string{ "--foo-bar=bar-foo", + "--alice=bob", "--a-slice=1", "--a-slice=1.5", "--a-slice=2", @@ -237,6 +238,7 @@ func Test_UnitParser_Parse(t *testing.T) { "--c-slice=three", "--d-slice=three", "--d-slice=four", + "--f-string=beta", "--e-slice=one", "--e-slice=two", } @@ -376,7 +378,7 @@ func Test_UnitParser_FindString(t *testing.T) { want: "", }, { - name: "A custom config yaml exists, target exists", + name: "A custom config exists, target exists", fields: fields{ FlagNames: []string{"-c", "--config"}, EnvName: "_TEST_ENV", @@ -384,12 +386,12 @@ func Test_UnitParser_FindString(t *testing.T) { }, args: args{ osArgs: []string{"-c", "./testdata/data.yaml"}, - target: "foo-bar", + target: "alice", }, - want: "baz", + want: "bob", }, { - name: "A custom config yaml exists, target does not exist", + name: "A custom config exists, target does not exist", fields: fields{ FlagNames: []string{"-c", "--config"}, EnvName: "_TEST_ENV", @@ -401,6 +403,45 @@ func Test_UnitParser_FindString(t *testing.T) { }, want: "", }, + { + name: "Multiple custom configs exist, target exists in a secondary config", + fields: fields{ + FlagNames: []string{"-c", "--config"}, + EnvName: "_TEST_ENV", + DefaultConfig: "./testdata/data.yaml", + }, + args: args{ + osArgs: []string{"-c", "./testdata/data.yaml"}, + target: "f-string", + }, + want: "beta", + }, + { + name: "Multiple custom configs exist, multiple targets exist in multiple secondary config, replacement", + fields: fields{ + FlagNames: []string{"-c", "--config"}, + EnvName: "_TEST_ENV", + DefaultConfig: "./testdata/data.yaml", + }, + args: args{ + osArgs: []string{"-c", "./testdata/data.yaml"}, + target: "foo-bar", + }, + want: "bar-foo", + }, + { + name: "Multiple custom configs exist, multiple targets exist in multiple secondary config, appending", + fields: fields{ + FlagNames: []string{"-c", "--config"}, + EnvName: "_TEST_ENV", + DefaultConfig: "./testdata/data.yaml", + }, + args: args{ + osArgs: []string{"-c", "./testdata/data.yaml"}, + target: "b-string", + }, + want: "one,two", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/pkg/configfilearg/testdata/data.yaml b/pkg/configfilearg/testdata/data.yaml index 35105341ad7a..712668e5ab31 100644 --- a/pkg/configfilearg/testdata/data.yaml +++ b/pkg/configfilearg/testdata/data.yaml @@ -1,4 +1,5 @@ foo-bar: baz +alice: bob a-slice: - 1 - "2" diff --git a/pkg/configfilearg/testdata/data.yaml.d/01-data.yml b/pkg/configfilearg/testdata/data.yaml.d/01-data.yml index d118ca5a00f7..9a0a098f7c73 100644 --- a/pkg/configfilearg/testdata/data.yaml.d/01-data.yml +++ b/pkg/configfilearg/testdata/data.yaml.d/01-data.yml @@ -11,4 +11,5 @@ c-slice: - two d-slice: - one -- two \ No newline at end of file +- two +f-string: beta \ No newline at end of file