Merge pull request #21576 from medyagh/verify_aux_driver
verify aux drivers installed correctly and exit nicely if notpull/21584/head
commit
1a676ed723
|
|
@ -534,6 +534,12 @@ func updateDriver(driverName string) {
|
|||
if err != nil {
|
||||
out.WarningT("Error parsing minikube version: {{.error}}", out.V{"error": err})
|
||||
} else if err := auxdriver.InstallOrUpdate(driverName, localpath.MakeMiniPath("bin"), v, viper.GetBool(interactive), viper.GetBool(autoUpdate)); err != nil {
|
||||
if errors.Is(err, auxdriver.ErrAuxDriverVersionCommandFailed) {
|
||||
exit.Error(reason.DrvAuxNotHealthy, "Aux driver "+driverName, err)
|
||||
}
|
||||
if errors.Is(err, auxdriver.ErrAuxDriverVersionNotinPath) {
|
||||
exit.Error(reason.DrvAuxNotHealthy, "Aux driver"+driverName, err)
|
||||
} //if failed to update but not a fatal error, log it and continue (old version might still work)
|
||||
out.WarningT("Unable to update {{.driver}} driver: {{.error}}", out.V{"driver": driverName, "error": err})
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -38,6 +38,20 @@ import (
|
|||
"k8s.io/minikube/pkg/util/lock"
|
||||
)
|
||||
|
||||
func newAuxUnthealthyError(path string) error {
|
||||
return fmt.Errorf(`failed to execute auxiliary version command "%s --version"`, path)
|
||||
}
|
||||
|
||||
func newAuxNotFoundError(name, path string) error {
|
||||
return fmt.Errorf("auxiliary driver %s not found in path %s", name, path)
|
||||
}
|
||||
|
||||
// ErrAuxDriverVersionCommandFailed indicates the aux driver 'version' command failed to run
|
||||
var ErrAuxDriverVersionCommandFailed error
|
||||
|
||||
// ErrAuxDriverVersionNotinPath was not found in PATH
|
||||
var ErrAuxDriverVersionNotinPath error
|
||||
|
||||
// InstallOrUpdate downloads driver if it is not present, or updates it if there's a newer version
|
||||
func InstallOrUpdate(name string, directory string, v semver.Version, interactive bool, autoUpdate bool) error {
|
||||
if name != driver.KVM2 && name != driver.HyperKit {
|
||||
|
|
@ -65,7 +79,14 @@ func InstallOrUpdate(name string, directory string, v semver.Version, interactiv
|
|||
return err
|
||||
}
|
||||
}
|
||||
return fixDriverPermissions(name, path, interactive)
|
||||
if err := fixDriverPermissions(name, path, interactive); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if _, err := validateDriver(executable, minAcceptableDriverVersion(name, v)); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// fixDriverPermissions fixes the permissions on a driver
|
||||
|
|
@ -117,12 +138,17 @@ func validateDriver(executable string, v semver.Version) (string, error) {
|
|||
klog.Infof("Validating %s, PATH=%s", executable, os.Getenv("PATH"))
|
||||
path, err := exec.LookPath(executable)
|
||||
if err != nil {
|
||||
return path, err
|
||||
klog.Warningf("driver not in path : %s, %v", path, err.Error())
|
||||
ErrAuxDriverVersionNotinPath = newAuxNotFoundError(executable, path)
|
||||
return path, ErrAuxDriverVersionNotinPath
|
||||
}
|
||||
|
||||
output, err := exec.Command(path, "version").Output()
|
||||
cmd := exec.Command(path, "version")
|
||||
output, err := cmd.CombinedOutput()
|
||||
if err != nil {
|
||||
return path, err
|
||||
klog.Warningf("%s failed: %v: %s", cmd, err, output)
|
||||
ErrAuxDriverVersionCommandFailed = newAuxUnthealthyError(path)
|
||||
return path, ErrAuxDriverVersionCommandFailed
|
||||
}
|
||||
|
||||
ev := extractDriverVersion(string(output))
|
||||
|
|
|
|||
|
|
@ -318,6 +318,10 @@ var (
|
|||
DrvNotFound = Kind{ID: "DRV_NOT_FOUND", ExitCode: ExDriverNotFound}
|
||||
// minikube could not find a valid driver
|
||||
DrvNotDetected = Kind{ID: "DRV_NOT_DETECTED", ExitCode: ExDriverNotFound}
|
||||
// aux drivers (kvm or hyperkit) were not found
|
||||
DrvAuxNotNotFound = Kind{ID: "DRV_AUX_NOT_FOUND", ExitCode: ExDriverNotFound}
|
||||
// aux drivers (kvm or hyperkit) were found but not healthy
|
||||
DrvAuxNotHealthy = Kind{ID: "DRV_AUX_NOT_HEALTHY", ExitCode: ExDriverError}
|
||||
// minikube found drivers but none were ready to use
|
||||
DrvNotHealthy = Kind{ID: "DRV_NOT_HEALTHY", ExitCode: ExDriverNotFound}
|
||||
// minikube found the docker driver but the docker service was not running
|
||||
|
|
|
|||
|
|
@ -51,7 +51,6 @@ func TestKVMDriverInstallOrUpdate(t *testing.T) {
|
|||
name string
|
||||
path string
|
||||
}{
|
||||
{name: "driver-without-version-support", path: filepath.Join(*testdataDir, "kvm2-driver-without-version")},
|
||||
{name: "driver-with-older-version", path: filepath.Join(*testdataDir, "kvm2-driver-older-version")},
|
||||
}
|
||||
|
||||
|
|
@ -59,7 +58,7 @@ func TestKVMDriverInstallOrUpdate(t *testing.T) {
|
|||
defer os.Setenv("PATH", originalPath)
|
||||
|
||||
for _, tc := range tests {
|
||||
dir := t.TempDir()
|
||||
tempDLDir := t.TempDir()
|
||||
|
||||
pwd, err := os.Getwd()
|
||||
if err != nil {
|
||||
|
|
@ -70,9 +69,19 @@ func TestKVMDriverInstallOrUpdate(t *testing.T) {
|
|||
|
||||
_, err = os.Stat(filepath.Join(path, "docker-machine-driver-kvm2"))
|
||||
if err != nil {
|
||||
t.Fatalf("Expected driver to exist. test: %s, got: %v", tc.name, err)
|
||||
t.Fatalf("Expected test data driver to exist. test: %s, got: %v", tc.name, err)
|
||||
}
|
||||
|
||||
// copy test data driver into the temp download dir so we can point PATH to it for before/after install
|
||||
src := filepath.Join(path, "docker-machine-driver-kvm2")
|
||||
dst := filepath.Join(tempDLDir, "docker-machine-driver-kvm2")
|
||||
if err = CopyFile(src, dst, false); err != nil {
|
||||
t.Fatalf("Failed to copy test data driver to temp dir. test: %s, got: %v", tc.name, err)
|
||||
}
|
||||
|
||||
// point to the copied driver for the rest of the test
|
||||
path = tempDLDir
|
||||
|
||||
// change permission to allow driver to be executable
|
||||
err = os.Chmod(filepath.Join(path, "docker-machine-driver-kvm2"), 0700)
|
||||
if err != nil {
|
||||
|
|
@ -82,17 +91,17 @@ func TestKVMDriverInstallOrUpdate(t *testing.T) {
|
|||
os.Setenv("PATH", fmt.Sprintf("%s:%s", path, originalPath))
|
||||
|
||||
// NOTE: This should be a real version, as it impacts the downloaded URL
|
||||
newerVersion, err := semver.Make("1.3.0")
|
||||
newerVersion, err := semver.Make("1.37.0")
|
||||
if err != nil {
|
||||
t.Fatalf("Expected new semver. test: %v, got: %v", tc.name, err)
|
||||
}
|
||||
|
||||
err = auxdriver.InstallOrUpdate("kvm2", dir, newerVersion, true, true)
|
||||
err = auxdriver.InstallOrUpdate("kvm2", tempDLDir, newerVersion, true, true)
|
||||
if err != nil {
|
||||
t.Fatalf("Failed to update driver to %v. test: %s, got: %v", newerVersion, tc.name, err)
|
||||
}
|
||||
|
||||
_, err = os.Stat(filepath.Join(dir, "docker-machine-driver-kvm2"))
|
||||
_, err = os.Stat(filepath.Join(tempDLDir, "docker-machine-driver-kvm2"))
|
||||
if err != nil {
|
||||
t.Fatalf("Expected driver to be download. test: %s, got: %v", tc.name, err)
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Loading…
Reference in New Issue