diff --git a/Gopkg.lock b/Gopkg.lock index 5bc2516ee7..3e13432fd5 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -505,6 +505,14 @@ pruneopts = "NUT" revision = "4d0e916071f68db74f8a73926335f809396d6b42" +[[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" + name = "github.com/pmezard/go-difflib" + packages = ["difflib"] + pruneopts = "NUT" + revision = "792786c7400a136282c1664665ae0a8db921c6c2" + version = "v1.0.0" + [[projects]] branch = "master" digest = "1:1b6f62a965e4b2e004184bf2d38ef2915af240befa4d44e5f0e83925bcf89727" @@ -1008,6 +1016,7 @@ "github.com/pkg/browser", "github.com/pkg/errors", "github.com/pkg/profile", + "github.com/pmezard/go-difflib/difflib", "github.com/r2d4/external-storage/lib/controller", "github.com/sirupsen/logrus", "github.com/spf13/cobra", diff --git a/cmd/minikube/cmd/mount.go b/cmd/minikube/cmd/mount.go index 4260178135..36c7071837 100644 --- a/cmd/minikube/cmd/mount.go +++ b/cmd/minikube/cmd/mount.go @@ -45,8 +45,8 @@ var mountIP string var mountVersion string var mountType string var isKill bool -var uid int -var gid int +var uid string +var gid string var mSize int var options []string var mode uint @@ -98,6 +98,7 @@ var mountCmd = &cobra.Command{ } defer api.Close() host, err := api.Load(config.GetMachineName()) + if err != nil { exit.WithError("Error loading api", err) } @@ -144,8 +145,8 @@ var mountCmd = &cobra.Command{ console.OutStyle("mounting", "Mounting host path %s into VM as %s ...", hostPath, vmPath) console.OutStyle("mount-options", "Mount options:") console.OutStyle("option", "Type: %s", cfg.Type) - console.OutStyle("option", "UID: %d", cfg.UID) - console.OutStyle("option", "GID: %d", cfg.GID) + console.OutStyle("option", "UID: %s", cfg.UID) + console.OutStyle("option", "GID: %s", cfg.GID) console.OutStyle("option", "Version: %s", cfg.Version) console.OutStyle("option", "MSize: %d", cfg.MSize) console.OutStyle("option", "Mode: %o (%s)", cfg.Mode, cfg.Mode) @@ -163,22 +164,32 @@ var mountCmd = &cobra.Command{ go func() { console.OutStyle("fileserver", "Userspace file server: ") ufs.StartServer(net.JoinHostPort(ip.String(), strconv.Itoa(port)), debugVal, hostPath) + console.OutStyle("stopped", "Userspace file server is shutdown") wg.Done() }() } + // Use CommandRunner, as the native docker ssh service dies when Ctrl-C is received. + runner, err := machine.CommandRunner(host) + if err != nil { + exit.WithError("Failed to get command runner", err) + } + // Unmount if Ctrl-C or kill request is received. c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt, syscall.SIGTERM) go func() { for sig := range c { console.OutStyle("unmount", "Unmounting %s ...", vmPath) - cluster.Unmount(host, vmPath) + err := cluster.Unmount(runner, vmPath) + if err != nil { + console.ErrStyle("failure", "Failed unmount: %v", err) + } exit.WithCode(exit.Interrupted, "Exiting due to %s signal", sig) } }() - err = cluster.Mount(host, ip.String(), vmPath, cfg) + err = cluster.Mount(runner, ip.String(), vmPath, cfg) if err != nil { exit.WithError("mount failed", err) } @@ -194,8 +205,8 @@ func init() { mountCmd.Flags().StringVar(&mountType, "type", nineP, "Specify the mount filesystem type (supported types: 9p)") mountCmd.Flags().StringVar(&mountVersion, "9p-version", constants.DefaultMountVersion, "Specify the 9p version that the mount should use") mountCmd.Flags().BoolVar(&isKill, "kill", false, "Kill the mount process spawned by minikube start") - mountCmd.Flags().IntVar(&uid, "uid", 1001, "Default user id used for the mount") - mountCmd.Flags().IntVar(&gid, "gid", 1001, "Default group id used for the mount") + mountCmd.Flags().StringVar(&uid, "uid", "docker", "Default user id used for the mount") + mountCmd.Flags().StringVar(&gid, "gid", "docker", "Default group id used for the mount") mountCmd.Flags().UintVar(&mode, "mode", 0755, "File permissions used for the mount") mountCmd.Flags().StringSliceVar(&options, "options", []string{}, "Additional mount options, such as cache=fscache") mountCmd.Flags().IntVar(&mSize, "msize", constants.DefaultMsize, "The number of bytes to use for 9p packet payload") diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go index c3f7ebce9c..a43fe782c5 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm_test.go @@ -17,458 +17,209 @@ limitations under the License. package kubeadm import ( - "strings" + "fmt" + "io/ioutil" "testing" - "github.com/google/go-cmp/cmp" + "github.com/pmezard/go-difflib/difflib" "k8s.io/minikube/pkg/minikube/config" + "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/cruntime" "k8s.io/minikube/pkg/util" ) +const ( + newMajor = "v1.14.0" + recentMajor = "v1.13.0" + oldMajor = "v1.12.0" + obsoleteMajor = "v1.10.0" +) + func TestGenerateKubeletConfig(t *testing.T) { tests := []struct { description string cfg config.KubernetesConfig - expectedCfg string + expected string shouldErr bool }{ { description: "docker runtime", cfg: config.KubernetesConfig{ NodeIP: "192.168.1.100", - KubernetesVersion: "v1.1.0", + KubernetesVersion: recentMajor, NodeName: "minikube", ContainerRuntime: "docker", }, - expectedCfg: ` + 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 --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --require-kubeconfig=true +ExecStart=/usr/bin/kubelet --allow-privileged=true --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-manifest-path=/etc/kubernetes/manifests [Install] `, }, { - description: "cri runtime", + description: "newest cri runtime", cfg: config.KubernetesConfig{ NodeIP: "192.168.1.100", - KubernetesVersion: "v1.1.0", + KubernetesVersion: constants.NewestKubernetesVersion, NodeName: "minikube", ContainerRuntime: "cri-o", }, - expectedCfg: ` + expected: ` [Unit] Wants=crio.service [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=remote --container-runtime-endpoint=/var/run/crio/crio.sock --hostname-override=minikube --image-service-endpoint=/var/run/crio/crio.sock --kubeconfig=/etc/kubernetes/kubelet.conf --pod-manifest-path=/etc/kubernetes/manifests --require-kubeconfig=true --runtime-request-timeout=15m +ExecStart=/usr/bin/kubelet --allow-privileged=true --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] `, }, { - description: "docker runtime with custom image repository", + description: "docker with custom image repository", cfg: config.KubernetesConfig{ NodeIP: "192.168.1.100", - KubernetesVersion: "v1.1.0", + KubernetesVersion: constants.DefaultKubernetesVersion, NodeName: "minikube", ContainerRuntime: "docker", ImageRepository: "docker-proxy-image.io/google_containers", }, - expectedCfg: ` + 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 --hostname-override=minikube --kubeconfig=/etc/kubernetes/kubelet.conf --pod-infra-container-image=docker-proxy-image.io/google_containers/pause:3.0 --pod-manifest-path=/etc/kubernetes/manifests --require-kubeconfig=true +ExecStart=/usr/bin/kubelet --allow-privileged=true --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] `, }, } - for _, test := range tests { - t.Run(test.description, func(t *testing.T) { - runtime, err := cruntime.New(cruntime.Config{Type: test.cfg.ContainerRuntime}) + for _, tc := range tests { + t.Run(tc.description, func(t *testing.T) { + runtime, err := cruntime.New(cruntime.Config{Type: tc.cfg.ContainerRuntime}) if err != nil { t.Fatalf("runtime: %v", err) } - actualCfg, err := NewKubeletConfig(test.cfg, runtime) - if err != nil && !test.shouldErr { + got, err := NewKubeletConfig(tc.cfg, runtime) + if err != nil && !tc.shouldErr { t.Errorf("got unexpected error generating config: %v", err) return } - if err == nil && test.shouldErr { - t.Errorf("expected error but got none, config: %s", actualCfg) + if err == nil && tc.shouldErr { + t.Errorf("expected error but got none, config: %s", got) return } - if diff := cmp.Diff(test.expectedCfg, actualCfg); diff != "" { - t.Errorf("actual config does not match expected. (-want +got)\n%s", diff) + + diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(tc.expected), + B: difflib.SplitLines(got), + FromFile: "Expected", + ToFile: "Got", + Context: 1, + }) + if err != nil { + t.Fatalf("diff error: %v", err) + } + if diff != "" { + t.Errorf("unexpected diff:\n%s", diff) } }) } } func TestGenerateConfig(t *testing.T) { - tests := []struct { - description string - cfg config.KubernetesConfig - expectedCfg string - shouldErr bool - }{ - { - description: "no extra args", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.100", - KubernetesVersion: "v1.10.0", - NodeName: "minikube", - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.100 - 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: minikube -apiServerExtraArgs: - admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" -`, + extraOpts := util.ExtraOptionSlice{ + util.ExtraOption{ + Component: Apiserver, + Key: "fail-no-swap", + Value: "true", }, - { - description: "extra args all components", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.101", - KubernetesVersion: "v1.10.0-alpha.0", - NodeName: "extra-args-minikube", - ExtraOptions: util.ExtraOptionSlice{ - util.ExtraOption{ - Component: Apiserver, - Key: "fail-no-swap", - Value: "true", - }, - util.ExtraOption{ - Component: ControllerManager, - Key: "kube-api-burst", - Value: "32", - }, - util.ExtraOption{ - Component: Scheduler, - Key: "scheduler-name", - Value: "mini-scheduler", - }, - }, - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.101 - bindPort: 8443 - controlPlaneEndpoint: localhost -kubernetesVersion: v1.10.0-alpha.0 -certificatesDir: /var/lib/minikube/certs/ -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /data/minikube -nodeName: extra-args-minikube -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" -`, + util.ExtraOption{ + Component: ControllerManager, + Key: "kube-api-burst", + Value: "32", }, - { - description: "extra args, v1.14.0", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.101", - KubernetesVersion: "v1.14.0-beta1", - NodeName: "extra-args-minikube-114", - ExtraOptions: util.ExtraOptionSlice{ - util.ExtraOption{ - Component: Apiserver, - Key: "fail-no-swap", - Value: "true", - }, - util.ExtraOption{ - Component: ControllerManager, - Key: "kube-api-burst", - Value: "32", - }, - }, - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1beta1 -kind: InitConfiguration -localAPIEndpoint: - advertiseAddress: 192.168.1.101 - bindPort: 8443 -bootstrapTokens: -- groups: - - system:bootstrappers:kubeadm:default-node-token - ttl: 24h0m0s - usages: - - signing - - authentication -nodeRegistration: - criSocket: /var/run/dockershim.sock - name: extra-args-minikube-114 - 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" -certificatesDir: /var/lib/minikube/certs/ -clusterName: kubernetes -controlPlaneEndpoint: localhost:8443 -dns: - type: CoreDNS -etcd: - local: - dataDir: /data/minikube -kubernetesVersion: v1.14.0-beta1 -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%" -`, - }, { - description: "two extra args for one component", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.101", - KubernetesVersion: "v1.10.0-alpha.0", - NodeName: "extra-args-minikube", - ExtraOptions: util.ExtraOptionSlice{ - util.ExtraOption{ - Component: Apiserver, - Key: "fail-no-swap", - Value: "true", - }, - util.ExtraOption{ - Component: Apiserver, - Key: "kube-api-burst", - Value: "32", - }, - }, - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.101 - bindPort: 8443 - controlPlaneEndpoint: localhost -kubernetesVersion: v1.10.0-alpha.0 -certificatesDir: /var/lib/minikube/certs/ -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /data/minikube -nodeName: extra-args-minikube -apiServerExtraArgs: - admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" - fail-no-swap: "true" - kube-api-burst: "32" -`, - }, - { - description: "enable feature gates", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.101", - KubernetesVersion: "v1.10.0-alpha.0", - NodeName: "extra-args-minikube", - FeatureGates: "HugePages=true,OtherFeature=false", - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.101 - bindPort: 8443 - controlPlaneEndpoint: localhost -kubernetesVersion: v1.10.0-alpha.0 -certificatesDir: /var/lib/minikube/certs/ -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /data/minikube -nodeName: extra-args-minikube -apiServerExtraArgs: - admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" - feature-gates: "HugePages=true,OtherFeature=false" -controllerManagerExtraArgs: - feature-gates: "HugePages=true,OtherFeature=false" -kubeadmExtraArgs: - feature-gates: "HugePages=true,OtherFeature=false" -schedulerExtraArgs: - feature-gates: "HugePages=true,OtherFeature=false" -`, - }, - { - description: "enable feature gates and extra config", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.101", - KubernetesVersion: "v1.10.0-alpha.0", - NodeName: "extra-args-minikube", - FeatureGates: "HugePages=true,OtherFeature=false", - ExtraOptions: util.ExtraOptionSlice{ - util.ExtraOption{ - Component: Apiserver, - Key: "fail-no-swap", - Value: "true", - }, - }, - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.101 - bindPort: 8443 - controlPlaneEndpoint: localhost -kubernetesVersion: v1.10.0-alpha.0 -certificatesDir: /var/lib/minikube/certs/ -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /data/minikube -nodeName: extra-args-minikube -apiServerExtraArgs: - admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" - fail-no-swap: "true" - feature-gates: "HugePages=true,OtherFeature=false" -controllerManagerExtraArgs: - feature-gates: "HugePages=true,OtherFeature=false" -kubeadmExtraArgs: - feature-gates: "HugePages=true,OtherFeature=false" -schedulerExtraArgs: - feature-gates: "HugePages=true,OtherFeature=false" -`, - }, - { - // Unknown components should fail silently - description: "unknown component", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.101", - KubernetesVersion: "v1.8.0-alpha.0", - NodeName: "extra-args-minikube", - ExtraOptions: util.ExtraOptionSlice{ - util.ExtraOption{ - Component: "not-a-real-component", - Key: "killswitch", - Value: "true", - }, - }, - }, - shouldErr: true, - }, - { - description: "custom api server port", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.100", - NodePort: 18443, - KubernetesVersion: "v1.10.0", - NodeName: "minikube", - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.100 - bindPort: 18443 - controlPlaneEndpoint: localhost -kubernetesVersion: v1.10.0 -certificatesDir: /var/lib/minikube/certs/ -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /data/minikube -nodeName: minikube -apiServerExtraArgs: - admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" -`, - }, - { - description: "custom image repository", - cfg: config.KubernetesConfig{ - NodeIP: "192.168.1.100", - KubernetesVersion: "v1.10.0", - NodeName: "minikube", - ImageRepository: "docker-proxy-image.io/google_containers", - }, - expectedCfg: `apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 192.168.1.100 - 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: minikube -imageRepository: docker-proxy-image.io/google_containers -apiServerExtraArgs: - admission-control: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" -`, + util.ExtraOption{ + Component: Scheduler, + Key: "scheduler-name", + Value: "mini-scheduler", }, } - for _, test := range tests { - runtime, err := cruntime.New(cruntime.Config{Type: "docker"}) - if err != nil { - t.Fatalf("runtime: %v", err) + // Test version policy: Last 4 major releases (slightly looser than our general policy) + versions := map[string]string{ + "default": constants.DefaultKubernetesVersion, + "new": newMajor, + "recent": recentMajor, + "old": oldMajor, + "obsolete": obsoleteMajor, + } + + tests := []struct { + name string + runtime string + shouldErr bool + cfg config.KubernetesConfig + }{ + {"default", "docker", false, config.KubernetesConfig{}}, + {"containerd", "containerd", false, config.KubernetesConfig{}}, + {"crio", "crio", false, config.KubernetesConfig{}}, + {"options", "docker", false, config.KubernetesConfig{ExtraOptions: extraOpts}}, + {"crio-options-gates", "crio", false, config.KubernetesConfig{ExtraOptions: extraOpts, FeatureGates: "a=b"}}, + {"unknown-omponent", "docker", true, config.KubernetesConfig{ExtraOptions: util.ExtraOptionSlice{util.ExtraOption{Component: "not-a-real-component", Key: "killswitch", Value: "true"}}}}, + {"containerd-api-port", "containerd", false, config.KubernetesConfig{NodePort: 12345}}, + {"image-repository", "docker", false, config.KubernetesConfig{ImageRepository: "test/repo"}}, + } + for vname, version := range versions { + for _, tc := range tests { + runtime, err := cruntime.New(cruntime.Config{Type: tc.runtime}) + if err != nil { + t.Fatalf("runtime: %v", err) + } + tname := tc.name + "__" + vname + t.Run(tname, func(t *testing.T) { + cfg := tc.cfg + cfg.NodeIP = "1.1.1.1" + cfg.NodeName = "mk" + cfg.KubernetesVersion = version + + got, err := generateConfig(cfg, runtime) + if err != nil && !tc.shouldErr { + t.Fatalf("got unexpected error generating config: %v", err) + } + if err == nil && tc.shouldErr { + t.Fatalf("expected error but got none, config: %s", got) + } + if tc.shouldErr { + return + } + expected, err := ioutil.ReadFile(fmt.Sprintf("testdata/%s.yaml", tname)) + if err != nil { + t.Fatalf("unable to read testdata: %v", err) + } + diff, err := difflib.GetUnifiedDiffString(difflib.UnifiedDiff{ + A: difflib.SplitLines(string(expected)), + B: difflib.SplitLines(got), + FromFile: "Expected", + ToFile: "Got", + Context: 1, + }) + if err != nil { + t.Fatalf("diff error: %v", err) + } + if diff != "" { + t.Errorf("unexpected diff:\n%s\n===== [RAW OUTPUT] =====\n%s", diff, got) + } + }) } - - t.Run(test.description, func(t *testing.T) { - gotCfg, err := generateConfig(test.cfg, runtime) - if err != nil && !test.shouldErr { - t.Errorf("got unexpected error generating config: %v", err) - return - } - if err == nil && test.shouldErr { - t.Errorf("expected error but got none, config: %s", gotCfg) - return - } - - // cmp.Diff doesn't present diffs of multi-line text well - gotSplit := strings.Split(gotCfg, "\n") - wantSplit := strings.Split(test.expectedCfg, "\n") - if diff := cmp.Diff(gotSplit, wantSplit); diff != "" { - t.Errorf("unexpected diff: (-want +got)\n%s\ngot: %s\n", diff, gotCfg) - } - }) } } diff --git a/pkg/minikube/bootstrapper/kubeadm/templates.go b/pkg/minikube/bootstrapper/kubeadm/templates.go index 7df240f120..e5a63efc44 100644 --- a/pkg/minikube/bootstrapper/kubeadm/templates.go +++ b/pkg/minikube/bootstrapper/kubeadm/templates.go @@ -56,12 +56,12 @@ apiEndpoint: advertiseAddress: {{.AdvertiseAddress}} bindPort: {{.APIServerPort}} bootstrapTokens: -- groups: - - system:bootstrappers:kubeadm:default-node-token - ttl: 24h0m0s - usages: - - signing - - authentication + - groups: + - system:bootstrappers:kubeadm:default-node-token + ttl: 24h0m0s + usages: + - signing + - authentication nodeRegistration: criSocket: {{if .CRISocket}}{{.CRISocket}}{{else}}/var/run/dockershim.sock{{end}} name: {{.NodeName}} @@ -72,9 +72,10 @@ kind: ClusterConfiguration {{if .ImageRepository}}imageRepository: {{.ImageRepository}} {{end}}{{range .ExtraArgs}}{{.Component}}ExtraArgs:{{range $i, $val := printMapInOrder .Options ": " }} {{$val}}{{end}} -{{end}}{{if .FeatureArgs}}featureGates: {{range $i, $val := .FeatureArgs}} +{{end -}} +{{if .FeatureArgs}}featureGates: {{range $i, $val := .FeatureArgs}} {{$i}}: {{$val}}{{end}} -{{end}} +{{end -}} certificatesDir: {{.CertDir}} clusterName: kubernetes controlPlaneEndpoint: localhost:{{.APIServerPort}} @@ -104,12 +105,12 @@ localAPIEndpoint: advertiseAddress: {{.AdvertiseAddress}} bindPort: {{.APIServerPort}} bootstrapTokens: -- groups: - - system:bootstrappers:kubeadm:default-node-token - ttl: 24h0m0s - usages: - - signing - - authentication + - groups: + - system:bootstrappers:kubeadm:default-node-token + ttl: 24h0m0s + usages: + - signing + - authentication nodeRegistration: criSocket: {{if .CRISocket}}{{.CRISocket}}{{else}}/var/run/dockershim.sock{{end}} name: {{.NodeName}} @@ -117,13 +118,16 @@ nodeRegistration: --- apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration -{{if .ImageRepository}}imageRepository: {{.ImageRepository}} +{{ if .ImageRepository}}imageRepository: {{.ImageRepository}} {{end}}{{range .ExtraArgs}}{{.Component}}: extraArgs: - {{range $i, $val := printMapInOrder .Options ": " }}{{$val}}{{end}} -{{end}}{{if .FeatureArgs}}featureGates: {{range $i, $val := .FeatureArgs}} - {{$i}}: {{$val}}{{end}} +{{- range $i, $val := printMapInOrder .Options ": " }} + {{$val}} +{{- end}} {{end -}} +{{if .FeatureArgs}}featureGates: +{{range $i, $val := .FeatureArgs}}{{$i}}: {{$val}} +{{end -}}{{end -}} certificatesDir: {{.CertDir}} clusterName: kubernetes controlPlaneEndpoint: localhost:{{.APIServerPort}} diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__default.yaml new file mode 100644 index 0000000000..cc96f136ac --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__default.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/containerd-api-port__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__new.yaml new file mode 100644 index 0000000000..cc96f136ac --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__new.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/containerd-api-port__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__obsolete.yaml new file mode 100644 index 0000000000..40c91637f3 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__obsolete.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/containerd-api-port__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__old.yaml new file mode 100644 index 0000000000..7d84e36369 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__old.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/containerd-api-port__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__recent.yaml new file mode 100644 index 0000000000..e776755631 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd-api-port__recent.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/containerd__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__default.yaml new file mode 100644 index 0000000000..147a6ccbec --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__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: /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/containerd__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__new.yaml new file mode 100644 index 0000000000..147a6ccbec --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__new.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/containerd__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__obsolete.yaml new file mode 100644 index 0000000000..b2d73f912b --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__obsolete.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/containerd__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__old.yaml new file mode 100644 index 0000000000..4e4b1e4830 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__old.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/containerd__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__recent.yaml new file mode 100644 index 0000000000..a852561fbe --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/containerd__recent.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/crio-options-gates__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__default.yaml new file mode 100644 index 0000000000..b593f313d3 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__default.yaml @@ -0,0 +1,56 @@ +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" +kubeadm: + extraArgs: + feature-gates: "a=b" +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/crio-options-gates__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__new.yaml new file mode 100644 index 0000000000..b593f313d3 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__new.yaml @@ -0,0 +1,56 @@ +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" +kubeadm: + extraArgs: + feature-gates: "a=b" +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/crio-options-gates__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__obsolete.yaml new file mode 100644 index 0000000000..0635574f4c --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__obsolete.yaml @@ -0,0 +1,27 @@ +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" +kubeadmExtraArgs: + feature-gates: "a=b" +schedulerExtraArgs: + feature-gates: "a=b" + scheduler-name: "mini-scheduler" diff --git a/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__old.yaml new file mode 100644 index 0000000000..cf204e307a --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__old.yaml @@ -0,0 +1,49 @@ +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" +kubeadmExtraArgs: + feature-gates: "a=b" +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/crio-options-gates__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__recent.yaml new file mode 100644 index 0000000000..49e8c06a9f --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio-options-gates__recent.yaml @@ -0,0 +1,49 @@ +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" +kubeadmExtraArgs: + feature-gates: "a=b" +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/crio__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__default.yaml new file mode 100644 index 0000000000..66dac1c8af --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__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/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/crio__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__new.yaml new file mode 100644 index 0000000000..66dac1c8af --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__new.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/crio__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__obsolete.yaml new file mode 100644 index 0000000000..f68df3416f --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__obsolete.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/crio__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__old.yaml new file mode 100644 index 0000000000..033a7aefe2 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__old.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/crio__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__recent.yaml new file mode 100644 index 0000000000..57b9f1b122 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/crio__recent.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/default__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/default__default.yaml new file mode 100644 index 0000000000..d88c0efebf --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/default__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/default__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/default__new.yaml new file mode 100644 index 0000000000..d88c0efebf --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/default__new.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/default__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/default__obsolete.yaml new file mode 100644 index 0000000000..9f0ea00701 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/default__obsolete.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/default__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/default__old.yaml new file mode 100644 index 0000000000..d9ba1066a5 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/default__old.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/default__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/default__recent.yaml new file mode 100644 index 0000000000..db611e2263 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/default__recent.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/image-repository__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__default.yaml new file mode 100644 index 0000000000..bf53791b71 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__default.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/image-repository__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__new.yaml new file mode 100644 index 0000000000..bf53791b71 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__new.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/image-repository__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__obsolete.yaml new file mode 100644 index 0000000000..cebbc924ed --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__obsolete.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/image-repository__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__old.yaml new file mode 100644 index 0000000000..bf00349785 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__old.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/image-repository__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__recent.yaml new file mode 100644 index 0000000000..037dd6add2 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/image-repository__recent.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/options__default.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/options__default.yaml new file mode 100644 index 0000000000..a85a2447b2 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/options__default.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/options__new.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/options__new.yaml new file mode 100644 index 0000000000..a85a2447b2 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/options__new.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/options__obsolete.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/options__obsolete.yaml new file mode 100644 index 0000000000..97fcc2e56e --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/options__obsolete.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/options__old.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/options__old.yaml new file mode 100644 index 0000000000..3e9052efa8 --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/options__old.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/options__recent.yaml b/pkg/minikube/bootstrapper/kubeadm/testdata/options__recent.yaml new file mode 100644 index 0000000000..f1df66954d --- /dev/null +++ b/pkg/minikube/bootstrapper/kubeadm/testdata/options__recent.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/cluster/mount.go b/pkg/minikube/cluster/mount.go index 41181330b8..1610b214bc 100644 --- a/pkg/minikube/cluster/mount.go +++ b/pkg/minikube/cluster/mount.go @@ -23,6 +23,7 @@ import ( "strconv" "strings" + "github.com/golang/glog" "github.com/pkg/errors" ) @@ -31,9 +32,9 @@ type MountConfig struct { // Type is the filesystem type (Typically 9p) Type string // UID is the User ID which this path will be mounted as - UID int + UID string // GID is the Group ID which this path will be mounted as - GID int + GID string // Version is the 9P protocol version. Valid options: 9p2000, 9p200.u, 9p2000.L Version string // MSize is the number of bytes to use for 9p packet payload @@ -46,30 +47,59 @@ type MountConfig struct { Options map[string]string } -// hostRunner is the subset of host.Host used for mounting -type hostRunner interface { - RunSSHCommand(cmd string) (string, error) +// mountRunner is the subset of CommandRunner used for mounting +type mountRunner interface { + CombinedOutput(string) (string, error) } // Mount runs the mount command from the 9p client on the VM to the 9p server on the host -func Mount(h hostRunner, source string, target string, c *MountConfig) error { - if err := Unmount(h, target); err != nil { +func Mount(r mountRunner, source string, target string, c *MountConfig) error { + if err := Unmount(r, target); err != nil { return errors.Wrap(err, "umount") } cmd := fmt.Sprintf("sudo mkdir -m %o -p %s && %s", c.Mode, target, mntCmd(source, target, c)) - out, err := h.RunSSHCommand(cmd) + glog.Infof("Will run: %s", cmd) + out, err := r.CombinedOutput(cmd) + glog.Infof("mount err=%s, out=%s", err, out) if err != nil { return errors.Wrap(err, out) } return nil } +// returns either a raw UID number, or the subshell to resolve it. +func resolveUID(id string) string { + _, err := strconv.ParseInt(id, 10, 64) + if err == nil { + return id + } + // Preserve behavior where unset ID == 0 + if id == "" { + return "0" + } + return fmt.Sprintf(`$(id -u %s)`, id) +} + +// returns either a raw GID number, or the subshell to resolve it. +func resolveGID(id string) string { + _, err := strconv.ParseInt(id, 10, 64) + if err == nil { + return id + } + // Preserve behavior where unset ID == 0 + if id == "" { + return "0" + } + // Because `getent` isn't part of our ISO + return fmt.Sprintf(`$(grep ^%s: /etc/group | cut -d: -f3)`, id) +} + // mntCmd returns a mount command based on a config. func mntCmd(source string, target string, c *MountConfig) string { options := map[string]string{ - "dfltgid": strconv.Itoa(c.GID), - "dfltuid": strconv.Itoa(c.UID), + "dfltgid": resolveGID(c.GID), + "dfltuid": resolveUID(c.UID), } if c.Port != 0 { options["port"] = strconv.Itoa(c.Port) @@ -100,9 +130,31 @@ func mntCmd(source string, target string, c *MountConfig) string { return fmt.Sprintf("sudo mount -t %s -o %s %s %s", c.Type, strings.Join(opts, ","), source, target) } +// umountCmd returns a command for unmounting +func umountCmd(target string, force bool) string { + flag := "" + if force { + flag = "-f " + } + // grep because findmnt will also display the parent! + return fmt.Sprintf("findmnt -T %s | grep %s && sudo umount %s%s || true", target, target, flag, target) +} + // Unmount unmounts a path -func Unmount(h hostRunner, target string) error { - out, err := h.RunSSHCommand(fmt.Sprintf("findmnt -T %s && sudo umount %s || true", target, target)) +func Unmount(r mountRunner, target string) error { + cmd := umountCmd(target, false) + glog.Infof("Will run: %s", cmd) + out, err := r.CombinedOutput(cmd) + if err == nil { + return nil + } + glog.Warningf("initial unmount error: %v, out: %s", err, out) + + // Try again, using force if needed. + cmd = umountCmd(target, true) + glog.Infof("Will run: %s", cmd) + out, err = r.CombinedOutput(cmd) + glog.Infof("unmount force err=%v, out=%s", err, out) if err != nil { return errors.Wrap(err, out) } diff --git a/pkg/minikube/cluster/mount_test.go b/pkg/minikube/cluster/mount_test.go index 98f1f6ed29..01dffb087e 100644 --- a/pkg/minikube/cluster/mount_test.go +++ b/pkg/minikube/cluster/mount_test.go @@ -23,19 +23,19 @@ import ( "github.com/google/go-cmp/cmp" ) -type mockMountHost struct { +type mockMountRunner struct { cmds []string T *testing.T } -func newMockMountHost(t *testing.T) *mockMountHost { - return &mockMountHost{ +func newMockMountRunner(t *testing.T) *mockMountRunner { + return &mockMountRunner{ T: t, cmds: []string{}, } } -func (m *mockMountHost) RunSSHCommand(cmd string) (string, error) { +func (m *mockMountRunner) CombinedOutput(cmd string) (string, error) { m.cmds = append(m.cmds, cmd) return "", nil } @@ -54,20 +54,30 @@ func TestMount(t *testing.T) { target: "target", cfg: &MountConfig{Type: "9p", Mode: os.FileMode(0700)}, want: []string{ - "findmnt -T target && sudo umount target || true", + "findmnt -T target | grep target && sudo umount target || true", "sudo mkdir -m 700 -p target && sudo mount -t 9p -o dfltgid=0,dfltuid=0 src target", }, }, + { + name: "named uid", + source: "src", + target: "target", + cfg: &MountConfig{Type: "9p", Mode: os.FileMode(0700), UID: "docker", GID: "docker"}, + want: []string{ + "findmnt -T target && sudo umount target || true", + "sudo mkdir -m 700 -p target && sudo mount -t 9p -o dfltgid=$(grep ^docker: /etc/group | cut -d: -f3),dfltuid=$(id -u docker) src target", + }, + }, { name: "everything", source: "10.0.0.1", target: "/target", - cfg: &MountConfig{Type: "9p", Mode: os.FileMode(0777), UID: 82, GID: 72, Version: "9p2000.u", Options: map[string]string{ + cfg: &MountConfig{Type: "9p", Mode: os.FileMode(0777), UID: "82", GID: "72", Version: "9p2000.u", Options: map[string]string{ "noextend": "", "cache": "fscache", }}, want: []string{ - "findmnt -T /target && sudo umount /target || true", + "findmnt -T /target | grep /target && sudo umount /target || true", "sudo mkdir -m 777 -p /target && sudo mount -t 9p -o cache=fscache,dfltgid=72,dfltuid=82,noextend,version=9p2000.u 10.0.0.1 /target", }, }, @@ -79,19 +89,19 @@ func TestMount(t *testing.T) { "version": "9p2000.L", }}, want: []string{ - "findmnt -T tgt && sudo umount tgt || true", + "findmnt -T tgt | grep tgt && sudo umount tgt || true", "sudo mkdir -m 700 -p tgt && sudo mount -t 9p -o dfltgid=0,dfltuid=0,version=9p2000.L src tgt", }, }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { - h := newMockMountHost(t) - err := Mount(h, tc.source, tc.target, tc.cfg) + r := newMockMountRunner(t) + err := Mount(r, tc.source, tc.target, tc.cfg) if err != nil { t.Fatalf("Mount(%s, %s, %+v): %v", tc.source, tc.target, tc.cfg, err) } - if diff := cmp.Diff(h.cmds, tc.want); diff != "" { + if diff := cmp.Diff(r.cmds, tc.want); diff != "" { t.Errorf("command diff (-want +got): %s", diff) } }) @@ -99,14 +109,14 @@ func TestMount(t *testing.T) { } func TestUnmount(t *testing.T) { - h := newMockMountHost(t) - err := Unmount(h, "/mnt") + r := newMockMountRunner(t) + err := Unmount(r, "/mnt") if err != nil { t.Fatalf("Unmount(/mnt): %v", err) } - want := []string{"findmnt -T /mnt && sudo umount /mnt || true"} - if diff := cmp.Diff(h.cmds, want); diff != "" { + want := []string{"findmnt -T /mnt | grep /mnt && sudo umount /mnt || true"} + if diff := cmp.Diff(r.cmds, want); diff != "" { t.Errorf("command diff (-want +got): %s", diff) } } diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go index 82ab828df2..d46834fed0 100644 --- a/pkg/minikube/constants/constants.go +++ b/pkg/minikube/constants/constants.go @@ -154,7 +154,13 @@ var DefaultISOURL = fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.i var DefaultISOSHAURL = DefaultISOURL + SHASuffix // DefaultKubernetesVersion is the default kubernetes version -var DefaultKubernetesVersion = "v1.13.4" +var DefaultKubernetesVersion = "v1.14.0" + +// NewestKubernetesVersion is the newest Kubernetes version to test against +var NewestKubernetesVersion = "v1.14.0" + +// 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") diff --git a/pkg/minikube/cruntime/cruntime_test.go b/pkg/minikube/cruntime/cruntime_test.go index b7b5816b27..194c4a5b1c 100644 --- a/pkg/minikube/cruntime/cruntime_test.go +++ b/pkg/minikube/cruntime/cruntime_test.go @@ -445,9 +445,6 @@ func TestContainerFunctions(t *testing.T) { "fgh1": prefix + "coredns", "xyz2": prefix + "storage", } - if tc.runtime == "docker" { - runner.containers["zzz"] = "unrelated" - } cr, err := New(Config{Type: tc.runtime, Runner: runner}) if err != nil { t.Fatalf("New(%s): %v", tc.runtime, err) diff --git a/pkg/minikube/cruntime/docker.go b/pkg/minikube/cruntime/docker.go index e8a0a9b39b..504ca255fc 100644 --- a/pkg/minikube/cruntime/docker.go +++ b/pkg/minikube/cruntime/docker.go @@ -24,9 +24,6 @@ import ( "github.com/golang/glog" ) -// KubernetesContainerPrefix is the prefix of each kubernetes container -const KubernetesContainerPrefix = "k8s_" - // Docker contains Docker runtime state type Docker struct { Socket string @@ -99,7 +96,6 @@ func (r *Docker) KubeletOptions() map[string]string { // ListContainers returns a list of containers func (r *Docker) ListContainers(filter string) ([]string, error) { - filter = KubernetesContainerPrefix + filter content, err := r.Runner.CombinedOutput(fmt.Sprintf(`docker ps -a --filter="name=%s" --format="{{.ID}}"`, filter)) if err != nil { return nil, err diff --git a/pkg/minikube/logs/logs.go b/pkg/minikube/logs/logs.go index 83e3f5c55f..3364a23f1c 100644 --- a/pkg/minikube/logs/logs.go +++ b/pkg/minikube/logs/logs.go @@ -41,6 +41,9 @@ var importantPods = []string{ "coredns", "kube-scheduler", "kube-proxy", + "kube-addon-manager", + "kubernetes-dashboard", + "storage-provisioner", } // lookbackwardsCount is how far back to look in a log for problems. This should be large enough to diff --git a/test/integration/mount_test.go b/test/integration/mount_test.go index 08dd127a13..6e426a223f 100644 --- a/test/integration/mount_test.go +++ b/test/integration/mount_test.go @@ -56,6 +56,8 @@ func testMounting(t *testing.T) { } else { mountCmd = fmt.Sprintf("mount %s:/mount-9p", tempDir) } + + t.Logf("Starting mount: %s", mountCmd) cmd, _, _ := minikubeRunner.RunDaemon2(mountCmd) defer func() { err := cmd.Process.Kill() @@ -81,12 +83,14 @@ func testMounting(t *testing.T) { // Create the pods we need outside the main test loop. setupTest := func() error { + t.Logf("Deploying pod from: %s", podPath) if _, err := kubectlRunner.RunCommand([]string{"create", "-f", podPath}); err != nil { return err } return nil } defer func() { + t.Logf("Deleting pod from: %s", podPath) if out, err := kubectlRunner.RunCommand([]string{"delete", "-f", podPath}); err != nil { t.Logf("delete -f %s failed: %v\noutput: %s\n", podPath, err, out) } @@ -104,6 +108,7 @@ func testMounting(t *testing.T) { if err := pkgutil.WaitForPodsWithLabelRunning(client, "default", selector); err != nil { t.Fatalf("Error waiting for busybox mount pod to be up: %v", err) } + t.Logf("Pods appear to be running") mountTest := func() error { path := filepath.Join(tempDir, "frompod") @@ -161,5 +166,4 @@ func testMounting(t *testing.T) { if err := util.Retry(t, mountTest, 5*time.Second, 40); err != nil { t.Fatalf("mountTest failed with error: %v", err) } - } diff --git a/test/integration/start_stop_delete_test.go b/test/integration/start_stop_delete_test.go index d6d2ac0d0e..ec53219b6f 100644 --- a/test/integration/start_stop_delete_test.go +++ b/test/integration/start_stop_delete_test.go @@ -19,12 +19,14 @@ limitations under the License. package integration import ( + "fmt" "net" "strings" "testing" "time" "github.com/docker/machine/libmachine/state" + "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/test/integration/util" ) @@ -33,10 +35,24 @@ func TestStartStop(t *testing.T) { name string args []string }{ - {"docker+cache", []string{"--container-runtime=docker", "--cache-images"}}, - {"docker+cache+ignore_verifications", []string{"--container-runtime=docker", "--cache-images", "--extra-config", "kubeadm.ignore-preflight-errors=SystemVerification"}}, - {"containerd+cache", []string{"--container-runtime=containerd", "--docker-opt containerd=/var/run/containerd/containerd.sock", "--cache-images"}}, - {"crio+cache", []string{"--container-runtime=crio", "--cache-images"}}, + {"nocache_oldest", []string{ + "--cache-images=false", + fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion), + }}, + {"feature_gates_newest", []string{ + "--feature-gates", + "ServerSideApply=true", + fmt.Sprintf("--kubernetes-version=%s", constants.NewestKubernetesVersion), + }}, + {"containerd", []string{ + "--container-runtime=containerd", + "--docker-opt containerd=/var/run/containerd/containerd.sock", + }}, + {"crio_ignore_preflights", []string{ + "--container-runtime=crio", + "--extra-config", + "kubeadm.ignore-preflight-errors=SystemVerification", + }}, } for _, test := range tests { diff --git a/vendor/github.com/pmezard/go-difflib/LICENSE b/vendor/github.com/pmezard/go-difflib/LICENSE new file mode 100644 index 0000000000..c67dad612a --- /dev/null +++ b/vendor/github.com/pmezard/go-difflib/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2013, Patrick Mezard +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + The names of its contributors may not be used to endorse or promote +products derived from this software without specific prior written +permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/pmezard/go-difflib/difflib/difflib.go b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go new file mode 100644 index 0000000000..003e99fadb --- /dev/null +++ b/vendor/github.com/pmezard/go-difflib/difflib/difflib.go @@ -0,0 +1,772 @@ +// Package difflib is a partial port of Python difflib module. +// +// It provides tools to compare sequences of strings and generate textual diffs. +// +// The following class and functions have been ported: +// +// - SequenceMatcher +// +// - unified_diff +// +// - context_diff +// +// Getting unified diffs was the main goal of the port. Keep in mind this code +// is mostly suitable to output text differences in a human friendly way, there +// are no guarantees generated diffs are consumable by patch(1). +package difflib + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" +) + +func min(a, b int) int { + if a < b { + return a + } + return b +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} + +func calculateRatio(matches, length int) float64 { + if length > 0 { + return 2.0 * float64(matches) / float64(length) + } + return 1.0 +} + +type Match struct { + A int + B int + Size int +} + +type OpCode struct { + Tag byte + I1 int + I2 int + J1 int + J2 int +} + +// SequenceMatcher compares sequence of strings. The basic +// algorithm predates, and is a little fancier than, an algorithm +// published in the late 1980's by Ratcliff and Obershelp under the +// hyperbolic name "gestalt pattern matching". The basic idea is to find +// the longest contiguous matching subsequence that contains no "junk" +// elements (R-O doesn't address junk). The same idea is then applied +// recursively to the pieces of the sequences to the left and to the right +// of the matching subsequence. This does not yield minimal edit +// sequences, but does tend to yield matches that "look right" to people. +// +// SequenceMatcher tries to compute a "human-friendly diff" between two +// sequences. Unlike e.g. UNIX(tm) diff, the fundamental notion is the +// longest *contiguous* & junk-free matching subsequence. That's what +// catches peoples' eyes. The Windows(tm) windiff has another interesting +// notion, pairing up elements that appear uniquely in each sequence. +// That, and the method here, appear to yield more intuitive difference +// reports than does diff. This method appears to be the least vulnerable +// to synching up on blocks of "junk lines", though (like blank lines in +// ordinary text files, or maybe "
" lines in HTML files). That may be
+// because this is the only method of the 3 that has a *concept* of
+// "junk"