mirror of
https://github.com/k3s-io/k3s.git
synced 2024-06-07 19:41:36 +00:00
Enable FindString to search dotD config files (#7323)
* Enable FindString to search dotD config files * Address multiple arg cases Signed-off-by: Derek Nola <derek.nola@suse.com>
This commit is contained in:
parent
132b41c3bf
commit
e1d4cff14c
@ -98,28 +98,46 @@ func (p *Parser) stripInvalidFlags(command string, args []string) ([]string, err
|
|||||||
|
|
||||||
func (p *Parser) FindString(args []string, target string) (string, error) {
|
func (p *Parser) FindString(args []string, target string) (string, error) {
|
||||||
configFile, isSet := p.findConfigFileFlag(args)
|
configFile, isSet := p.findConfigFileFlag(args)
|
||||||
|
var lastVal string
|
||||||
if configFile != "" {
|
if configFile != "" {
|
||||||
bytes, err := readConfigFileData(configFile)
|
|
||||||
|
_, err := os.Stat(configFile)
|
||||||
if !isSet && os.IsNotExist(err) {
|
if !isSet && os.IsNotExist(err) {
|
||||||
return "", nil
|
return "", nil
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
data := yaml.MapSlice{}
|
files, err := dotDFiles(configFile)
|
||||||
if err := yaml.Unmarshal(bytes, &data); err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
files = append([]string{configFile}, files...)
|
||||||
|
for _, file := range files {
|
||||||
|
bytes, err := readConfigFileData(file)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
for _, i := range data {
|
data := yaml.MapSlice{}
|
||||||
k, v := convert.ToString(i.Key), convert.ToString(i.Value)
|
if err := yaml.Unmarshal(bytes, &data); err != nil {
|
||||||
if k == target {
|
return "", err
|
||||||
return v, nil
|
}
|
||||||
|
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 lastVal, nil
|
||||||
return "", nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *Parser) findConfigFileFlag(args []string) (string, bool) {
|
func (p *Parser) findConfigFileFlag(args []string) (string, bool) {
|
||||||
|
@ -221,6 +221,7 @@ func Test_UnitParser_findConfigFileFlag(t *testing.T) {
|
|||||||
func Test_UnitParser_Parse(t *testing.T) {
|
func Test_UnitParser_Parse(t *testing.T) {
|
||||||
testDataOutput := []string{
|
testDataOutput := []string{
|
||||||
"--foo-bar=bar-foo",
|
"--foo-bar=bar-foo",
|
||||||
|
"--alice=bob",
|
||||||
"--a-slice=1",
|
"--a-slice=1",
|
||||||
"--a-slice=1.5",
|
"--a-slice=1.5",
|
||||||
"--a-slice=2",
|
"--a-slice=2",
|
||||||
@ -237,6 +238,7 @@ func Test_UnitParser_Parse(t *testing.T) {
|
|||||||
"--c-slice=three",
|
"--c-slice=three",
|
||||||
"--d-slice=three",
|
"--d-slice=three",
|
||||||
"--d-slice=four",
|
"--d-slice=four",
|
||||||
|
"--f-string=beta",
|
||||||
"--e-slice=one",
|
"--e-slice=one",
|
||||||
"--e-slice=two",
|
"--e-slice=two",
|
||||||
}
|
}
|
||||||
@ -376,7 +378,7 @@ func Test_UnitParser_FindString(t *testing.T) {
|
|||||||
want: "",
|
want: "",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "A custom config yaml exists, target exists",
|
name: "A custom config exists, target exists",
|
||||||
fields: fields{
|
fields: fields{
|
||||||
FlagNames: []string{"-c", "--config"},
|
FlagNames: []string{"-c", "--config"},
|
||||||
EnvName: "_TEST_ENV",
|
EnvName: "_TEST_ENV",
|
||||||
@ -384,12 +386,12 @@ func Test_UnitParser_FindString(t *testing.T) {
|
|||||||
},
|
},
|
||||||
args: args{
|
args: args{
|
||||||
osArgs: []string{"-c", "./testdata/data.yaml"},
|
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{
|
fields: fields{
|
||||||
FlagNames: []string{"-c", "--config"},
|
FlagNames: []string{"-c", "--config"},
|
||||||
EnvName: "_TEST_ENV",
|
EnvName: "_TEST_ENV",
|
||||||
@ -401,6 +403,45 @@ func Test_UnitParser_FindString(t *testing.T) {
|
|||||||
},
|
},
|
||||||
want: "",
|
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 {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
t.Run(tt.name, func(t *testing.T) {
|
||||||
|
1
pkg/configfilearg/testdata/data.yaml
vendored
1
pkg/configfilearg/testdata/data.yaml
vendored
@ -1,4 +1,5 @@
|
|||||||
foo-bar: baz
|
foo-bar: baz
|
||||||
|
alice: bob
|
||||||
a-slice:
|
a-slice:
|
||||||
- 1
|
- 1
|
||||||
- "2"
|
- "2"
|
||||||
|
@ -11,4 +11,5 @@ c-slice:
|
|||||||
- two
|
- two
|
||||||
d-slice:
|
d-slice:
|
||||||
- one
|
- one
|
||||||
- two
|
- two
|
||||||
|
f-string: beta
|
Loading…
Reference in New Issue
Block a user