diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 2ac3e52a72..07b096bbf7 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -26,6 +26,7 @@ import ( "os/exec" "os/user" "path/filepath" + "regexp" "runtime" "strconv" "strings" @@ -210,6 +211,8 @@ func runStart(cmd *cobra.Command, args []string) { exit.WithError("Failed to save config", err) } + validateDriverVersion(viper.GetString(vmDriver)) + m, err := machine.NewAPIClient() if err != nil { exit.WithError("Failed to get machine client", err) @@ -850,3 +853,51 @@ func saveConfig(clusterConfig cfg.Config) error { } return nil } + +func validateDriverVersion(vmDriver string) { + if vmDriver == constants.DriverKvm2 { + cmd := exec.Command("docker-machine-driver-kvm2", "version") + output, err := cmd.Output() + + // we don't want to fail if an error was returned, libmachine has a nice message for the user if + // the driver isn't present + if err != nil { + console.Warning("Error checking driver version: %v", err) + return + } + + v := extractVMDriverVersion(string(output)) + + if len(v) == 0 { + exit.WithCode(exit.Failure, "Please upgrade the 'docker-machine-driver-kvm2'.") + } + + vmDriverVersion, err := semver.Make(v) + if err != nil { + console.Warning("Error parsing vmDriver version: %v", err) + return + } + + minikubeVersion, err := version.GetSemverVersion() + if err != nil { + console.Warning("Error parsing minukube version: %v", err) + return + } + + if vmDriverVersion.LT(minikubeVersion) { + console.Warning("The 'docker-machine-driver-kvm2' version is old. Please consider upgrading.") + } + } +} + +func extractVMDriverVersion(s string) string { + versionRegex := regexp.MustCompile(`version:(.*)`) + matches := versionRegex.FindStringSubmatch(s) + + if len(matches) != 2 { + return "" + } + + v := strings.TrimSpace(matches[1]) + return strings.TrimPrefix(v, version.VersionPrefix) +} diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go new file mode 100644 index 0000000000..fc97b96887 --- /dev/null +++ b/cmd/minikube/cmd/start_test.go @@ -0,0 +1,45 @@ +/* +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 cmd + +import ( + "testing" +) + +func Test_extractVMDriverVersion(t *testing.T) { + v := extractVMDriverVersion("") + if len(v) != 0 { + t.Error("Expected empty string") + } + + v = extractVMDriverVersion("random text") + if len(v) != 0 { + t.Error("Expected empty string") + } + + expectedVersion := "1.2.3" + + v = extractVMDriverVersion("version: v1.2.3") + if expectedVersion != v { + t.Errorf("Expected version: %s, got: %s", expectedVersion, v) + } + + v = extractVMDriverVersion("version: 1.2.3") + if expectedVersion != v { + t.Errorf("Expected version: %s, got: %s", expectedVersion, v) + } +}