Files
k3s/pkg/configfilearg/defaultparser_test.go
Brad Davidson 48750ae6fc Fix MustFindString returning override flags on external CLI commands
External CLI actions cannot short-circuit on --help or --version, so we
cannot skip loading the config file if these flags are present when
running these wrapped commands. The behavior of just returning the
override flag name instead of the requested flag value was breaking
data-dir lookup when running wrapped commands.

Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
(cherry picked from commit ff5c633fe7)
Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
2024-11-06 12:41:11 -08:00

152 lines
4.5 KiB
Go

package configfilearg
import (
"os"
"reflect"
"testing"
)
func Test_UnitMustParse(t *testing.T) {
tests := []struct {
name string
args []string
config string
want []string
}{
{
name: "Basic server",
args: []string{"k3s", "server"},
want: []string{"k3s", "server"},
},
{
name: "Server with known flags",
args: []string{"k3s", "server", "-t 12345", "--write-kubeconfig-mode 644"},
want: []string{"k3s", "server", "-t 12345", "--write-kubeconfig-mode 644"},
},
{
name: "Server with known flags and config with known and unknown flags",
args: []string{"k3s", "server", "--write-kubeconfig-mode 644"},
config: "./testdata/defaultdata.yaml",
want: []string{"k3s", "server", "--token=12345", "--node-label=DEAFBEEF",
"--etcd-s3=true", "--etcd-s3-bucket=my-backup", "--kubelet-arg=max-pods=999", "--write-kubeconfig-mode 644"},
},
{
name: "Basic etcd-snapshot",
args: []string{"k3s", "etcd-snapshot", "save"},
want: []string{"k3s", "etcd-snapshot", "save"},
},
{
name: "Etcd-snapshot with known flags",
args: []string{"k3s", "etcd-snapshot", "save", "--s3=true"},
want: []string{"k3s", "etcd-snapshot", "save", "--s3=true"},
},
{
name: "Etcd-snapshot with config with known and unknown flags",
args: []string{"k3s", "etcd-snapshot", "save"},
config: "./testdata/defaultdata.yaml",
want: []string{"k3s", "etcd-snapshot", "save", "--etcd-s3=true", "--etcd-s3-bucket=my-backup"},
},
{
name: "Agent with known flags",
args: []string{"k3s", "agent", "--token=12345"},
want: []string{"k3s", "agent", "--token=12345"},
},
{
name: "Agent with config with known and unknown flags, flags are not skipped",
args: []string{"k3s", "agent"},
config: "./testdata/defaultdata.yaml",
want: []string{"k3s", "agent", "--token=12345", "--node-label=DEAFBEEF",
"--etcd-s3=true", "--etcd-s3-bucket=my-backup", "--notaflag=true", "--kubelet-arg=max-pods=999"},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
DefaultParser.DefaultConfig = tt.config
if got := MustParse(tt.args); !reflect.DeepEqual(got, tt.want) {
t.Errorf("MustParse() = %+v\nWant = %+v", got, tt.want)
}
})
}
}
func Test_UnitMustFindString(t *testing.T) {
tests := []struct {
name string
args []string
target string
setup func() error // Optional, delete if unused
teardown func() error // Optional, delete if unused
want string
}{
{
name: "Target not found in config file",
args: []string{"k3s", "--foo", "bar"},
target: "token",
want: "",
setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/data.yaml") },
teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") },
},
{
name: "Target found in config file",
args: []string{"k3s", "--foo", "bar"},
target: "token",
want: "12345",
setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/defaultdata.yaml") },
teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") },
},
{
name: "Override flag is returned if found",
args: []string{"k3s", "--foo", "bar", "--version"},
target: "token",
want: "--version",
setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/defaultdata.yaml") },
teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") },
},
{
name: "Override flag is not returned for specific subcommands",
args: []string{"k3s", "ctr", "--foo", "bar", "--version"},
target: "token",
want: "12345",
setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/defaultdata.yaml") },
teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") },
},
{
name: "Override flag is not returned for specific subcommands",
args: []string{"kubectl", "--foo", "bar", "--help"},
target: "token",
want: "12345",
setup: func() error { return os.Setenv("K3S_CONFIG_FILE", "./testdata/defaultdata.yaml") },
teardown: func() error { return os.Unsetenv("K3S_CONFIG_FILE") },
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
defer tt.teardown()
if err := tt.setup(); err != nil {
t.Errorf("Setup for MustFindString() failed = %v", err)
return
}
got := MustFindString(tt.args, tt.target, "crictl", "ctr", "kubectl")
t.Logf("MustFindString(%+v, %+v) = %s", tt.args, tt.target, got)
if got != tt.want {
t.Errorf("MustFindString() = %+v\nWant = %+v", got, tt.want)
}
})
}
}