diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 62911c7d40ec..6421a206af92 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -213,6 +213,10 @@ func runStart(cmd *cobra.Command, args []string) { success := false // Walk down the rest of the options for _, alt := range alts { + // Skip non-default drivers + if !ds.Default { + continue + } out.WarningT("Startup with {{.old_driver}} driver failed, trying with alternate driver {{.new_driver}}: {{.error}}", out.V{"old_driver": ds.Name, "new_driver": alt.Name, "error": err}) ds = alt // Delete the existing cluster and try again with the next driver on the list diff --git a/pkg/minikube/driver/driver.go b/pkg/minikube/driver/driver.go index c9042b773d00..5ca3b4288b3b 100644 --- a/pkg/minikube/driver/driver.go +++ b/pkg/minikube/driver/driver.go @@ -255,6 +255,11 @@ func Suggest(options []registry.DriverState) (registry.DriverState, []registry.D continue } + if !ds.Default { + klog.Infof("not recommending %q due to default: %v", ds.Name, ds.Default) + continue + } + if ds.Priority <= registry.Discouraged { klog.Infof("not recommending %q due to priority: %d", ds.Name, ds.Priority) continue @@ -296,6 +301,7 @@ func Status(name string) registry.DriverState { d := registry.Driver(name) return registry.DriverState{ Name: d.Name, + Default: d.Default, Priority: d.Priority, State: registry.Status(name), } diff --git a/pkg/minikube/driver/driver_test.go b/pkg/minikube/driver/driver_test.go index b4fac014eb52..b602003b5aac 100644 --- a/pkg/minikube/driver/driver_test.go +++ b/pkg/minikube/driver/driver_test.go @@ -119,6 +119,7 @@ func TestSuggest(t *testing.T) { { def: registry.DriverDef{ Name: "unhealthy", + Default: true, Priority: registry.Default, Status: func() registry.State { return registry.State{Installed: true, Healthy: false} }, }, @@ -130,6 +131,7 @@ func TestSuggest(t *testing.T) { { def: registry.DriverDef{ Name: "discouraged", + Default: false, Priority: registry.Discouraged, Status: func() registry.State { return registry.State{Installed: true, Healthy: true} }, }, @@ -141,6 +143,7 @@ func TestSuggest(t *testing.T) { { def: registry.DriverDef{ Name: "default", + Default: true, Priority: registry.Default, Status: func() registry.State { return registry.State{Installed: true, Healthy: true} }, }, @@ -152,6 +155,7 @@ func TestSuggest(t *testing.T) { { def: registry.DriverDef{ Name: "preferred", + Default: true, Priority: registry.Preferred, Status: func() registry.State { return registry.State{Installed: true, Healthy: true} }, }, diff --git a/pkg/minikube/registry/drvs/docker/docker.go b/pkg/minikube/registry/drvs/docker/docker.go index 8616159c453f..d29904a9b813 100644 --- a/pkg/minikube/registry/drvs/docker/docker.go +++ b/pkg/minikube/registry/drvs/docker/docker.go @@ -46,6 +46,7 @@ func init() { Config: configure, Init: func() drivers.Driver { return kic.NewDriver(kic.Config{OCIBinary: oci.Docker}) }, Status: status, + Default: true, Priority: registry.HighlyPreferred, }); err != nil { panic(fmt.Sprintf("register failed: %v", err)) diff --git a/pkg/minikube/registry/drvs/hyperkit/hyperkit.go b/pkg/minikube/registry/drvs/hyperkit/hyperkit.go index 33d0caf3f399..4abde3a3d656 100644 --- a/pkg/minikube/registry/drvs/hyperkit/hyperkit.go +++ b/pkg/minikube/registry/drvs/hyperkit/hyperkit.go @@ -52,6 +52,7 @@ func init() { Name: driver.HyperKit, Config: configure, Status: status, + Default: true, Priority: registry.Preferred, }); err != nil { panic(fmt.Sprintf("register: %v", err)) diff --git a/pkg/minikube/registry/drvs/hyperv/hyperv.go b/pkg/minikube/registry/drvs/hyperv/hyperv.go index 7f324939d178..f8ce19f98fbf 100644 --- a/pkg/minikube/registry/drvs/hyperv/hyperv.go +++ b/pkg/minikube/registry/drvs/hyperv/hyperv.go @@ -47,6 +47,7 @@ func init() { Init: func() drivers.Driver { return hyperv.NewDriver("", "") }, Config: configure, Status: status, + Default: true, Priority: registry.Preferred, }); err != nil { panic(fmt.Sprintf("register: %v", err)) diff --git a/pkg/minikube/registry/drvs/kvm2/kvm2.go b/pkg/minikube/registry/drvs/kvm2/kvm2.go index 4dbce061d15c..393b7c6fbf9e 100644 --- a/pkg/minikube/registry/drvs/kvm2/kvm2.go +++ b/pkg/minikube/registry/drvs/kvm2/kvm2.go @@ -46,6 +46,7 @@ func init() { Alias: []string{driver.AliasKVM}, Config: configure, Status: status, + Default: true, Priority: registry.Preferred, }); err != nil { panic(fmt.Sprintf("register failed: %v", err)) diff --git a/pkg/minikube/registry/drvs/none/none.go b/pkg/minikube/registry/drvs/none/none.go index b50d2b0c1dd4..e2fcf11b0691 100644 --- a/pkg/minikube/registry/drvs/none/none.go +++ b/pkg/minikube/registry/drvs/none/none.go @@ -38,7 +38,8 @@ func init() { Config: configure, Init: func() drivers.Driver { return none.NewDriver(none.Config{}) }, Status: status, - Priority: registry.Discouraged, // requires root + Default: false, // no isolation + Priority: registry.Discouraged, }); err != nil { panic(fmt.Sprintf("register failed: %v", err)) } diff --git a/pkg/minikube/registry/drvs/parallels/parallels.go b/pkg/minikube/registry/drvs/parallels/parallels.go index 45e888d66064..a9b22ae36ab1 100644 --- a/pkg/minikube/registry/drvs/parallels/parallels.go +++ b/pkg/minikube/registry/drvs/parallels/parallels.go @@ -36,6 +36,7 @@ func init() { Name: driver.Parallels, Config: configure, Status: status, + Default: true, Priority: registry.Default, Init: func() drivers.Driver { return parallels.NewDriver("", "") }, }) diff --git a/pkg/minikube/registry/drvs/podman/podman.go b/pkg/minikube/registry/drvs/podman/podman.go index 9c5ddc931633..ef74aac63b74 100644 --- a/pkg/minikube/registry/drvs/podman/podman.go +++ b/pkg/minikube/registry/drvs/podman/podman.go @@ -53,6 +53,7 @@ func init() { Config: configure, Init: func() drivers.Driver { return kic.NewDriver(kic.Config{OCIBinary: oci.Podman}) }, Status: status, + Default: true, Priority: priority, }); err != nil { panic(fmt.Sprintf("register failed: %v", err)) diff --git a/pkg/minikube/registry/drvs/ssh/ssh.go b/pkg/minikube/registry/drvs/ssh/ssh.go index 45dfc3e3550c..8985143b615c 100644 --- a/pkg/minikube/registry/drvs/ssh/ssh.go +++ b/pkg/minikube/registry/drvs/ssh/ssh.go @@ -35,7 +35,8 @@ func init() { Alias: []string{driver.AliasSSH}, Config: configure, Status: status, - Priority: registry.Discouraged, // requires external VM + Default: false, // requires external VM + Priority: registry.Discouraged, Init: func() drivers.Driver { return ssh.NewDriver(ssh.Config{}) }, }) if err != nil { diff --git a/pkg/minikube/registry/drvs/virtualbox/virtualbox.go b/pkg/minikube/registry/drvs/virtualbox/virtualbox.go index 1d7cdac97fad..60f837790cb3 100644 --- a/pkg/minikube/registry/drvs/virtualbox/virtualbox.go +++ b/pkg/minikube/registry/drvs/virtualbox/virtualbox.go @@ -43,6 +43,7 @@ func init() { Name: driver.VirtualBox, Config: configure, Status: status, + Default: true, Priority: registry.Fallback, Init: func() drivers.Driver { return virtualbox.NewDriver("", "") }, }) diff --git a/pkg/minikube/registry/drvs/vmware/vmware.go b/pkg/minikube/registry/drvs/vmware/vmware.go index c422b4b60b48..de335931f785 100644 --- a/pkg/minikube/registry/drvs/vmware/vmware.go +++ b/pkg/minikube/registry/drvs/vmware/vmware.go @@ -32,6 +32,7 @@ func init() { err := registry.Register(registry.DriverDef{ Name: driver.VMware, Config: configure, + Default: true, Priority: registry.Default, Status: status, }) diff --git a/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go b/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go index 649bb8513d99..d2197f077845 100644 --- a/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go +++ b/pkg/minikube/registry/drvs/vmwarefusion/vmwarefusion.go @@ -30,6 +30,7 @@ func init() { if err := registry.Register(registry.DriverDef{ Name: driver.VMwareFusion, Status: status, + Default: false, // see driver.VMware instead Priority: registry.Obsolete, }); err != nil { panic(fmt.Sprintf("register: %v", err)) diff --git a/pkg/minikube/registry/global.go b/pkg/minikube/registry/global.go index 7ffc3d5d94de..8b942e99e248 100644 --- a/pkg/minikube/registry/global.go +++ b/pkg/minikube/registry/global.go @@ -67,6 +67,7 @@ var ( // DriverState is metadata relating to a driver and status type DriverState struct { Name string + Default bool Priority Priority State State // Rejection is why we chose not to use this driver @@ -107,7 +108,7 @@ func Available(vm bool) []DriverState { continue } s := d.Status() - klog.Infof("%s priority: %d, state: %+v", d.Name, d.Priority, s) + klog.Infof("%s default: %v priority: %d, state: %+v", d.Name, d.Default, d.Priority, s) priority := d.Priority if !s.Healthy { @@ -116,10 +117,10 @@ func Available(vm bool) []DriverState { if vm { if IsVM(d.Name) { - sts = append(sts, DriverState{Name: d.Name, Priority: priority, State: s}) + sts = append(sts, DriverState{Name: d.Name, Default: d.Default, Priority: priority, State: s}) } } else { - sts = append(sts, DriverState{Name: d.Name, Priority: priority, State: s}) + sts = append(sts, DriverState{Name: d.Name, Default: d.Default, Priority: priority, State: s}) } } diff --git a/pkg/minikube/registry/global_test.go b/pkg/minikube/registry/global_test.go index 9cb01a1e3599..f76e1adef0bf 100644 --- a/pkg/minikube/registry/global_test.go +++ b/pkg/minikube/registry/global_test.go @@ -73,6 +73,7 @@ func TestGlobalAvailable(t *testing.T) { bar := DriverDef{ Name: "healthy-bar", + Default: true, Priority: Default, Status: func() State { return State{Healthy: true} }, } @@ -82,6 +83,7 @@ func TestGlobalAvailable(t *testing.T) { foo := DriverDef{ Name: "unhealthy-foo", + Default: true, Priority: Default, Status: func() State { return State{Healthy: false} }, } @@ -92,11 +94,13 @@ func TestGlobalAvailable(t *testing.T) { expected := []DriverState{ { Name: "healthy-bar", + Default: true, Priority: Default, State: State{Healthy: true}, }, { Name: "unhealthy-foo", + Default: true, Priority: Unhealthy, State: State{Healthy: false}, }, @@ -117,6 +121,7 @@ func TestGlobalStatus(t *testing.T) { expected := State{Installed: true, Healthy: true} bar := DriverDef{ Name: "bar", + Default: true, Priority: Default, Status: func() State { return expected }, } diff --git a/pkg/minikube/registry/registry.go b/pkg/minikube/registry/registry.go index 3d4b065d1083..3deb18e1221f 100644 --- a/pkg/minikube/registry/registry.go +++ b/pkg/minikube/registry/registry.go @@ -102,6 +102,9 @@ type DriverDef struct { // Status returns the installation status of the driver Status StatusChecker + // Default is whether this driver is selected by default or not (opt-in). + Default bool + // Priority returns the prioritization for selecting a driver by default. Priority Priority }