From 31525fe822dce8d04a41f566dc130e219fbaf3f2 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Wed, 13 May 2020 14:15:08 -0700 Subject: [PATCH 1/5] Add defaults subcommand to `minikube config` `minikube config defaults PROPERTY_NAME` will print out all acceptable default values for that property. Currently only works for `minikube config defaults driver` which looks like this on Mac: ``` $ minikube config defaults driver * virtualbox * parallels * vmwarefusion * hyperkit * vmware * docker * podman ``` This will be useful for clients that depend on minikube, like IDE extensions. --- cmd/minikube/cmd/config/config.go | 21 ++++---- cmd/minikube/cmd/config/defaults.go | 74 +++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 9 deletions(-) create mode 100644 cmd/minikube/cmd/config/defaults.go diff --git a/cmd/minikube/cmd/config/config.go b/cmd/minikube/cmd/config/config.go index 9d80c2112b..46a9b4fe6b 100644 --- a/cmd/minikube/cmd/config/config.go +++ b/cmd/minikube/cmd/config/config.go @@ -22,6 +22,7 @@ import ( "github.com/golang/glog" "github.com/spf13/cobra" "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/localpath" ) @@ -32,21 +33,23 @@ type setFn func(string, string) error // Setting represents a setting type Setting struct { - name string - set func(config.MinikubeConfig, string, string) error - setMap func(config.MinikubeConfig, string, map[string]interface{}) error - validations []setFn - callbacks []setFn + name string + set func(config.MinikubeConfig, string, string) error + setMap func(config.MinikubeConfig, string, map[string]interface{}) error + validDefaults func() []string + validations []setFn + callbacks []setFn } // These are all the settings that are configurable // and their validation and callback fn run on Set var settings = []Setting{ { - name: "driver", - set: SetString, - validations: []setFn{IsValidDriver}, - callbacks: []setFn{RequiresRestartMsg}, + name: "driver", + set: SetString, + validDefaults: driver.SupportedDrivers, + validations: []setFn{IsValidDriver}, + callbacks: []setFn{RequiresRestartMsg}, }, { name: "vm-driver", diff --git a/cmd/minikube/cmd/config/defaults.go b/cmd/minikube/cmd/config/defaults.go new file mode 100644 index 0000000000..caaf2eab1d --- /dev/null +++ b/cmd/minikube/cmd/config/defaults.go @@ -0,0 +1,74 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + "errors" + "fmt" + "strings" + + "github.com/spf13/cobra" +) + +var configDefaultsCommand = &cobra.Command{ + Use: "defaults PROPERTY_NAME", + Short: "Lists all valid default values for PROPERTY_NAME", + Long: `list displays all valid default settings for PROPERTY_NAME +Acceptable fields: ` + "\n\n" + fieldsWithDefaults(), + RunE: func(cmd *cobra.Command, args []string) error { + if len(args) == 0 { + cmd.SilenceErrors = true + return errors.New("not enough arguments.\nusage: minikube config list PROPERTY_NAME") + } + if len(args) > 1 { + cmd.SilenceErrors = true + return fmt.Errorf("too many arguments (%d)\nusage: minikube config list PROPERTY_NAME", len(args)) + } + + property := args[0] + return listDefaults(property) + }, +} + +func listDefaults(property string) error { + setting, err := findSetting(property) + if err != nil { + return err + } + if setting.validDefaults == nil { + return fmt.Errorf("%s is not a valid option for the `defaults` command; to see valid options run `minikube config defaults -h`", property) + } + defaults := setting.validDefaults() + for _, d := range defaults { + fmt.Printf("* %s\n", d) + } + return nil +} + +func fieldsWithDefaults() string { + fields := []string{} + for _, s := range settings { + if s.validDefaults != nil { + fields = append(fields, " * "+s.name) + } + } + return strings.Join(fields, "\n") +} + +func init() { + ConfigCmd.AddCommand(configDefaultsCommand) +} From 208fb8a3c6c0fdafd4d0c12b5675f6c95d8df142 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Wed, 13 May 2020 14:29:28 -0700 Subject: [PATCH 2/5] Add unit test --- cmd/minikube/cmd/config/defaults.go | 3 +- cmd/minikube/cmd/config/defaults_test.go | 59 ++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 cmd/minikube/cmd/config/defaults_test.go diff --git a/cmd/minikube/cmd/config/defaults.go b/cmd/minikube/cmd/config/defaults.go index caaf2eab1d..d7d61015aa 100644 --- a/cmd/minikube/cmd/config/defaults.go +++ b/cmd/minikube/cmd/config/defaults.go @@ -22,6 +22,7 @@ import ( "strings" "github.com/spf13/cobra" + "k8s.io/minikube/pkg/minikube/out" ) var configDefaultsCommand = &cobra.Command{ @@ -54,7 +55,7 @@ func listDefaults(property string) error { } defaults := setting.validDefaults() for _, d := range defaults { - fmt.Printf("* %s\n", d) + out.Ln("* %s", d) } return nil } diff --git a/cmd/minikube/cmd/config/defaults_test.go b/cmd/minikube/cmd/config/defaults_test.go new file mode 100644 index 0000000000..93d567f338 --- /dev/null +++ b/cmd/minikube/cmd/config/defaults_test.go @@ -0,0 +1,59 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package config + +import ( + "strings" + "testing" + + "k8s.io/minikube/pkg/minikube/tests" + + "k8s.io/minikube/pkg/minikube/out" +) + +func TestListDefaults(t *testing.T) { + tcs := []struct { + property string + expectedContents string + shouldErr bool + }{ + { + property: "driver", + expectedContents: "* docker\n*", + }, { + property: "invalid", + shouldErr: true, + }, + } + for _, tc := range tcs { + t.Run(tc.property, func(t *testing.T) { + f := tests.NewFakeFile() + out.SetOutFile(f) + err := listDefaults(tc.property) + if err != nil && !tc.shouldErr { + t.Fatalf("test shouldn't have failed, error listing defaults: %v", err) + } + if err == nil && tc.shouldErr { + t.Fatal("test should have failed but did not") + } + actual := f.String() + if !strings.Contains(actual, tc.expectedContents) { + t.Fatalf("actual contents don't contain expected contents. Actual: %v\nExpected: %v\n", actual, tc.expectedContents) + } + }) + } +} From b3d4750c054c0e9614f0b1e82e67240399b5873e Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Wed, 13 May 2020 14:37:45 -0700 Subject: [PATCH 3/5] Add support for --output json --- cmd/minikube/cmd/config/defaults.go | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/cmd/minikube/cmd/config/defaults.go b/cmd/minikube/cmd/config/defaults.go index d7d61015aa..1807470880 100644 --- a/cmd/minikube/cmd/config/defaults.go +++ b/cmd/minikube/cmd/config/defaults.go @@ -17,10 +17,11 @@ limitations under the License. package config import ( - "errors" + "encoding/json" "fmt" "strings" + "github.com/pkg/errors" "github.com/spf13/cobra" "k8s.io/minikube/pkg/minikube/out" ) @@ -41,19 +42,34 @@ Acceptable fields: ` + "\n\n" + fieldsWithDefaults(), } property := args[0] - return listDefaults(property) + defaults, err := getDefaults(property) + if err != nil { + return err + } + return printDefaults(defaults) }, } -func listDefaults(property string) error { +func getDefaults(property string) ([]string, error) { setting, err := findSetting(property) if err != nil { - return err + return nil, err } if setting.validDefaults == nil { - return fmt.Errorf("%s is not a valid option for the `defaults` command; to see valid options run `minikube config defaults -h`", property) + return nil, fmt.Errorf("%s is not a valid option for the `defaults` command; to see valid options run `minikube config defaults -h`", property) + } + return setting.validDefaults(), nil +} + +func printDefaults(defaults []string) error { + if output == "json" { + encoding, err := json.Marshal(defaults) + if err != nil { + return errors.Wrap(err, "encoding json") + } + out.Ln(string(encoding)) + return nil } - defaults := setting.validDefaults() for _, d := range defaults { out.Ln("* %s", d) } @@ -71,5 +87,6 @@ func fieldsWithDefaults() string { } func init() { + configDefaultsCommand.Flags().StringVar(&output, "output", "", "Output format. Accepted values: [json]") ConfigCmd.AddCommand(configDefaultsCommand) } From 950110280d759937e69fe901b6196d67799b6581 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Wed, 13 May 2020 14:44:31 -0700 Subject: [PATCH 4/5] Fix unit tests --- cmd/minikube/cmd/config/defaults_test.go | 54 +++++++++++++++++++----- go.sum | 1 + 2 files changed, 44 insertions(+), 11 deletions(-) diff --git a/cmd/minikube/cmd/config/defaults_test.go b/cmd/minikube/cmd/config/defaults_test.go index 93d567f338..e87b214e27 100644 --- a/cmd/minikube/cmd/config/defaults_test.go +++ b/cmd/minikube/cmd/config/defaults_test.go @@ -17,15 +17,13 @@ limitations under the License. package config import ( - "strings" "testing" - "k8s.io/minikube/pkg/minikube/tests" - "k8s.io/minikube/pkg/minikube/out" + "k8s.io/minikube/pkg/minikube/tests" ) -func TestListDefaults(t *testing.T) { +func TestGetDefaults(t *testing.T) { tcs := []struct { property string expectedContents string @@ -33,7 +31,7 @@ func TestListDefaults(t *testing.T) { }{ { property: "driver", - expectedContents: "* docker\n*", + expectedContents: "docker", }, { property: "invalid", shouldErr: true, @@ -41,18 +39,52 @@ func TestListDefaults(t *testing.T) { } for _, tc := range tcs { t.Run(tc.property, func(t *testing.T) { - f := tests.NewFakeFile() - out.SetOutFile(f) - err := listDefaults(tc.property) + defaults, err := getDefaults(tc.property) if err != nil && !tc.shouldErr { t.Fatalf("test shouldn't have failed, error listing defaults: %v", err) } if err == nil && tc.shouldErr { t.Fatal("test should have failed but did not") } - actual := f.String() - if !strings.Contains(actual, tc.expectedContents) { - t.Fatalf("actual contents don't contain expected contents. Actual: %v\nExpected: %v\n", actual, tc.expectedContents) + if tc.shouldErr { + return + } + for _, d := range defaults { + if d == tc.expectedContents { + return + } + } + t.Fatalf("defaults didn't contain expected default. Actual: %v\nExpected: %v\n", defaults, tc.expectedContents) + }) + } +} + +func TestPrintDefaults(t *testing.T) { + defaults := []string{"a", "b", "c"} + tcs := []struct { + description string + format string + expected string + }{ + { + description: "print to stdout", + expected: "* a\n* b\n* c\n", + }, { + description: "print in json", + format: "json", + expected: "[\"a\",\"b\",\"c\"]\n", + }, + } + for _, tc := range tcs { + t.Run(tc.description, func(t *testing.T) { + output = tc.format + f := tests.NewFakeFile() + out.SetOutFile(f) + if err := printDefaults(defaults); err != nil { + t.Fatalf("error printing defaults: %v", err) + } + if f.String() != tc.expected { + t.Fatalf("Expected: %v\n Actual: %v\n", tc.expected, f.String()) } }) } diff --git a/go.sum b/go.sum index e515f17ba5..d25b4f2065 100644 --- a/go.sum +++ b/go.sum @@ -405,6 +405,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5 h1:UImYN5qQ8tuGpGE16ZmjvcTtTw24zw1QAp/SlnNrZhI= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/hashicorp/go-cleanhttp v0.5.0 h1:wvCrVc9TjDls6+YGAF2hAifE1E5U1+b4tH6KdvN3Gig= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= From bd08d04df72254a752f4b8bcdf39f817f9b41220 Mon Sep 17 00:00:00 2001 From: Priya Wadhwa Date: Wed, 13 May 2020 15:51:53 -0700 Subject: [PATCH 5/5] update docs --- site/content/en/docs/commands/config.md | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/site/content/en/docs/commands/config.md b/site/content/en/docs/commands/config.md index be16831f3d..a77338047e 100644 --- a/site/content/en/docs/commands/config.md +++ b/site/content/en/docs/commands/config.md @@ -68,6 +68,42 @@ minikube config SUBCOMMAND [flags] --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging ``` +## minikube config defaults + +Lists all valid default values for PROPERTY_NAME + +### Synopsis + +list displays all valid default settings for PROPERTY_NAME +Acceptable fields: + + * driver + +``` +minikube config defaults PROPERTY_NAME [flags] +``` + +### Options + +``` + -h, --help help for defaults + --output string Output format. Accepted values: [json] +``` + +### Options inherited from parent commands + +``` + --alsologtostderr log to standard error as well as files + -b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm") + --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_dir string If non-empty, write log files in this directory + --logtostderr log to standard error instead of files + -p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube") + --stderrthreshold severity logs at or above this threshold go to stderr (default 2) + -v, --v Level log level for V logs + --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging +``` + ## minikube config get Gets the value of PROPERTY_NAME from the minikube config file