diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index f695186cda965b1552f4889cf07f2b2ea84c6e75..42081bc919a5144a509bc590c85817e5b8756ed7 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -660,6 +660,12 @@ func validateSpecifiedDriver(existing *config.ClusterConfig) { return } + // hostDriver always returns original driver name even if an alias is used to start minikube. + // For all next start with alias needs to be check against the host driver aliases. + if driver.IsAlias(old, requested) { + return + } + exit.Advice( reason.GuestDrvMismatch, `The existing "{{.name}}" cluster was created using the "{{.old}}" driver, which is incompatible with requested "{{.new}}" driver.`, diff --git a/pkg/minikube/driver/driver.go b/pkg/minikube/driver/driver.go index 8d876f1c8302fb71f4a4fdcd82a3646c075ef8c8..7a5ff92828b9c3b38f91a5e5f55a83814771b21c 100644 --- a/pkg/minikube/driver/driver.go +++ b/pkg/minikube/driver/driver.go @@ -53,6 +53,9 @@ const ( HyperV = "hyperv" // Parallels driver Parallels = "parallels" + + // AliasKVM is driver name alias for kvm2 + AliasKVM = "kvm" ) var ( @@ -283,6 +286,17 @@ func Status(name string) registry.DriverState { } } +// IsAlias checks if an alias belongs to provided driver by name. +func IsAlias(name, alias string) bool { + d := registry.Driver(name) + for _, da := range d.Alias { + if da == alias { + return true + } + } + return false +} + // SetLibvirtURI sets the URI to perform libvirt health checks against func SetLibvirtURI(v string) { klog.Infof("Setting default libvirt URI to %s", v) diff --git a/pkg/minikube/registry/drvs/kvm2/kvm2.go b/pkg/minikube/registry/drvs/kvm2/kvm2.go index a1c1f4442abf15f4909d3b948a0a473895c1c890..55174110ba611b50054ba9adfeeeca5c2ddb2490 100644 --- a/pkg/minikube/registry/drvs/kvm2/kvm2.go +++ b/pkg/minikube/registry/drvs/kvm2/kvm2.go @@ -43,6 +43,7 @@ const ( func init() { if err := registry.Register(registry.DriverDef{ Name: driver.KVM2, + Alias: []string{driver.AliasKVM}, Config: configure, Status: status, Priority: registry.Preferred, diff --git a/pkg/minikube/registry/registry.go b/pkg/minikube/registry/registry.go index ff0ce69c74e0573c043c46693d47574a27da8486..3cdc64414abcce175d908e433df924ce17147222 100644 --- a/pkg/minikube/registry/registry.go +++ b/pkg/minikube/registry/registry.go @@ -86,6 +86,9 @@ type DriverDef struct { // Name of the machine driver. It has to be unique. Name string + // Alias contains a list of machine driver aliases. Each alias should also be unique. + Alias []string + // Config is a function that emits a configured driver struct Config Configurator @@ -109,13 +112,15 @@ func (d DriverDef) String() string { } type driverRegistry struct { - drivers map[string]DriverDef - lock sync.RWMutex + drivers map[string]DriverDef + driversByAlias map[string]DriverDef + lock sync.RWMutex } func newRegistry() *driverRegistry { return &driverRegistry{ - drivers: make(map[string]DriverDef), + drivers: make(map[string]DriverDef), + driversByAlias: make(map[string]DriverDef), } } @@ -129,6 +134,13 @@ func (r *driverRegistry) Register(def DriverDef) error { } r.drivers[def.Name] = def + + for _, alias := range def.Alias { + if _, ok := r.driversByAlias[alias]; ok { + return fmt.Errorf("alias %q is already registered: %+v", alias, def) + } + r.driversByAlias[alias] = def + } return nil } @@ -150,5 +162,12 @@ func (r *driverRegistry) List() []DriverDef { func (r *driverRegistry) Driver(name string) DriverDef { r.lock.RLock() defer r.lock.RUnlock() - return r.drivers[name] + + def, ok := r.drivers[name] + if ok { + return def + } + + // Check if we have driver def with name as alias + return r.driversByAlias[name] } diff --git a/pkg/minikube/registry/registry_test.go b/pkg/minikube/registry/registry_test.go index e1d84b25efaeef805ba515a101f74e066e6fda83..c04959abe70a356c2af323533e96b97412647ae6 100644 --- a/pkg/minikube/registry/registry_test.go +++ b/pkg/minikube/registry/registry_test.go @@ -63,3 +63,31 @@ func TestList(t *testing.T) { t.Errorf("list mismatch (-want +got):\n%s", diff) } } + +func TestDriverAlias(t *testing.T) { + foo := DriverDef{Name: "foo", Alias: []string{"foo-alias"}} + r := newRegistry() + + if err := r.Register(foo); err != nil { + t.Errorf("Register = %v, expected nil", err) + } + + d := r.Driver("foo") + if d.Empty() { + t.Errorf("driver.Empty = true, expected false") + } + + d = r.Driver("foo-alias") + if d.Empty() { + t.Errorf("driver.Empty = true, expected false") + } + + if diff := cmp.Diff(r.List(), []DriverDef{foo}); diff != "" { + t.Errorf("list mismatch (-want +got):\n%s", diff) + } + + d = r.Driver("bar") + if !d.Empty() { + t.Errorf("driver.Empty = false, expected true") + } +}