From 2f1a11d8d379bf971e44b228d642746d92b50547 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Fri, 9 Aug 2019 15:04:07 -0700
Subject: [PATCH 01/40] Move reusable files (images, binaries, certs) to /data

---
 pkg/drivers/none/none.go                      |   4 +-
 pkg/minikube/assets/addons.go                 |  74 ++++----
 pkg/minikube/assets/addons_test.go            |   8 +-
 pkg/minikube/assets/vm_assets.go              |  10 +-
 pkg/minikube/bootstrapper/bootstrapper.go     |   2 +-
 pkg/minikube/bootstrapper/certs.go            |  17 +-
 pkg/minikube/bootstrapper/kubeadm/kubeadm.go  | 165 +++++++++++-------
 .../bootstrapper/kubeadm/templates.go         |  14 +-
 pkg/minikube/bootstrapper/kubeadm/versions.go |   4 +-
 pkg/minikube/command/ssh_runner.go            |  48 +++--
 pkg/minikube/constants/constants.go           |  36 ++--
 pkg/minikube/logs/logs.go                     |   2 +-
 pkg/minikube/machine/cache_binaries.go        |   7 +-
 pkg/minikube/machine/cache_images.go          |  19 +-
 pkg/util/constants.go                         |   1 -
 15 files changed, 224 insertions(+), 187 deletions(-)

diff --git a/pkg/drivers/none/none.go b/pkg/drivers/none/none.go
index dd18634d4a..6c3a5cfef4 100644
--- a/pkg/drivers/none/none.go
+++ b/pkg/drivers/none/none.go
@@ -38,8 +38,8 @@ const driverName = constants.DriverNone
 
 // cleanupPaths are paths to be removed by cleanup, and are used by both kubeadm and minikube.
 var cleanupPaths = []string{
-	"/data/minikube",
-	"/etc/kubernetes/manifests",
+	constants.GuestEphemeralDir,
+	constants.GuestManifestsDir,
 	"/var/lib/minikube",
 }
 
diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go
index 969d5e30d9..ec72f813e3 100644
--- a/pkg/minikube/assets/addons.go
+++ b/pkg/minikube/assets/addons.go
@@ -70,7 +70,7 @@ var Addons = map[string]*Addon{
 	"addon-manager": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/addon-manager.yaml.tmpl",
-			"/etc/kubernetes/manifests/",
+			constants.GuestManifestsDir,
 			"addon-manager.yaml.tmpl",
 			"0640",
 			true),
@@ -78,13 +78,13 @@ var Addons = map[string]*Addon{
 	"dashboard": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/dashboard/dashboard-dp.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"dashboard-dp.yaml",
 			"0640",
 			true),
 		MustBinAsset(
 			"deploy/addons/dashboard/dashboard-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"dashboard-svc.yaml",
 			"0640",
 			false),
@@ -92,7 +92,7 @@ var Addons = map[string]*Addon{
 	"default-storageclass": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/storageclass/storageclass.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"storageclass.yaml",
 			"0640",
 			false),
@@ -100,7 +100,7 @@ var Addons = map[string]*Addon{
 	"storage-provisioner": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/storage-provisioner/storage-provisioner.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"storage-provisioner.yaml",
 			"0640",
 			true),
@@ -108,25 +108,25 @@ var Addons = map[string]*Addon{
 	"storage-provisioner-gluster": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/storage-provisioner-gluster/storage-gluster-ns.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"storage-gluster-ns.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/storage-provisioner-gluster/glusterfs-daemonset.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"glusterfs-daemonset.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/storage-provisioner-gluster/heketi-deployment.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"heketi-deployment.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/storage-provisioner-gluster/storage-provisioner-glusterfile.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"storage-privisioner-glusterfile.yaml",
 			"0640",
 			false),
@@ -134,31 +134,31 @@ var Addons = map[string]*Addon{
 	"heapster": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/heapster/influx-grafana-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"influxGrafana-rc.yaml",
 			"0640",
 			true),
 		MustBinAsset(
 			"deploy/addons/heapster/grafana-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"grafana-svc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/heapster/influxdb-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"influxdb-svc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/heapster/heapster-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"heapster-rc.yaml",
 			"0640",
 			true),
 		MustBinAsset(
 			"deploy/addons/heapster/heapster-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"heapster-svc.yaml",
 			"0640",
 			false),
@@ -166,37 +166,37 @@ var Addons = map[string]*Addon{
 	"efk": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/efk/elasticsearch-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"elasticsearch-rc.yaml",
 			"0640",
 			true),
 		MustBinAsset(
 			"deploy/addons/efk/elasticsearch-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"elasticsearch-svc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/efk/fluentd-es-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"fluentd-es-rc.yaml",
 			"0640",
 			true),
 		MustBinAsset(
 			"deploy/addons/efk/fluentd-es-configmap.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"fluentd-es-configmap.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/efk/kibana-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"kibana-rc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/efk/kibana-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"kibana-svc.yaml",
 			"0640",
 			false),
@@ -204,19 +204,19 @@ var Addons = map[string]*Addon{
 	"ingress": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/ingress/ingress-configmap.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"ingress-configmap.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/ingress/ingress-rbac.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"ingress-rbac.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/ingress/ingress-dp.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"ingress-dp.yaml",
 			"0640",
 			true),
@@ -224,19 +224,19 @@ var Addons = map[string]*Addon{
 	"metrics-server": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"metrics-apiservice.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/metrics-server/metrics-server-deployment.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"metrics-server-deployment.yaml",
 			"0640",
 			true),
 		MustBinAsset(
 			"deploy/addons/metrics-server/metrics-server-service.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"metrics-server-service.yaml",
 			"0640",
 			false),
@@ -244,19 +244,19 @@ var Addons = map[string]*Addon{
 	"registry": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/registry/registry-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"registry-rc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/registry/registry-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"registry-svc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/registry/registry-proxy.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"registry-proxy.yaml",
 			"0640",
 			false),
@@ -264,7 +264,7 @@ var Addons = map[string]*Addon{
 	"registry-creds": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/registry-creds/registry-creds-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"registry-creds-rc.yaml",
 			"0640",
 			false),
@@ -272,7 +272,7 @@ var Addons = map[string]*Addon{
 	"freshpod": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/freshpod/freshpod-rc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"freshpod-rc.yaml",
 			"0640",
 			true),
@@ -280,7 +280,7 @@ var Addons = map[string]*Addon{
 	"nvidia-driver-installer": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/gpu/nvidia-driver-installer.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"nvidia-driver-installer.yaml",
 			"0640",
 			true),
@@ -288,7 +288,7 @@ var Addons = map[string]*Addon{
 	"nvidia-gpu-device-plugin": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/gpu/nvidia-gpu-device-plugin.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"nvidia-gpu-device-plugin.yaml",
 			"0640",
 			true),
@@ -296,13 +296,13 @@ var Addons = map[string]*Addon{
 	"logviewer": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/logviewer/logviewer-dp-and-svc.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"logviewer-dp-and-svc.yaml",
 			"0640",
 			false),
 		MustBinAsset(
 			"deploy/addons/logviewer/logviewer-rbac.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"logviewer-rbac.yaml",
 			"0640",
 			false),
