From 19551f1e342dfef3c73657de8cd7db54594e95c3 Mon Sep 17 00:00:00 2001 From: Flavio Percoco Date: Tue, 16 Oct 2018 09:20:08 +0200 Subject: [PATCH] Proxy cli params to minikube (#485) --- .../bootstrap/minikube/minikube.go | 14 +++++--- .../bootstrap/minikube/minikube_test.go | 35 +++++++++++++++++-- cmd/clusterctl/cmd/create_cluster.go | 8 ++++- cmd/clusterctl/cmd/delete_cluster.go | 5 ++- ...create-cluster-no-args-invalid-flag.golden | 1 + .../testdata/create-cluster-no-args.golden | 1 + 6 files changed, 54 insertions(+), 10 deletions(-) diff --git a/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go b/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go index 9a3a79445bac..29c039c9f0f5 100644 --- a/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go +++ b/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube.go @@ -27,15 +27,19 @@ import ( type Minikube struct { kubeconfigpath string - vmDriver string + options []string // minikubeExec implemented as function variable for testing hooks minikubeExec func(env []string, args ...string) (string, error) } -func New(vmDriver string) *Minikube { +func New() *Minikube { + return WithOptions([]string{}) +} + +func WithOptions(options []string) *Minikube { return &Minikube{ minikubeExec: minikubeExec, - vmDriver: vmDriver, + options: options, // Arbitrary file name. Can potentially be randomly generated. kubeconfigpath: "minikube.kubeconfig", } @@ -56,8 +60,8 @@ var minikubeExec = func(env []string, args ...string) (string, error) { func (m *Minikube) Create() error { args := []string{"start", "--bootstrapper=kubeadm"} - if m.vmDriver != "" { - args = append(args, fmt.Sprintf("--vm-driver=%v", m.vmDriver)) + for _, opt := range m.options { + args = append(args, fmt.Sprintf("--%v", opt)) } _, err := m.exec(args...) return err diff --git a/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube_test.go b/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube_test.go index 817ed4aa1423..b41714847943 100644 --- a/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube_test.go +++ b/cmd/clusterctl/clusterdeployer/bootstrap/minikube/minikube_test.go @@ -40,7 +40,36 @@ func TestCreate(t *testing.T) { } for _, testcase := range testcases { t.Run(testcase.name, func(t *testing.T) { - m := New("") + m := New() + m.minikubeExec = func(env []string, args ...string) (string, error) { + return "", testcase.execError + } + err := m.Create() + if (testcase.expectErr && err == nil) || (!testcase.expectErr && err != nil) { + t.Fatalf("Unexpected returned error. Got: %v, Want Err: %v", err, testcase.expectErr) + } + }) + } +} + +func TestCreateOptions(t *testing.T) { + var testcases = []struct { + name string + execError error + expectErr bool + }{ + { + name: "success", + }, + { + name: "exec fail", + execError: fmt.Errorf("test error"), + expectErr: true, + }, + } + for _, testcase := range testcases { + t.Run(testcase.name, func(t *testing.T) { + m := WithOptions([]string{"vm-driver=kvm2", "insecure-registry='172.16.0.1'"}) m.minikubeExec = func(env []string, args ...string) (string, error) { return "", testcase.execError } @@ -69,7 +98,7 @@ func TestDelete(t *testing.T) { } for _, testcase := range testcases { t.Run(testcase.name, func(t *testing.T) { - m := New("") + m := New() m.minikubeExec = func(env []string, args ...string) (string, error) { return "", testcase.execError } @@ -83,7 +112,7 @@ func TestDelete(t *testing.T) { func TestGetKubeconfig(t *testing.T) { const contents = "dfserfafaew" - m := New("") + m := New() f, err := createTempFile(contents) if err != nil { t.Fatal("Unable to create test file.") diff --git a/cmd/clusterctl/cmd/create_cluster.go b/cmd/clusterctl/cmd/create_cluster.go index ee5c34e4f2ca..aced2814e8af 100644 --- a/cmd/clusterctl/cmd/create_cluster.go +++ b/cmd/clusterctl/cmd/create_cluster.go @@ -38,6 +38,7 @@ type CreateOptions struct { ProviderComponents string AddonComponents string CleanupBootstrapCluster bool + MiniKube []string VmDriver string Provider string KubeconfigOutput string @@ -83,7 +84,11 @@ func RunCreate(co *CreateOptions) error { return err } } else { - bootstrapProvider = minikube.New(co.VmDriver) + if co.VmDriver != "" { + co.MiniKube = append(co.MiniKube, fmt.Sprintf("vm-driver=%s", co.VmDriver)) + } + + bootstrapProvider = minikube.WithOptions(co.MiniKube) } @@ -123,6 +128,7 @@ func init() { // Optional flags createClusterCmd.Flags().StringVarP(&co.AddonComponents, "addon-components", "a", "", "A yaml file containing cluster addons to apply to the internal cluster") createClusterCmd.Flags().BoolVarP(&co.CleanupBootstrapCluster, "cleanup-bootstrap-cluster", "", true, "Whether to cleanup the bootstrap cluster after bootstrap") + createClusterCmd.Flags().StringSliceVarP(&co.MiniKube, "minikube", "", []string{}, "Minikube options") createClusterCmd.Flags().StringVarP(&co.VmDriver, "vm-driver", "", "", "Which vm driver to use for minikube") createClusterCmd.Flags().StringVarP(&co.KubeconfigOutput, "kubeconfig-out", "", "kubeconfig", "Where to output the kubeconfig for the provisioned cluster") createClusterCmd.Flags().StringVarP(&co.ExistingClusterKubeconfigPath, "existing-bootstrap-cluster-kubeconfig", "", "", "Path to an existing cluster's kubeconfig for bootstrapping (intead of using minikube)") diff --git a/cmd/clusterctl/cmd/delete_cluster.go b/cmd/clusterctl/cmd/delete_cluster.go index efbb4ce88a0d..b5c95831f983 100644 --- a/cmd/clusterctl/cmd/delete_cluster.go +++ b/cmd/clusterctl/cmd/delete_cluster.go @@ -72,7 +72,10 @@ func RunDelete() error { return fmt.Errorf("error when creating cluster client: %v", err) } defer clusterClient.Close() - mini := minikube.New(do.VmDriver) + if co.VmDriver != "" { + co.MiniKube = append(co.MiniKube, fmt.Sprintf("vm-driver=%s", co.VmDriver)) + } + mini := minikube.WithOptions(co.MiniKube) deployer := clusterdeployer.New(mini, clusterclient.NewFactory(), providerComponents, diff --git a/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden b/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden index 4ecdc212ff2e..137d1889e9fe 100644 --- a/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden +++ b/cmd/clusterctl/testdata/create-cluster-no-args-invalid-flag.golden @@ -10,6 +10,7 @@ Flags: -h, --help help for cluster --kubeconfig-out string Where to output the kubeconfig for the provisioned cluster (default "kubeconfig") -m, --machines string A yaml file containing machine object definition(s) + --minikube strings Minikube options --provider string Which provider deployment logic to use (google/vsphere/azure) -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects --vm-driver string Which vm driver to use for minikube diff --git a/cmd/clusterctl/testdata/create-cluster-no-args.golden b/cmd/clusterctl/testdata/create-cluster-no-args.golden index 4b12becf4792..8ff72b633d50 100644 --- a/cmd/clusterctl/testdata/create-cluster-no-args.golden +++ b/cmd/clusterctl/testdata/create-cluster-no-args.golden @@ -12,6 +12,7 @@ Flags: -h, --help help for cluster --kubeconfig-out string Where to output the kubeconfig for the provisioned cluster (default "kubeconfig") -m, --machines string A yaml file containing machine object definition(s) + --minikube strings Minikube options --provider string Which provider deployment logic to use (google/vsphere/azure) -p, --provider-components string A yaml file containing cluster api provider controllers and supporting objects --vm-driver string Which vm driver to use for minikube