@@ -310,7 +310,7 @@ var Addons = map[string]*Addon{
 	"gvisor": NewAddon([]*BinAsset{
 		MustBinAsset(
 			"deploy/addons/gvisor/gvisor-pod.yaml.tmpl",
-			constants.AddonsPath,
+			constants.GuestAddonsDir,
 			"gvisor-pod.yaml",
 			"0640",
 			true),
@@ -332,7 +332,7 @@ var Addons = map[string]*Addon{
 // AddMinikubeDirAssets adds all addons and files to the list
 // of files to be copied to the vm.
 func AddMinikubeDirAssets(assets *[]CopyableFile) error {
-	if err := addMinikubeDirToAssets(constants.MakeMiniPath("addons"), constants.AddonsPath, assets); err != nil {
+	if err := addMinikubeDirToAssets(constants.MakeMiniPath("addons"), constants.GuestAddonsDir, assets); err != nil {
 		return errors.Wrap(err, "adding addons folder to assets")
 	}
 	if err := addMinikubeDirToAssets(constants.MakeMiniPath("files"), "", assets); err != nil {
diff --git a/pkg/minikube/assets/addons_test.go b/pkg/minikube/assets/addons_test.go
index eccdbf2ad8..55d073b10b 100644
--- a/pkg/minikube/assets/addons_test.go
+++ b/pkg/minikube/assets/addons_test.go
@@ -56,18 +56,18 @@ func TestAddMinikubeDirAssets(t *testing.T) {
 			}{
 				{
 					relativePath: "/dir1/file1.txt",
-					expectedPath: constants.AddonsPath,
+					expectedPath: constants.GuestAddonsDir,
 				},
 				{
 					relativePath: "/dir1/file2.txt",
-					expectedPath: constants.AddonsPath,
+					expectedPath: constants.GuestAddonsDir,
 				},
 				{
 					relativePath: "/dir2/file1.txt",
-					expectedPath: constants.AddonsPath,
+					expectedPath: constants.GuestAddonsDir,
 				},
 			},
-			vmPath: constants.AddonsPath,
+			vmPath: constants.GuestAddonsDir,
 		},
 		{
 			description: "absolute path assets",
diff --git a/pkg/minikube/assets/vm_assets.go b/pkg/minikube/assets/vm_assets.go
index 2dcec3d3ac..f73a86bf3d 100644
--- a/pkg/minikube/assets/vm_assets.go
+++ b/pkg/minikube/assets/vm_assets.go
@@ -23,6 +23,7 @@ import (
 	"io"
 	"os"
 	"path"
+	"path/filepath"
 
 	"github.com/golang/glog"
 	"github.com/pkg/errors"
@@ -78,14 +79,15 @@ func NewMemoryAssetTarget(d []byte, targetPath, permissions string) *MemoryAsset
 }
 
 // NewFileAsset creates a new FileAsset
-func NewFileAsset(path, targetDir, targetName, permissions string) (*FileAsset, error) {
-	f, err := os.Open(path)
+func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, error) {
+	glog.Infof("NewFileAsset: %s -> %s", src, filepath.Join(targetDir, targetName))
+	f, err := os.Open(src)
 	if err != nil {
-		return nil, errors.Wrapf(err, "Error opening file asset: %s", path)
+		return nil, errors.Wrapf(err, "Error opening file asset: %s", src)
 	}
 	return &FileAsset{
 		BaseAsset: BaseAsset{
-			AssetName:   path,
+			AssetName:   src,
 			TargetDir:   targetDir,
 			TargetName:  targetName,
 			Permissions: permissions,
diff --git a/pkg/minikube/bootstrapper/bootstrapper.go b/pkg/minikube/bootstrapper/bootstrapper.go
index b3ff31095d..25a0b3a396 100644
--- a/pkg/minikube/bootstrapper/bootstrapper.go
+++ b/pkg/minikube/bootstrapper/bootstrapper.go
@@ -56,7 +56,7 @@ const (
 func GetCachedBinaryList(bootstrapper string) []string {
 	switch bootstrapper {
 	case BootstrapperTypeKubeadm:
-		return constants.GetKubeadmCachedBinaries()
+		return constants.KubeadmBinaries
 	default:
 		return []string{}
 	}
diff --git a/pkg/minikube/bootstrapper/certs.go b/pkg/minikube/bootstrapper/certs.go
index b24f2e7d83..64b2a912c3 100644
--- a/pkg/minikube/bootstrapper/certs.go
+++ b/pkg/minikube/bootstrapper/certs.go
@@ -50,7 +50,9 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig) error {
 	if err := generateCerts(k8s); err != nil {
 		return errors.Wrap(err, "Error generating certs")
 	}
-
+	if err := cmd.Run(fmt.Sprintf("sudo mkdir -p %s", constants.GuestCertsDir)); err != nil {
+		return errors.Wrap(err, "mkdir")
+	}
 	copyableFiles := []assets.CopyableFile{}
 
 	for _, cert := range certs {
@@ -59,7 +61,7 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig) error {
 		if strings.HasSuffix(cert, ".key") {
 			perms = "0600"
 		}
-		certFile, err := assets.NewFileAsset(p, util.DefaultCertPath, cert, perms)
+		certFile, err := assets.NewFileAsset(p, constants.GuestCertsDir, cert, perms)
 		if err != nil {
 			return err
 		}
@@ -69,9 +71,9 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig) error {
 	kubeCfgSetup := &util.KubeConfigSetup{
 		ClusterName:          k8s.NodeName,
 		ClusterServerAddress: fmt.Sprintf("https://localhost:%d", k8s.NodePort),
-		ClientCertificate:    path.Join(util.DefaultCertPath, "apiserver.crt"),
-		ClientKey:            path.Join(util.DefaultCertPath, "apiserver.key"),
-		CertificateAuthority: path.Join(util.DefaultCertPath, "ca.crt"),
+		ClientCertificate:    path.Join(constants.GuestCertsDir, "apiserver.crt"),
+		ClientKey:            path.Join(constants.GuestCertsDir, "apiserver.key"),
+		CertificateAuthority: path.Join(constants.GuestCertsDir, "ca.crt"),
 		KeepContext:          false,
 	}
 
@@ -85,13 +87,12 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig) error {
 		return errors.Wrap(err, "encoding kubeconfig")
 	}
 
-	kubeCfgFile := assets.NewMemoryAsset(data,
-		util.DefaultMinikubeDirectory, "kubeconfig", "0644")
+	kubeCfgFile := assets.NewMemoryAsset(data, constants.GuestEphemeralDir, "kubeconfig", "0644")
 	copyableFiles = append(copyableFiles, kubeCfgFile)
 
 	for _, f := range copyableFiles {
 		if err := cmd.Copy(f); err != nil {
-			return err
+			return errors.Wrapf(err, "Copy %s", f.GetAssetName())
 		}
 	}
 	return nil
diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
index 9e45a9f963..2b7f15adb2 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
@@ -22,6 +22,7 @@ import (
 	"fmt"
 	"net"
 	"net/http"
+	"path/filepath"
 	"runtime"
 	"strings"
 	"time"
@@ -90,6 +91,9 @@ var PodsByLayer = []pod{
 	{"dns", "k8s-app", "kube-dns"},
 }
 
+// yamlConfigPath is the path to the kubeadm configuration
+var yamlConfigPath = filepath.Join(constants.GuestEphemeralDir, "kubeadm.yaml")
+
 // SkipAdditionalPreflights are additional preflights we skip depending on the runtime in use.
 var SkipAdditionalPreflights = map[string][]string{}
 
@@ -206,8 +210,8 @@ func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
 	}
 
 	ignore := []string{
-		"DirAvailable--etc-kubernetes-manifests", // Addons are stored in /etc/kubernetes/manifests
-		"DirAvailable--data-minikube",
+		fmt.Sprintf("DirAvailable-%s", strings.Replace(constants.GuestManifestsDir, "/", "-", -1)),
+		fmt.Sprintf("DirAvailable-%s", strings.Replace(constants.GuestPersistentDir, "/", "-", -1)),
 		"FileAvailable--etc-kubernetes-manifests-kube-scheduler.yaml",
 		"FileAvailable--etc-kubernetes-manifests-kube-apiserver.yaml",
 		"FileAvailable--etc-kubernetes-manifests-kube-controller-manager.yaml",
@@ -223,8 +227,8 @@ func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
 		ignore = append(ignore, "SystemVerification")
 	}
 
-	cmd := fmt.Sprintf("sudo /usr/bin/kubeadm init --config %s %s --ignore-preflight-errors=%s",
-		constants.KubeadmConfigFile, extraFlags, strings.Join(ignore, ","))
+	cmd := fmt.Sprintf("%s init --config %s %s --ignore-preflight-errors=%s",
+		invokeKubeadm(k8s.KubernetesVersion), yamlConfigPath, extraFlags, strings.Join(ignore, ","))
 	out, err := k.c.CombinedOutput(cmd)
 	if err != nil {
 		return errors.Wrapf(err, "cmd failed: %s\n%s\n", cmd, out)
@@ -347,13 +351,12 @@ func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
 		controlPlane = "control-plane"
 	}
 
-	configPath := constants.KubeadmConfigFile
-	baseCmd := fmt.Sprintf("sudo kubeadm %s", phase)
+	baseCmd := fmt.Sprintf("%s %s", invokeKubeadm(k8s.KubernetesVersion), phase)
 	cmds := []string{
-		fmt.Sprintf("%s phase certs all --config %s", baseCmd, configPath),
-		fmt.Sprintf("%s phase kubeconfig all --config %s", baseCmd, configPath),
-		fmt.Sprintf("%s phase %s all --config %s", baseCmd, controlPlane, configPath),
-		fmt.Sprintf("%s phase etcd local --config %s", baseCmd, configPath),
+		fmt.Sprintf("%s phase certs all --config %s", baseCmd, yamlConfigPath),
+		fmt.Sprintf("%s phase kubeconfig all --config %s", baseCmd, yamlConfigPath),
+		fmt.Sprintf("%s phase %s all --config %s", baseCmd, controlPlane, yamlConfigPath),
+		fmt.Sprintf("%s phase etcd local --config %s", baseCmd, yamlConfigPath),
 	}
 
 	// Run commands one at a time so that it is easier to root cause failures.
@@ -367,7 +370,7 @@ func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
 		return errors.Wrap(err, "waiting for apiserver")
 	}
 	// restart the proxy and coredns
-	if err := k.c.Run(fmt.Sprintf("%s phase addon all --config %s", baseCmd, configPath)); err != nil {
+	if err := k.c.Run(fmt.Sprintf("%s phase addon all --config %s", baseCmd, yamlConfigPath)); err != nil {
 		return errors.Wrapf(err, "addon phase")
 	}
 
@@ -379,8 +382,21 @@ func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
 
 // waitForAPIServer waits for the apiserver to start up
 func (k *Bootstrapper) waitForAPIServer(k8s config.KubernetesConfig) error {
-	glog.Infof("Waiting for apiserver ...")
-	return wait.PollImmediate(time.Millisecond*300, time.Minute*3, func() (bool, error) {
+	glog.Infof("Waiting for apiserver process ...")
+	// To give a better error message, first check for process existence via ssh
+	err := wait.PollImmediate(time.Millisecond*300, time.Minute*2, func() (bool, error) {
+		ierr := k.c.Run(`pgrep apiserver`)
+		if ierr != nil {
+			return false, ierr
+		}
+		return true, nil
+	})
+	if err != nil {
+		return fmt.Errorf("apiserver process never appeared")
+	}
+
+	glog.Infof("Waiting for apiserver status ...")
+	return wait.PollImmediate(time.Millisecond*300, time.Minute*1, func() (bool, error) {
 		status, err := k.GetAPIServerStatus(net.ParseIP(k8s.NodeIP), k8s.NodePort)
 		glog.Infof("apiserver status: %s, err: %v", status, err)
 		if err != nil {
@@ -395,7 +411,7 @@ func (k *Bootstrapper) waitForAPIServer(k8s config.KubernetesConfig) error {
 
 // DeleteCluster removes the components that were started earlier
 func (k *Bootstrapper) DeleteCluster(k8s config.KubernetesConfig) error {
-	cmd := fmt.Sprintf("sudo kubeadm reset --force")
+	cmd := fmt.Sprintf("%s reset --force", invokeKubeadm(k8s.KubernetesVersion))
 	out, err := k.c.CombinedOutput(cmd)
 	if err != nil {
 		return errors.Wrapf(err, "kubeadm reset: %s\n%s\n", cmd, out)
@@ -414,7 +430,7 @@ func (k *Bootstrapper) PullImages(k8s config.KubernetesConfig) error {
 		return fmt.Errorf("pull command is not supported by kubeadm v%s", version)
 	}
 
-	cmd := fmt.Sprintf("sudo kubeadm config images pull --config %s", constants.KubeadmConfigFile)
+	cmd := fmt.Sprintf("%s config images pull --config %s", invokeKubeadm(k8s.KubernetesVersion), yamlConfigPath)
 	if err := k.c.Run(cmd); err != nil {
 		return errors.Wrapf(err, "running cmd: %s", cmd)
 	}
@@ -428,15 +444,15 @@ func (k *Bootstrapper) SetupCerts(k8s config.KubernetesConfig) error {
 
 // NewKubeletConfig generates a new systemd unit containing a configured kubelet
 // based on the options present in the KubernetesConfig.
-func NewKubeletConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, error) {
+func NewKubeletConfig(k8s config.KubernetesConfig, r cruntime.Manager) ([]byte, error) {
 	version, err := ParseKubernetesVersion(k8s.KubernetesVersion)
 	if err != nil {
-		return "", errors.Wrap(err, "parsing kubernetes version")
+		return nil, errors.Wrap(err, "parsing kubernetes version")
 	}
 
 	extraOpts, err := ExtraConfigForComponent(Kubelet, k8s.ExtraOptions, version)
 	if err != nil {
-		return "", errors.Wrap(err, "generating extra configuration for kubelet")
+		return nil, errors.Wrap(err, "generating extra configuration for kubelet")
 	}
 
 	for k, v := range r.KubeletOptions() {
@@ -454,28 +470,28 @@ func NewKubeletConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string,
 	// parses a map of the feature gates for kubelet
 	_, kubeletFeatureArgs, err := ParseFeatureArgs(k8s.FeatureGates)
 	if err != nil {
-		return "", errors.Wrap(err, "parses feature gate config for kubelet")
+		return nil, errors.Wrap(err, "parses feature gate config for kubelet")
 	}
 
 	if kubeletFeatureArgs != "" {
 		extraOpts["feature-gates"] = kubeletFeatureArgs
 	}
 
-	extraFlags := convertToFlags(extraOpts)
-
 	b := bytes.Buffer{}
 	opts := struct {
 		ExtraOptions     string
 		ContainerRuntime string
+		KubeletPath      string
 	}{
-		ExtraOptions:     extraFlags,
+		ExtraOptions:     convertToFlags(extraOpts),
 		ContainerRuntime: k8s.ContainerRuntime,
+		KubeletPath:      filepath.Join(binRoot(k8s.KubernetesVersion), "kubelet"),
 	}
 	if err := kubeletSystemdTemplate.Execute(&b, opts); err != nil {
-		return "", err
+		return nil, err
 	}
 
-	return b.String(), nil
+	return b.Bytes(), nil
 }
 
 // UpdateCluster updates the cluster
@@ -499,32 +515,35 @@ func (k *Bootstrapper) UpdateCluster(cfg config.KubernetesConfig) error {
 	if err != nil {
 		return errors.Wrap(err, "generating kubelet config")
 	}
-	glog.Infof("kubelet %s config:\n%s", cfg.KubernetesVersion, kubeletCfg)
 
-	var files []assets.CopyableFile
-	files = copyConfig(cfg, files, kubeadmCfg, kubeletCfg)
-
-	if err := downloadBinaries(cfg, k.c); err != nil {
-		return errors.Wrap(err, "downloading binaries")
+	kubeletService, err := NewKubeletService(cfg)
+	if err != nil {
+		return errors.Wrap(err, "generating kubelet service")
 	}
 
+	glog.Infof("kubelet %s config:\n%s", cfg.KubernetesVersion, kubeletCfg)
+
+	// stop kubelet to avoid "Text File Busy" error
+	err = k.c.Run(`pgrep kubelet && sudo systemctl stop kubelet`)
+	if err != nil {
+		glog.Warningf("unable to stop kubelet: %s", err)
+	}
+	if err := transferBinaries(cfg, k.c); err != nil {
+		return errors.Wrap(err, "downloading binaries")
+	}
+	files := configFiles(cfg, kubeadmCfg, kubeletCfg, kubeletService)
 	if err := addAddons(&files, assets.GenerateTemplateData(cfg)); err != nil {
 		return errors.Wrap(err, "adding addons")
 	}
-
 	for _, f := range files {
 		if err := k.c.Copy(f); err != nil {
 			return errors.Wrapf(err, "copy")
 		}
 	}
-	err = k.c.Run(`
-sudo systemctl daemon-reload &&
-sudo systemctl start kubelet
-`)
-	if err != nil {
+
+	if err := k.c.Run(`sudo systemctl daemon-reload && sudo systemctl start kubelet`); err != nil {
 		return errors.Wrap(err, "starting kubelet")
 	}
-
 	return nil
 }
 
@@ -547,21 +566,22 @@ func createExtraComponentConfig(extraOptions util.ExtraOptionSlice, version semv
 	return extraArgsSlice, nil
 }
 
-func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, error) {
+// generateConfig generates the kubeadm.yaml file
+func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) ([]byte, error) {
 	version, err := ParseKubernetesVersion(k8s.KubernetesVersion)
 	if err != nil {
-		return "", errors.Wrap(err, "parsing kubernetes version")
+		return nil, errors.Wrap(err, "parsing kubernetes version")
 	}
 
 	// parses a map of the feature gates for kubeadm and component
 	kubeadmFeatureArgs, componentFeatureArgs, err := ParseFeatureArgs(k8s.FeatureGates)
 	if err != nil {
-		return "", errors.Wrap(err, "parses feature gate config for kubeadm and component")
+		return nil, errors.Wrap(err, "parses feature gate config for kubeadm and component")
 	}
 
 	extraComponentConfig, err := createExtraComponentConfig(k8s.ExtraOptions, version, componentFeatureArgs)
 	if err != nil {
-		return "", errors.Wrap(err, "generating extra component config for kubeadm")
+		return nil, errors.Wrap(err, "generating extra component config for kubeadm")
 	}
 
 	// In case of no port assigned, use util.APIServerPort
@@ -585,13 +605,13 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, er
 		FeatureArgs       map[string]bool
 		NoTaintMaster     bool
 	}{
-		CertDir:           util.DefaultCertPath,
+		CertDir:           constants.GuestCertsDir,
 		ServiceCIDR:       util.DefaultServiceCIDR,
 		PodSubnet:         k8s.ExtraOptions.Get("pod-network-cidr", Kubeadm),
 		AdvertiseAddress:  k8s.NodeIP,
 		APIServerPort:     nodePort,
 		KubernetesVersion: k8s.KubernetesVersion,
-		EtcdDataDir:       "/data/minikube", //TODO(r2d4): change to something else persisted
+		EtcdDataDir:       filepath.Join(constants.GuestPersistentDir, "etcd"),
 		NodeName:          k8s.NodeName,
 		CRISocket:         r.SocketPath(),
 		ImageRepository:   k8s.ImageRepository,
@@ -618,41 +638,62 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) (string, er
 		configTmpl = configTmplV1Beta1
 	}
 	if err := configTmpl.Execute(&b, opts); err != nil {
-		return "", err
+		return nil, err
 	}
 
-	return b.String(), nil
+	return b.Bytes(), nil
 }
 
-func copyConfig(cfg config.KubernetesConfig, files []assets.CopyableFile, kubeadmCfg string, kubeletCfg string) []assets.CopyableFile {
-	files = append(files,
-		assets.NewMemoryAssetTarget([]byte(kubeletService), constants.KubeletServiceFile, "0640"),
-		assets.NewMemoryAssetTarget([]byte(kubeletCfg), constants.KubeletSystemdConfFile, "0640"),
-		assets.NewMemoryAssetTarget([]byte(kubeadmCfg), constants.KubeadmConfigFile, "0640"))
+// NewKubeletService returns a generated systemd unit file for the kubelet
+func NewKubeletService(cfg config.KubernetesConfig) ([]byte, error) {
+	var b bytes.Buffer
+	opts := struct{ KubeletPath string }{KubeletPath: filepath.Join(binRoot(cfg.KubernetesVersion), "kubelet")}
+	if err := kubeletServiceTemplate.Execute(&b, opts); err != nil {
+		return nil, errors.Wrap(err, "template execute")
+	}
+	return b.Bytes(), nil
+}
 
+// configFiles returns configuration file assets
+func configFiles(cfg config.KubernetesConfig, kubeadm []byte, kubelet []byte, kubeletSvc []byte) []assets.CopyableFile {
+	fs := []assets.CopyableFile{
+		assets.NewMemoryAssetTarget(kubeadm, yamlConfigPath, "0640"),
+		assets.NewMemoryAssetTarget(kubelet, constants.KubeletSystemdConfFile, "0640"),
+		assets.NewMemoryAssetTarget(kubeletSvc, constants.KubeletServiceFile, "0640"),
+	}
 	// Copy the default CNI config (k8s.conf), so that kubelet can successfully
 	// start a Pod in the case a user hasn't manually installed any CNI plugin
 	// and minikube was started with "--extra-config=kubelet.network-plugin=cni".
 	if cfg.EnableDefaultCNI {
-		files = append(files,
-			assets.NewMemoryAssetTarget([]byte(defaultCNIConfig), constants.DefaultCNIConfigPath, "0644"))
+		fs = append(fs, assets.NewMemoryAssetTarget([]byte(defaultCNIConfig), constants.DefaultCNIConfigPath, "0644"))
 	}
-
-	return files
+	return fs
 }
 
-func downloadBinaries(cfg config.KubernetesConfig, c command.Runner) error {
+// binDir returns the persistant path binaries are stored in
+func binRoot(version string) string {
+	return filepath.Join(constants.GuestPersistentDir, "binaries", version)
+}
+
+// invokeKubeadm returns the invocation command for Kubeadm
+func invokeKubeadm(version string) string {
+	return fmt.Sprintf("sudo env PATH=%s:$PATH kubeadm", binRoot(version))
+}
+
+// transferBinaries transfers all required Kubernetes binaries
+func transferBinaries(cfg config.KubernetesConfig, c command.Runner) error {
 	var g errgroup.Group
-	for _, bin := range constants.GetKubeadmCachedBinaries() {
-		bin := bin
+	for _, name := range constants.KubeadmBinaries {
+		name := name
 		g.Go(func() error {
-			path, err := machine.CacheBinary(bin, cfg.KubernetesVersion, "linux", runtime.GOARCH)
+			src, err := machine.CacheBinary(name, cfg.KubernetesVersion, "linux", runtime.GOARCH)
 			if err != nil {
-				return errors.Wrapf(err, "downloading %s", bin)
+				return errors.Wrapf(err, "downloading %s", name)
 			}
-			err = machine.CopyBinary(c, bin, path)
-			if err != nil {
-				return errors.Wrapf(err, "copying %s", bin)
+
+			dst := filepath.Join(binRoot(cfg.KubernetesVersion), name)
+			if err := machine.CopyBinary(c, src, dst); err != nil {
+				return errors.Wrapf(err, "copybinary %s -> %s", src, dst)
 			}
 			return nil
 		})
diff --git a/pkg/minikube/bootstrapper/kubeadm/templates.go b/pkg/minikube/bootstrapper/kubeadm/templates.go
index 70ae1aad28..dd1bfe6590 100644
--- a/pkg/minikube/bootstrapper/kubeadm/templates.go
+++ b/pkg/minikube/bootstrapper/kubeadm/templates.go
@@ -151,24 +151,24 @@ evictionHard:
   imagefs.available: "0%"
 `))
 
-var kubeletSystemdTemplate = template.Must(template.New("kubeletSystemdTemplate").Parse(`
-[Unit]
+// kubeletSystemdTemplate hosts the override kubelet flags, written to constants.KubeletSystemdConfFile
+var kubeletSystemdTemplate = template.Must(template.New("kubeletSystemdTemplate").Parse(`[Unit]
 {{if or (eq .ContainerRuntime "cri-o") (eq .ContainerRuntime "cri")}}Wants=crio.service{{else if eq .ContainerRuntime "containerd"}}Wants=containerd.service{{else}}Wants=docker.socket{{end}}
 
 [Service]
 ExecStart=
-ExecStart=/usr/bin/kubelet{{if .ExtraOptions}} {{.ExtraOptions}}{{end}}
+ExecStart={{.KubeletPath}}{{if .ExtraOptions}} {{.ExtraOptions}}{{end}}
 
 [Install]
 `))
 
-const kubeletService = `
-[Unit]
+// kubeletServiceTemplate is the base kubelet systemd template, written to constanst.KubeletServiceFile
+var kubeletServiceTemplate = template.Must(template.New("kubeletServiceTemplate").Parse(`[Unit]
 Description=kubelet: The Kubernetes Node Agent
 Documentation=http://kubernetes.io/docs/
 
 [Service]
-ExecStart=/usr/bin/kubelet
+ExecStart={{.KubeletPath}}
 Restart=always
 StartLimitInterval=0
 # Tuned for local dev: faster than upstream default (10s), but slower than systemd default (100ms)
@@ -176,7 +176,7 @@ RestartSec=600ms
 
 [Install]
 WantedBy=multi-user.target
-`
+`))
 
 // printMapInOrder sorts the keys and prints the map in order, combining key
 // value pairs with the separator character
diff --git a/pkg/minikube/bootstrapper/kubeadm/versions.go b/pkg/minikube/bootstrapper/kubeadm/versions.go
index 2c7c9a97f9..02d0de884f 100644
--- a/pkg/minikube/bootstrapper/kubeadm/versions.go
+++ b/pkg/minikube/bootstrapper/kubeadm/versions.go
@@ -241,7 +241,7 @@ var versionSpecificOpts = []VersionedExtraOption{
 	NewUnversionedOption(Kubelet, "hostname-override", constants.DefaultNodeName),
 
 	// System pods args
-	NewUnversionedOption(Kubelet, "pod-manifest-path", "/etc/kubernetes/manifests"),
+	NewUnversionedOption(Kubelet, "pod-manifest-path", constants.GuestManifestsDir),
 	{
 		Option: util.ExtraOption{
 			Component: Kubelet,
@@ -257,7 +257,7 @@ var versionSpecificOpts = []VersionedExtraOption{
 
 	// Auth args
 	NewUnversionedOption(Kubelet, "authorization-mode", "Webhook"),
-	NewUnversionedOption(Kubelet, "client-ca-file", path.Join(util.DefaultCertPath, "ca.crt")),
+	NewUnversionedOption(Kubelet, "client-ca-file", path.Join(constants.GuestCertsDir, "ca.crt")),
 
 	// Cgroup args
 	NewUnversionedOption(Kubelet, "cgroup-driver", "cgroupfs"),
diff --git a/pkg/minikube/command/ssh_runner.go b/pkg/minikube/command/ssh_runner.go
index a07e3ad985..ad94c2036f 100644
--- a/pkg/minikube/command/ssh_runner.go
+++ b/pkg/minikube/command/ssh_runner.go
@@ -21,11 +21,13 @@ import (
 	"fmt"
 	"io"
 	"path"
+	"path/filepath"
 	"sync"
 
 	"github.com/golang/glog"
 	"github.com/pkg/errors"
 	"golang.org/x/crypto/ssh"
+	"golang.org/x/sync/errgroup"
 	"k8s.io/minikube/pkg/minikube/assets"
 	"k8s.io/minikube/pkg/util"
 )
@@ -152,14 +154,6 @@ func (s *SSHRunner) CombinedOutput(cmd string) (string, error) {
 
 // Copy copies a file to the remote over SSH.
 func (s *SSHRunner) Copy(f assets.CopyableFile) error {
-	deleteCmd := fmt.Sprintf("sudo rm -f %s", path.Join(f.GetTargetDir(), f.GetTargetName()))
-	mkdirCmd := fmt.Sprintf("sudo mkdir -p %s", f.GetTargetDir())
-	for _, cmd := range []string{deleteCmd, mkdirCmd} {
-		if err := s.Run(cmd); err != nil {
-			return errors.Wrapf(err, "pre-copy")
-		}
-	}
-
 	sess, err := s.c.NewSession()
 	if err != nil {
 		return errors.Wrap(err, "NewSession")
@@ -170,40 +164,38 @@ func (s *SSHRunner) Copy(f assets.CopyableFile) error {
 		return errors.Wrap(err, "StdinPipe")
 	}
 	// The scpcmd below *should not* return until all data is copied and the
-	// StdinPipe is closed. But let's use a WaitGroup to make it expicit.
-	var wg sync.WaitGroup
-	wg.Add(1)
-	var ierr error
+	// StdinPipe is closed. But let's use errgroup to make it expicit.
+	var g errgroup.Group
 	var copied int64
+	dst := filepath.Join(path.Join(f.GetTargetDir(), f.GetTargetName()))
+	glog.Infof("Transferring %d bytes to %s", f.GetLength(), dst)
 
-	go func() {
-		defer wg.Done()
+	g.Go(func() error {
 		defer w.Close()
-		glog.Infof("Transferring %d bytes to %s", f.GetLength(), f.GetTargetName())
 		header := fmt.Sprintf("C%s %d %s\n", f.GetPermissions(), f.GetLength(), f.GetTargetName())
 		fmt.Fprint(w, header)
 		if f.GetLength() == 0 {
 			glog.Warningf("%s is a 0 byte asset!", f.GetTargetName())
 			fmt.Fprint(w, "\x00")
-			return
+			return nil
 		}
 
-		copied, ierr = io.Copy(w, f)
+		copied, err = io.Copy(w, f)
+		if err != nil {
+			return errors.Wrap(err, "io.Copy")
+		}
 		if copied != int64(f.GetLength()) {
-			glog.Warningf("%s: expected to copy %d bytes, but copied %d instead", f.GetTargetName(), f.GetLength(), copied)
-		} else {
-			glog.Infof("%s: copied %d bytes", f.GetTargetName(), copied)
-		}
-		if ierr != nil {
-			glog.Errorf("io.Copy failed: %v", ierr)
+			return fmt.Errorf("%s: expected to copy %d bytes, but copied %d instead", f.GetTargetName(), f.GetLength(), copied)
 		}
+		glog.Infof("%s: copied %d bytes", f.GetTargetName(), copied)
 		fmt.Fprint(w, "\x00")
-	}()
+		return nil
+	})
 
-	_, err = sess.CombinedOutput(fmt.Sprintf("sudo scp -t %s", f.GetTargetDir()))
+	scp := fmt.Sprintf("sudo mkdir -p %s && sudo scp -t %s", f.GetTargetDir(), f.GetTargetDir())
+	out, err := sess.CombinedOutput(scp)
 	if err != nil {
-		return err
+		return fmt.Errorf("%s: %s\noutput: %s", scp, err, out)
 	}
-	wg.Wait()
-	return ierr
+	return g.Wait()
 }
diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go
index b2cbd0680d..2a1ec7eef0 100644
--- a/pkg/minikube/constants/constants.go
+++ b/pkg/minikube/constants/constants.go
@@ -208,12 +208,6 @@ func GetProfilePath(profile string, miniHome ...string) string {
 	return filepath.Join(miniPath, "profiles", profile)
 }
 
-// AddonsPath is the default path of the addons configuration
-const AddonsPath = "/etc/kubernetes/addons"
-
-// FilesPath is the default path of files
-const FilesPath = "/files"
-
 const (
 	// KubeletServiceFile is the path to the kubelet systemd service
 	KubeletServiceFile = "/lib/systemd/system/kubelet.service"
@@ -223,9 +217,17 @@ const (
 	KubeadmConfigFile = "/var/lib/kubeadm.yaml"
 	// DefaultCNIConfigPath is the path to the CNI configuration
 	DefaultCNIConfigPath = "/etc/cni/net.d/k8s.conf"
-)
+	// GuestAddonsDir is the default path of the addons configuration
+	GuestAddonsDir = "/etc/kubernetes/addons"
+	// GuestManifestsDir is where the kubelet should look for static Pod manifests
+	GuestManifestsDir = "/etc/kubernetes/manifests"
+	// PersistentDir is the path where persistant data should be stored within the VM (not tmpfs)
+	GuestPersistentDir = "/data/minikube"
+	// GuestEphemeralDir is the path where ephemeral data should be stored within the VM
+	GuestEphemeralDir = "/var/tmp/minikube"
+	// GuestCertsDir are where Kubernetes certificates are kept on the guest
+	GuestCertsDir = "/data/minikube/certs"
 
-const (
 	// DefaultUfsPort is the default port of UFS
 	DefaultUfsPort = "5640"
 	// DefaultUfsDebugLvl is the default debug level of UFS
@@ -236,6 +238,12 @@ const (
 	DefaultMsize = 262144
 	// DefaultMountVersion is the default 9p version to use for mount
 	DefaultMountVersion = "9p2000.L"
+
+	// IsMinikubeChildProcess is the name of "is minikube child process" variable
+	IsMinikubeChildProcess = "IS_MINIKUBE_CHILD_PROCESS"
+
+	// FileScheme is the file scheme
+	FileScheme = "file"
 )
 
 // ImageRepositories contains all known image repositories
@@ -254,16 +262,8 @@ func GetKubernetesReleaseURLSHA1(binaryName, version, osName, archName string) s
 	return fmt.Sprintf("%s.sha1", GetKubernetesReleaseURL(binaryName, version, osName, archName))
 }
 
-// IsMinikubeChildProcess is the name of "is minikube child process" variable
-const IsMinikubeChildProcess = "IS_MINIKUBE_CHILD_PROCESS"
-
-// FileScheme is the file scheme
-const FileScheme = "file"
-
-// GetKubeadmCachedBinaries gets the binaries to cache for kubeadm
-func GetKubeadmCachedBinaries() []string {
-	return []string{"kubelet", "kubeadm"}
-}
+// KubeadmBinaries are Kubernetes release binaries required for kubeadm
+var KubeadmBinaries = []string{"kubelet", "kubeadm"}
 
 // GetKubeadmCachedImages gets the images to cache for kubeadm for a version
 func GetKubeadmCachedImages(imageRepository string, kubernetesVersionStr string) (string, []string) {
diff --git a/pkg/minikube/logs/logs.go b/pkg/minikube/logs/logs.go
index 6af57a34d4..05775f8779 100644
--- a/pkg/minikube/logs/logs.go
+++ b/pkg/minikube/logs/logs.go
@@ -34,7 +34,7 @@ import (
 )
 
 // rootCauseRe is a regular expression that matches known failure root causes
-var rootCauseRe = regexp.MustCompile(`^error: |eviction manager: pods.* evicted|unknown flag: --|forbidden.*no providers available|eviction manager:.*evicted|tls: bad certificate`)
+var rootCauseRe = regexp.MustCompile(`^error: |eviction manager: pods.* evicted|unknown flag: --|forbidden.*no providers available|eviction manager:.*evicted|tls: bad certificate|kubelet.*no API client|kubelet.*No api server`)
 
 // ignoreRe is a regular expression that matches spurious errors to not surface
 var ignoreCauseRe = regexp.MustCompile("error: no objects passed to apply")
diff --git a/pkg/minikube/machine/cache_binaries.go b/pkg/minikube/machine/cache_binaries.go
index a31cde810a..8dd2c03ff4 100644
--- a/pkg/minikube/machine/cache_binaries.go
+++ b/pkg/minikube/machine/cache_binaries.go
@@ -20,6 +20,7 @@ import (
 	"crypto"
 	"os"
 	"path"
+	"path/filepath"
 	"runtime"
 
 	"github.com/golang/glog"
@@ -90,9 +91,9 @@ func CacheBinary(binary, version, osName, archName string) (string, error) {
 	return targetFilepath, nil
 }
 
-// CopyBinary copies previously cached binaries into the path
-func CopyBinary(cr command.Runner, binary, path string) error {
-	f, err := assets.NewFileAsset(path, "/usr/bin", binary, "0755")
+// CopyBinary copies a locally cached binary to the guest VM
+func CopyBinary(cr command.Runner, src string, dest string) error {
+	f, err := assets.NewFileAsset(src, filepath.Dir(dest), filepath.Base(dest), "0755")
 	if err != nil {
 		return errors.Wrap(err, "new file asset")
 	}
diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go
index 3456e2270c..b3fcf45e1a 100644
--- a/pkg/minikube/machine/cache_images.go
+++ b/pkg/minikube/machine/cache_images.go
@@ -41,7 +41,8 @@ import (
 	"k8s.io/minikube/pkg/minikube/cruntime"
 )
 
-const tempLoadDir = "/tmp"
+// loadRoot is where images should be loaded from within the guest VM
+var loadRoot = filepath.Join(constants.GuestPersistentDir, "images")
 
 var getWindowsVolumeName = getWindowsVolumeNameCmd
 
@@ -86,6 +87,9 @@ func CacheImages(images []string, cacheDir string) error {
 
 // LoadImages loads previously cached images into the container runtime
 func LoadImages(cmd command.Runner, images []string, cacheDir string) error {
+	glog.Infof("LoadImages start: %s", images)
+	defer glog.Infof("LoadImages end")
+
 	var g errgroup.Group
 	// Load profile cluster config from file
 	cc, err := config.Load()
@@ -97,7 +101,7 @@ func LoadImages(cmd command.Runner, images []string, cacheDir string) error {
 		g.Go(func() error {
 			src := filepath.Join(cacheDir, image)
 			src = sanitizeCacheDir(src)
-			if err := loadImageFromCache(cmd, cc.KubernetesConfig, src); err != nil {
+			if err := transferAndLoadImage(cmd, cc.KubernetesConfig, src); err != nil {
 				glog.Warningf("Failed to load %s: %v", src, err)
 				return errors.Wrapf(err, "loading image %s", src)
 			}
@@ -194,15 +198,15 @@ func getWindowsVolumeNameCmd(d string) (string, error) {
 	return vname, nil
 }
 
-// loadImageFromCache loads a single image from the cache
-func loadImageFromCache(cr command.Runner, k8s config.KubernetesConfig, src string) error {
+// transferAndLoadImage transfers and loads a single image from the cache
+func transferAndLoadImage(cr command.Runner, k8s config.KubernetesConfig, src string) error {
 	glog.Infof("Loading image from cache: %s", src)
 	filename := filepath.Base(src)
 	if _, err := os.Stat(src); err != nil {
 		return err
 	}
-	dst := path.Join(tempLoadDir, filename)
-	f, err := assets.NewFileAsset(src, tempLoadDir, filename, "0777")
+	dst := path.Join(loadRoot, filename)
+	f, err := assets.NewFileAsset(src, loadRoot, filename, "0644")
 	if err != nil {
 		return errors.Wrapf(err, "creating copyable file asset: %s", filename)
 	}
@@ -222,9 +226,6 @@ func loadImageFromCache(cr command.Runner, k8s config.KubernetesConfig, src stri
 		return errors.Wrapf(err, "%s load %s", r.Name(), dst)
 	}
 
-	if err := cr.Run("sudo rm -rf " + dst); err != nil {
-		return errors.Wrap(err, "deleting temp docker image location")
-	}
 	glog.Infof("Successfully loaded image %s from cache", src)
 	return nil
 }
diff --git a/pkg/util/constants.go b/pkg/util/constants.go
index 92f0c29bf5..9ca61ffb8b 100644
--- a/pkg/util/constants.go
+++ b/pkg/util/constants.go
@@ -26,7 +26,6 @@ import (
 const (
 	APIServerPort            = 8443
 	DefaultMinikubeDirectory = "/var/lib/minikube"
-	DefaultCertPath          = DefaultMinikubeDirectory + "/certs/"
 	DefaultKubeConfigPath    = DefaultMinikubeDirectory + "/kubeconfig"
 	DefaultDNSDomain         = "cluster.local"
 	DefaultServiceCIDR       = "10.96.0.0/12"

From 7c865c27cfc5cd06bab8ab00b9d009e0c7ef2cba Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Fri, 9 Aug 2019 15:19:23 -0700
Subject: [PATCH 02/40] Merge DefaultMinikubeDirectory with GuestPersistentDir

---
 pkg/minikube/constants/constants.go | 11 ++++-------
 pkg/util/constants.go               |  8 +++-----
 2 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go
index 2a1ec7eef0..710e098b79 100644
--- a/pkg/minikube/constants/constants.go
+++ b/pkg/minikube/constants/constants.go
@@ -213,21 +213,19 @@ const (
 	KubeletServiceFile = "/lib/systemd/system/kubelet.service"
 	// KubeletSystemdConfFile is the path to the kubelet systemd configuration
 	KubeletSystemdConfFile = "/etc/systemd/system/kubelet.service.d/10-kubeadm.conf"
-	// KubeadmConfigFile is the path to the kubeadm configuration
-	KubeadmConfigFile = "/var/lib/kubeadm.yaml"
 	// DefaultCNIConfigPath is the path to the CNI configuration
 	DefaultCNIConfigPath = "/etc/cni/net.d/k8s.conf"
+
 	// GuestAddonsDir is the default path of the addons configuration
 	GuestAddonsDir = "/etc/kubernetes/addons"
 	// GuestManifestsDir is where the kubelet should look for static Pod manifests
 	GuestManifestsDir = "/etc/kubernetes/manifests"
-	// PersistentDir is the path where persistant data should be stored within the VM (not tmpfs)
-	GuestPersistentDir = "/data/minikube"
 	// GuestEphemeralDir is the path where ephemeral data should be stored within the VM
 	GuestEphemeralDir = "/var/tmp/minikube"
+	// PersistentDir is the path where persistant data should be stored within the VM (not tmpfs)
+	GuestPersistentDir = "/var/lib/minikube"
 	// GuestCertsDir are where Kubernetes certificates are kept on the guest
-	GuestCertsDir = "/data/minikube/certs"
-
+	GuestCertsDir = GuestPersistentDir + "/certs"
 	// DefaultUfsPort is the default port of UFS
 	DefaultUfsPort = "5640"
 	// DefaultUfsDebugLvl is the default debug level of UFS
@@ -241,7 +239,6 @@ const (
 
 	// IsMinikubeChildProcess is the name of "is minikube child process" variable
 	IsMinikubeChildProcess = "IS_MINIKUBE_CHILD_PROCESS"
-
 	// FileScheme is the file scheme
 	FileScheme = "file"
 )
diff --git a/pkg/util/constants.go b/pkg/util/constants.go
index 9ca61ffb8b..f1132155c4 100644
--- a/pkg/util/constants.go
+++ b/pkg/util/constants.go
@@ -24,11 +24,9 @@ import (
 
 // These constants are used by both minikube
 const (
-	APIServerPort            = 8443
-	DefaultMinikubeDirectory = "/var/lib/minikube"
-	DefaultKubeConfigPath    = DefaultMinikubeDirectory + "/kubeconfig"
-	DefaultDNSDomain         = "cluster.local"
-	DefaultServiceCIDR       = "10.96.0.0/12"
+	APIServerPort      = 8443
+	DefaultDNSDomain   = "cluster.local"
+	DefaultServiceCIDR = "10.96.0.0/12"
 )
 
 // DefaultV114AdmissionControllers are admission controllers we default to in v1.14.x

From 3d1797606207c454c0d3653c6444ff0eb86a2e89 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Fri, 9 Aug 2019 16:24:49 -0700
Subject: [PATCH 03/40] lint and change detector test updates

---
 pkg/minikube/bootstrapper/certs.go            |  4 ----
 pkg/minikube/bootstrapper/certs_test.go       |  3 ++-
 pkg/minikube/bootstrapper/kubeadm/kubeadm.go  |  2 +-
 .../bootstrapper/kubeadm/kubeadm_test.go      | 24 ++++++++-----------
 .../testdata/v1.10/containerd-api-port.yaml   |  4 ++--
 .../v1.10/containerd-pod-network-cidr.yaml    |  4 ++--
 .../kubeadm/testdata/v1.10/containerd.yaml    |  4 ++--
 .../testdata/v1.10/crio-options-gates.yaml    |  4 ++--
 .../kubeadm/testdata/v1.10/crio.yaml          |  4 ++--
 .../kubeadm/testdata/v1.10/default.yaml       |  4 ++--
 .../testdata/v1.10/image-repository.yaml      |  4 ++--
 .../kubeadm/testdata/v1.10/options.yaml       |  4 ++--
 .../testdata/v1.11/containerd-api-port.yaml   |  4 ++--
 .../v1.11/containerd-pod-network-cidr.yaml    |  4 ++--
 .../kubeadm/testdata/v1.11/containerd.yaml    |  4 ++--
 .../testdata/v1.11/crio-options-gates.yaml    |  4 ++--
 .../kubeadm/testdata/v1.11/crio.yaml          |  4 ++--
 .../kubeadm/testdata/v1.11/default.yaml       |  4 ++--
 .../testdata/v1.11/image-repository.yaml      |  4 ++--
 .../kubeadm/testdata/v1.11/options.yaml       |  4 ++--
 .../testdata/v1.12/containerd-api-port.yaml   |  4 ++--
 .../v1.12/containerd-pod-network-cidr.yaml    |  4 ++--
 .../kubeadm/testdata/v1.12/containerd.yaml    |  4 ++--
 .../testdata/v1.12/crio-options-gates.yaml    |  4 ++--
 .../kubeadm/testdata/v1.12/crio.yaml          |  4 ++--
 .../kubeadm/testdata/v1.12/default.yaml       |  4 ++--
 .../testdata/v1.12/image-repository.yaml      |  4 ++--
 .../kubeadm/testdata/v1.12/options.yaml       |  4 ++--
 .../testdata/v1.13/containerd-api-port.yaml   |  4 ++--
 .../v1.13/containerd-pod-network-cidr.yaml    |  4 ++--
 .../kubeadm/testdata/v1.13/containerd.yaml    |  4 ++--
 .../testdata/v1.13/crio-options-gates.yaml    |  4 ++--
 .../kubeadm/testdata/v1.13/crio.yaml          |  4 ++--
 .../kubeadm/testdata/v1.13/default.yaml       |  4 ++--
 .../testdata/v1.13/image-repository.yaml      |  4 ++--
 .../kubeadm/testdata/v1.13/options.yaml       |  4 ++--
 .../testdata/v1.14/containerd-api-port.yaml   |  4 ++--
 .../v1.14/containerd-pod-network-cidr.yaml    |  4 ++--
 .../kubeadm/testdata/v1.14/containerd.yaml    |  4 ++--
 .../testdata/v1.14/crio-options-gates.yaml    |  4 ++--
 .../kubeadm/testdata/v1.14/crio.yaml          |  4 ++--
 .../kubeadm/testdata/v1.14/default.yaml       |  4 ++--
 .../testdata/v1.14/image-repository.yaml      |  4 ++--
 .../kubeadm/testdata/v1.14/options.yaml       |  4 ++--
 .../testdata/v1.15/containerd-api-port.yaml   |  4 ++--
 .../v1.15/containerd-pod-network-cidr.yaml    |  4 ++--
 .../kubeadm/testdata/v1.15/containerd.yaml    |  4 ++--
 .../testdata/v1.15/crio-options-gates.yaml    |  4 ++--
 .../kubeadm/testdata/v1.15/crio.yaml          |  4 ++--
 .../kubeadm/testdata/v1.15/default.yaml       |  4 ++--
 .../testdata/v1.15/image-repository.yaml      |  4 ++--
 .../kubeadm/testdata/v1.15/options.yaml       |  4 ++--
 pkg/minikube/constants/constants.go           |  2 +-
 53 files changed, 110 insertions(+), 117 deletions(-)

diff --git a/pkg/minikube/bootstrapper/certs.go b/pkg/minikube/bootstrapper/certs.go
index 64b2a912c3..d235c1eadf 100644
--- a/pkg/minikube/bootstrapper/certs.go
+++ b/pkg/minikube/bootstrapper/certs.go
@@ -50,11 +50,7 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig) error {
 	if err := generateCerts(k8s); err != nil {
 		return errors.Wrap(err, "Error generating certs")
 	}
-	if err := cmd.Run(fmt.Sprintf("sudo mkdir -p %s", constants.GuestCertsDir)); err != nil {
-		return errors.Wrap(err, "mkdir")
-	}
 	copyableFiles := []assets.CopyableFile{}
-
 	for _, cert := range certs {
 		p := filepath.Join(localPath, cert)
 		perms := "0644"
diff --git a/pkg/minikube/bootstrapper/certs_test.go b/pkg/minikube/bootstrapper/certs_test.go
index 893c7a0832..6cd39e5cf3 100644
--- a/pkg/minikube/bootstrapper/certs_test.go
+++ b/pkg/minikube/bootstrapper/certs_test.go
@@ -32,7 +32,6 @@ func TestSetupCerts(t *testing.T) {
 	tempDir := tests.MakeTempDir()
 	defer os.RemoveAll(tempDir)
 
-	f := command.NewFakeCommandRunner()
 	k8s := config.KubernetesConfig{
 		APIServerName: constants.APIServerName,
 		DNSDomain:     constants.ClusterDNSDomain,
@@ -44,6 +43,8 @@ func TestSetupCerts(t *testing.T) {
 		filesToBeTransferred = append(filesToBeTransferred, filepath.Join(constants.GetMinipath(), cert))
 	}
 
+	f := command.NewFakeCommandRunner()
+	f.SetCommandToOutput(map[string]string{"sudo mkdir -p  /var/lib/minikube/certs": ""})
 	if err := SetupCerts(f, k8s); err != nil {
 		t.Fatalf("Error starting cluster: %v", err)
 	}
diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
index 2b7f15adb2..d96fe6ea99 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
@@ -670,7 +670,7 @@ func configFiles(cfg config.KubernetesConfig, kubeadm []byte, kubelet []byte, ku
 	return fs
 }
 
-// binDir returns the persistant path binaries are stored in
+// binDir returns the persistent path binaries are stored in
 func binRoot(version string) string {
 	return filepath.Join(constants.GuestPersistentDir, "binaries", version)
 }
diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go
index 5e6389f993..dd9e095eae 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go
@@ -44,13 +44,12 @@ func TestGenerateKubeletConfig(t *testing.T) {
 				NodeName:          "minikube",
 				ContainerRuntime:  "docker",
 			},
-			expected: `
-[Unit]
+			expected: `[Unit]
 Wants=docker.socket
 
 [Service]
 ExecStart=
-ExecStart=/usr/bin/kubelet --allow-privileged=true --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cadvisor-port=0 --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=docker --fail-swap-on=false --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests
+ExecStart=/var/lib/minikube/binaries/v1.10.13/kubelet --allow-privileged=true --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cadvisor-port=0 --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=docker --fail-swap-on=false --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests
 
 [Install]
 `,
@@ -63,13 +62,12 @@ ExecStart=/usr/bin/kubelet --allow-privileged=true --authorization-mode=Webhook
 				NodeName:          "minikube",
 				ContainerRuntime:  "cri-o",
 			},
-			expected: `
-[Unit]
+			expected: `[Unit]
 Wants=crio.service
 
 [Service]
 ExecStart=
-ExecStart=/usr/bin/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock --fail-swap-on=false --hostname-override=minikube --image-service-endpoint=/var/run/crio/crio.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --runtime-request-timeout=15m
+ExecStart=/var/lib/minikube/binaries/v1.15.2/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock --fail-swap-on=false --hostname-override=minikube --image-service-endpoint=/var/run/crio/crio.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --runtime-request-timeout=15m
 
 [Install]
 `,
@@ -82,13 +80,12 @@ ExecStart=/usr/bin/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/
 				NodeName:          "minikube",
 				ContainerRuntime:  "containerd",
 			},
-			expected: `
-[Unit]
+			expected: `[Unit]
 Wants=containerd.service
 
 [Service]
 ExecStart=
-ExecStart=/usr/bin/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --fail-swap-on=false --hostname-override=minikube --image-service-endpoint=unix:///run/containerd/containerd.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --runtime-request-timeout=15m
+ExecStart=/var/lib/minikube/binaries/v1.15.2/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock --fail-swap-on=false --hostname-override=minikube --image-service-endpoint=unix:///run/containerd/containerd.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --runtime-request-timeout=15m
 
 [Install]
 `,
@@ -102,13 +99,12 @@ ExecStart=/usr/bin/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/
 				ContainerRuntime:  "docker",
 				ImageRepository:   "docker-proxy-image.io/google_containers",
 			},
-			expected: `
-[Unit]
+			expected: `[Unit]
 Wants=docker.socket
 
 [Service]
 ExecStart=
-ExecStart=/usr/bin/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=docker --fail-swap-on=false --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --pod-infra-container-image=docker-proxy-image.io/google_containers/pause:3.1 --pod-manifest-path=/etc/kubernetes/manifests
+ExecStart=/var/lib/minikube/binaries/v1.15.2/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=docker --fail-swap-on=false --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --pod-infra-container-image=docker-proxy-image.io/google_containers/pause:3.1 --pod-manifest-path=/etc/kubernetes/manifests
 
 [Install]
 `,
@@ -134,7 +130,7 @@ ExecStart=/usr/bin/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/
 
 			diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
 				A:        difflib.SplitLines(tc.expected),
-				B:        difflib.SplitLines(got),
+				B:        difflib.SplitLines(string(got)),
 				FromFile: "Expected",
 				ToFile:   "Got",
 				Context:  1,
@@ -267,7 +263,7 @@ func TestGenerateConfig(t *testing.T) {
 				}
 				diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{
 					A:        difflib.SplitLines(string(expected)),
-					B:        difflib.SplitLines(got),
+					B:        difflib.SplitLines(string(got)),
 					FromFile: "Expected",
 					ToFile:   "Got",
 					Context:  1,
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
index 40c91637f3..877e831b4b 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 12345
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /run/containerd/containerd.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
index b2d73f912b..2741f3dfbe 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /run/containerd/containerd.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
index b2d73f912b..2741f3dfbe 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /run/containerd/containerd.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
index e71f7dde0f..f4f766a146 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /var/run/crio/crio.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
index f68df3416f..4f689e42cd 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /var/run/crio/crio.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
index 9f0ea00701..1db5fb0711 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 apiServerExtraArgs:
   admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
index cebbc924ed..077385fcd6 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 imageRepository: test/repo
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
index 97fcc2e56e..d52687fa94 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 apiServerExtraArgs:
   admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
index c7edeea5f2..cb5e0e62e5 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 12345
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /run/containerd/containerd.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
index 320c885927..a78261c550 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /run/containerd/containerd.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
index 320c885927..a78261c550 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /run/containerd/containerd.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
index 37e2d4729a..15bb16aaa1 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /var/run/crio/crio.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
index 2b394b5335..7e33c3c861 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 criSocket: /var/run/crio/crio.sock
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
index f831b4e46e..13ea3d1c53 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
index 72ac00feb7..5e121b085d 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 imageRepository: test/repo
 apiServerExtraArgs:
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
index 653a3e4428..aac8924cbe 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
@@ -6,11 +6,11 @@ api:
   bindPort: 8443
   controlPlaneEndpoint: localhost
 kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 networking:
   serviceSubnet: 10.96.0.0/12
 etcd:
-  dataDir: /data/minikube
+  dataDir: /var/lib/minikube/etcd
 nodeName: mk
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
index 7d84e36369..2c7ad8fc47 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:12345
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
index 64bf678f02..c13a251804 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
index 4e4b1e4830..1398527e91 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
index 6f933f84cc..d33f0e13dc 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
@@ -27,12 +27,12 @@ controllerManagerExtraArgs:
 schedulerExtraArgs:
   feature-gates: "a=b"
   scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
index 033a7aefe2..c076b8ad9f 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
index d9ba1066a5..36856509b9 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
index bf00349785..dab9a37c23 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
@@ -20,12 +20,12 @@ kind: ClusterConfiguration
 imageRepository: test/repo
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
index 3e9052efa8..3a6ff1aeed 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
@@ -24,12 +24,12 @@ controllerManagerExtraArgs:
   kube-api-burst: "32"
 schedulerExtraArgs:
   scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.12.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
index e776755631..f365193c61 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:12345
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
index ecc9a14631..d5f799e56f 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
index a852561fbe..806106b3b7 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
index 9e5812dbda..e602810b0d 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
@@ -27,12 +27,12 @@ controllerManagerExtraArgs:
 schedulerExtraArgs:
   feature-gates: "a=b"
   scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
index 57b9f1b122..b82b3bf69b 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
index db611e2263..9995a46c14 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
@@ -19,12 +19,12 @@ apiVersion: kubeadm.k8s.io/v1alpha3
 kind: ClusterConfiguration
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
index 037dd6add2..b2b8b6e3fb 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
@@ -20,12 +20,12 @@ kind: ClusterConfiguration
 imageRepository: test/repo
 apiServerExtraArgs:
   enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
index f1df66954d..484dd5a352 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
@@ -24,12 +24,12 @@ controllerManagerExtraArgs:
   kube-api-burst: "32"
 schedulerExtraArgs:
   scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.13.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
index cc96f136ac..5755f5641d 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:12345
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
index 147a6ccbec..f4ff177f67 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
index 147a6ccbec..f4ff177f67 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
index 1b35bce5c6..6f46996151 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
@@ -30,14 +30,14 @@ scheduler:
   extraArgs:
     feature-gates: "a=b"
     scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
index 66dac1c8af..47cfd0ecbb 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
index d88c0efebf..57371bf704 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
index bf53791b71..2c1a895bca 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
@@ -21,14 +21,14 @@ imageRepository: test/repo
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
index a85a2447b2..325265c2c6 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
@@ -27,14 +27,14 @@ controllerManager:
 scheduler:
   extraArgs:
     scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.14.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
index 0fbf400ebf..9f08022e33 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:12345
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
index c6354e860b..30e3b200f1 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
index c6354e860b..30e3b200f1 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
index 78bbe09f1c..bcc3e64b00 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
@@ -30,14 +30,14 @@ scheduler:
   extraArgs:
     feature-gates: "a=b"
     scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
index b956109b81..7cc895ca15 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
index 46d6e4e78c..f31d943013 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
index 8ab50ff902..aec5820a00 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
@@ -21,14 +21,14 @@ imageRepository: test/repo
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
index 2e6f561dd4..eb354d47ee 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
@@ -27,14 +27,14 @@ controllerManager:
 scheduler:
   extraArgs:
     scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.15.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go
index 710e098b79..bc2085e8e0 100644
--- a/pkg/minikube/constants/constants.go
+++ b/pkg/minikube/constants/constants.go
@@ -222,7 +222,7 @@ const (
 	GuestManifestsDir = "/etc/kubernetes/manifests"
 	// GuestEphemeralDir is the path where ephemeral data should be stored within the VM
 	GuestEphemeralDir = "/var/tmp/minikube"
-	// PersistentDir is the path where persistant data should be stored within the VM (not tmpfs)
+	// PersistentDir is the path where persistent data should be stored within the VM (not tmpfs)
 	GuestPersistentDir = "/var/lib/minikube"
 	// GuestCertsDir are where Kubernetes certificates are kept on the guest
 	GuestCertsDir = GuestPersistentDir + "/certs"

From 03ebad25ab79e63ab85dd5385476ae9c9e23d648 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Wed, 14 Aug 2019 08:14:03 -0700
Subject: [PATCH 04/40] merge conflict

---
 pkg/minikube/constants/constants.go | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go
index d861681bc3..118a1eb1f5 100644
--- a/pkg/minikube/constants/constants.go
+++ b/pkg/minikube/constants/constants.go
@@ -210,12 +210,6 @@ func GetProfilePath(profile string, miniHome ...string) string {
 	return filepath.Join(miniPath, "profiles", profile)
 }
 
-// AddonsPath is the default path of the addons configuration
-const AddonsPath = "/etc/kubernetes/addons"
-
-// FilesPath is the default path of files
-const FilesPath = "/files"
-
 const (
 	// KubeletServiceFile is the path to the kubelet systemd service
 	KubeletServiceFile = "/lib/systemd/system/kubelet.service"

From 1d6699f0dabae907477e170340a850a6e2c5daf1 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Fri, 16 Aug 2019 15:21:58 -0700
Subject: [PATCH 05/40] kubeconfig needs to live persistently

---
 pkg/minikube/bootstrapper/certs.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/minikube/bootstrapper/certs.go b/pkg/minikube/bootstrapper/certs.go
index 9a690f5b44..3ad2740bef 100644
--- a/pkg/minikube/bootstrapper/certs.go
+++ b/pkg/minikube/bootstrapper/certs.go
@@ -84,7 +84,7 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig) error {
 		return errors.Wrap(err, "encoding kubeconfig")
 	}
 
-	kubeCfgFile := assets.NewMemoryAsset(data, constants.GuestEphemeralDir, "kubeconfig", "0644")
+	kubeCfgFile := assets.NewMemoryAsset(data, constants.GuestPersistentDir, "kubeconfig", "0644")
 	copyableFiles = append(copyableFiles, kubeCfgFile)
 
 	for _, f := range copyableFiles {

From b17d377d68a0d96ebbb6723ea4045f9f66f97ca7 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Fri, 16 Aug 2019 15:22:27 -0700
Subject: [PATCH 06/40] Detect when the addon-manager isn't able to process

---
 pkg/minikube/logs/logs.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/minikube/logs/logs.go b/pkg/minikube/logs/logs.go
index 05775f8779..8897c4e0c2 100644
--- a/pkg/minikube/logs/logs.go
+++ b/pkg/minikube/logs/logs.go
@@ -34,7 +34,7 @@ import (
 )
 
 // rootCauseRe is a regular expression that matches known failure root causes
-var rootCauseRe = regexp.MustCompile(`^error: |eviction manager: pods.* evicted|unknown flag: --|forbidden.*no providers available|eviction manager:.*evicted|tls: bad certificate|kubelet.*no API client|kubelet.*No api server`)
+var rootCauseRe = regexp.MustCompile(`^error: |eviction manager: pods.* evicted|unknown flag: --|forbidden.*no providers available|eviction manager:.*evicted|tls: bad certificate|kubelet.*no API client|kubelet.*No api server|STDIN.*127.0.0.1:8080`)
 
 // ignoreRe is a regular expression that matches spurious errors to not surface
 var ignoreCauseRe = regexp.MustCompile("error: no objects passed to apply")

From d11804e83f412672ec788ec101e699f0df422d8f Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Fri, 16 Aug 2019 16:45:59 -0700
Subject: [PATCH 07/40] Fix certs_test merge conflict

---
 pkg/minikube/bootstrapper/certs_test.go | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/pkg/minikube/bootstrapper/certs_test.go b/pkg/minikube/bootstrapper/certs_test.go
index 58a0d97823..db4d2e4bec 100644
--- a/pkg/minikube/bootstrapper/certs_test.go
+++ b/pkg/minikube/bootstrapper/certs_test.go
@@ -52,7 +52,9 @@ func TestSetupCerts(t *testing.T) {
 		t.Fatalf("error generating certificate: %v", err)
 	}
 
-	cmdMap := map[string]string{}
+	cmdMap := map[string]string{
+		"sudo mkdir -p  /var/lib/minikube/certs": "",
+	}
 	certFilenames := map[string]string{"ca.crt": "minikubeCA.pem", "mycert.pem": "mycert.pem"}
 	for _, dst := range certFilenames {
 		certFile := path.Join(CACertificatesDir, dst)
@@ -63,6 +65,7 @@ func TestSetupCerts(t *testing.T) {
 		cmdMap[fmt.Sprintf("openssl x509 -hash -noout -in '%s'", certFile)] = certNameHash
 		cmdMap[fmt.Sprintf("sudo ln -s '%s' '%s'", certStorePath, remoteCertHashLink)] = "1"
 	}
+	f := command.NewFakeCommandRunner()
 	f.SetCommandToOutput(cmdMap)
 
 	var filesToBeTransferred []string
@@ -72,8 +75,6 @@ func TestSetupCerts(t *testing.T) {
 	filesToBeTransferred = append(filesToBeTransferred, filepath.Join(constants.GetMinipath(), "ca.crt"))
 	filesToBeTransferred = append(filesToBeTransferred, filepath.Join(constants.GetMinipath(), "certs", "mycert.pem"))
 
-	f := command.NewFakeCommandRunner()
-	f.SetCommandToOutput(map[string]string{"sudo mkdir -p  /var/lib/minikube/certs": ""})
 	if err := SetupCerts(f, k8s); err != nil {
 		t.Fatalf("Error starting cluster: %v", err)
 	}

From 417feb6f1f79b2858261440d8e30d589f4bdb58f Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 14:35:33 -0700
Subject: [PATCH 08/40] adding travisbuddy bot for lint error comment

---
 .travis.yml | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/.travis.yml b/.travis.yml
index d2edd1570c..0da54a2646 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -18,3 +18,5 @@ script:
   - make test
 after_success:
   - bash <(curl -s https://codecov.io/bash)
+notifications:
+    webhooks: https://www.travisbuddy.com/
\ No newline at end of file

From 3b0ae8371d76145b9eb243b02c2134aa3b8033b8 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 14:44:06 -0700
Subject: [PATCH 09/40] making test fail on purpose to see travis buddy

---
 pkg/minikube/proxy/proxy_test.go     | 2 +-
 pkg/minikube/service/service_test.go | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/pkg/minikube/proxy/proxy_test.go b/pkg/minikube/proxy/proxy_test.go
index 25dccce10d..cd081248c3 100644
--- a/pkg/minikube/proxy/proxy_test.go
+++ b/pkg/minikube/proxy/proxy_test.go
@@ -34,7 +34,7 @@ func TestIsValidEnv(t *testing.T) {
 	for _, tc := range testCases {
 		t.Run(tc.env, func(t *testing.T) {
 			got := isValidEnv(tc.env)
-			if got != tc.want {
+			if got == tc.want { // Making it fail just to see travisbuddy work
 				t.Errorf("isValidEnv(\"%v\") got %v; want %v", tc.env, got, tc.want)
 			}
 
diff --git a/pkg/minikube/service/service_test.go b/pkg/minikube/service/service_test.go
index 2b6702baa5..0cd5a5d3e9 100644
--- a/pkg/minikube/service/service_test.go
+++ b/pkg/minikube/service/service_test.go
@@ -343,7 +343,7 @@ func TestOptionallyHttpsFormattedUrlString(t *testing.T) {
 				t.Errorf("\nhttpsFormattedURLString, Expected %v \nActual: %v \n\n", test.expectedHTTPSFormattedURLString, httpsFormattedURLString)
 			}
 
-			if isHTTPSchemedURL != test.expectedIsHTTPSchemedURL {
+			if isHTTPSchemedURL == test.expectedIsHTTPSchemedURL {
 				t.Errorf("\nisHTTPSchemedURL, Expected %v \nActual: %v \n\n",
 					test.expectedHTTPSFormattedURLString, httpsFormattedURLString)
 			}

From bcef943becaa7d1fcf39b06529b4c5150f9a3825 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 15:00:00 -0700
Subject: [PATCH 10/40] make travisbuddy only to comment on failure

---
 .travis.yml                          | 3 ++-
 pkg/minikube/proxy/proxy_test.go     | 2 +-
 pkg/minikube/service/service_test.go | 2 +-
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/.travis.yml b/.travis.yml
index 0da54a2646..6bbc93422d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -19,4 +19,5 @@ script:
 after_success:
   - bash <(curl -s https://codecov.io/bash)
 notifications:
-    webhooks: https://www.travisbuddy.com/
\ No newline at end of file
+    webhooks: https://www.travisbuddy.com/
+    on_success: never # travisbuddy don't comment on successfull 
\ No newline at end of file
diff --git a/pkg/minikube/proxy/proxy_test.go b/pkg/minikube/proxy/proxy_test.go
index cd081248c3..25dccce10d 100644
--- a/pkg/minikube/proxy/proxy_test.go
+++ b/pkg/minikube/proxy/proxy_test.go
@@ -34,7 +34,7 @@ func TestIsValidEnv(t *testing.T) {
 	for _, tc := range testCases {
 		t.Run(tc.env, func(t *testing.T) {
 			got := isValidEnv(tc.env)
-			if got == tc.want { // Making it fail just to see travisbuddy work
+			if got != tc.want {
 				t.Errorf("isValidEnv(\"%v\") got %v; want %v", tc.env, got, tc.want)
 			}
 
diff --git a/pkg/minikube/service/service_test.go b/pkg/minikube/service/service_test.go
index 0cd5a5d3e9..2b6702baa5 100644
--- a/pkg/minikube/service/service_test.go
+++ b/pkg/minikube/service/service_test.go
@@ -343,7 +343,7 @@ func TestOptionallyHttpsFormattedUrlString(t *testing.T) {
 				t.Errorf("\nhttpsFormattedURLString, Expected %v \nActual: %v \n\n", test.expectedHTTPSFormattedURLString, httpsFormattedURLString)
 			}
 
-			if isHTTPSchemedURL == test.expectedIsHTTPSchemedURL {
+			if isHTTPSchemedURL != test.expectedIsHTTPSchemedURL {
 				t.Errorf("\nisHTTPSchemedURL, Expected %v \nActual: %v \n\n",
 					test.expectedHTTPSFormattedURLString, httpsFormattedURLString)
 			}

From e325516ab1e4915d6c3480bd6f27d7c9ef502c05 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Tue, 20 Aug 2019 15:24:30 -0700
Subject: [PATCH 11/40] remove retry start from integeration tests

---
 test/integration/util/minikube_runner.go | 12 +++++-------
 1 file changed, 5 insertions(+), 7 deletions(-)

diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index 95bcfb603b..48d6bb549f 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -125,8 +125,7 @@ func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ..
 }
 
 // RunCommandRetriable executes a command, returns error
-// the purpose of this command is to make it retriable and
-// better logging for retrying
+// the purpose of this command is to make it retriable by returning error
 func (m *MinikubeRunner) RunCommandRetriable(cmdStr string, waitForRun ...bool) (stdout string, stderr string, err error) {
 	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
@@ -231,11 +230,10 @@ func (m *MinikubeRunner) SSH(cmdStr string) (string, error) {
 // Start starts the cluster
 func (m *MinikubeRunner) Start(opts ...string) (stdout string, stderr string, err error) {
 	cmd := fmt.Sprintf("start %s %s %s", m.StartArgs, m.GlobalArgs, strings.Join(opts, " "))
-	s := func() error {
-		stdout, stderr, err = m.RunCommandRetriable(cmd)
-		return err
-	}
-	err = retry.Expo(s, 10*time.Second, m.TimeOutStart)
+	ctx := context.Background()
+	ctx, cancel := context.WithTimeout(ctx, m.TimeOutStart)
+	defer cancel()
+	stdout, stderr, err = m.RunWithContext(ctx, cmd, true)
 	return stdout, stderr, err
 }
 

From 441f999e1dca3929231d744819fe3d35e95a2c9a Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Tue, 20 Aug 2019 16:23:14 -0700
Subject: [PATCH 12/40] Add better logging

---
 test/integration/util/minikube_runner.go | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index 48d6bb549f..7dc09b02c9 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -100,7 +100,7 @@ func (m *MinikubeRunner) teeRun(cmd *exec.Cmd, waitForRun ...bool) (string, stri
 
 // RunCommand executes a command, optionally checking for error and by default waits for run to finish
 func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ...bool) (string, string) {
-	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
+	profileArg := fmt.Sprintf(" -p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
 	path, _ := filepath.Abs(m.BinaryPath)
@@ -127,13 +127,13 @@ func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ..
 // RunCommandRetriable executes a command, returns error
 // the purpose of this command is to make it retriable by returning error
 func (m *MinikubeRunner) RunCommandRetriable(cmdStr string, waitForRun ...bool) (stdout string, stderr string, err error) {
-	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
+	profileArg := fmt.Sprintf(" -p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
 	path, _ := filepath.Abs(m.BinaryPath)
 
 	cmd := exec.Command(path, cmdArgs...)
-	Logf("Run: %s", cmd.Args)
+	Logf("RunCommandRetriable: %s", cmd.Args)
 	stdout, stderr, err = m.teeRun(cmd, waitForRun...)
 	if err != nil {
 		if exitError, ok := err.(*exec.ExitError); ok {
@@ -147,13 +147,13 @@ func (m *MinikubeRunner) RunCommandRetriable(cmdStr string, waitForRun ...bool)
 
 // RunWithContext calls the minikube command with a context, useful for timeouts.
 func (m *MinikubeRunner) RunWithContext(ctx context.Context, cmdStr string, wait ...bool) (string, string, error) {
-	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
+	profileArg := fmt.Sprintf(" -p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
 	path, _ := filepath.Abs(m.BinaryPath)
 
 	cmd := exec.CommandContext(ctx, path, cmdArgs...)
-	Logf("Run: %s", cmd.Args)
+	Logf("RunWithContext: %s", cmd.Args)
 	return m.teeRun(cmd, wait...)
 }
 

From 0e13fecd8ba1915035cc8bfdb1bf0301bcbe5e95 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Tue, 20 Aug 2019 17:56:47 -0700
Subject: [PATCH 13/40] fix replace

---
 test/integration/version_upgrade_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/integration/version_upgrade_test.go b/test/integration/version_upgrade_test.go
index 7e45ec28fa..86cabba679 100644
--- a/test/integration/version_upgrade_test.go
+++ b/test/integration/version_upgrade_test.go
@@ -80,7 +80,7 @@ func TestVersionUpgrade(t *testing.T) {
 
 	// because the --wait-timeout is a new flag and the current latest release (1.3.1) doesn't have it
 	// this won't be necessary after we release the change with --wait-timeout flag
-	mkRelease.StartArgs = strings.Replace("mkRelease.StartArgs", "--wait-timeout=13m", "", 1)
+	mkRelease.StartArgs = strings.Replace(mkRelease.StartArgs, "--wait-timeout=13m", "", 1)
 	mkRelease.BinaryPath = fname
 	// For full coverage: also test upgrading from oldest to newest supported k8s release
 	stdout, stderr, err := mkRelease.Start(fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))

From 8923e4b5cda71122e31bcb45ba4c19ef81864289 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Tue, 20 Aug 2019 18:04:56 -0700
Subject: [PATCH 14/40] Fix string replace

---
 test/integration/util/minikube_runner.go | 10 +++++-----
 test/integration/version_upgrade_test.go |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index 7dc09b02c9..105f7f5887 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -100,7 +100,7 @@ func (m *MinikubeRunner) teeRun(cmd *exec.Cmd, waitForRun ...bool) (string, stri
 
 // RunCommand executes a command, optionally checking for error and by default waits for run to finish
 func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ...bool) (string, string) {
-	profileArg := fmt.Sprintf(" -p=%s ", m.Profile)
+	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
 	path, _ := filepath.Abs(m.BinaryPath)
@@ -111,9 +111,9 @@ func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ..
 	if err != nil {
 		errMsg := ""
 		if exitError, ok := err.(*exec.ExitError); ok {
-			errMsg = fmt.Sprintf("Error running command: %s %s. Output: %s Stderr: %s", cmdStr, exitError.Stderr, stdout, stderr)
+			errMsg = fmt.Sprintf("Error RunCommand: %q : %q. Output: %q Stderr: %q", cmdStr, exitError.Stderr, stdout, stderr)
 		} else {
-			errMsg = fmt.Sprintf("Error running command: %s %s. Output: %s", cmdStr, stderr, stdout)
+			errMsg = fmt.Sprintf("Error RunCommand: %q : %q. Output: %q", cmdStr, stderr, stdout)
 		}
 		if failError {
 			m.T.Fatalf(errMsg)
@@ -127,7 +127,7 @@ func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ..
 // RunCommandRetriable executes a command, returns error
 // the purpose of this command is to make it retriable by returning error
 func (m *MinikubeRunner) RunCommandRetriable(cmdStr string, waitForRun ...bool) (stdout string, stderr string, err error) {
-	profileArg := fmt.Sprintf(" -p=%s ", m.Profile)
+	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
 	path, _ := filepath.Abs(m.BinaryPath)
@@ -147,7 +147,7 @@ func (m *MinikubeRunner) RunCommandRetriable(cmdStr string, waitForRun ...bool)
 
 // RunWithContext calls the minikube command with a context, useful for timeouts.
 func (m *MinikubeRunner) RunWithContext(ctx context.Context, cmdStr string, wait ...bool) (string, string, error) {
-	profileArg := fmt.Sprintf(" -p=%s ", m.Profile)
+	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
 	path, _ := filepath.Abs(m.BinaryPath)
diff --git a/test/integration/version_upgrade_test.go b/test/integration/version_upgrade_test.go
index 86cabba679..a9c0da2453 100644
--- a/test/integration/version_upgrade_test.go
+++ b/test/integration/version_upgrade_test.go
@@ -85,7 +85,7 @@ func TestVersionUpgrade(t *testing.T) {
 	// For full coverage: also test upgrading from oldest to newest supported k8s release
 	stdout, stderr, err := mkRelease.Start(fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
 	if err != nil {
-		t.Fatalf("TestVersionUpgrade minikube start failed : %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
+		t.Fatalf("minikube start (%s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
 	}
 
 	mkRelease.CheckStatus(state.Running.String())

From 5f0b0c1b90ea632b4d13192e7f22154f33f23808 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Tue, 20 Aug 2019 19:37:04 -0700
Subject: [PATCH 15/40] Added duration metric for elevate priv

---
 pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 2 +-
 pkg/minikube/bootstrapper/kubeadm/util.go    | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
index 736cdd4f25..ce7cf5c614 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
@@ -244,7 +244,7 @@ func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
 
 	glog.Infof("Configuring cluster permissions ...")
 
-	if err := retry.Expo(elevateKubeSystemPrivileges, time.Millisecond*500, 40*time.Second); err != nil {
+	if err := retry.Expo(elevateKubeSystemPrivileges, time.Millisecond*500, 60*time.Second); err != nil {
 		return errors.Wrap(err, "timed out waiting to elevate kube-system RBAC privileges")
 	}
 
diff --git a/pkg/minikube/bootstrapper/kubeadm/util.go b/pkg/minikube/bootstrapper/kubeadm/util.go
index 3814cef7d5..b6c56ad39d 100644
--- a/pkg/minikube/bootstrapper/kubeadm/util.go
+++ b/pkg/minikube/bootstrapper/kubeadm/util.go
@@ -19,6 +19,7 @@ package kubeadm
 import (
 	"encoding/json"
 	"net"
+	"time"
 
 	"github.com/golang/glog"
 	"github.com/pkg/errors"
@@ -89,6 +90,7 @@ func unmarkMaster() error {
 // elevateKubeSystemPrivileges gives the kube-system service account
 // cluster admin privileges to work with RBAC.
 func elevateKubeSystemPrivileges() error {
+	start := time.Now()
 	k8s := service.K8s
 	client, err := k8s.GetClientset(constants.DefaultK8sClientTimeout)
 	if err != nil {
@@ -123,5 +125,6 @@ func elevateKubeSystemPrivileges() error {
 		}
 		return errors.Wrap(err, "creating clusterrolebinding")
 	}
+	glog.Infof("duration metric: took %s to wait for elevateKubeSystemPrivileges.", time.Since(start))
 	return nil
 }

From eef31403b4e665fe6d7437ab55303654461e23d7 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 08:45:17 -0700
Subject: [PATCH 16/40] Unified StartFail Logging, more t.Error and Added
 download only test,

---
 test/integration/a_download_only_test.go   | 38 +++++++++++++++++-----
 test/integration/containerd_test.go        | 11 ++-----
 test/integration/docker_test.go            |  7 ++--
 test/integration/functional_test.go        |  5 +--
 test/integration/iso_test.go               |  2 +-
 test/integration/none_test.go              |  2 +-
 test/integration/persistence_test.go       | 10 ++----
 test/integration/start_stop_delete_test.go | 26 ++++++++-------
 test/integration/util/minikube_runner.go   | 16 ++++++---
 test/integration/version_upgrade_test.go   | 11 ++-----
 test/integration/z_proxy_test.go           |  5 +--
 11 files changed, 69 insertions(+), 64 deletions(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index 3060b72636..a03344f99f 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -43,22 +43,44 @@ func TestDownloadOnly(t *testing.T) {
 	if !isTestNoneDriver(t) { // none driver doesnt need to be deleted
 		defer mk.TearDown(t)
 	}
+	minHome := constants.GetMinipath()
 
 	t.Run("Oldest", func(t *testing.T) {
-		stdout, stderr, err := mk.Start("--download-only", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
-		if err != nil {
-			t.Errorf("%s minikube --download-only failed : %v\nstdout: %s\nstderr: %s", p, err, stdout, stderr)
-		}
+		mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
 	})
 
 	t.Run("Newest", func(t *testing.T) {
-		stdout, stderr, err := mk.Start("--download-only", fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion))
-		if err != nil {
-			t.Errorf("%s minikube --download-only failed : %v\nstdout: %s\nstderr: %s", p, err, stdout, stderr)
+		v := constants.NewestKubernetesVersion
+		mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
+
+		// checking binaries downloaded
+		_, imgs := constants.GetKubeadmCachedImages("", v)
+		for _, img := range imgs {
+			_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("images/%s", img)))
+			if err != nil {
+				t.Errorf("error expected download-only to cachne image %q but got error %v", img, err)
+			}
 		}
-		// TODO: add test to check if files are downloaded
+
+		// checking binaries downloaded (kubelet,kubeadm)
+		for _, bin := range constants.GetKubeadmCachedBinaries() {
+			_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("cache/%s/%s", v, bin)))
+			if err != nil {
+				t.Errorf("error expected download-only to cachne binary %q but got error %v", bin, err)
+			}
+		}
+
+		// checking binaries downloaded
+		for _, bin := range []string{"kublet,kbueadm"} {
+			_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("cache/%s/%s", v, bin)))
+			if err != nil {
+				t.Errorf("error expected download-only to cachne binary %q but got error %v", bin, err)
+			}
+		}
+
 	})
 
+	// this downloads the latest published binary from where we publish the minikube binary
 	t.Run("DownloadLatestRelease", func(t *testing.T) {
 		dest := filepath.Join(*testdataDir, fmt.Sprintf("minikube-%s-%s-latest-stable", runtime.GOOS, runtime.GOARCH))
 		err := downloadMinikubeBinary(t, dest, "latest")
diff --git a/test/integration/containerd_test.go b/test/integration/containerd_test.go
index 7c72a13491..293f6f053c 100644
--- a/test/integration/containerd_test.go
+++ b/test/integration/containerd_test.go
@@ -48,11 +48,7 @@ func testGvisorRestart(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	defer mk.TearDown(t)
 
-	stdout, stderr, err := mk.Start("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
-	if err != nil {
-		t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", p, err, stdout, stderr)
-	}
-
+	mk.StartWithFail("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
 	mk.RunCommand("cache add gcr.io/k8s-minikube/gvisor-addon:latest", true)
 	mk.RunCommand("addons enable gvisor", true)
 
@@ -69,10 +65,7 @@ func testGvisorRestart(t *testing.T) {
 	deleteUntrustedWorkload(t, p)
 
 	mk.RunCommand("delete", true)
-	stdout, stderr, err = mk.Start("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
-	if err != nil {
-		t.Fatalf("failed to start minikube (for profile %s) failed : %v \nstdout: %s \nstderr: %s", t.Name(), err, stdout, stderr)
-	}
+	mk.StartWithFail("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
 	mk.CheckStatus(state.Running.String())
 
 	t.Log("waiting for gvisor controller to come up")
diff --git a/test/integration/docker_test.go b/test/integration/docker_test.go
index c7d02c36a3..5d90987f09 100644
--- a/test/integration/docker_test.go
+++ b/test/integration/docker_test.go
@@ -46,14 +46,11 @@ func TestDocker(t *testing.T) {
 		t.Logf("pre-delete failed (probably ok): %v", err)
 	}
 
-	stdout, stderr, err := mk.Start("--docker-env=FOO=BAR", "--docker-env=BAZ=BAT", "--docker-opt=debug", " --docker-opt=icc=true")
-	if err != nil {
-		t.Fatalf("TestDocker minikube start failed : %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
-	}
+	mk.StartWithFail("--docker-env=FOO=BAR", "--docker-env=BAZ=BAT", "--docker-opt=debug", " --docker-opt=icc=true")
 
 	mk.CheckStatus(state.Running.String())
 
-	stdout, stderr, err = mk.RunWithContext(ctx, "ssh -- systemctl show docker --property=Environment --no-pager")
+	stdout, stderr, err := mk.RunWithContext(ctx, "ssh -- systemctl show docker --property=Environment --no-pager")
 	if err != nil {
 		t.Errorf("docker env: %v\nstderr: %s", err, stderr)
 	}
diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go
index bae1efded5..8dd5cc57ba 100644
--- a/test/integration/functional_test.go
+++ b/test/integration/functional_test.go
@@ -25,10 +25,7 @@ import (
 func TestFunctional(t *testing.T) {
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p)
-	stdout, stderr, err := mk.Start()
-	if err != nil {
-		t.Fatalf("failed to start minikube failed : %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
-	}
+	mk.StartWithFail()
 	if !isTestNoneDriver(t) { // none driver doesn't need to be deleted
 		defer mk.TearDown(t)
 	}
diff --git a/test/integration/iso_test.go b/test/integration/iso_test.go
index 94092e1b5a..e2e8d6f01f 100644
--- a/test/integration/iso_test.go
+++ b/test/integration/iso_test.go
@@ -32,7 +32,7 @@ func TestISO(t *testing.T) {
 
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	mk.RunCommand("delete", false)
-	stdout, stderr, err := mk.Start()
+	stdout, stderr := mk.StartWithFail()
 	if err != nil {
 		t.Fatalf("failed to start minikube (for profile %s) %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
 	}
diff --git a/test/integration/none_test.go b/test/integration/none_test.go
index ec7f33ebc0..8371b65980 100644
--- a/test/integration/none_test.go
+++ b/test/integration/none_test.go
@@ -47,7 +47,7 @@ func TestNone(t *testing.T) {
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	mk.RunCommand("delete", false)
-	stdout, stderr, err := mk.Start()
+	stdout, stderr := mk.StartWithFail()
 	if err != nil {
 		t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", p, err, stdout, stderr)
 	}
diff --git a/test/integration/persistence_test.go b/test/integration/persistence_test.go
index c88e1b6cbf..097211b9fa 100644
--- a/test/integration/persistence_test.go
+++ b/test/integration/persistence_test.go
@@ -38,10 +38,7 @@ func TestPersistence(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	defer mk.TearDown(t)
 
-	stdout, stderr, err := mk.Start()
-	if err != nil {
-		t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
-	}
+	mk.StartWithFail()
 	kr := util.NewKubectlRunner(t, p)
 	if _, err := kr.RunCommand([]string{"create", "-f", filepath.Join(*testdataDir, "busybox.yaml")}); err != nil {
 		t.Fatalf("creating busybox pod: %s", err)
@@ -58,10 +55,7 @@ func TestPersistence(t *testing.T) {
 	mk.RunCommand("stop", true)
 	mk.CheckStatus(state.Stopped.String())
 
-	stdout, stderr, err = mk.Start()
-	if err != nil {
-		t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
-	}
+	mk.StartWithFail()
 	mk.CheckStatus(state.Running.String())
 
 	// Make sure the same things come up after we've restarted.
diff --git a/test/integration/start_stop_delete_test.go b/test/integration/start_stop_delete_test.go
index 19cb44535a..303de31cfe 100644
--- a/test/integration/start_stop_delete_test.go
+++ b/test/integration/start_stop_delete_test.go
@@ -87,10 +87,7 @@ func TestStartStop(t *testing.T) {
 				}
 
 				mk.RunCommand("config set WantReportErrorPrompt false", true)
-				stdout, stderr, err := mk.Start(tc.args...)
-				if err != nil {
-					t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", pn, err, stdout, stderr)
-				}
+				mk.StartWithFail(tc.args...)
 
 				mk.CheckStatus(state.Running.String())
 
@@ -101,20 +98,25 @@ func TestStartStop(t *testing.T) {
 				}
 
 				stop := func() error {
-					stdout, stderr, err = mk.RunCommandRetriable("stop")
-					return mk.CheckStatusNoFail(state.Stopped.String())
+					_, _, err := mk.RunCommandRetriable("stop", true)
+					if err != nil {
+						t.Errorf("minikube stop error %v ( will retry up to 3 times) ", err)
+					}
+					err = mk.CheckStatusNoFail(state.Stopped.String())
+					if err != nil {
+						t.Errorf("expected status to be stoped but got error %v ", err)
+					}
+					return err
 				}
 
-				err = retry.Expo(stop, 10*time.Second, 5*time.Minute)
-				mk.CheckStatus(state.Stopped.String())
-
-				stdout, stderr, err = mk.Start(tc.args...)
+				err := retry.Expo(stop, 10*time.Second, 5*time.Minute, 3) // max retry 3
 				if err != nil {
-					t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
+					t.Errorf("expected status to be stoped but got error: %v ", err)
 				}
 
+				mk.CheckStatus(state.Stopped.String())
+				mk.StartWithFail(tc.args...)
 				mk.CheckStatus(state.Running.String())
-
 				mk.RunCommand("delete", true)
 				mk.CheckStatus(state.None.String())
 			})
diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index 105f7f5887..c8fd71c85f 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -228,13 +228,21 @@ func (m *MinikubeRunner) SSH(cmdStr string) (string, error) {
 }
 
 // Start starts the cluster
-func (m *MinikubeRunner) Start(opts ...string) (stdout string, stderr string, err error) {
+func (m *MinikubeRunner) start(opts ...string) (stdout string, stderr string, err error) {
 	cmd := fmt.Sprintf("start %s %s %s", m.StartArgs, m.GlobalArgs, strings.Join(opts, " "))
 	ctx := context.Background()
 	ctx, cancel := context.WithTimeout(ctx, m.TimeOutStart)
 	defer cancel()
-	stdout, stderr, err = m.RunWithContext(ctx, cmd, true)
-	return stdout, stderr, err
+	return m.RunWithContext(ctx, cmd, true)
+}
+
+// StartWithFail starts the cluster and fail the test if error
+func (m *MinikubeRunner) StartWithFail(opts ...string) (stdout string, stderr string) {
+	stdout, stderr, err := m.start(opts...)
+	if err != nil {
+		m.T.Fatalf("%s Failed to start minikube (for profile %s) error: %v \n\twith opts %v, \n\t Global Args: %s \n\t Driver Args: %s \n\t STDOUT: \n\t\t %s \n\t STDERR: \n\t\t %s", m.T.Name(), m.Profile, err, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr)
+	}
+	return stdout, stderr
 }
 
 // TearDown deletes minikube without waiting for it. used to free up ram/cpu after each test
@@ -255,7 +263,7 @@ func (m *MinikubeRunner) EnsureRunning(opts ...string) {
 		m.T.Errorf("error getting status for ensure running: %v", err)
 	}
 	if s != state.Running.String() {
-		stdout, stderr, err := m.Start(opts...)
+		stdout, stderr, err := m.start(opts...)
 		if err != nil {
 			m.T.Errorf("error starting while running EnsureRunning : %v , stdout %s stderr %s", err, stdout, stderr)
 		}
diff --git a/test/integration/version_upgrade_test.go b/test/integration/version_upgrade_test.go
index a9c0da2453..e66c2b2f3b 100644
--- a/test/integration/version_upgrade_test.go
+++ b/test/integration/version_upgrade_test.go
@@ -83,19 +83,14 @@ func TestVersionUpgrade(t *testing.T) {
 	mkRelease.StartArgs = strings.Replace(mkRelease.StartArgs, "--wait-timeout=13m", "", 1)
 	mkRelease.BinaryPath = fname
 	// For full coverage: also test upgrading from oldest to newest supported k8s release
-	stdout, stderr, err := mkRelease.Start(fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
-	if err != nil {
-		t.Fatalf("minikube start (%s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
-	}
+	mkRelease.StartWithFail(fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
 
 	mkRelease.CheckStatus(state.Running.String())
 	mkRelease.RunCommand("stop", true)
 	mkRelease.CheckStatus(state.Stopped.String())
 
 	// Trim the leading "v" prefix to assert that we handle it properly.
-	stdout, stderr, err = mkHead.Start(fmt.Sprintf("--kubernetes-version=%s", strings.TrimPrefix(constants.NewestKubernetesVersion, "v")))
-	if err != nil {
-		t.Fatalf("TestVersionUpgrade mkCurrent.Start start failed : %v\nstdout: %s\nstderr: %s", err, stdout, stderr)
-	}
+	mkHead.StartWithFail(fmt.Sprintf("--kubernetes-version=%s", strings.TrimPrefix(constants.NewestKubernetesVersion, "v")))
+
 	mkHead.CheckStatus(state.Running.String())
 }
diff --git a/test/integration/z_proxy_test.go b/test/integration/z_proxy_test.go
index 86b9e2e1fc..8c991d8fd6 100644
--- a/test/integration/z_proxy_test.go
+++ b/test/integration/z_proxy_test.go
@@ -112,10 +112,7 @@ func TestProxy(t *testing.T) {
 func testProxyWarning(t *testing.T) {
 	p := profileName(t) // profile name
 	mk := NewMinikubeRunner(t, p)
-	stdout, stderr, err := mk.Start("--wait=false")
-	if err != nil {
-		t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
-	}
+	stdout, stderr := mk.StartWithFail("--wait=false")
 
 	msg := "Found network options:"
 	if !strings.Contains(stdout, msg) {

From c7e0d3aa8e9df7f06d27c485ed048f74bcb25c4b Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 08:58:11 -0700
Subject: [PATCH 17/40] lint and simplify download_only

---
 test/integration/a_download_only_test.go | 49 +++++++++---------------
 test/integration/none_test.go            |  3 --
 2 files changed, 18 insertions(+), 34 deletions(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index a03344f99f..2f5679cb78 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -43,41 +43,28 @@ func TestDownloadOnly(t *testing.T) {
 	if !isTestNoneDriver(t) { // none driver doesnt need to be deleted
 		defer mk.TearDown(t)
 	}
-	minHome := constants.GetMinipath()
 
-	t.Run("Oldest", func(t *testing.T) {
-		mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
-	})
+	t.Run("OldestNewest", func(t *testing.T) {
+		minHome := constants.GetMinipath()
+		for _, v := range []string{constants.OldestKubernetesVersion, constants.NewestKubernetesVersion} {
+			mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
+			// checking if cached images are downloaded to
+			_, imgs := constants.GetKubeadmCachedImages("", v)
+			for _, img := range imgs {
+				_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("images/%s", img)))
+				if err != nil {
+					t.Errorf("error expected download-only to cachne image %q but got error %v", img, err)
+				}
+			}
 
-	t.Run("Newest", func(t *testing.T) {
-		v := constants.NewestKubernetesVersion
-		mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
-
-		// checking binaries downloaded
-		_, imgs := constants.GetKubeadmCachedImages("", v)
-		for _, img := range imgs {
-			_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("images/%s", img)))
-			if err != nil {
-				t.Errorf("error expected download-only to cachne image %q but got error %v", img, err)
+			// checking binaries downloaded (kubelet,kubeadm)
+			for _, bin := range constants.GetKubeadmCachedBinaries() {
+				_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("cache/%s/%s", v, bin)))
+				if err != nil {
+					t.Errorf("error expected download-only to cachne binary %q but got error %v", bin, err)
+				}
 			}
 		}
-
-		// checking binaries downloaded (kubelet,kubeadm)
-		for _, bin := range constants.GetKubeadmCachedBinaries() {
-			_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("cache/%s/%s", v, bin)))
-			if err != nil {
-				t.Errorf("error expected download-only to cachne binary %q but got error %v", bin, err)
-			}
-		}
-
-		// checking binaries downloaded
-		for _, bin := range []string{"kublet,kbueadm"} {
-			_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("cache/%s/%s", v, bin)))
-			if err != nil {
-				t.Errorf("error expected download-only to cachne binary %q but got error %v", bin, err)
-			}
-		}
-
 	})
 
 	// this downloads the latest published binary from where we publish the minikube binary
diff --git a/test/integration/none_test.go b/test/integration/none_test.go
index 8371b65980..720772a509 100644
--- a/test/integration/none_test.go
+++ b/test/integration/none_test.go
@@ -48,9 +48,6 @@ func TestNone(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	mk.RunCommand("delete", false)
 	stdout, stderr := mk.StartWithFail()
-	if err != nil {
-		t.Fatalf("failed to start minikube (for profile %s) failed : %v\nstdout: %s\nstderr: %s", p, err, stdout, stderr)
-	}
 	msg := "Configuring local host environment"
 	if !strings.Contains(stdout, msg) {
 		t.Errorf("Expected: stdout to contain %q, got: %s", msg, stdout)

From b3c9eea3d8042a1f6b7a2eab8099b726ce4d97d9 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 09:58:22 -0700
Subject: [PATCH 18/40] improve logging, fix expected filename for downloadonly

---
 test/integration/a_download_only_test.go | 14 +++++++++-----
 test/integration/util/minikube_runner.go |  3 ++-
 2 files changed, 11 insertions(+), 6 deletions(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index 2f5679cb78..b21b14148b 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -24,6 +24,7 @@ import (
 	"os"
 	"path/filepath"
 	"runtime"
+	"strings"
 	"testing"
 	"time"
 
@@ -48,20 +49,23 @@ func TestDownloadOnly(t *testing.T) {
 		minHome := constants.GetMinipath()
 		for _, v := range []string{constants.OldestKubernetesVersion, constants.NewestKubernetesVersion} {
 			mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
-			// checking if cached images are downloaded to
+			// checking if cached images are downloaded for example (kube-apiserver_v1.15.2, kube-scheduler_v1.15.2, ...)
 			_, imgs := constants.GetKubeadmCachedImages("", v)
 			for _, img := range imgs {
-				_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("images/%s", img)))
+				img = strings.Replace(img, ":", "_", 1) // for example kube-scheduler:v1.15.2 --> kube-scheduler_v1.15.2
+				fp := filepath.Join(minHome, "cache", "images", img)
+				_, err := os.Stat(fp)
 				if err != nil {
-					t.Errorf("error expected download-only to cachne image %q but got error %v", img, err)
+					t.Errorf("expected image file exist at %q but got error: %v", fp, err)
 				}
 			}
 
 			// checking binaries downloaded (kubelet,kubeadm)
 			for _, bin := range constants.GetKubeadmCachedBinaries() {
-				_, err := os.Stat(filepath.Join(minHome, fmt.Sprintf("cache/%s/%s", v, bin)))
+				fp := filepath.Join(minHome, "cache", v, bin)
+				_, err := os.Stat(fp)
 				if err != nil {
-					t.Errorf("error expected download-only to cachne binary %q but got error %v", bin, err)
+					t.Errorf("expected the file for binary exist at %q but got error %v", fp, err)
 				}
 			}
 		}
diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index c8fd71c85f..a8fb81d683 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -239,8 +239,9 @@ func (m *MinikubeRunner) start(opts ...string) (stdout string, stderr string, er
 // StartWithFail starts the cluster and fail the test if error
 func (m *MinikubeRunner) StartWithFail(opts ...string) (stdout string, stderr string) {
 	stdout, stderr, err := m.start(opts...)
+	// the reason for this formatting is, the logs are very big but useful and also in parallel testing logs are harder to identify
 	if err != nil {
-		m.T.Fatalf("%s Failed to start minikube (for profile %s) error: %v \n\twith opts %v, \n\t Global Args: %s \n\t Driver Args: %s \n\t STDOUT: \n\t\t %s \n\t STDERR: \n\t\t %s", m.T.Name(), m.Profile, err, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr)
+		m.T.Fatalf("%s Failed to start minikube With error: %v \n\t Start log block ---> \n\t With Profile: %s \n\t With Args: %v \n\t With Global Args: %s  \n\t With Driver Args: %s \n\t With STDOUT: \n \t %s \n\t With STDERR: \n \t %s \n\t <--- End of log block", m.T.Name(), err, m.Profile, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr)
 	}
 	return stdout, stderr
 }

From 8796539112d922699a3e4fc4725a7669b831edec Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 10:19:02 -0700
Subject: [PATCH 19/40] skip cache imge test for none

---
 test/integration/a_download_only_test.go | 47 +++++++++++++-----------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index b21b14148b..b3f2a96bf7 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -44,31 +44,36 @@ func TestDownloadOnly(t *testing.T) {
 	if !isTestNoneDriver(t) { // none driver doesnt need to be deleted
 		defer mk.TearDown(t)
 	}
-
-	t.Run("OldestNewest", func(t *testing.T) {
-		minHome := constants.GetMinipath()
-		for _, v := range []string{constants.OldestKubernetesVersion, constants.NewestKubernetesVersion} {
-			mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
-			// checking if cached images are downloaded for example (kube-apiserver_v1.15.2, kube-scheduler_v1.15.2, ...)
-			_, imgs := constants.GetKubeadmCachedImages("", v)
-			for _, img := range imgs {
-				img = strings.Replace(img, ":", "_", 1) // for example kube-scheduler:v1.15.2 --> kube-scheduler_v1.15.2
-				fp := filepath.Join(minHome, "cache", "images", img)
-				_, err := os.Stat(fp)
-				if err != nil {
-					t.Errorf("expected image file exist at %q but got error: %v", fp, err)
-				}
+	t.Run("group", func(t *testing.T) {
+		t.Run("CacheOldestNewest", func(t *testing.T) {
+			if !isTestNoneDriver(t) { // don't cache images
+				t.Skip("skipping test for none driver as it doesn't cache images")
 			}
 
-			// checking binaries downloaded (kubelet,kubeadm)
-			for _, bin := range constants.GetKubeadmCachedBinaries() {
-				fp := filepath.Join(minHome, "cache", v, bin)
-				_, err := os.Stat(fp)
-				if err != nil {
-					t.Errorf("expected the file for binary exist at %q but got error %v", fp, err)
+			minHome := constants.GetMinipath()
+			for _, v := range []string{constants.OldestKubernetesVersion, constants.NewestKubernetesVersion} {
+				mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
+				// checking if cached images are downloaded for example (kube-apiserver_v1.15.2, kube-scheduler_v1.15.2, ...)
+				_, imgs := constants.GetKubeadmCachedImages("", v)
+				for _, img := range imgs {
+					img = strings.Replace(img, ":", "_", 1) // for example kube-scheduler:v1.15.2 --> kube-scheduler_v1.15.2
+					fp := filepath.Join(minHome, "cache", "images", img)
+					_, err := os.Stat(fp)
+					if err != nil {
+						t.Errorf("expected image file exist at %q but got error: %v", fp, err)
+					}
+				}
+
+				// checking binaries downloaded (kubelet,kubeadm)
+				for _, bin := range constants.GetKubeadmCachedBinaries() {
+					fp := filepath.Join(minHome, "cache", v, bin)
+					_, err := os.Stat(fp)
+					if err != nil {
+						t.Errorf("expected the file for binary exist at %q but got error %v", fp, err)
+					}
 				}
 			}
-		}
+		})
 	})
 
 	// this downloads the latest published binary from where we publish the minikube binary

From 246f33f52bedea1974ba8f616c5a65d51a1aeaae Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 11:19:03 -0700
Subject: [PATCH 20/40] Less Retry on minikube, new auto fail helpers
 MustStart,MustRun

---
 test/integration/a_download_only_test.go   |  2 +-
 test/integration/containerd_test.go        | 10 ++--
 test/integration/docker_test.go            |  2 +-
 test/integration/fn_addons.go              | 15 +++---
 test/integration/fn_cluster_env.go         |  2 +-
 test/integration/fn_cluster_logs.go        |  6 +--
 test/integration/fn_cluster_ssh.go         |  2 +-
 test/integration/fn_profile.go             |  2 +-
 test/integration/fn_tunnel.go              |  2 +-
 test/integration/functional_test.go        |  2 +-
 test/integration/iso_test.go               |  5 +-
 test/integration/none_test.go              |  2 +-
 test/integration/persistence_test.go       |  6 +--
 test/integration/start_stop_delete_test.go | 31 +++--------
 test/integration/util/minikube_runner.go   | 62 +++++++++-------------
 test/integration/version_upgrade_test.go   |  6 +--
 test/integration/z_proxy_test.go           |  2 +-
 17 files changed, 67 insertions(+), 92 deletions(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index b3f2a96bf7..9cf1b1f8ea 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -52,7 +52,7 @@ func TestDownloadOnly(t *testing.T) {
 
 			minHome := constants.GetMinipath()
 			for _, v := range []string{constants.OldestKubernetesVersion, constants.NewestKubernetesVersion} {
-				mk.StartWithFail("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
+				mk.MustStart("--download-only", fmt.Sprintf("--kubernetes-version=%s", v))
 				// checking if cached images are downloaded for example (kube-apiserver_v1.15.2, kube-scheduler_v1.15.2, ...)
 				_, imgs := constants.GetKubeadmCachedImages("", v)
 				for _, img := range imgs {
diff --git a/test/integration/containerd_test.go b/test/integration/containerd_test.go
index 293f6f053c..8ee9863db1 100644
--- a/test/integration/containerd_test.go
+++ b/test/integration/containerd_test.go
@@ -48,9 +48,9 @@ func testGvisorRestart(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	defer mk.TearDown(t)
 
-	mk.StartWithFail("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
-	mk.RunCommand("cache add gcr.io/k8s-minikube/gvisor-addon:latest", true)
-	mk.RunCommand("addons enable gvisor", true)
+	mk.MustStart("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
+	mk.MustRun("cache add gcr.io/k8s-minikube/gvisor-addon:latest")
+	mk.MustRun("addons enable gvisor")
 
 	t.Log("waiting for gvisor controller to come up")
 	if err := waitForGvisorControllerRunning(p); err != nil {
@@ -64,8 +64,8 @@ func testGvisorRestart(t *testing.T) {
 	}
 	deleteUntrustedWorkload(t, p)
 
-	mk.RunCommand("delete", true)
-	mk.StartWithFail("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
+	mk.MustRun("delete")
+	mk.MustStart("--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock")
 	mk.CheckStatus(state.Running.String())
 
 	t.Log("waiting for gvisor controller to come up")
diff --git a/test/integration/docker_test.go b/test/integration/docker_test.go
index 5d90987f09..818bcbf5bb 100644
--- a/test/integration/docker_test.go
+++ b/test/integration/docker_test.go
@@ -46,7 +46,7 @@ func TestDocker(t *testing.T) {
 		t.Logf("pre-delete failed (probably ok): %v", err)
 	}
 
-	mk.StartWithFail("--docker-env=FOO=BAR", "--docker-env=BAZ=BAT", "--docker-opt=debug", " --docker-opt=icc=true")
+	mk.MustStart("--docker-env=FOO=BAR", "--docker-env=BAZ=BAT", "--docker-opt=debug", " --docker-opt=icc=true")
 
 	mk.CheckStatus(state.Running.String())
 
diff --git a/test/integration/fn_addons.go b/test/integration/fn_addons.go
index 0ecc1ecba4..c6f3a1cea7 100644
--- a/test/integration/fn_addons.go
+++ b/test/integration/fn_addons.go
@@ -128,7 +128,7 @@ func testIngressController(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	kr := util.NewKubectlRunner(t, p)
 
-	mk.RunCommand("addons enable ingress", true)
+	mk.MustRun("addons enable ingress")
 	if err := waitForIngressControllerRunning(p); err != nil {
 		t.Fatalf("Failed waiting for ingress-controller to be up: %v", err)
 	}
@@ -168,7 +168,7 @@ func testIngressController(t *testing.T) {
 			}
 		}
 	}()
-	mk.RunCommand("addons disable ingress", true)
+	mk.MustRun("addons disable ingress")
 }
 
 func testServicesList(t *testing.T) {
@@ -177,7 +177,10 @@ func testServicesList(t *testing.T) {
 	mk := NewMinikubeRunner(t, p)
 
 	checkServices := func() error {
-		output, stderr := mk.RunCommand("service list", false)
+		output, stderr, err := mk.RunCommand("service list", false)
+		if err != nil {
+			return err
+		}
 		if !strings.Contains(output, "kubernetes") {
 			return fmt.Errorf("error, kubernetes service missing from output: %s, \n stderr: %s", output, stderr)
 		}
@@ -191,7 +194,7 @@ func testRegistry(t *testing.T) {
 	t.Parallel()
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p)
-	mk.RunCommand("addons enable registry", true)
+	mk.MustRun("addons enable registry")
 	client, err := kapi.Client(p)
 	if err != nil {
 		t.Fatalf("getting kubernetes client: %v", err)
@@ -210,7 +213,7 @@ func testRegistry(t *testing.T) {
 	if err := kapi.WaitForPodsWithLabelRunning(client, "kube-system", ps); err != nil {
 		t.Fatalf("waiting for registry-proxy pods: %v", err)
 	}
-	ip, stderr := mk.RunCommand("ip", true)
+	ip, stderr := mk.MustRun("ip")
 	ip = strings.TrimSpace(ip)
 	endpoint := fmt.Sprintf("http://%s:%d", ip, 5000)
 	u, err := url.Parse(endpoint)
@@ -259,7 +262,7 @@ func testRegistry(t *testing.T) {
 			t.Errorf("failed to delete pod registry-test")
 		}
 	}()
-	mk.RunCommand("addons disable registry", true)
+	mk.MustRun("addons disable registry")
 }
 
 // waitForNginxRunning waits for nginx service to be up
diff --git a/test/integration/fn_cluster_env.go b/test/integration/fn_cluster_env.go
index 9a5e66a0ae..7144000616 100644
--- a/test/integration/fn_cluster_env.go
+++ b/test/integration/fn_cluster_env.go
@@ -34,7 +34,7 @@ func testClusterEnv(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 
 	// Set a specific shell syntax so that we don't have to handle every possible user shell
-	envOut, stderr := mk.RunCommand("docker-env --shell=bash", true)
+	envOut, stderr := mk.MustRun("docker-env --shell=bash")
 	vars := mk.ParseEnvCmdOutput(envOut)
 	if len(vars) == 0 {
 		t.Fatalf("Failed to parse env vars:\n%s, \n stderr: %s ", envOut, stderr)
diff --git a/test/integration/fn_cluster_logs.go b/test/integration/fn_cluster_logs.go
index c97912a916..c4b0b9cb13 100644
--- a/test/integration/fn_cluster_logs.go
+++ b/test/integration/fn_cluster_logs.go
@@ -27,13 +27,13 @@ func testClusterLogs(t *testing.T) {
 	t.Parallel()
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p)
-	logsCmdOutput := mk.GetLogs()
+	logsCmdStdout, _ := mk.GetLogs()
 
 	// check for # of lines or check for strings
 	logWords := []string{"minikube", ".go"}
 	for _, logWord := range logWords {
-		if !strings.Contains(logsCmdOutput, logWord) {
-			t.Fatalf("Error in logsCmdOutput, expected to find: %s. Output: %s", logWord, logsCmdOutput)
+		if !strings.Contains(logsCmdStdout, logWord) {
+			t.Fatalf("Error in logsCmdOutput, expected to find: %s. Output: %s", logWord, logsCmdStdout)
 		}
 	}
 }
diff --git a/test/integration/fn_cluster_ssh.go b/test/integration/fn_cluster_ssh.go
index cb2744ae96..4c98d24a46 100644
--- a/test/integration/fn_cluster_ssh.go
+++ b/test/integration/fn_cluster_ssh.go
@@ -28,7 +28,7 @@ func testClusterSSH(t *testing.T) {
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	expectedStr := "hello"
-	sshCmdOutput, stderr := mk.RunCommand("ssh echo "+expectedStr, true)
+	sshCmdOutput, stderr := mk.MustRun("ssh echo " + expectedStr)
 	if !strings.Contains(sshCmdOutput, expectedStr) {
 		t.Fatalf("ExpectedStr sshCmdOutput to be: %s. Output was: %s Stderr: %s", expectedStr, sshCmdOutput, stderr)
 	}
diff --git a/test/integration/fn_profile.go b/test/integration/fn_profile.go
index 9160a21190..3e9d108700 100644
--- a/test/integration/fn_profile.go
+++ b/test/integration/fn_profile.go
@@ -28,7 +28,7 @@ func testProfileList(t *testing.T) {
 	p := profileName(t)
 	t.Parallel()
 	mk := NewMinikubeRunner(t, p, "--wait=false")
-	out, stderr := mk.RunCommand("profile list", true)
+	out, stderr := mk.MustRun("profile list")
 	if !strings.Contains(out, p) {
 		t.Errorf("Error , failed to read profile name (%s) in `profile list` command output : \n %q : \n stderr: %s ", p, out, stderr)
 	}
diff --git a/test/integration/fn_tunnel.go b/test/integration/fn_tunnel.go
index d3721c71bf..534bb5bf24 100644
--- a/test/integration/fn_tunnel.go
+++ b/test/integration/fn_tunnel.go
@@ -49,7 +49,7 @@ func testTunnel(t *testing.T) {
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	go func() {
-		output, stderr := mk.RunCommand("tunnel --alsologtostderr -v 8 --logtostderr", true)
+		output, stderr := mk.MustRun("tunnel --alsologtostderr -v 8 --logtostderr")
 		if t.Failed() {
 			t.Errorf("tunnel stderr : %s", stderr)
 			t.Errorf("tunnel output : %s", output)
diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go
index 8dd5cc57ba..a9a3d61bea 100644
--- a/test/integration/functional_test.go
+++ b/test/integration/functional_test.go
@@ -25,7 +25,7 @@ import (
 func TestFunctional(t *testing.T) {
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p)
-	mk.StartWithFail()
+	mk.MustStart()
 	if !isTestNoneDriver(t) { // none driver doesn't need to be deleted
 		defer mk.TearDown(t)
 	}
diff --git a/test/integration/iso_test.go b/test/integration/iso_test.go
index e2e8d6f01f..1febd5b023 100644
--- a/test/integration/iso_test.go
+++ b/test/integration/iso_test.go
@@ -29,10 +29,9 @@ func TestISO(t *testing.T) {
 	if shouldRunInParallel(t) {
 		t.Parallel()
 	}
-
 	mk := NewMinikubeRunner(t, p, "--wait=false")
-	mk.RunCommand("delete", false)
-	stdout, stderr := mk.StartWithFail()
+	mk.RunCommand("delete", false) // will error if not exist, but ignored.
+	stdout, stderr := mk.MustStart()
 	if err != nil {
 		t.Fatalf("failed to start minikube (for profile %s) %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
 	}
diff --git a/test/integration/none_test.go b/test/integration/none_test.go
index 720772a509..5062ed0d49 100644
--- a/test/integration/none_test.go
+++ b/test/integration/none_test.go
@@ -47,7 +47,7 @@ func TestNone(t *testing.T) {
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	mk.RunCommand("delete", false)
-	stdout, stderr := mk.StartWithFail()
+	stdout, stderr := mk.MustStart()
 	msg := "Configuring local host environment"
 	if !strings.Contains(stdout, msg) {
 		t.Errorf("Expected: stdout to contain %q, got: %s", msg, stdout)
diff --git a/test/integration/persistence_test.go b/test/integration/persistence_test.go
index 097211b9fa..d2c576fbdc 100644
--- a/test/integration/persistence_test.go
+++ b/test/integration/persistence_test.go
@@ -38,7 +38,7 @@ func TestPersistence(t *testing.T) {
 	mk := NewMinikubeRunner(t, p, "--wait=false")
 	defer mk.TearDown(t)
 
-	mk.StartWithFail()
+	mk.MustStart()
 	kr := util.NewKubectlRunner(t, p)
 	if _, err := kr.RunCommand([]string{"create", "-f", filepath.Join(*testdataDir, "busybox.yaml")}); err != nil {
 		t.Fatalf("creating busybox pod: %s", err)
@@ -52,10 +52,10 @@ func TestPersistence(t *testing.T) {
 	// Make sure everything is up before we stop.
 	verifyBusybox(t)
 
-	mk.RunCommand("stop", true)
+	mk.MustRun("stop")
 	mk.CheckStatus(state.Stopped.String())
 
-	mk.StartWithFail()
+	mk.MustStart()
 	mk.CheckStatus(state.Running.String())
 
 	// Make sure the same things come up after we've restarted.
diff --git a/test/integration/start_stop_delete_test.go b/test/integration/start_stop_delete_test.go
index 303de31cfe..19b0e6f2aa 100644
--- a/test/integration/start_stop_delete_test.go
+++ b/test/integration/start_stop_delete_test.go
@@ -23,11 +23,9 @@ import (
 	"net"
 	"strings"
 	"testing"
-	"time"
 
 	"github.com/docker/machine/libmachine/state"
 	"k8s.io/minikube/pkg/minikube/constants"
-	"k8s.io/minikube/pkg/util/retry"
 )
 
 func TestStartStop(t *testing.T) {
@@ -86,38 +84,25 @@ func TestStartStop(t *testing.T) {
 					t.Skipf("skipping %s - incompatible with none driver", t.Name())
 				}
 
-				mk.RunCommand("config set WantReportErrorPrompt false", true)
-				mk.StartWithFail(tc.args...)
+				mk.MustRun("config set WantReportErrorPrompt false")
+				mk.MustStart(tc.args...)
 
 				mk.CheckStatus(state.Running.String())
 
-				ip, stderr := mk.RunCommand("ip", true)
+				ip, stderr := mk.MustRun("ip")
 				ip = strings.TrimRight(ip, "\n")
 				if net.ParseIP(ip) == nil {
 					t.Fatalf("IP command returned an invalid address: %s \n %s", ip, stderr)
 				}
 
-				stop := func() error {
-					_, _, err := mk.RunCommandRetriable("stop", true)
-					if err != nil {
-						t.Errorf("minikube stop error %v ( will retry up to 3 times) ", err)
-					}
-					err = mk.CheckStatusNoFail(state.Stopped.String())
-					if err != nil {
-						t.Errorf("expected status to be stoped but got error %v ", err)
-					}
-					return err
-				}
-
-				err := retry.Expo(stop, 10*time.Second, 5*time.Minute, 3) // max retry 3
+				mk.MustRun("stop")
+				err := mk.CheckStatusNoFail(state.Stopped.String())
 				if err != nil {
-					t.Errorf("expected status to be stoped but got error: %v ", err)
+					t.Errorf("expected status to be %s but got error %v ", state.Stopped.String(), err)
 				}
-
-				mk.CheckStatus(state.Stopped.String())
-				mk.StartWithFail(tc.args...)
+				mk.MustStart(tc.args...)
 				mk.CheckStatus(state.Running.String())
-				mk.RunCommand("delete", true)
+				mk.MustRun("delete")
 				mk.CheckStatus(state.None.String())
 			})
 		}
diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index a8fb81d683..6e1d7381aa 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -98,8 +98,17 @@ func (m *MinikubeRunner) teeRun(cmd *exec.Cmd, waitForRun ...bool) (string, stri
 	return "", "", err
 }
 
+// MustRun executes a command and fails if error, and and unless waitForRun is set to false it waits for it finish.
+func (m *MinikubeRunner) MustRun(cmdStr string, waitForRun ...bool) (string, string) {
+	stdout, stderr, err := m.RunCommand(cmdStr, true, waitForRun...)
+	if err != nil {
+		m.T.Logf("MusRun error: %v", err)
+	}
+	return stdout, stderr
+}
+
 // RunCommand executes a command, optionally checking for error and by default waits for run to finish
-func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ...bool) (string, string) {
+func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ...bool) (string, string, error) {
 	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
 	cmdStr = profileArg + cmdStr
 	cmdArgs := strings.Split(cmdStr, " ")
@@ -109,39 +118,17 @@ func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ..
 	Logf("Run: %s", cmd.Args)
 	stdout, stderr, err := m.teeRun(cmd, waitForRun...)
 	if err != nil {
-		errMsg := ""
+		exitCode := ""
 		if exitError, ok := err.(*exec.ExitError); ok {
-			errMsg = fmt.Sprintf("Error RunCommand: %q : %q. Output: %q Stderr: %q", cmdStr, exitError.Stderr, stdout, stderr)
-		} else {
-			errMsg = fmt.Sprintf("Error RunCommand: %q : %q. Output: %q", cmdStr, stderr, stdout)
+			exitCode = string(exitError.Stderr)
 		}
+		errMsg := fmt.Sprintf("Error RunCommand : %s \n\t Begin RunCommand log block ---> \n\t With Profile: %s \n\t With ExitCode: %q \n\t With STDOUT %s \n\t With STDERR %s \n\t <--- End of RunCommand log block", cmdStr, m.Profile, exitCode, stdout, stderr)
 		if failError {
 			m.T.Fatalf(errMsg)
 		} else {
 			m.T.Errorf(errMsg)
 		}
 	}
-	return stdout, stderr
-}
-
-// RunCommandRetriable executes a command, returns error
-// the purpose of this command is to make it retriable by returning error
-func (m *MinikubeRunner) RunCommandRetriable(cmdStr string, waitForRun ...bool) (stdout string, stderr string, err error) {
-	profileArg := fmt.Sprintf("-p=%s ", m.Profile)
-	cmdStr = profileArg + cmdStr
-	cmdArgs := strings.Split(cmdStr, " ")
-	path, _ := filepath.Abs(m.BinaryPath)
-
-	cmd := exec.Command(path, cmdArgs...)
-	Logf("RunCommandRetriable: %s", cmd.Args)
-	stdout, stderr, err = m.teeRun(cmd, waitForRun...)
-	if err != nil {
-		if exitError, ok := err.(*exec.ExitError); ok {
-			m.T.Logf("temporary error: running command: %s %s. Output: \n%s", cmdStr, exitError.Stderr, stdout)
-		} else {
-			m.T.Logf("temporary error: running command: %s %s. Output: \n%s", cmdStr, stderr, stdout)
-		}
-	}
 	return stdout, stderr, err
 }
 
@@ -237,11 +224,11 @@ func (m *MinikubeRunner) start(opts ...string) (stdout string, stderr string, er
 }
 
 // StartWithFail starts the cluster and fail the test if error
-func (m *MinikubeRunner) StartWithFail(opts ...string) (stdout string, stderr string) {
+func (m *MinikubeRunner) MustStart(opts ...string) (stdout string, stderr string) {
 	stdout, stderr, err := m.start(opts...)
 	// the reason for this formatting is, the logs are very big but useful and also in parallel testing logs are harder to identify
 	if err != nil {
-		m.T.Fatalf("%s Failed to start minikube With error: %v \n\t Start log block ---> \n\t With Profile: %s \n\t With Args: %v \n\t With Global Args: %s  \n\t With Driver Args: %s \n\t With STDOUT: \n \t %s \n\t With STDERR: \n \t %s \n\t <--- End of log block", m.T.Name(), err, m.Profile, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr)
+		m.T.Fatalf("%s Failed to start minikube With error: %v \n\t begin Start log block ---> \n\t With Profile: %s \n\t With Args: %v \n\t With Global Args: %s  \n\t With Driver Args: %s \n\t With STDOUT: \n \t %s \n\t With STDERR: \n \t %s \n\t <--- End of start log block", m.T.Name(), err, m.Profile, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr)
 	}
 	return stdout, stderr
 }
@@ -284,24 +271,25 @@ func (m *MinikubeRunner) ParseEnvCmdOutput(out string) map[string]string {
 
 // Status returns the status of a service
 func (m *MinikubeRunner) Status() (status string, stderr string, err error) {
-	cmd := fmt.Sprintf("status --format={{.Host}} %s", m.GlobalArgs)
 	s := func() error {
-		status, stderr, err = m.RunCommandRetriable(cmd)
+		status, stderr, err = m.RunCommand("status --format={{.Host}} %s", false)
 		status = strings.TrimRight(status, "\n")
+		if err != nil && (status == state.None.String() || status == state.Stopped.String()) {
+			err = nil // because https://github.com/kubernetes/minikube/issues/4932
+		}
 		return err
 	}
 	err = retry.Expo(s, 3*time.Second, 2*time.Minute)
-	if err != nil && (status == state.None.String() || status == state.Stopped.String()) {
-		err = nil // because https://github.com/kubernetes/minikube/issues/4932
-	}
 	return status, stderr, err
 }
 
 // GetLogs returns the logs of a service
-func (m *MinikubeRunner) GetLogs() string {
-	// TODO: this test needs to check sterr too !
-	stdout, _ := m.RunCommand(fmt.Sprintf("logs %s", m.GlobalArgs), true)
-	return stdout
+func (m *MinikubeRunner) GetLogs() (string, string) {
+	stdout, stderr, err := m.RunCommand(fmt.Sprintf("logs %s", m.GlobalArgs), true)
+	if err != nil {
+		m.T.Logf("Error in GetLogs %v", err)
+	}
+	return stdout, stderr
 }
 
 // CheckStatus makes sure the service has the desired status, or cause fatal error
diff --git a/test/integration/version_upgrade_test.go b/test/integration/version_upgrade_test.go
index e66c2b2f3b..6295c1d34f 100644
--- a/test/integration/version_upgrade_test.go
+++ b/test/integration/version_upgrade_test.go
@@ -83,14 +83,14 @@ func TestVersionUpgrade(t *testing.T) {
 	mkRelease.StartArgs = strings.Replace(mkRelease.StartArgs, "--wait-timeout=13m", "", 1)
 	mkRelease.BinaryPath = fname
 	// For full coverage: also test upgrading from oldest to newest supported k8s release
-	mkRelease.StartWithFail(fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
+	mkRelease.MustStart(fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion))
 
 	mkRelease.CheckStatus(state.Running.String())
-	mkRelease.RunCommand("stop", true)
+	mkRelease.MustRun("stop")
 	mkRelease.CheckStatus(state.Stopped.String())
 
 	// Trim the leading "v" prefix to assert that we handle it properly.
-	mkHead.StartWithFail(fmt.Sprintf("--kubernetes-version=%s", strings.TrimPrefix(constants.NewestKubernetesVersion, "v")))
+	mkHead.MustStart(fmt.Sprintf("--kubernetes-version=%s", strings.TrimPrefix(constants.NewestKubernetesVersion, "v")))
 
 	mkHead.CheckStatus(state.Running.String())
 }
diff --git a/test/integration/z_proxy_test.go b/test/integration/z_proxy_test.go
index 8c991d8fd6..a87f462986 100644
--- a/test/integration/z_proxy_test.go
+++ b/test/integration/z_proxy_test.go
@@ -112,7 +112,7 @@ func TestProxy(t *testing.T) {
 func testProxyWarning(t *testing.T) {
 	p := profileName(t) // profile name
 	mk := NewMinikubeRunner(t, p)
-	stdout, stderr := mk.StartWithFail("--wait=false")
+	stdout, stderr := mk.MustStart("--wait=false")
 
 	msg := "Found network options:"
 	if !strings.Contains(stdout, msg) {

From 8cadce302a1fcc37940af150f2297334eaabe55a Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 11:33:05 -0700
Subject: [PATCH 21/40] lint and add profile name to end of obvious log block

---
 test/integration/config_test.go          | 3 +--
 test/integration/util/minikube_runner.go | 2 +-
 2 files changed, 2 insertions(+), 3 deletions(-)

diff --git a/test/integration/config_test.go b/test/integration/config_test.go
index 626f84266f..6555c6519f 100644
--- a/test/integration/config_test.go
+++ b/test/integration/config_test.go
@@ -65,8 +65,7 @@ func TestConfig(t *testing.T) {
 	}
 
 	for _, tc := range tests {
-		stdout, stderr, _ := mk.RunCommandRetriable(tc.cmd)
-
+		stdout, stderr := mk.MustRun(tc.cmd)
 		if !compare(tc.stdout, stdout) {
 			t.Fatalf("Expected stdout to be: %s. Stdout was: %s Stderr: %s", tc.stdout, stdout, stderr)
 		}
diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index 6e1d7381aa..7e03387159 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -228,7 +228,7 @@ func (m *MinikubeRunner) MustStart(opts ...string) (stdout string, stderr string
 	stdout, stderr, err := m.start(opts...)
 	// the reason for this formatting is, the logs are very big but useful and also in parallel testing logs are harder to identify
 	if err != nil {
-		m.T.Fatalf("%s Failed to start minikube With error: %v \n\t begin Start log block ---> \n\t With Profile: %s \n\t With Args: %v \n\t With Global Args: %s  \n\t With Driver Args: %s \n\t With STDOUT: \n \t %s \n\t With STDERR: \n \t %s \n\t <--- End of start log block", m.T.Name(), err, m.Profile, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr)
+		m.T.Fatalf("%s Failed to start minikube With error: %v \n\t begin Start log block ------------> \n\t With Profile: %s \n\t With Args: %v \n\t With Global Args: %s  \n\t With Driver Args: %s \n\t With STDOUT: \n \t %s \n\t With STDERR: \n \t %s \n\t <------------ End of Start (%s) log block", m.T.Name(), err, m.Profile, strings.Join(opts, " "), m.GlobalArgs, m.StartArgs, stdout, stderr, m.Profile)
 	}
 	return stdout, stderr
 }

From 16e5aeec5ec05ce84214cffb9910e2c43cc96bf4 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 12:12:15 -0700
Subject: [PATCH 22/40] lint

---
 test/integration/iso_test.go  | 4 ++--
 test/integration/none_test.go | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/test/integration/iso_test.go b/test/integration/iso_test.go
index 1febd5b023..fa44e9ee52 100644
--- a/test/integration/iso_test.go
+++ b/test/integration/iso_test.go
@@ -30,8 +30,8 @@ func TestISO(t *testing.T) {
 		t.Parallel()
 	}
 	mk := NewMinikubeRunner(t, p, "--wait=false")
-	mk.RunCommand("delete", false) // will error if not exist, but ignored.
-	stdout, stderr := mk.MustStart()
+	mk.MustRun("delete")
+		stdout, stderr := mk.MustStart()
 	if err != nil {
 		t.Fatalf("failed to start minikube (for profile %s) %s) failed : %v\nstdout: %s\nstderr: %s", t.Name(), err, stdout, stderr)
 	}
diff --git a/test/integration/none_test.go b/test/integration/none_test.go
index 5062ed0d49..29915d9979 100644
--- a/test/integration/none_test.go
+++ b/test/integration/none_test.go
@@ -46,7 +46,7 @@ func TestNone(t *testing.T) {
 
 	p := profileName(t)
 	mk := NewMinikubeRunner(t, p, "--wait=false")
-	mk.RunCommand("delete", false)
+	mk.MustRun("delete")
 	stdout, stderr := mk.MustStart()
 	msg := "Configuring local host environment"
 	if !strings.Contains(stdout, msg) {

From 0f0def79ce4564c148f34070a9fbe152211707b9 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 13:53:35 -0700
Subject: [PATCH 23/40] change RunCommand for test config

---
 test/integration/config_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/integration/config_test.go b/test/integration/config_test.go
index 6555c6519f..bec9a36d71 100644
--- a/test/integration/config_test.go
+++ b/test/integration/config_test.go
@@ -65,7 +65,7 @@ func TestConfig(t *testing.T) {
 	}
 
 	for _, tc := range tests {
-		stdout, stderr := mk.MustRun(tc.cmd)
+		stdout, stderr := mk.RunCommand(tc.cmd, false)
 		if !compare(tc.stdout, stdout) {
 			t.Fatalf("Expected stdout to be: %s. Stdout was: %s Stderr: %s", tc.stdout, stdout, stderr)
 		}

From ac254bc7858e2633e4b6a84af52379e1c52f6f4b Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 14:25:00 -0700
Subject: [PATCH 24/40] check err

---
 test/integration/config_test.go | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/test/integration/config_test.go b/test/integration/config_test.go
index bec9a36d71..2eafa40877 100644
--- a/test/integration/config_test.go
+++ b/test/integration/config_test.go
@@ -65,7 +65,10 @@ func TestConfig(t *testing.T) {
 	}
 
 	for _, tc := range tests {
-		stdout, stderr := mk.RunCommand(tc.cmd, false)
+		stdout, stderr, err := mk.RunCommand(tc.cmd, false)
+		if err != nil {
+			t.Logf("error running config test command (might be okay): %v ", err)
+		}
 		if !compare(tc.stdout, stdout) {
 			t.Fatalf("Expected stdout to be: %s. Stdout was: %s Stderr: %s", tc.stdout, stdout, stderr)
 		}

From 56cbffb028c8cafbc9f4fc057b848a75ad9772be Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 15:29:01 -0700
Subject: [PATCH 25/40] skip none test for image cache

---
 test/integration/a_download_only_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index 9cf1b1f8ea..4f72c557d3 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -46,7 +46,7 @@ func TestDownloadOnly(t *testing.T) {
 	}
 	t.Run("group", func(t *testing.T) {
 		t.Run("CacheOldestNewest", func(t *testing.T) {
-			if !isTestNoneDriver(t) { // don't cache images
+			if isTestNoneDriver(t) { // don't cache images
 				t.Skip("skipping test for none driver as it doesn't cache images")
 			}
 

From 9d0654f59e55558a1bb0208df1b32875c2693665 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 15:58:57 -0700
Subject: [PATCH 26/40] remove mistake file checked in

---
 .../testdata/v1.10/containerd-api-port.yaml   | 17 ------
 .../v1.10/containerd-pod-network-cidr.yaml    | 17 ------
 .../kubeadm/testdata/v1.10/containerd.yaml    | 17 ------
 .../testdata/v1.10/crio-options-gates.yaml    | 25 ---------
 .../kubeadm/testdata/v1.10/crio.yaml          | 17 ------
 .../kubeadm/testdata/v1.10/default.yaml       | 16 ------
 .../testdata/v1.10/image-repository.yaml      | 17 ------
 .../kubeadm/testdata/v1.10/options.yaml       | 21 --------
 .../testdata/v1.11/containerd-api-port.yaml   | 17 ------
 .../v1.11/containerd-pod-network-cidr.yaml    | 17 ------
 .../kubeadm/testdata/v1.11/containerd.yaml    | 17 ------
 .../testdata/v1.11/crio-options-gates.yaml    | 25 ---------
 .../kubeadm/testdata/v1.11/crio.yaml          | 17 ------
 .../kubeadm/testdata/v1.11/default.yaml       | 16 ------
 .../testdata/v1.11/image-repository.yaml      | 17 ------
 .../kubeadm/testdata/v1.11/options.yaml       | 21 --------
 .../testdata/v1.12/containerd-api-port.yaml   | 39 --------------
 .../v1.12/containerd-pod-network-cidr.yaml    | 39 --------------
 .../kubeadm/testdata/v1.12/containerd.yaml    | 39 --------------
 .../testdata/v1.12/crio-options-gates.yaml    | 47 ----------------
 .../kubeadm/testdata/v1.12/crio.yaml          | 39 --------------
 .../kubeadm/testdata/v1.12/default.yaml       | 39 --------------
 .../testdata/v1.12/image-repository.yaml      | 40 --------------
 .../kubeadm/testdata/v1.12/options.yaml       | 44 ---------------
 .../testdata/v1.13/containerd-api-port.yaml   | 39 --------------
 .../v1.13/containerd-pod-network-cidr.yaml    | 39 --------------
 .../kubeadm/testdata/v1.13/containerd.yaml    | 39 --------------
 .../testdata/v1.13/crio-options-gates.yaml    | 47 ----------------
 .../kubeadm/testdata/v1.13/crio.yaml          | 39 --------------
 .../kubeadm/testdata/v1.13/default.yaml       | 39 --------------
 .../testdata/v1.13/image-repository.yaml      | 40 --------------
 .../kubeadm/testdata/v1.13/options.yaml       | 44 ---------------
 .../testdata/v1.14/containerd-api-port.yaml   | 43 ---------------
 .../v1.14/containerd-pod-network-cidr.yaml    | 43 ---------------
 .../kubeadm/testdata/v1.14/containerd.yaml    | 43 ---------------
 .../testdata/v1.14/crio-options-gates.yaml    | 53 -------------------
 .../kubeadm/testdata/v1.14/crio.yaml          | 43 ---------------
 .../kubeadm/testdata/v1.14/default.yaml       | 43 ---------------
 .../testdata/v1.14/image-repository.yaml      | 44 ---------------
 .../kubeadm/testdata/v1.14/options.yaml       | 50 -----------------
 .../testdata/v1.15/containerd-api-port.yaml   | 43 ---------------
 .../v1.15/containerd-pod-network-cidr.yaml    | 43 ---------------
 .../kubeadm/testdata/v1.15/containerd.yaml    | 43 ---------------
 .../testdata/v1.15/crio-options-gates.yaml    | 53 -------------------
 .../kubeadm/testdata/v1.15/crio.yaml          | 43 ---------------
 .../kubeadm/testdata/v1.15/default.yaml       | 43 ---------------
 .../testdata/v1.15/image-repository.yaml      | 44 ---------------
 .../kubeadm/testdata/v1.15/options.yaml       | 50 -----------------
 .../testdata/v1.16/containerd-api-port.yaml   | 43 ---------------
 .../v1.16/containerd-pod-network-cidr.yaml    | 43 ---------------
 .../kubeadm/testdata/v1.16/containerd.yaml    | 43 ---------------
 .../testdata/v1.16/crio-options-gates.yaml    | 53 -------------------
 .../kubeadm/testdata/v1.16/crio.yaml          | 43 ---------------
 .../kubeadm/testdata/v1.16/default.yaml       | 43 ---------------
 .../testdata/v1.16/image-repository.yaml      | 44 ---------------
 .../kubeadm/testdata/v1.16/options.yaml       | 50 -----------------
 56 files changed, 2032 deletions(-)
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
 delete mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml

diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
deleted file mode 100644
index 40c91637f3..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /run/containerd/containerd.sock
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
deleted file mode 100644
index b2d73f912b..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /run/containerd/containerd.sock
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
deleted file mode 100644
index b2d73f912b..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /run/containerd/containerd.sock
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
deleted file mode 100644
index e71f7dde0f..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /var/run/crio/crio.sock
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-  feature-gates: "a=b"
-controllerManagerExtraArgs:
-  feature-gates: "a=b"
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  feature-gates: "a=b"
-  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
deleted file mode 100644
index f68df3416f..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /var/run/crio/crio.sock
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
deleted file mode 100644
index 9f0ea00701..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
deleted file mode 100644
index cebbc924ed..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-imageRepository: test/repo
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
deleted file mode 100644
index 97fcc2e56e..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.10.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-apiServerExtraArgs:
-  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-controllerManagerExtraArgs:
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
deleted file mode 100644
index c7edeea5f2..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /run/containerd/containerd.sock
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
deleted file mode 100644
index 320c885927..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /run/containerd/containerd.sock
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
deleted file mode 100644
index 320c885927..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /run/containerd/containerd.sock
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
deleted file mode 100644
index 37e2d4729a..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /var/run/crio/crio.sock
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-  feature-gates: "a=b"
-controllerManagerExtraArgs:
-  feature-gates: "a=b"
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  feature-gates: "a=b"
-  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
deleted file mode 100644
index 2b394b5335..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-criSocket: /var/run/crio/crio.sock
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
deleted file mode 100644
index f831b4e46e..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
+++ /dev/null
@@ -1,16 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
deleted file mode 100644
index 72ac00feb7..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-imageRepository: test/repo
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
deleted file mode 100644
index 653a3e4428..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
+++ /dev/null
@@ -1,21 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha1
-kind: MasterConfiguration
-noTaintMaster: true
-api:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-  controlPlaneEndpoint: localhost
-kubernetesVersion: v1.11.0
-certificatesDir: /var/lib/minikube/certs/
-networking:
-  serviceSubnet: 10.96.0.0/12
-etcd:
-  dataDir: /data/minikube
-nodeName: mk
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-controllerManagerExtraArgs:
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
deleted file mode 100644
index 7d84e36369..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:12345
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
deleted file mode 100644
index 64bf678f02..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: 192.168.32.0/20
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
deleted file mode 100644
index 4e4b1e4830..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
deleted file mode 100644
index 6f933f84cc..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
+++ /dev/null
@@ -1,47 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-  feature-gates: "a=b"
-controllerManagerExtraArgs:
-  feature-gates: "a=b"
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  feature-gates: "a=b"
-  scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
deleted file mode 100644
index 033a7aefe2..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
deleted file mode 100644
index d9ba1066a5..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
deleted file mode 100644
index bf00349785..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-imageRepository: test/repo
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
deleted file mode 100644
index 3e9052efa8..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-controllerManagerExtraArgs:
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.12.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
deleted file mode 100644
index e776755631..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:12345
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
deleted file mode 100644
index ecc9a14631..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: 192.168.32.0/20
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
deleted file mode 100644
index a852561fbe..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
deleted file mode 100644
index 9e5812dbda..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
+++ /dev/null
@@ -1,47 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-  feature-gates: "a=b"
-controllerManagerExtraArgs:
-  feature-gates: "a=b"
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  feature-gates: "a=b"
-  scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
deleted file mode 100644
index 57b9f1b122..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
deleted file mode 100644
index db611e2263..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
+++ /dev/null
@@ -1,39 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
deleted file mode 100644
index 037dd6add2..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
+++ /dev/null
@@ -1,40 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-imageRepository: test/repo
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
deleted file mode 100644
index f1df66954d..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: InitConfiguration
-apiEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1alpha3
-kind: ClusterConfiguration
-apiServerExtraArgs:
-  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-  fail-no-swap: "true"
-controllerManagerExtraArgs:
-  kube-api-burst: "32"
-schedulerExtraArgs:
-  scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.13.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
deleted file mode 100644
index cc96f136ac..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:12345
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
deleted file mode 100644
index 147a6ccbec..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
deleted file mode 100644
index 147a6ccbec..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
deleted file mode 100644
index 1b35bce5c6..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
+++ /dev/null
@@ -1,53 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-    fail-no-swap: "true"
-    feature-gates: "a=b"
-controllerManager:
-  extraArgs:
-    feature-gates: "a=b"
-    kube-api-burst: "32"
-scheduler:
-  extraArgs:
-    feature-gates: "a=b"
-    scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
deleted file mode 100644
index 66dac1c8af..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
deleted file mode 100644
index d88c0efebf..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
deleted file mode 100644
index bf53791b71..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-imageRepository: test/repo
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
deleted file mode 100644
index a85a2447b2..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-    fail-no-swap: "true"
-controllerManager:
-  extraArgs:
-    kube-api-burst: "32"
-scheduler:
-  extraArgs:
-    scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.14.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
deleted file mode 100644
index 0fbf400ebf..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:12345
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
deleted file mode 100644
index c6354e860b..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
deleted file mode 100644
index c6354e860b..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
deleted file mode 100644
index 78bbe09f1c..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
+++ /dev/null
@@ -1,53 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-    fail-no-swap: "true"
-    feature-gates: "a=b"
-controllerManager:
-  extraArgs:
-    feature-gates: "a=b"
-    kube-api-burst: "32"
-scheduler:
-  extraArgs:
-    feature-gates: "a=b"
-    scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
deleted file mode 100644
index b956109b81..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
deleted file mode 100644
index 46d6e4e78c..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
deleted file mode 100644
index 8ab50ff902..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-imageRepository: test/repo
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
deleted file mode 100644
index 2e6f561dd4..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-    fail-no-swap: "true"
-controllerManager:
-  extraArgs:
-    kube-api-burst: "32"
-scheduler:
-  extraArgs:
-    scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.15.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
deleted file mode 100644
index 7d0e44e47c..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 12345
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:12345
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
deleted file mode 100644
index 428bbfc3e3..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
deleted file mode 100644
index 428bbfc3e3..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /run/containerd/containerd.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
deleted file mode 100644
index dc661e66ed..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
+++ /dev/null
@@ -1,53 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-    fail-no-swap: "true"
-    feature-gates: "a=b"
-controllerManager:
-  extraArgs:
-    feature-gates: "a=b"
-    kube-api-burst: "32"
-scheduler:
-  extraArgs:
-    feature-gates: "a=b"
-    scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
deleted file mode 100644
index 6fa2106724..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/crio/crio.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
deleted file mode 100644
index 74f7c79b92..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
+++ /dev/null
@@ -1,43 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
deleted file mode 100644
index caa1b2b456..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
+++ /dev/null
@@ -1,44 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-imageRepository: test/repo
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
deleted file mode 100644
index 348b4ab8c4..0000000000
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: InitConfiguration
-localAPIEndpoint:
-  advertiseAddress: 1.1.1.1
-  bindPort: 8443
-bootstrapTokens:
-  - groups:
-      - system:bootstrappers:kubeadm:default-node-token
-    ttl: 24h0m0s
-    usages:
-      - signing
-      - authentication
-nodeRegistration:
-  criSocket: /var/run/dockershim.sock
-  name: mk
-  taints: []
----
-apiVersion: kubeadm.k8s.io/v1beta1
-kind: ClusterConfiguration
-apiServer:
-  extraArgs:
-    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-    fail-no-swap: "true"
-controllerManager:
-  extraArgs:
-    kube-api-burst: "32"
-scheduler:
-  extraArgs:
-    scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
-clusterName: kubernetes
-controlPlaneEndpoint: localhost:8443
-dns:
-  type: CoreDNS
-etcd:
-  local:
-    dataDir: /data/minikube
-kubernetesVersion: v1.16.0
-networking:
-  dnsDomain: cluster.local
-  podSubnet: ""
-  serviceSubnet: 10.96.0.0/12
----
-apiVersion: kubelet.config.k8s.io/v1beta1
-kind: KubeletConfiguration
-imageGCHighThresholdPercent: 100
-evictionHard:
-  nodefs.available: "0%"
-  nodefs.inodesFree: "0%"
-  imagefs.available: "0%"

From fc7c9046424971b5782b5c3c0a45602a624fe2e7 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 16:02:03 -0700
Subject: [PATCH 27/40] add back test data from master

---
 .../testdata/v1.10/containerd-api-port.yaml   | 17 ++++++
 .../v1.10/containerd-pod-network-cidr.yaml    | 17 ++++++
 .../kubeadm/testdata/v1.10/containerd.yaml    | 17 ++++++
 .../testdata/v1.10/crio-options-gates.yaml    | 25 +++++++++
 .../kubeadm/testdata/v1.10/crio.yaml          | 17 ++++++
 .../kubeadm/testdata/v1.10/default.yaml       | 16 ++++++
 .../testdata/v1.10/image-repository.yaml      | 17 ++++++
 .../kubeadm/testdata/v1.10/options.yaml       | 21 ++++++++
 .../testdata/v1.11/containerd-api-port.yaml   | 17 ++++++
 .../v1.11/containerd-pod-network-cidr.yaml    | 17 ++++++
 .../kubeadm/testdata/v1.11/containerd.yaml    | 17 ++++++
 .../testdata/v1.11/crio-options-gates.yaml    | 25 +++++++++
 .../kubeadm/testdata/v1.11/crio.yaml          | 17 ++++++
 .../kubeadm/testdata/v1.11/default.yaml       | 16 ++++++
 .../testdata/v1.11/image-repository.yaml      | 17 ++++++
 .../kubeadm/testdata/v1.11/options.yaml       | 21 ++++++++
 .../testdata/v1.12/containerd-api-port.yaml   | 39 ++++++++++++++
 .../v1.12/containerd-pod-network-cidr.yaml    | 39 ++++++++++++++
 .../kubeadm/testdata/v1.12/containerd.yaml    | 39 ++++++++++++++
 .../testdata/v1.12/crio-options-gates.yaml    | 47 ++++++++++++++++
 .../kubeadm/testdata/v1.12/crio.yaml          | 39 ++++++++++++++
 .../kubeadm/testdata/v1.12/default.yaml       | 39 ++++++++++++++
 .../testdata/v1.12/image-repository.yaml      | 40 ++++++++++++++
 .../kubeadm/testdata/v1.12/options.yaml       | 44 +++++++++++++++
 .../testdata/v1.13/containerd-api-port.yaml   | 39 ++++++++++++++
 .../v1.13/containerd-pod-network-cidr.yaml    | 39 ++++++++++++++
 .../kubeadm/testdata/v1.13/containerd.yaml    | 39 ++++++++++++++
 .../testdata/v1.13/crio-options-gates.yaml    | 47 ++++++++++++++++
 .../kubeadm/testdata/v1.13/crio.yaml          | 39 ++++++++++++++
 .../kubeadm/testdata/v1.13/default.yaml       | 39 ++++++++++++++
 .../testdata/v1.13/image-repository.yaml      | 40 ++++++++++++++
 .../kubeadm/testdata/v1.13/options.yaml       | 44 +++++++++++++++
 .../testdata/v1.14/containerd-api-port.yaml   | 43 +++++++++++++++
 .../v1.14/containerd-pod-network-cidr.yaml    | 43 +++++++++++++++
 .../kubeadm/testdata/v1.14/containerd.yaml    | 43 +++++++++++++++
 .../testdata/v1.14/crio-options-gates.yaml    | 53 +++++++++++++++++++
 .../kubeadm/testdata/v1.14/crio.yaml          | 43 +++++++++++++++
 .../kubeadm/testdata/v1.14/default.yaml       | 43 +++++++++++++++
 .../testdata/v1.14/image-repository.yaml      | 44 +++++++++++++++
 .../kubeadm/testdata/v1.14/options.yaml       | 50 +++++++++++++++++
 .../testdata/v1.15/containerd-api-port.yaml   | 43 +++++++++++++++
 .../v1.15/containerd-pod-network-cidr.yaml    | 43 +++++++++++++++
 .../kubeadm/testdata/v1.15/containerd.yaml    | 43 +++++++++++++++
 .../testdata/v1.15/crio-options-gates.yaml    | 53 +++++++++++++++++++
 .../kubeadm/testdata/v1.15/crio.yaml          | 43 +++++++++++++++
 .../kubeadm/testdata/v1.15/default.yaml       | 43 +++++++++++++++
 .../testdata/v1.15/image-repository.yaml      | 44 +++++++++++++++
 .../kubeadm/testdata/v1.15/options.yaml       | 50 +++++++++++++++++
 .../testdata/v1.16/containerd-api-port.yaml   | 43 +++++++++++++++
 .../v1.16/containerd-pod-network-cidr.yaml    | 43 +++++++++++++++
 .../kubeadm/testdata/v1.16/containerd.yaml    | 43 +++++++++++++++
 .../testdata/v1.16/crio-options-gates.yaml    | 53 +++++++++++++++++++
 .../kubeadm/testdata/v1.16/crio.yaml          | 43 +++++++++++++++
 .../kubeadm/testdata/v1.16/default.yaml       | 43 +++++++++++++++
 .../testdata/v1.16/image-repository.yaml      | 44 +++++++++++++++
 .../kubeadm/testdata/v1.16/options.yaml       | 50 +++++++++++++++++
 56 files changed, 2032 insertions(+)
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
 create mode 100644 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml

diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
new file mode 100644
index 0000000000..40c91637f3
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-api-port.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /run/containerd/containerd.sock
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..b2d73f912b
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd-pod-network-cidr.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /run/containerd/containerd.sock
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
new file mode 100644
index 0000000000..b2d73f912b
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/containerd.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /run/containerd/containerd.sock
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
new file mode 100644
index 0000000000..e71f7dde0f
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio-options-gates.yaml
@@ -0,0 +1,25 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /var/run/crio/crio.sock
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+  feature-gates: "a=b"
+controllerManagerExtraArgs:
+  feature-gates: "a=b"
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  feature-gates: "a=b"
+  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
new file mode 100644
index 0000000000..f68df3416f
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/crio.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /var/run/crio/crio.sock
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
new file mode 100644
index 0000000000..9f0ea00701
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/default.yaml
@@ -0,0 +1,16 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
new file mode 100644
index 0000000000..cebbc924ed
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/image-repository.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+imageRepository: test/repo
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
new file mode 100644
index 0000000000..97fcc2e56e
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.10/options.yaml
@@ -0,0 +1,21 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.10.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+apiServerExtraArgs:
+  admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+controllerManagerExtraArgs:
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
new file mode 100644
index 0000000000..c7edeea5f2
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-api-port.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /run/containerd/containerd.sock
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..320c885927
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd-pod-network-cidr.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /run/containerd/containerd.sock
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
new file mode 100644
index 0000000000..320c885927
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/containerd.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /run/containerd/containerd.sock
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
new file mode 100644
index 0000000000..37e2d4729a
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio-options-gates.yaml
@@ -0,0 +1,25 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /var/run/crio/crio.sock
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+  feature-gates: "a=b"
+controllerManagerExtraArgs:
+  feature-gates: "a=b"
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  feature-gates: "a=b"
+  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
new file mode 100644
index 0000000000..2b394b5335
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/crio.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+criSocket: /var/run/crio/crio.sock
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
new file mode 100644
index 0000000000..f831b4e46e
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/default.yaml
@@ -0,0 +1,16 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
new file mode 100644
index 0000000000..72ac00feb7
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/image-repository.yaml
@@ -0,0 +1,17 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+imageRepository: test/repo
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
new file mode 100644
index 0000000000..653a3e4428
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.11/options.yaml
@@ -0,0 +1,21 @@
+apiVersion: kubeadm.k8s.io/v1alpha1
+kind: MasterConfiguration
+noTaintMaster: true
+api:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+  controlPlaneEndpoint: localhost
+kubernetesVersion: v1.11.0
+certificatesDir: /var/lib/minikube/certs/
+networking:
+  serviceSubnet: 10.96.0.0/12
+etcd:
+  dataDir: /data/minikube
+nodeName: mk
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+controllerManagerExtraArgs:
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  scheduler-name: "mini-scheduler"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
new file mode 100644
index 0000000000..7d84e36369
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-api-port.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:12345
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..64bf678f02
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd-pod-network-cidr.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: 192.168.32.0/20
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
new file mode 100644
index 0000000000..4e4b1e4830
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/containerd.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
new file mode 100644
index 0000000000..6f933f84cc
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio-options-gates.yaml
@@ -0,0 +1,47 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+  feature-gates: "a=b"
+controllerManagerExtraArgs:
+  feature-gates: "a=b"
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  feature-gates: "a=b"
+  scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
new file mode 100644
index 0000000000..033a7aefe2
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/crio.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
new file mode 100644
index 0000000000..d9ba1066a5
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/default.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
new file mode 100644
index 0000000000..bf00349785
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/image-repository.yaml
@@ -0,0 +1,40 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+imageRepository: test/repo
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
new file mode 100644
index 0000000000..3e9052efa8
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.12/options.yaml
@@ -0,0 +1,44 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+controllerManagerExtraArgs:
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.12.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
new file mode 100644
index 0000000000..e776755631
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-api-port.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:12345
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..ecc9a14631
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd-pod-network-cidr.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: 192.168.32.0/20
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
new file mode 100644
index 0000000000..a852561fbe
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/containerd.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
new file mode 100644
index 0000000000..9e5812dbda
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio-options-gates.yaml
@@ -0,0 +1,47 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+  feature-gates: "a=b"
+controllerManagerExtraArgs:
+  feature-gates: "a=b"
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  feature-gates: "a=b"
+  scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
new file mode 100644
index 0000000000..57b9f1b122
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/crio.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
new file mode 100644
index 0000000000..db611e2263
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/default.yaml
@@ -0,0 +1,39 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
new file mode 100644
index 0000000000..037dd6add2
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/image-repository.yaml
@@ -0,0 +1,40 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+imageRepository: test/repo
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
new file mode 100644
index 0000000000..f1df66954d
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.13/options.yaml
@@ -0,0 +1,44 @@
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: InitConfiguration
+apiEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1alpha3
+kind: ClusterConfiguration
+apiServerExtraArgs:
+  enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+  fail-no-swap: "true"
+controllerManagerExtraArgs:
+  kube-api-burst: "32"
+schedulerExtraArgs:
+  scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.13.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
new file mode 100644
index 0000000000..cc96f136ac
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-api-port.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:12345
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..147a6ccbec
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd-pod-network-cidr.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
new file mode 100644
index 0000000000..147a6ccbec
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/containerd.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
new file mode 100644
index 0000000000..1b35bce5c6
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio-options-gates.yaml
@@ -0,0 +1,53 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+    fail-no-swap: "true"
+    feature-gates: "a=b"
+controllerManager:
+  extraArgs:
+    feature-gates: "a=b"
+    kube-api-burst: "32"
+scheduler:
+  extraArgs:
+    feature-gates: "a=b"
+    scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
new file mode 100644
index 0000000000..66dac1c8af
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/crio.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
new file mode 100644
index 0000000000..d88c0efebf
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/default.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
new file mode 100644
index 0000000000..bf53791b71
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/image-repository.yaml
@@ -0,0 +1,44 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+imageRepository: test/repo
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
new file mode 100644
index 0000000000..a85a2447b2
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.14/options.yaml
@@ -0,0 +1,50 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+    fail-no-swap: "true"
+controllerManager:
+  extraArgs:
+    kube-api-burst: "32"
+scheduler:
+  extraArgs:
+    scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.14.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
new file mode 100644
index 0000000000..0fbf400ebf
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-api-port.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:12345
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..c6354e860b
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd-pod-network-cidr.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
new file mode 100644
index 0000000000..c6354e860b
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/containerd.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
new file mode 100644
index 0000000000..78bbe09f1c
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio-options-gates.yaml
@@ -0,0 +1,53 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+    fail-no-swap: "true"
+    feature-gates: "a=b"
+controllerManager:
+  extraArgs:
+    feature-gates: "a=b"
+    kube-api-burst: "32"
+scheduler:
+  extraArgs:
+    feature-gates: "a=b"
+    scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
new file mode 100644
index 0000000000..b956109b81
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/crio.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
new file mode 100644
index 0000000000..46d6e4e78c
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/default.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
new file mode 100644
index 0000000000..8ab50ff902
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/image-repository.yaml
@@ -0,0 +1,44 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+imageRepository: test/repo
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
new file mode 100644
index 0000000000..2e6f561dd4
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.15/options.yaml
@@ -0,0 +1,50 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+    fail-no-swap: "true"
+controllerManager:
+  extraArgs:
+    kube-api-burst: "32"
+scheduler:
+  extraArgs:
+    scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.15.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
new file mode 100644
index 0000000000..7d0e44e47c
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 12345
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:12345
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
new file mode 100644
index 0000000000..428bbfc3e3
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
new file mode 100644
index 0000000000..428bbfc3e3
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /run/containerd/containerd.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
new file mode 100644
index 0000000000..dc661e66ed
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
@@ -0,0 +1,53 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+    fail-no-swap: "true"
+    feature-gates: "a=b"
+controllerManager:
+  extraArgs:
+    feature-gates: "a=b"
+    kube-api-burst: "32"
+scheduler:
+  extraArgs:
+    feature-gates: "a=b"
+    scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
new file mode 100644
index 0000000000..6fa2106724
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/crio/crio.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
new file mode 100644
index 0000000000..74f7c79b92
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
@@ -0,0 +1,43 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
new file mode 100644
index 0000000000..caa1b2b456
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
@@ -0,0 +1,44 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+imageRepository: test/repo
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
new file mode 100644
index 0000000000..348b4ab8c4
--- /dev/null
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
@@ -0,0 +1,50 @@
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: InitConfiguration
+localAPIEndpoint:
+  advertiseAddress: 1.1.1.1
+  bindPort: 8443
+bootstrapTokens:
+  - groups:
+      - system:bootstrappers:kubeadm:default-node-token
+    ttl: 24h0m0s
+    usages:
+      - signing
+      - authentication
+nodeRegistration:
+  criSocket: /var/run/dockershim.sock
+  name: mk
+  taints: []
+---
+apiVersion: kubeadm.k8s.io/v1beta1
+kind: ClusterConfiguration
+apiServer:
+  extraArgs:
+    enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
+    fail-no-swap: "true"
+controllerManager:
+  extraArgs:
+    kube-api-burst: "32"
+scheduler:
+  extraArgs:
+    scheduler-name: "mini-scheduler"
+certificatesDir: /var/lib/minikube/certs/
+clusterName: kubernetes
+controlPlaneEndpoint: localhost:8443
+dns:
+  type: CoreDNS
+etcd:
+  local:
+    dataDir: /data/minikube
+kubernetesVersion: v1.16.0
+networking:
+  dnsDomain: cluster.local
+  podSubnet: ""
+  serviceSubnet: 10.96.0.0/12
+---
+apiVersion: kubelet.config.k8s.io/v1beta1
+kind: KubeletConfiguration
+imageGCHighThresholdPercent: 100
+evictionHard:
+  nodefs.available: "0%"
+  nodefs.inodesFree: "0%"
+  imagefs.available: "0%"

From 5d325c745ca25e936ab8d26b424bad7520c3a1c2 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Wed, 21 Aug 2019 17:20:47 -0700
Subject: [PATCH 28/40] Create symlink for legacy etcd directory, make
 apiserver check more robust

---
 pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 55 ++++++++++++++++----
 1 file changed, 46 insertions(+), 9 deletions(-)

diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
index 1c8e60c12b..a089e7c3fb 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
@@ -198,6 +198,28 @@ func createFlagsFromExtraArgs(extraOptions config.ExtraOptionSlice) string {
 	return convertToFlags(kubeadmExtraOpts)
 }
 
+// etcdDataDir is where etcd data is stored.
+func etcdDataDir() string {
+	return filepath.Join(constants.GuestPersistentDir, "etcd")
+}
+
+// createCompatSymlinks creates compatibility symlinks to transition running services to new directory structures
+func (k *Bootstrapper) createCompatSymlinks() error {
+	legacyEtcd := "/data/minikube"
+	if err := k.c.Run(fmt.Sprintf("sudo test -d %s", legacyEtcd)); err != nil {
+		glog.Infof("%s check failed, skipping compat symlinks: %v", legacyEtcd, err)
+		return nil
+	}
+
+	glog.Infof("Found %s, creating compatibility symlinks ...", legacyEtcd)
+	cmd := fmt.Sprintf("sudo ln -s %s %s", legacyEtcd, etcdDataDir())
+	out, err := k.c.CombinedOutput(cmd)
+	if err != nil {
+		return errors.Wrapf(err, "cmd failed: %s\n%s\n", cmd, out)
+	}
+	return nil
+}
+
 // StartCluster starts the cluster
 func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
 	version, err := parseKubernetesVersion(k8s.KubernetesVersion)
@@ -206,7 +228,6 @@ func (k *Bootstrapper) StartCluster(k8s config.KubernetesConfig) error {
 	}
 
 	extraFlags := createFlagsFromExtraArgs(k8s.ExtraOptions)
-
 	r, err := cruntime.New(cruntime.Config{Type: k8s.ContainerRuntime})
 	if err != nil {
 		return err
@@ -343,6 +364,12 @@ func (k *Bootstrapper) WaitCluster(k8s config.KubernetesConfig, timeout time.Dur
 
 // RestartCluster restarts the Kubernetes cluster configured by kubeadm
 func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
+	glog.Infof("RestartCluster start")
+	start := time.Now()
+	defer func() {
+		glog.Infof("RestartCluster took %s", time.Since(start))
+	}()
+
 	version, err := parseKubernetesVersion(k8s.KubernetesVersion)
 	if err != nil {
 		return errors.Wrap(err, "parsing kubernetes version")
@@ -355,6 +382,10 @@ func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
 		controlPlane = "control-plane"
 	}
 
+	if err := k.createCompatSymlinks(); err != nil {
+		glog.Errorf("failed to create compat symlinks: %v", err)
+	}
+
 	baseCmd := fmt.Sprintf("%s %s", invokeKubeadm(k8s.KubernetesVersion), phase)
 	cmds := []string{
 		fmt.Sprintf("%s phase certs all --config %s", baseCmd, yamlConfigPath),
@@ -386,12 +417,19 @@ func (k *Bootstrapper) RestartCluster(k8s config.KubernetesConfig) error {
 
 // waitForAPIServer waits for the apiserver to start up
 func (k *Bootstrapper) waitForAPIServer(k8s config.KubernetesConfig) error {
+	start := time.Now()
+	defer func() {
+		glog.Infof("duration metric: took %s to wait for apiserver status ...", time.Since(start))
+	}()
+
 	glog.Infof("Waiting for apiserver process ...")
 	// To give a better error message, first check for process existence via ssh
-	err := wait.PollImmediate(time.Millisecond*300, time.Minute*2, func() (bool, error) {
-		ierr := k.c.Run(`pgrep apiserver`)
+	// Needs minutes in case the image isn't cached (such as with v1.10.x)
+	err := wait.PollImmediate(time.Millisecond*300, time.Minute*3, func() (bool, error) {
+		ierr := k.c.Run(`sudo pgrep kube-apiserver`)
 		if ierr != nil {
-			return false, ierr
+			glog.Warningf("pgrep apiserver: %v", ierr)
+			return false, nil
 		}
 		return true, nil
 	})
@@ -399,13 +437,13 @@ func (k *Bootstrapper) waitForAPIServer(k8s config.KubernetesConfig) error {
 		return fmt.Errorf("apiserver process never appeared")
 	}
 
-	start := time.Now()
-	glog.Infof("Waiting for apiserver ...")
+	glog.Infof("Waiting for apiserver to port healthy status ...")
 	f := func() (bool, error) {
 		status, err := k.GetAPIServerStatus(net.ParseIP(k8s.NodeIP), k8s.NodePort)
 		glog.Infof("apiserver status: %s, err: %v", status, err)
 		if err != nil {
-			return false, err
+			glog.Warningf("status: %v", err)
+			return false, nil
 		}
 		if status != "Running" {
 			return false, nil
@@ -413,7 +451,6 @@ func (k *Bootstrapper) waitForAPIServer(k8s config.KubernetesConfig) error {
 		return true, nil
 	}
 	err = wait.PollImmediate(kconst.APICallRetryInterval, kconst.DefaultControlPlaneTimeout, f)
-	glog.Infof("duration metric: took %s to wait for apiserver status ...", time.Since(start))
 	return err
 }
 
@@ -619,7 +656,7 @@ func generateConfig(k8s config.KubernetesConfig, r cruntime.Manager) ([]byte, er
 		AdvertiseAddress:  k8s.NodeIP,
 		APIServerPort:     nodePort,
 		KubernetesVersion: k8s.KubernetesVersion,
-		EtcdDataDir:       filepath.Join(constants.GuestPersistentDir, "etcd"),
+		EtcdDataDir:       etcdDataDir(),
 		NodeName:          k8s.NodeName,
 		CRISocket:         r.SocketPath(),
 		ImageRepository:   k8s.ImageRepository,

From 45c3219470299d0a77f56c0d31f169015df89814 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Wed, 21 Aug 2019 17:24:41 -0700
Subject: [PATCH 29/40] none reliability: --force does not work in v1.10, allow
 failed kubelet

---
 pkg/drivers/none/none.go                     | 4 ++--
 pkg/minikube/bootstrapper/kubeadm/kubeadm.go | 8 ++++++++
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/pkg/drivers/none/none.go b/pkg/drivers/none/none.go
index 18e48fcbbf..5731d22841 100644
--- a/pkg/drivers/none/none.go
+++ b/pkg/drivers/none/none.go
@@ -233,8 +233,8 @@ func stopKubelet(exec command.Runner) error {
 		if errStatus != nil {
 			glog.Errorf("temporary error: for %q : %v", cmdCheck, errStatus)
 		}
-		if !strings.Contains(out.String(), "dead") {
-			return fmt.Errorf("expected to kubelet to be dead but it got : %q", out)
+		if !strings.Contains(out.String(), "dead") && !strings.Contains(out.String(), "failed") {
+			return fmt.Errorf("unexpected kubelet state: %q", out)
 		}
 		return nil
 	}
diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
index a089e7c3fb..e061151022 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go
@@ -456,7 +456,15 @@ func (k *Bootstrapper) waitForAPIServer(k8s config.KubernetesConfig) error {
 
 // DeleteCluster removes the components that were started earlier
 func (k *Bootstrapper) DeleteCluster(k8s config.KubernetesConfig) error {
+	version, err := parseKubernetesVersion(k8s.KubernetesVersion)
+	if err != nil {
+		return errors.Wrap(err, "parsing kubernetes version")
+	}
+
 	cmd := fmt.Sprintf("%s reset --force", invokeKubeadm(k8s.KubernetesVersion))
+	if version.LT(semver.MustParse("1.11.0")) {
+		cmd = fmt.Sprintf("%s reset", invokeKubeadm(k8s.KubernetesVersion))
+	}
 	out, err := k.c.CombinedOutput(cmd)
 	if err != nil {
 		return errors.Wrapf(err, "kubeadm reset: %s\n%s\n", cmd, out)

From 4e9d4bd00f7044573d8d36c60c46f4269ff3a806 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Wed, 21 Aug 2019 17:41:58 -0700
Subject: [PATCH 30/40] Remove unused constant function brought in by a bad
 merge

---
 pkg/minikube/constants/constants.go | 21 ---------------------
 1 file changed, 21 deletions(-)

diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go
index 118a1eb1f5..82ae03a61f 100644
--- a/pkg/minikube/constants/constants.go
+++ b/pkg/minikube/constants/constants.go
@@ -186,30 +186,9 @@ var NewestKubernetesVersion = "v1.15.2"
 // OldestKubernetesVersion is the oldest Kubernetes version to test against
 var OldestKubernetesVersion = "v1.10.13"
 
-// ConfigFilePath is the path of the config directory
-var ConfigFilePath = MakeMiniPath("config")
-
 // ConfigFile is the path of the config file
 var ConfigFile = MakeMiniPath("config", "config.json")
 
-// GetProfileFile returns the Minikube profile config file
-func GetProfileFile(profile string, miniHome ...string) string {
-	miniPath := GetMinipath()
-	if len(miniHome) > 0 {
-		miniPath = miniHome[0]
-	}
-	return filepath.Join(miniPath, "profiles", profile, "config.json")
-}
-
-// GetProfilePath returns the Minikube profile path of config file
-func GetProfilePath(profile string, miniHome ...string) string {
-	miniPath := GetMinipath()
-	if len(miniHome) > 0 {
-		miniPath = miniHome[0]
-	}
-	return filepath.Join(miniPath, "profiles", profile)
-}
-
 const (
 	// KubeletServiceFile is the path to the kubelet systemd service
 	KubeletServiceFile = "/lib/systemd/system/kubelet.service"

From 6abf0ed2d57a257cb63103ac416d04d1ca6962f3 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 17:58:25 -0700
Subject: [PATCH 31/40] fix not to fail logic

---
 test/integration/util/minikube_runner.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/integration/util/minikube_runner.go b/test/integration/util/minikube_runner.go
index 7e03387159..0513e28e0c 100644
--- a/test/integration/util/minikube_runner.go
+++ b/test/integration/util/minikube_runner.go
@@ -126,7 +126,7 @@ func (m *MinikubeRunner) RunCommand(cmdStr string, failError bool, waitForRun ..
 		if failError {
 			m.T.Fatalf(errMsg)
 		} else {
-			m.T.Errorf(errMsg)
+			m.T.Logf(errMsg)
 		}
 	}
 	return stdout, stderr, err

From 7c9c4ac0f950def8ee4d4a04a369661b081478c5 Mon Sep 17 00:00:00 2001
From: Medya Gh <medya@google.com>
Date: Wed, 21 Aug 2019 18:00:30 -0700
Subject: [PATCH 32/40] add quote for log

---
 test/integration/config_test.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/test/integration/config_test.go b/test/integration/config_test.go
index 2eafa40877..0b2cff3117 100644
--- a/test/integration/config_test.go
+++ b/test/integration/config_test.go
@@ -70,10 +70,10 @@ func TestConfig(t *testing.T) {
 			t.Logf("error running config test command (might be okay): %v ", err)
 		}
 		if !compare(tc.stdout, stdout) {
-			t.Fatalf("Expected stdout to be: %s. Stdout was: %s Stderr: %s", tc.stdout, stdout, stderr)
+			t.Fatalf("Expected stdout to be: %q. Stdout was: %q Stderr: %q", tc.stdout, stdout, stderr)
 		}
 		if !compare(tc.stderr, stderr) {
-			t.Fatalf("Expected stderr to be: %s. Stdout was: %s Stderr: %s", tc.stderr, stdout, stderr)
+			t.Fatalf("Expected stderr to be: %q. Stdout was: %s Stderr: %q", tc.stderr, stdout, stderr)
 		}
 	}
 }

From a7af253eaae8c484fd8a5a8f13db88d56e53eb8c Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Wed, 21 Aug 2019 18:49:25 -0700
Subject: [PATCH 33/40] Merge in v1.16 test updates

---
 pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go             | 2 +-
 .../kubeadm/testdata/v1.16/containerd-api-port.yaml           | 4 ++--
 .../kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml   | 4 ++--
 .../bootstrapper/kubeadm/testdata/v1.16/containerd.yaml       | 4 ++--
 .../kubeadm/testdata/v1.16/crio-options-gates.yaml            | 4 ++--
 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml    | 4 ++--
 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml | 4 ++--
 .../bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml | 4 ++--
 pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml | 4 ++--
 9 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go
index 2ae3fe2e4a..d22f89cdb0 100644
--- a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go
+++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go
@@ -66,7 +66,7 @@ Wants=crio.service
 
 [Service]
 ExecStart=
-ExecStart=/var/lib/minikube/binaries/v1.15.2/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock --fail-swap-on=false --hostname-override=minikube --image-service-endpoint=/var/run/crio/crio.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --runtime-request-timeout=15m
+ExecStart=/var/lib/minikube/binaries/v1.16.0-beta.1/kubelet --authorization-mode=Webhook --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --cgroup-driver=cgroupfs --client-ca-file=/var/lib/minikube/certs/ca.crt --cluster-dns=10.96.0.10 --cluster-domain=cluster.local --container-runtime=remote --container-runtime-endpoint=/var/run/crio/crio.sock --fail-swap-on=false --hostname-override=minikube --image-service-endpoint=/var/run/crio/crio.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --runtime-request-timeout=15m
 
 [Install]
 `,
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
index 7d0e44e47c..d7e9c9e975 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-api-port.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:12345
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
index 428bbfc3e3..d4de91b7eb 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd-pod-network-cidr.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
index 428bbfc3e3..d4de91b7eb 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/containerd.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
index dc661e66ed..5aa8ca8652 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio-options-gates.yaml
@@ -30,14 +30,14 @@ scheduler:
   extraArgs:
     feature-gates: "a=b"
     scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
index 6fa2106724..57ac32b75e 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/crio.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
index 74f7c79b92..4e1949e0f2 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/default.yaml
@@ -20,14 +20,14 @@ kind: ClusterConfiguration
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
index caa1b2b456..f1b08545b9 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/image-repository.yaml
@@ -21,14 +21,14 @@ imageRepository: test/repo
 apiServer:
   extraArgs:
     enable-admission-plugins: "NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local
diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
index 348b4ab8c4..6c02b9c29e 100644
--- a/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
+++ b/pkg/minikube/bootstrapper/kubeadm/testdata/v1.16/options.yaml
@@ -27,14 +27,14 @@ controllerManager:
 scheduler:
   extraArgs:
     scheduler-name: "mini-scheduler"
-certificatesDir: /var/lib/minikube/certs/
+certificatesDir: /var/lib/minikube/certs
 clusterName: kubernetes
 controlPlaneEndpoint: localhost:8443
 dns:
   type: CoreDNS
 etcd:
   local:
-    dataDir: /data/minikube
+    dataDir: /var/lib/minikube/etcd
 kubernetesVersion: v1.16.0
 networking:
   dnsDomain: cluster.local

From 206522dee831fb391935f83fd69d897dd4ec9b5c Mon Sep 17 00:00:00 2001
From: Guangming Wang <guangming.wang@daocloud.io>
Date: Thu, 22 Aug 2019 22:54:23 +0800
Subject: [PATCH 34/40] Cleanup: fix some typos in code comment

Signed-off-by: Guangming Wang <guangming.wang@daocloud.io>
---
 pkg/minikube/command/ssh_runner.go        | 2 +-
 pkg/minikube/extract/extract.go           | 2 +-
 pkg/minikube/storageclass/storageclass.go | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/pkg/minikube/command/ssh_runner.go b/pkg/minikube/command/ssh_runner.go
index ad94c2036f..77f580418e 100644
--- a/pkg/minikube/command/ssh_runner.go
+++ b/pkg/minikube/command/ssh_runner.go
@@ -164,7 +164,7 @@ func (s *SSHRunner) Copy(f assets.CopyableFile) error {
 		return errors.Wrap(err, "StdinPipe")
 	}
 	// The scpcmd below *should not* return until all data is copied and the
-	// StdinPipe is closed. But let's use errgroup to make it expicit.
+	// StdinPipe is closed. But let's use errgroup to make it explicit.
 	var g errgroup.Group
 	var copied int64
 	dst := filepath.Join(path.Join(f.GetTargetDir(), f.GetTargetName()))
diff --git a/pkg/minikube/extract/extract.go b/pkg/minikube/extract/extract.go
index b7b65df0b7..b0dd931e25 100644
--- a/pkg/minikube/extract/extract.go
+++ b/pkg/minikube/extract/extract.go
@@ -281,7 +281,7 @@ func checkArguments(s *ast.CallExpr, e *state) {
 
 }
 
-// checkIdentForStringValye takes a identifier and sees if it's a variable assigned to a string
+// checkIdentForStringValue takes a identifier and sees if it's a variable assigned to a string
 func checkIdentForStringValue(i *ast.Ident) string {
 	// This identifier is nil
 	if i.Obj == nil {
diff --git a/pkg/minikube/storageclass/storageclass.go b/pkg/minikube/storageclass/storageclass.go
index bba117467d..32f52d875b 100644
--- a/pkg/minikube/storageclass/storageclass.go
+++ b/pkg/minikube/storageclass/storageclass.go
@@ -63,7 +63,7 @@ func DisableDefaultStorageClass(class string) error {
 	return nil
 }
 
-// SetDefaultStorageClass makes sure onlt the class with @name is marked as
+// SetDefaultStorageClass makes sure only the class with @name is marked as
 // default.
 func SetDefaultStorageClass(name string) error {
 	loadingRules := clientcmd.NewDefaultClientConfigLoadingRules()

From b22f59f320b1a9ec2c1d57f2ded3c88249f20dea Mon Sep 17 00:00:00 2001
From: AllenZMC <zhongming.chang@daocloud.io>
Date: Thu, 22 Aug 2019 22:54:58 +0800
Subject: [PATCH 35/40] fix mis-spelling in ssh_runner.go (#5171)

---
 pkg/minikube/command/ssh_runner.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/minikube/command/ssh_runner.go b/pkg/minikube/command/ssh_runner.go
index ad94c2036f..77f580418e 100644
--- a/pkg/minikube/command/ssh_runner.go
+++ b/pkg/minikube/command/ssh_runner.go
@@ -164,7 +164,7 @@ func (s *SSHRunner) Copy(f assets.CopyableFile) error {
 		return errors.Wrap(err, "StdinPipe")
 	}
 	// The scpcmd below *should not* return until all data is copied and the
-	// StdinPipe is closed. But let's use errgroup to make it expicit.
+	// StdinPipe is closed. But let's use errgroup to make it explicit.
 	var g errgroup.Group
 	var copied int64
 	dst := filepath.Join(path.Join(f.GetTargetDir(), f.GetTargetName()))

From 777bee6a93da28f8ac9f05390f6ba075195a8d4f Mon Sep 17 00:00:00 2001
From: Vydruth <Vydruth@users.noreply.github.com>
Date: Thu, 22 Aug 2019 10:08:27 -0700
Subject: [PATCH 36/40] Fixed grammer.

---
 site/content/en/docs/Tutorials/continuous_integration.md | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/site/content/en/docs/Tutorials/continuous_integration.md b/site/content/en/docs/Tutorials/continuous_integration.md
index eaf357a964..53ce4e46de 100644
--- a/site/content/en/docs/Tutorials/continuous_integration.md
+++ b/site/content/en/docs/Tutorials/continuous_integration.md
@@ -9,7 +9,7 @@ description: >
 
 ## Overview
 
-Most continuous integration environments are already running inside a VM, and may not supported nested virtualization. The `none` driver was designed for this use case.
+Most continuous integration environments are already running inside a VM, and may not support nested virtualization. The `none` driver was designed for this use case.
 
 ## Prerequisites
 

From 111873e0b8b321f9eaa1303c3fdfa5f17daae49d Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Thu, 22 Aug 2019 11:41:06 -0700
Subject: [PATCH 37/40] GetKubeadmCachedBinaries() is now
 constants.KubeadmBinaries

---
 test/integration/a_download_only_test.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/test/integration/a_download_only_test.go b/test/integration/a_download_only_test.go
index 4f72c557d3..d972f9352f 100644
--- a/test/integration/a_download_only_test.go
+++ b/test/integration/a_download_only_test.go
@@ -65,7 +65,7 @@ func TestDownloadOnly(t *testing.T) {
 				}
 
 				// checking binaries downloaded (kubelet,kubeadm)
-				for _, bin := range constants.GetKubeadmCachedBinaries() {
+				for _, bin := range constants.KubeadmBinaries {
 					fp := filepath.Join(minHome, "cache", v, bin)
 					_, err := os.Stat(fp)
 					if err != nil {

From 48d2ace5ccb2ecbd91362d0807ef974532cfff6d Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Thu, 22 Aug 2019 11:41:41 -0700
Subject: [PATCH 38/40] Remove broken default disk size test that didn't make
 sense

---
 pkg/drivers/hyperkit/driver_test.go | 13 -------------
 1 file changed, 13 deletions(-)

diff --git a/pkg/drivers/hyperkit/driver_test.go b/pkg/drivers/hyperkit/driver_test.go
index 63008ac396..22d4ddbd39 100644
--- a/pkg/drivers/hyperkit/driver_test.go
+++ b/pkg/drivers/hyperkit/driver_test.go
@@ -20,10 +20,6 @@ package hyperkit
 
 import (
 	"testing"
-
-	"k8s.io/minikube/pkg/minikube/constants"
-
-	commonutil "k8s.io/minikube/pkg/util"
 )
 
 func Test_portExtraction(t *testing.T) {
@@ -66,15 +62,6 @@ func Test_portExtraction(t *testing.T) {
 	}
 }
 
-func Test_defaultDiskSize(t *testing.T) {
-	expectedDefaultDiscSize := commonutil.CalculateSizeInMB(constants.DefaultDiskSize)
-	driver := NewDriver("", "")
-	got := driver.DiskSize
-	if got != expectedDefaultDiscSize {
-		t.Errorf("Unexpected default disk size got: %v, want: %v", got, expectedDefaultDiscSize)
-	}
-}
-
 func testEq(a, b []int) bool {
 
 	if a == nil && b == nil {

From a43e311783eb6c6b0263829b4c946fa43f423337 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Thu, 22 Aug 2019 12:04:19 -0700
Subject: [PATCH 39/40] Exit startup if uid=0, add --force flag to override

---
 cmd/minikube/cmd/start.go | 39 +++++++++++++++++++++++++--------------
 1 file changed, 25 insertions(+), 14 deletions(-)

diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go
index c429d1f301..f6af4b8684 100644
--- a/cmd/minikube/cmd/start.go
+++ b/cmd/minikube/cmd/start.go
@@ -102,6 +102,7 @@ const (
 	dnsProxy              = "dns-proxy"
 	hostDNSResolver       = "host-dns-resolver"
 	waitUntilHealthy      = "wait"
+	force                 = "force"
 	waitTimeout           = "wait-timeout"
 )
 
@@ -134,6 +135,8 @@ func initMinikubeFlags() {
 	viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
 	viper.AutomaticEnv()
 
+	startCmd.Flags().Bool(force, false, "Force minikube to perform possibly dangerous operations")
+
 	startCmd.Flags().Int(cpus, constants.DefaultCPUS, "Number of CPUs allocated to the minikube VM.")
 	startCmd.Flags().String(memory, constants.DefaultMemorySize, "Amount of RAM allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g).")
 	startCmd.Flags().String(humanReadableDiskSize, constants.DefaultDiskSize, "Disk size allocated to the minikube VM (format: <number>[<unit>], where unit = b, k, m or g).")
@@ -502,25 +505,33 @@ func selectImageRepository(mirrorCountry string, k8sVersion string) (bool, strin
 // validerUser validates minikube is run by the recommended user (privileged or regular)
 func validateUser() {
 	u, err := user.Current()
-	d := viper.GetString(vmDriver)
-	// Check if minikube needs to run with sudo or not.
-	if err == nil {
-		if d == constants.DriverNone && u.Name != "root" {
-			exit.UsageT(`Please run with sudo. the vm-driver "{{.driver_name}}" requires sudo.`, out.V{"driver_name": constants.DriverNone})
-		} else if u.Name == "root" && !(d == constants.DriverHyperv || d == constants.DriverNone) {
-			out.T(out.WarningType, "Please don't run minikube as root or with 'sudo' privileges. It isn't necessary with {{.driver}} driver.", out.V{"driver": d})
-		}
-
-	} else {
+	if err != nil {
 		glog.Errorf("Error getting the current user: %v", err)
+		return
 	}
 
+	d := viper.GetString(vmDriver)
+	useForce := viper.GetBool(force)
+
+	if d == constants.DriverNone && u.Uid != "0" && !useForce {
+		exit.WithCodeT(exit.Permissions, `The "{{.driver_name}}" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}'.`, out.V{"driver_name": d})
+	}
+
+	if d == constants.DriverNone || u.Uid != "0" {
+		return
+	}
+
+	if useForce {
+		out.T(out.WarningType, "Exiting, as the {{.driver_name}} driver should not be used with root privileges.", out.V{"driver_name": d})
+		return
+	}
+	exit.WithCodeT(exit.Permissions, "Exiting, as the {{.driver_name}} driver should not be used with root privileges.", out.V{"driver_name": d})
 }
 
 // validateConfig validates the supplied configuration against known bad combinations
 func validateConfig() {
 	diskSizeMB := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize))
-	if diskSizeMB < pkgutil.CalculateSizeInMB(constants.MinimumDiskSize) {
+	if diskSizeMB < pkgutil.CalculateSizeInMB(constants.MinimumDiskSize) && !viper.GetBool(force) {
 		exit.WithCodeT(exit.Config, "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}", out.V{"requested_size": diskSizeMB, "minimum_size": pkgutil.CalculateSizeInMB(constants.MinimumDiskSize)})
 	}
 
@@ -530,10 +541,10 @@ func validateConfig() {
 	}
 
 	memorySizeMB := pkgutil.CalculateSizeInMB(viper.GetString(memory))
-	if memorySizeMB < pkgutil.CalculateSizeInMB(constants.MinimumMemorySize) {
+	if memorySizeMB < pkgutil.CalculateSizeInMB(constants.MinimumMemorySize) && !viper.GetBool(force) {
 		exit.UsageT("Requested memory allocation {{.requested_size}} is less than the minimum allowed of {{.minimum_size}}", out.V{"requested_size": memorySizeMB, "minimum_size": pkgutil.CalculateSizeInMB(constants.MinimumMemorySize)})
 	}
-	if memorySizeMB < pkgutil.CalculateSizeInMB(constants.DefaultMemorySize) {
+	if memorySizeMB < pkgutil.CalculateSizeInMB(constants.DefaultMemorySize) && !viper.GetBool(force) {
 		out.T(out.Notice, "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.",
 			out.V{"memory": memorySizeMB, "default_memorysize": pkgutil.CalculateSizeInMB(constants.DefaultMemorySize)})
 	}
@@ -956,7 +967,7 @@ func validateDriverVersion(vmDriver string) {
 	v := extractVMDriverVersion(string(output))
 
 	// if the driver doesn't have return any version, it is really old, we force a upgrade.
-	if len(v) == 0 {
+	if len(v) == 0 && !viper.GetBool(force) {
 		exit.WithCodeT(
 			exit.Failure,
 			"Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}",

From c2c2d91453fbd13ada62e3abdfb317994277dd12 Mon Sep 17 00:00:00 2001
From: Thomas Stromberg <tstromberg@google.com>
Date: Thu, 22 Aug 2019 14:24:59 -0700
Subject: [PATCH 40/40] Add assistance if the user has a root owned config

---
 cmd/minikube/cmd/start.go | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go
index f6af4b8684..772c3e843f 100644
--- a/cmd/minikube/cmd/start.go
+++ b/cmd/minikube/cmd/start.go
@@ -502,6 +502,14 @@ func selectImageRepository(mirrorCountry string, k8sVersion string) (bool, strin
 	return false, fallback, nil
 }
 
+// Return a minikube command containing the current profile name
+func minikubeCmd() string {
+	if viper.GetString(cfg.MachineProfile) != constants.DefaultMachineName {
+		return fmt.Sprintf("minikube -p %s", cfg.MachineProfile)
+	}
+	return "minikube"
+}
+
 // validerUser validates minikube is run by the recommended user (privileged or regular)
 func validateUser() {
 	u, err := user.Current()
@@ -521,11 +529,15 @@ func validateUser() {
 		return
 	}
 
-	if useForce {
-		out.T(out.WarningType, "Exiting, as the {{.driver_name}} driver should not be used with root privileges.", out.V{"driver_name": d})
-		return
+	out.T(out.Stopped, "The {{.driver_name}} driver should not be used with root privileges.", out.V{"driver_name": d})
+
+	_, err = cfg.Load()
+	if err == nil || !os.IsNotExist(err) {
+		out.T(out.Tip, "Tip: To remove this root owned cluster, run: sudo {{.cmd}} delete", out.V{"cmd": minikubeCmd()})
+	}
+	if !useForce {
+		exit.WithCodeT(exit.Permissions, "Exiting")
 	}
-	exit.WithCodeT(exit.Permissions, "Exiting, as the {{.driver_name}} driver should not be used with root privileges.", out.V{"driver_name": d})
 }
 
 // validateConfig validates the supplied configuration against known bad combinations