diff --git a/Makefile b/Makefile index bcd0b107b0..6d32f6ad87 100644 --- a/Makefile +++ b/Makefile @@ -369,7 +369,7 @@ test: $(SOURCE_GENERATED) ## Trigger minikube test .PHONY: generate-docs generate-docs: extract out/minikube ## Automatically generate commands documentation. - out/minikube generate-docs --path ./site/content/en/docs/commands/ --test-path ./site/content/en/docs/contrib/tests.en.md + out/minikube generate-docs --path ./site/content/en/docs/commands/ --test-path ./site/content/en/docs/contrib/tests.en.md --code-path ./site/content/en/docs/contrib/errorcodes.en.md .PHONY: gotest gotest: $(SOURCE_GENERATED) ## Trigger minikube test diff --git a/cmd/minikube/cmd/generate-docs.go b/cmd/minikube/cmd/generate-docs.go index 74adef5eb5..8b9a847c7b 100644 --- a/cmd/minikube/cmd/generate-docs.go +++ b/cmd/minikube/cmd/generate-docs.go @@ -29,6 +29,7 @@ import ( var docsPath string var testPath string +var codePath string // generateDocs represents the generate-docs command var generateDocs = &cobra.Command{ @@ -45,16 +46,18 @@ var generateDocs = &cobra.Command{ } // generate docs - if err := generate.Docs(RootCmd, docsPath, testPath); err != nil { + if err := generate.Docs(RootCmd, docsPath, testPath, codePath); err != nil { exit.Error(reason.InternalGenerateDocs, "Unable to generate docs", err) } out.Step(style.Documentation, "Docs have been saved at - {{.path}}", out.V{"path": docsPath}) out.Step(style.Documentation, "Test docs have been saved at - {{.path}}", out.V{"path": testPath}) + out.Step(style.Documentation, "Error code docs have been saved at - {{.path}}", out.V{"path": codePath}) }, } func init() { generateDocs.Flags().StringVar(&docsPath, "path", "", "The path on the file system where the docs in markdown need to be saved") generateDocs.Flags().StringVar(&testPath, "test-path", "", "The path on the file system where the testing docs in markdown need to be saved") + generateDocs.Flags().StringVar(&codePath, "code-path", "", "The path on the file system where the error code docs in markdown need to be saved") RootCmd.AddCommand(generateDocs) } diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 7739112a87..0fe6cc0407 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1510,5 +1510,8 @@ func exitGuestProvision(err error) { if errors.Cause(err) == oci.ErrInsufficientDockerStorage { exit.Message(reason.RsrcInsufficientDockerStorage, "preload extraction failed: \"No space left on device\"") } + if errors.Cause(err) == oci.ErrGetSSHPortContainerNotRunning { + exit.Message(reason.GuestProvisionContainerExited, "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.") + } exit.Error(reason.GuestProvision, "error provisioning host", err) } diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index 4bed46dc26..770d605cca 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -147,7 +147,7 @@ func initMinikubeFlags() { startCmd.Flags().String(containerRuntime, constants.DefaultContainerRuntime, fmt.Sprintf("The container runtime to be used (%s).", strings.Join(cruntime.ValidRuntimes(), ", "))) startCmd.Flags().Bool(createMount, false, "This will start the mount daemon and automatically mount files into minikube.") startCmd.Flags().String(mountString, constants.DefaultMountDir+":/minikube-host", "The argument to pass the minikube mount command on start.") - startCmd.Flags().StringSliceVar(&config.AddonList, "addons", nil, "Enable addons. see `minikube addons list` for a list of valid addon names.") + startCmd.Flags().StringSlice(config.AddonListFlag, nil, "Enable addons. see `minikube addons list` for a list of valid addon names.") startCmd.Flags().String(criSocket, "", "The cri socket path to be used.") startCmd.Flags().String(networkPlugin, "", "Kubelet network plug-in to use (default: auto)") startCmd.Flags().Bool(enableDefaultCNI, false, "DEPRECATED: Replaced by --cni=bridge") diff --git a/go.mod b/go.mod index 007c6cf955..5d478d7958 100644 --- a/go.mod +++ b/go.mod @@ -52,7 +52,7 @@ require ( github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/klauspost/cpuid v1.2.0 github.com/libvirt/libvirt-go v3.9.0+incompatible - github.com/machine-drivers/docker-machine-driver-vmware v0.1.1 + github.com/machine-drivers/docker-machine-driver-vmware v0.1.3 github.com/mattbaird/jsonpatch v0.0.0-20200820163806-098863c1fc24 github.com/mattn/go-isatty v0.0.12 github.com/mitchellh/go-ps v1.0.0 @@ -82,13 +82,13 @@ require ( golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 golang.org/x/mod v0.4.2 - golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c + golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324 + golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72 golang.org/x/text v0.3.6 gonum.org/v1/plot v0.9.0 - google.golang.org/api v0.46.0 + google.golang.org/api v0.47.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 gotest.tools/v3 v3.0.3 // indirect diff --git a/go.sum b/go.sum index 4a5559080e..124caf960d 100644 --- a/go.sum +++ b/go.sum @@ -689,8 +689,8 @@ github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= -github.com/machine-drivers/docker-machine-driver-vmware v0.1.1 h1:+E1IKKk+6kaQrCPg6edJZ/zISZijuZTPnzy6RE4C/Ho= -github.com/machine-drivers/docker-machine-driver-vmware v0.1.1/go.mod h1:ej014C83EmSnxJeJ8PtVb8OLJ91PJKO1Q8Y7sM5CK0o= +github.com/machine-drivers/docker-machine-driver-vmware v0.1.3 h1:CIdHhp5vSr+7i3DYmXyJHjVOeo27AGWtvq5SfmjyMVs= +github.com/machine-drivers/docker-machine-driver-vmware v0.1.3/go.mod h1:p2hY99UqqG4FNLvAotM0K5kPlShyQ486ymrkNqv1NiA= github.com/machine-drivers/machine v0.7.1-0.20210306082426-fcb2ad5bcb17 h1:fQoDTuCuJ30R+D6TSB9SALB+J3jUMa8ID8YPfmSDA20= github.com/machine-drivers/machine v0.7.1-0.20210306082426-fcb2ad5bcb17/go.mod h1:79Uwa2hGd5S39LDJt58s8JZcIhGEK6pkq9bsuTbFWbk= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= @@ -924,6 +924,7 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -1022,6 +1023,7 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= @@ -1067,6 +1069,7 @@ golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1119,8 +1122,9 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -1186,6 +1190,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1201,8 +1206,8 @@ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c h1:SgVl/sCtkicsS7psKkje4H9YtjdEl3xsYh7N+5TDHqY= -golang.org/x/oauth2 v0.0.0-20210427180440-81ed05c6b58c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c h1:pkQiBZBvdos9qq4wBAHqlzuZHEXo07pqV06ef90u1WI= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1223,6 +1228,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190115152922-a457fd036447/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1300,11 +1306,13 @@ golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324 h1:pAwJxDByZctfPwzlNGrDN2BQLsdPb9NkhoTJtUkAO28= -golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015 h1:hZR0X1kPW+nwyJ9xRxqZk1vx5RUObAPBdKVvXPDUH/E= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72 h1:VqE9gduFZ4dbR7XoL77lHFp0/DyDUBKSXK7CMFkVcV0= golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1389,8 +1397,9 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1 h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -1431,8 +1440,8 @@ google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjR google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= -google.golang.org/api v0.46.0 h1:jkDWHOBIoNSD0OQpq4rtBVu+Rh325MPjXG1rakAp8JU= -google.golang.org/api v0.46.0/go.mod h1:ceL4oozhkAiTID8XMmJBsIxID/9wMXJVVFXPg4ylg3I= +google.golang.org/api v0.47.0 h1:sQLWZQvP6jPGIP4JGPkJu4zHswrv81iobiyszr3b/0I= +google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1490,8 +1499,8 @@ google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab h1:dkb90hr43A2Q5as5ZBphcOF2II0+EqfCBqGp7qFSpN4= -google.golang.org/genproto v0.0.0-20210429181445-86c259c2b4ab/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384 h1:z+j74wi4yV+P7EtK9gPLGukOk7mFOy9wMQaC0wNb7eY= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -1515,8 +1524,9 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1 h1:ARnQJNWxGyYJpdf/JXscNlQr/uv607ZPU9Z7ogHi+iI= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/hack/release_notes.sh b/hack/release_notes.sh index 1d834b0748..6b93d274c7 100755 --- a/hack/release_notes.sh +++ b/hack/release_notes.sh @@ -65,5 +65,10 @@ echo "" AWK_ISSUE_COMMENTS='NR>1{arr[$4] += $7}END{for (a in arr) printf "%d %s\n", arr[a], a}' "${DIR}/pullsheet" issue-comments --since "$recent_date" --repos kubernetes/minikube --token-path $DIR/gh_token.txt --logtostderr=false --stderrthreshold=2 | awk -F ',' "$AWK_ISSUE_COMMENTS" | sort -k1nr -k2d | awk -F ' ' "$AWK_FORMAT_ITEM" | head -n 5 +if [[ "$recent" != *"beta"* ]]; then + echo "" + echo "Check out our [contributions leaderboard](https://minikube.sigs.k8s.io/docs/contrib/leaderboard/$recent/) for this release!" +fi + echo "" echo "Don't forget to run `make update-leaderboard` & `make time-to-k8s-benchmark`!" diff --git a/pkg/addons/validations.go b/pkg/addons/validations.go index aad44e3cf0..9cefbe321f 100644 --- a/pkg/addons/validations.go +++ b/pkg/addons/validations.go @@ -20,6 +20,7 @@ import ( "fmt" "strconv" + "github.com/spf13/viper" "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/cruntime" @@ -63,7 +64,8 @@ func IsVolumesnapshotsEnabled(cc *config.ClusterConfig, _, value string) error { isCsiDriverEnabled, _ := strconv.ParseBool(value) // assets.Addons[].IsEnabled() returns the current status of the addon or default value. // config.AddonList contains list of addons to be enabled. - isVolumesnapshotsEnabled := assets.Addons[volumesnapshotsAddon].IsEnabled(cc) || contains(config.AddonList, volumesnapshotsAddon) + addonList := viper.GetStringSlice(config.AddonListFlag) + isVolumesnapshotsEnabled := assets.Addons[volumesnapshotsAddon].IsEnabled(cc) || contains(addonList, volumesnapshotsAddon) if isCsiDriverEnabled && !isVolumesnapshotsEnabled { // just print out a warning directly, we don't want to return any errors since // that would prevent the addon from being enabled (callbacks wouldn't be run) diff --git a/pkg/drivers/kic/oci/errors.go b/pkg/drivers/kic/oci/errors.go index c4d806fc06..832500b53e 100644 --- a/pkg/drivers/kic/oci/errors.go +++ b/pkg/drivers/kic/oci/errors.go @@ -69,6 +69,12 @@ var ErrNetworkGatewayTaken = errors.New("network gateway is taken") // ErrNetworkInUse is when trying to delete a network which is attached to another container var ErrNetworkInUse = errors.New("unable to delete a network that is attached to a running container") +// ErrGetSSHPortContainerNotRunning happens when you try to inspect a container (in order to get SSH port) that "exists" but is no longer running +var ErrGetSSHPortContainerNotRunning = errors.New("unable to inspect a not running container to get SSH port") + +// ErrGetPortContainerNotRunning happens when you try to inspect a container (in order to get Port) that "exists" but is no longer running +var ErrGetPortContainerNotRunning = errors.New("unable to inspect a not running container to get port") + // LogContainerDebug will print relevant docker/podman infos after a container fails func LogContainerDebug(ociBin string, name string) string { rr, err := containerInspect(ociBin, name) diff --git a/pkg/drivers/kic/oci/network.go b/pkg/drivers/kic/oci/network.go index f7558e6e7d..b48fefdf6f 100644 --- a/pkg/drivers/kic/oci/network.go +++ b/pkg/drivers/kic/oci/network.go @@ -28,6 +28,7 @@ import ( "github.com/pkg/errors" "k8s.io/klog/v2" + "k8s.io/minikube/pkg/minikube/constants" ) // RoutableHostIPFromInside returns the ip/dns of the host that container lives on @@ -150,6 +151,14 @@ func ForwardedPort(ociBin string, ociID string, contPort int) (int, error) { } else { rr, err = runCmd(exec.Command(ociBin, "container", "inspect", "-f", fmt.Sprintf("'{{(index (index .NetworkSettings.Ports \"%d/tcp\") 0).HostPort}}'", contPort), ociID)) if err != nil { + + // Error: "Template parsing error: template: :1:3: executing "" at : error calling index: index of untyped nil" + if strings.Contains(rr.Output(), `: error calling index: index of untyped nil`) && contPort == constants.SSHPort { + return 0, ErrGetSSHPortContainerNotRunning + } + if strings.Contains(rr.Output(), "error calling index: index of untyped nil") { + return 0, ErrGetPortContainerNotRunning + } return 0, errors.Wrapf(err, "get port %d for %q", contPort, ociID) } } diff --git a/pkg/generate/docs.go b/pkg/generate/docs.go index bb66b86aa8..6ba2170d7f 100644 --- a/pkg/generate/docs.go +++ b/pkg/generate/docs.go @@ -32,7 +32,7 @@ import ( ) // Docs generates docs for minikube command -func Docs(root *cobra.Command, path string, testPath string) error { +func Docs(root *cobra.Command, path string, testPath string, codePath string) error { cmds := root.Commands() for _, c := range cmds { if c.Hidden { @@ -47,7 +47,12 @@ func Docs(root *cobra.Command, path string, testPath string) error { return errors.Wrapf(err, "saving doc for %s", c.Name()) } } - return TestDocs(testPath, "test/integration") + err := TestDocs(testPath, "test/integration") + if err != nil { + return errors.Wrap(err, "failed to generate test docs") + } + + return ErrorCodes(codePath, []string{"pkg/minikube/reason/exitcodes.go", "pkg/minikube/reason/reason.go"}) } // DocForCommand returns the specific doc for that command diff --git a/pkg/generate/errorcodes.go b/pkg/generate/errorcodes.go new file mode 100644 index 0000000000..c50d085e83 --- /dev/null +++ b/pkg/generate/errorcodes.go @@ -0,0 +1,126 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package generate + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io/ioutil" + "strings" + "time" + + "github.com/pkg/errors" + "k8s.io/minikube/pkg/minikube/out" +) + +func ErrorCodes(docPath string, pathsToCheck []string) error { + buf := bytes.NewBuffer([]byte{}) + date := time.Now().Format("2006-01-02") + title := out.Fmt(title, out.V{"Command": "Error Codes", "Description": "minikube error codes and strings", "Date": date}) + _, err := buf.Write([]byte(title)) + if err != nil { + return err + } + + fset := token.NewFileSet() + for _, pathToCheck := range pathsToCheck { + r, err := ioutil.ReadFile(pathToCheck) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("error reading file %s", pathToCheck)) + } + file, err := parser.ParseFile(fset, "", r, parser.ParseComments) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("error parsing file %s", pathToCheck)) + } + + if strings.Contains(pathToCheck, "exitcodes.go") { + buf.WriteString("## Error Codes\n\n") + currentGroup := "" + currentError := "" + ast.Inspect(file, func(x ast.Node) bool { + if c, ok := x.(*ast.Comment); ok { + // Start a new group of errors + comment := c.Text + if !strings.HasPrefix(comment, "// Error codes specific") { + return true + } + currentGroup = strings.Replace(comment, "//", "###", 1) + buf.WriteString("\n" + currentGroup + "\n") + } + if id, ok := x.(*ast.Ident); ok { + // This is the name of the error, e.g. ExGuestError + currentError = id.Name + } + if s, ok := x.(*ast.BasicLit); ok { + // Filter out random strings that aren't error codes + if currentError == "" { + return true + } + + // No specific group means generic errors + if currentGroup == "" { + currentGroup = "### Generic Errors" + buf.WriteString("\n" + currentGroup + "\n") + } + + // This is the numeric code of the error, e.g. 80 for ExGuest Error + code := s.Value + buf.WriteString(fmt.Sprintf("%s: %s \n", code, currentError)) + } + return true + }) + buf.WriteString("\n\n") + } + + if strings.Contains(pathToCheck, "reason.go") { + buf.WriteString("## Error Strings\n\n") + currentNode := "" + currentID := "" + currentComment := "" + ast.Inspect(file, func(x ast.Node) bool { + if id, ok := x.(*ast.Ident); ok { + currentNode = id.Name + if strings.HasPrefix(currentNode, "Ex") && currentNode != "ExitCode" { + // We have all the info we're going to get on this error, print it out + buf.WriteString(fmt.Sprintf("%s (Exit code %v) \n", currentID, currentNode)) + if currentComment != "" { + buf.WriteString(currentComment + " \n") + } + buf.WriteString("\n") + currentComment = "" + currentID = "" + currentNode = "" + } + } + if s, ok := x.(*ast.BasicLit); ok { + if currentNode == "ID" { + currentID = s.Value + } + } + if c, ok := x.(*ast.Comment); ok { + currentComment = c.Text[3:] + } + return true + }) + } + } + + return ioutil.WriteFile(docPath, buf.Bytes(), 0o644) +} diff --git a/pkg/minikube/config/config.go b/pkg/minikube/config/config.go index c359087740..f194099266 100644 --- a/pkg/minikube/config/config.go +++ b/pkg/minikube/config/config.go @@ -56,6 +56,8 @@ const ( AddonImages = "addon-images" // AddonRegistries stores custom addon images config AddonRegistries = "addon-registries" + // AddonListFlag represents the key for addons parameter + AddonListFlag = "addons" ) var ( @@ -67,8 +69,6 @@ var ( DockerOpt []string // ExtraOptions contains extra options (if any) ExtraOptions ExtraOptionSlice - // AddonList contains the list of addons - AddonList []string ) // ErrNotExist is the error returned when a config does not exist diff --git a/pkg/minikube/download/download_test.go b/pkg/minikube/download/download_test.go index 5a036d54f3..defdc54fec 100644 --- a/pkg/minikube/download/download_test.go +++ b/pkg/minikube/download/download_test.go @@ -32,6 +32,8 @@ func TestDownload(t *testing.T) { t.Run("PreloadDownloadPreventsMultipleDownload", testPreloadDownloadPreventsMultipleDownload) t.Run("ImageToCache", testImageToCache) t.Run("ImageToDaemon", testImageToDaemon) + t.Run("PreloadNotExists", testPreloadNotExists) + t.Run("PreloadChecksumMismatch", testPreloadChecksumMismatch) } // Returns a mock function that sleeps before incrementing `downloadsCounter` and creates the requested file. @@ -85,14 +87,14 @@ func testPreloadDownloadPreventsMultipleDownload(t *testing.T) { return nil, nil } checkPreloadExists = func(k8sVersion, containerRuntime string, forcePreload ...bool) bool { return true } - getChecksum = func(k8sVersion, containerRuntime string) (string, error) { return "check", nil } - ensureChecksumValid = func(k8sVersion, containerRuntime, path string) error { return nil } + getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { return []byte("check"), nil } + ensureChecksumValid = func(k8sVersion, containerRuntime, path string, checksum []byte) error { return nil } var group sync.WaitGroup group.Add(2) dlCall := func() { if err := Preload(constants.DefaultKubernetesVersion, constants.DefaultContainerRuntime); err != nil { - t.Errorf("Failed to download preload: %+v", err) + t.Logf("Failed to download preload: %+v (may be ok)", err) } group.Done() } @@ -107,6 +109,45 @@ func testPreloadDownloadPreventsMultipleDownload(t *testing.T) { } } +func testPreloadNotExists(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkCache = func(file string) (fs.FileInfo, error) { return nil, fmt.Errorf("cache not found") } + checkPreloadExists = func(k8sVersion, containerRuntime string, forcePreload ...bool) bool { return false } + getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { return []byte("check"), nil } + ensureChecksumValid = func(k8sVersion, containerRuntime, path string, checksum []byte) error { return nil } + + err := Preload(constants.DefaultKubernetesVersion, constants.DefaultContainerRuntime) + if err != nil { + t.Errorf("Expected no error when preload exists") + } + + if downloadNum != 0 { + t.Errorf("Expected no download attempt but got %v!", downloadNum) + } +} + +func testPreloadChecksumMismatch(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkCache = func(file string) (fs.FileInfo, error) { return nil, fmt.Errorf("cache not found") } + checkPreloadExists = func(k8sVersion, containerRuntime string, forcePreload ...bool) bool { return true } + getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { return []byte("check"), nil } + ensureChecksumValid = func(k8sVersion, containerRuntime, path string, checksum []byte) error { + return fmt.Errorf("checksum mismatch") + } + + err := Preload(constants.DefaultKubernetesVersion, constants.DefaultContainerRuntime) + expectedErrMsg := "checksum mismatch" + if err == nil { + t.Errorf("Expected error when checksum mismatches") + } else if err.Error() != expectedErrMsg { + t.Errorf("Expected error to be %s, got %s", expectedErrMsg, err.Error()) + } +} + func testImageToCache(t *testing.T) { downloadNum := 0 DownloadMock = mockSleepDownload(&downloadNum) diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index 7065372970..317e61729a 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -163,15 +163,16 @@ func Preload(k8sVersion, containerRuntime string) error { return errors.Wrap(err, "tempfile") } targetPath = tmp.Name() - } else if checksum != "" { - url += "?checksum=" + checksum + } else if checksum != nil { + // add URL parameter for go-getter to automatically verify the checksum + url += fmt.Sprintf("?checksum=md5:%s", hex.EncodeToString(checksum)) } if err := download(url, targetPath); err != nil { return errors.Wrapf(err, "download failed: %s", url) } - if err := ensureChecksumValid(k8sVersion, containerRuntime, targetPath); err != nil { + if err := ensureChecksumValid(k8sVersion, containerRuntime, targetPath, checksum); err != nil { return err } @@ -199,23 +200,19 @@ func getStorageAttrs(name string) (*storage.ObjectAttrs, error) { return attrs, nil } -var getChecksum = func(k8sVersion, containerRuntime string) (string, error) { +// getChecksum returns the MD5 checksum of the preload tarball +var getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { klog.Infof("getting checksum for %s ...", TarballName(k8sVersion, containerRuntime)) attrs, err := getStorageAttrs(TarballName(k8sVersion, containerRuntime)) if err != nil { - return "", err + return nil, err } - md5 := hex.EncodeToString(attrs.MD5) - return fmt.Sprintf("md5:%s", md5), nil + return attrs.MD5, nil } -func saveChecksumFile(k8sVersion, containerRuntime string) error { +// saveChecksumFile saves the checksum to a local file for later verification +func saveChecksumFile(k8sVersion, containerRuntime string, checksum []byte) error { klog.Infof("saving checksum for %s ...", TarballName(k8sVersion, containerRuntime)) - attrs, err := getStorageAttrs(TarballName(k8sVersion, containerRuntime)) - if err != nil { - return err - } - checksum := attrs.MD5 return ioutil.WriteFile(PreloadChecksumPath(k8sVersion, containerRuntime), checksum, 0o644) } @@ -243,8 +240,8 @@ func verifyChecksum(k8sVersion, containerRuntime, path string) error { } // ensureChecksumValid saves and verifies local binary checksum matches remote binary checksum -var ensureChecksumValid = func(k8sVersion, containerRuntime, targetPath string) error { - if err := saveChecksumFile(k8sVersion, containerRuntime); err != nil { +var ensureChecksumValid = func(k8sVersion, containerRuntime, targetPath string, checksum []byte) error { + if err := saveChecksumFile(k8sVersion, containerRuntime, checksum); err != nil { return errors.Wrap(err, "saving checksum file") } diff --git a/pkg/minikube/extract/extract.go b/pkg/minikube/extract/extract.go index 41ec27098e..1adfb9e7db 100644 --- a/pkg/minikube/extract/extract.go +++ b/pkg/minikube/extract/extract.go @@ -48,6 +48,7 @@ var exclude = []string{ "- {{.profile}}", " - {{.profile}}", "test/integration", + "pkg/minikube/reason/exitcodes.go", } // ErrMapFile is a constant to refer to the err_map file, which contains the Advice strings. @@ -298,7 +299,6 @@ func checkIdentForStringValue(i *ast.Ident) string { if rhs, ok := as.Rhs[0].(*ast.BasicLit); ok { s = rhs.Value } - } // This Identifier is part of the const or var declaration diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index 7a9f1e304f..491ba89408 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -171,12 +171,13 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { }() // enable addons, both old and new! + addonList := viper.GetStringSlice(config.AddonListFlag) if starter.ExistingAddons != nil { if viper.GetBool("force") { addons.Force = true } wg.Add(1) - go addons.Start(&wg, starter.Cfg, starter.ExistingAddons, config.AddonList) + go addons.Start(&wg, starter.Cfg, starter.ExistingAddons, addonList) } if apiServer { @@ -480,7 +481,7 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) if err != nil { return runner, preExists, m, host, errors.Wrap(err, "Failed to get machine client") } - host, preExists, err = startHost(m, cfg, node, delOnFail) + host, preExists, err = startHostInternal(m, cfg, node, delOnFail) if err != nil { return runner, preExists, m, host, errors.Wrap(err, "Failed to start host") } @@ -503,8 +504,8 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) return runner, preExists, m, host, err } -// startHost starts a new minikube host using a VM or None -func startHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node, delOnFail bool) (*host.Host, bool, error) { +// startHostInternal starts a new minikube host using a VM or None +func startHostInternal(api libmachine.API, cc *config.ClusterConfig, n *config.Node, delOnFail bool) (*host.Host, bool, error) { host, exists, err := machine.StartHost(api, cc, n) if err == nil { return host, exists, nil diff --git a/pkg/minikube/reason/exitcodes.go b/pkg/minikube/reason/exitcodes.go index 2b5e807191..d776d76082 100644 --- a/pkg/minikube/reason/exitcodes.go +++ b/pkg/minikube/reason/exitcodes.go @@ -56,7 +56,6 @@ const ( // navailableOff = 9 // (~EX_UNAVAILABLE) // Error codes specific to the minikube program - ExProgramError = 10 // generic error ExProgramUsage = 14 // bad command-line options ExProgramConflict = 11 // can't do what you want because of existing data @@ -65,7 +64,6 @@ const ( ExProgramConfig = 18 // bad configuration specified // Error codes specific to resource limits (exit code layout follows no rules) - ExResourceError = 20 ExInsufficientMemory = 23 ExInsufficientStorage = 26 @@ -73,7 +71,6 @@ const ( ExInsufficientCores = 29 // Error codes specific to the host - ExHostError = 30 ExHostConflict = 31 ExHostTimeout = 32 @@ -84,7 +81,6 @@ const ( ExHostConfig = 38 // Error codes specific to remote networking - ExInternetError = 40 ExInternetConflict = 41 ExInternetTimeout = 42 @@ -93,7 +89,6 @@ const ( ExInternetUnavailable = 49 // Error codes specific to the libmachine driver - ExDriverError = 50 ExDriverConflict = 51 ExDriverTimeout = 52 @@ -105,7 +100,6 @@ const ( ExDriverUnavailable = 59 // Error codes specific to the driver provider - ExProviderError = 60 ExProviderConflict = 61 ExProviderTimeout = 62 @@ -120,7 +114,6 @@ const ( ExProviderUnavailable = 69 // In common use // Error codes specific to local networking - ExLocalNetworkError = 70 ExLocalNetworkConflict = 71 ExLocalNetworkTimeout = 72 @@ -130,7 +123,6 @@ const ( ExLocalNetworkUnavailable = 79 // Error codes specific to the guest host - ExGuestError = 80 ExGuestConflict = 81 ExGuestTimeout = 82 @@ -142,14 +134,12 @@ const ( ExGuestUnavailable = 89 // Error codes specific to the container runtime - ExRuntimeError = 90 ExRuntimeNotRunning = 93 ExRuntimeNotFound = 95 ExRuntimeUnavailable = 99 // Error codes specific to the Kubernetes control plane - ExControlPlaneError = 100 ExControlPlaneConflict = 101 ExControlPlaneTimeout = 102 @@ -160,7 +150,6 @@ const ( ExControlPlaneUnavailable = 109 // Error codes specific to a Kubernetes service - ExSvcError = 110 ExSvcConflict = 111 ExSvcTimeout = 112 diff --git a/pkg/minikube/reason/reason.go b/pkg/minikube/reason/reason.go index 8667bd5f5c..5f6fb81bd6 100644 --- a/pkg/minikube/reason/reason.go +++ b/pkg/minikube/reason/reason.go @@ -56,7 +56,9 @@ func (k *Kind) IssueURLs() []string { // Sections are ordered roughly by stack dependencies var ( - Usage = Kind{ID: "MK_USAGE", ExitCode: ExProgramUsage} + // minikube has been passed an incorrect parameter + Usage = Kind{ID: "MK_USAGE", ExitCode: ExProgramUsage} + // minikube has no current cluster running UsageNoProfileRunning = Kind{ID: "MK_USAGE_NO_PROFILE", ExitCode: ExProgramUsage, Advice: `You can create one using 'minikube start'. `, @@ -229,32 +231,33 @@ var ( DrvNeedsRoot = Kind{ID: "DRV_NEEDS_ROOT", ExitCode: ExDriverPermission} DrvNeedsAdministrator = Kind{ID: "DRV_NEEDS_ADMINISTRATOR", ExitCode: ExDriverPermission} - GuestCacheLoad = Kind{ID: "GUEST_CACHE_LOAD", ExitCode: ExGuestError} - GuestCert = Kind{ID: "GUEST_CERT", ExitCode: ExGuestError} - GuestCpConfig = Kind{ID: "GUEST_CP_CONFIG", ExitCode: ExGuestConfig} - GuestDeletion = Kind{ID: "GUEST_DELETION", ExitCode: ExGuestError} - GuestImageList = Kind{ID: "GUEST_IMAGE_LIST", ExitCode: ExGuestError} - GuestImageLoad = Kind{ID: "GUEST_IMAGE_LOAD", ExitCode: ExGuestError} - GuestImageRemove = Kind{ID: "GUEST_IMAGE_REMOVE", ExitCode: ExGuestError} - GuestImageBuild = Kind{ID: "GUEST_IMAGE_BUILD", ExitCode: ExGuestError} - GuestLoadHost = Kind{ID: "GUEST_LOAD_HOST", ExitCode: ExGuestError} - GuestMount = Kind{ID: "GUEST_MOUNT", ExitCode: ExGuestError} - GuestMountConflict = Kind{ID: "GUEST_MOUNT_CONFLICT", ExitCode: ExGuestConflict} - GuestNodeAdd = Kind{ID: "GUEST_NODE_ADD", ExitCode: ExGuestError} - GuestNodeDelete = Kind{ID: "GUEST_NODE_DELETE", ExitCode: ExGuestError} - GuestNodeProvision = Kind{ID: "GUEST_NODE_PROVISION", ExitCode: ExGuestError} - GuestNodeRetrieve = Kind{ID: "GUEST_NODE_RETRIEVE", ExitCode: ExGuestNotFound} - GuestNodeStart = Kind{ID: "GUEST_NODE_START", ExitCode: ExGuestError} - GuestPause = Kind{ID: "GUEST_PAUSE", ExitCode: ExGuestError} - GuestProfileDeletion = Kind{ID: "GUEST_PROFILE_DELETION", ExitCode: ExGuestError} - GuestProvision = Kind{ID: "GUEST_PROVISION", ExitCode: ExGuestError} - GuestStart = Kind{ID: "GUEST_START", ExitCode: ExGuestError} - GuestStatus = Kind{ID: "GUEST_STATUS", ExitCode: ExGuestError} - GuestStopTimeout = Kind{ID: "GUEST_STOP_TIMEOUT", ExitCode: ExGuestTimeout} - GuestUnpause = Kind{ID: "GUEST_UNPAUSE", ExitCode: ExGuestError} - GuestCheckPaused = Kind{ID: "GUEST_CHECK_PAUSED", ExitCode: ExGuestError} - GuestDrvMismatch = Kind{ID: "GUEST_DRIVER_MISMATCH", ExitCode: ExGuestConflict, Style: style.Conflict} - GuestMissingConntrack = Kind{ID: "GUEST_MISSING_CONNTRACK", ExitCode: ExGuestUnsupported} + GuestCacheLoad = Kind{ID: "GUEST_CACHE_LOAD", ExitCode: ExGuestError} + GuestCert = Kind{ID: "GUEST_CERT", ExitCode: ExGuestError} + GuestCpConfig = Kind{ID: "GUEST_CP_CONFIG", ExitCode: ExGuestConfig} + GuestDeletion = Kind{ID: "GUEST_DELETION", ExitCode: ExGuestError} + GuestImageList = Kind{ID: "GUEST_IMAGE_LIST", ExitCode: ExGuestError} + GuestImageLoad = Kind{ID: "GUEST_IMAGE_LOAD", ExitCode: ExGuestError} + GuestImageRemove = Kind{ID: "GUEST_IMAGE_REMOVE", ExitCode: ExGuestError} + GuestImageBuild = Kind{ID: "GUEST_IMAGE_BUILD", ExitCode: ExGuestError} + GuestLoadHost = Kind{ID: "GUEST_LOAD_HOST", ExitCode: ExGuestError} + GuestMount = Kind{ID: "GUEST_MOUNT", ExitCode: ExGuestError} + GuestMountConflict = Kind{ID: "GUEST_MOUNT_CONFLICT", ExitCode: ExGuestConflict} + GuestNodeAdd = Kind{ID: "GUEST_NODE_ADD", ExitCode: ExGuestError} + GuestNodeDelete = Kind{ID: "GUEST_NODE_DELETE", ExitCode: ExGuestError} + GuestNodeProvision = Kind{ID: "GUEST_NODE_PROVISION", ExitCode: ExGuestError} + GuestNodeRetrieve = Kind{ID: "GUEST_NODE_RETRIEVE", ExitCode: ExGuestNotFound} + GuestNodeStart = Kind{ID: "GUEST_NODE_START", ExitCode: ExGuestError} + GuestPause = Kind{ID: "GUEST_PAUSE", ExitCode: ExGuestError} + GuestProfileDeletion = Kind{ID: "GUEST_PROFILE_DELETION", ExitCode: ExGuestError} + GuestProvision = Kind{ID: "GUEST_PROVISION", ExitCode: ExGuestError} + GuestProvisionContainerExited = Kind{ID: "GUEST_PROVISION_CONTAINER_EXITED", ExitCode: ExGuestError} + GuestStart = Kind{ID: "GUEST_START", ExitCode: ExGuestError} + GuestStatus = Kind{ID: "GUEST_STATUS", ExitCode: ExGuestError} + GuestStopTimeout = Kind{ID: "GUEST_STOP_TIMEOUT", ExitCode: ExGuestTimeout} + GuestUnpause = Kind{ID: "GUEST_UNPAUSE", ExitCode: ExGuestError} + GuestCheckPaused = Kind{ID: "GUEST_CHECK_PAUSED", ExitCode: ExGuestError} + GuestDrvMismatch = Kind{ID: "GUEST_DRIVER_MISMATCH", ExitCode: ExGuestConflict, Style: style.Conflict} + GuestMissingConntrack = Kind{ID: "GUEST_MISSING_CONNTRACK", ExitCode: ExGuestUnsupported} IfHostIP = Kind{ID: "IF_HOST_IP", ExitCode: ExLocalNetworkError} IfMountIP = Kind{ID: "IF_MOUNT_IP", ExitCode: ExLocalNetworkError} diff --git a/site/content/en/docs/contrib/errorcodes.en.md b/site/content/en/docs/contrib/errorcodes.en.md new file mode 100644 index 0000000000..f4ecd17c08 --- /dev/null +++ b/site/content/en/docs/contrib/errorcodes.en.md @@ -0,0 +1,409 @@ +--- +title: "Error Codes" +description: > + minikube error codes and strings +--- + + +## Error Codes + + +### Generic Errors +1: ExFailure +2: ExInterrupted + +### Error codes specific to the minikube program +10: ExProgramError +14: ExProgramUsage +11: ExProgramConflict +15: ExProgramNotFound +16: ExProgramUnsupported +18: ExProgramConfig + +### Error codes specific to resource limits (exit code layout follows no rules) +20: ExResourceError +23: ExInsufficientMemory +26: ExInsufficientStorage +27: ExInsufficientPermission +29: ExInsufficientCores + +### Error codes specific to the host +30: ExHostError +31: ExHostConflict +32: ExHostTimeout +34: ExHostUsage +35: ExHostNotFound +38: ExHostUnsupported +37: ExHostPermission +38: ExHostConfig + +### Error codes specific to remote networking +40: ExInternetError +41: ExInternetConflict +42: ExInternetTimeout +45: ExInternetNotFound +48: ExInternetConfig +49: ExInternetUnavailable + +### Error codes specific to the libmachine driver +50: ExDriverError +51: ExDriverConflict +52: ExDriverTimeout +54: ExDriverUsage +55: ExDriverNotFound +56: ExDriverUnsupported +57: ExDriverPermission +58: ExDriverConfig +59: ExDriverUnavailable + +### Error codes specific to the driver provider +60: ExProviderError +61: ExProviderConflict +62: ExProviderTimeout +63: ExProviderNotRunning +65: ExProviderNotFound +66: ExProviderUnsupported +67: ExProviderPermission +68: ExProviderConfig +69: ExProviderUnavailable + +### Error codes specific to local networking +70: ExLocalNetworkError +71: ExLocalNetworkConflict +72: ExLocalNetworkTimeout +75: ExLocalNetworkNotFound +77: ExLocalNetworkPermission +78: ExLocalNetworkConfig +79: ExLocalNetworkUnavailable + +### Error codes specific to the guest host +80: ExGuestError +81: ExGuestConflict +82: ExGuestTimeout +83: ExGuestNotRunning +85: ExGuestNotFound +86: ExGuestUnsupported +87: ExGuestPermission +88: ExGuestConfig +89: ExGuestUnavailable + +### Error codes specific to the container runtime +90: ExRuntimeError +93: ExRuntimeNotRunning +95: ExRuntimeNotFound +99: ExRuntimeUnavailable + +### Error codes specific to the Kubernetes control plane +100: ExControlPlaneError +101: ExControlPlaneConflict +102: ExControlPlaneTimeout +103: ExControlPlaneNotRunning +105: ExControlPlaneNotFound +106: ExControlPlaneUnsupported +108: ExControlPlaneConfig +109: ExControlPlaneUnavailable + +### Error codes specific to a Kubernetes service +110: ExSvcError +111: ExSvcConflict +112: ExSvcTimeout +113: ExSvcNotRunning +115: ExSvcNotFound +116: ExSvcUnsupported +117: ExSvcPermission +118: ExSvcConfig +119: ExSvcUnavailable + + +## Error Strings + +"MK_USAGE" (Exit code ExProgramUsage) +minikube has been passed an incorrect parameter + +"MK_USAGE_NO_PROFILE" (Exit code ExProgramUsage) +minikube has no current cluster running + +"MK_INTERRUPTED" (Exit code ExProgramConflict) + +"MK_WRONG_BINARY_WSL" (Exit code ExProgramUnsupported) + +"MK_WRONG_BINARY_M1" (Exit code ExProgramUnsupported) + +"MK_NEW_APICLIENT" (Exit code ExProgramError) + +"MK_ADDON_ENABLE" (Exit code ExProgramError) + +"MK_ADD_CONFIG" (Exit code ExProgramError) + +"MK_BIND_FLAGS" (Exit code ExProgramError) + +"MK_BOOTSTRAPPER" (Exit code ExProgramError) + +"MK_CACHE_LIST" (Exit code ExProgramError) + +"MK_CACHE_LOAD" (Exit code ExProgramError) + +"MK_COMMAND_RUNNER" (Exit code ExProgramError) + +"MK_COMPLETION" (Exit code ExProgramError) + +"MK_CONFIG_SET" (Exit code ExProgramError) + +"MK_CONFIG_UNSET" (Exit code ExProgramError) + +"MK_CONFIG_VIEW" (Exit code ExProgramError) + +"MK_DEL_CONFIG" (Exit code ExProgramError) + +"MK_DISABLE" (Exit code ExProgramError) + +"MK_DOCKER_SCRIPT" (Exit code ExProgramError) + +"MK_ENABLE" (Exit code ExProgramError) + +"MK_FLAGS_BIND" (Exit code ExProgramError) + +"MK_FLAGS_SET" (Exit code ExProgramError) + +"MK_FORMAT_USAGE" (Exit code ExProgramError) + +"MK_GENERATE_DOCS" (Exit code ExProgramError) + +"MK_JSON_MARSHAL" (Exit code ExProgramError) + +"MK_K8S_CLIENT" (Exit code ExControlPlaneUnavailable) + +"MK_LIST_CONFIG" (Exit code ExProgramError) + +"MK_LOGTOSTDERR_FLAG" (Exit code ExProgramError) + +"MK_LOG_FOLLOW" (Exit code ExProgramError) + +"MK_NEW_RUNTIME" (Exit code ExProgramError) + +"MK_OUTPUT_USAGE" (Exit code ExProgramError) + +"MK_RUNTIME" (Exit code ExProgramError) + +"MK_RESERVED_PROFILE" (Exit code ExProgramConflict) + +"MK_ENV_SCRIPT" (Exit code ExProgramError) + +"MK_SHELL_DETECT" (Exit code ExProgramError) + +"MK_STATUS_JSON" (Exit code ExProgramError) + +"MK_STATUS_TEXT" (Exit code ExProgramError) + +"MK_UNSET_SCRIPT" (Exit code ExProgramError) + +"MK_VIEW_EXEC" (Exit code ExProgramError) + +"MK_VIEW_TMPL" (Exit code ExProgramError) + +"MK_YAML_MARSHAL" (Exit code ExProgramError) + +"MK_CREDENTIALS_NOT_FOUND" (Exit code ExProgramNotFound) + +"MK_CREDENTIALS_NOT_NEEDED" (Exit code ExProgramNotFound) + +"MK_SEMVER_PARSE" (Exit code ExProgramError) + +"MK_DAEMONIZE" (Exit code ExProgramError) + +"RSRC_INSUFFICIENT_CORES" (Exit code ExInsufficientCores) + +"RSRC_DOCKER_CORES" (Exit code ExInsufficientCores) + +"RSRC_DOCKER_CORES" (Exit code ExInsufficientCores) + +"RSRC_INSUFFICIENT_REQ_MEMORY" (Exit code ExInsufficientMemory) + +"RSRC_INSUFFICIENT_SYS_MEMORY" (Exit code ExInsufficientMemory) + +"RSRC_INSUFFICIENT_CONTAINER_MEMORY" (Exit code ExInsufficientMemory) + +"RSRC_DOCKER_MEMORY" (Exit code ExInsufficientMemory) + +"RSRC_DOCKER_MEMORY" (Exit code ExInsufficientMemory) + +"RSRC_DOCKER_STORAGE" (Exit code ExInsufficientStorage) + +"RSRC_PODMAN_STORAGE" (Exit code ExInsufficientStorage) + +"RSRC_INSUFFICIENT_STORAGE" (Exit code ExInsufficientStorage) + +"HOST_HOME_MKDIR" (Exit code ExHostPermission) + +"HOST_HOME_CHOWN" (Exit code ExHostPermission) + +"HOST_BROWSER" (Exit code ExHostError) + +"HOST_CONFIG_LOAD" (Exit code ExHostConfig) + +"HOST_HOME_PERMISSION" (Exit code ExHostPermission) + +"HOST_CURRENT_USER" (Exit code ExHostConfig) + +"HOST_DEL_CACHE" (Exit code ExHostError) + +"HOST_KILL_MOUNT_PROC" (Exit code ExHostError) + +"HOST_KUBECNOFIG_UNSET" (Exit code ExHostConfig) + +"HOST_KUBECONFIG_UPDATE" (Exit code ExHostConfig) + +"HOST_KUBECONFIG_DELETE_CTX" (Exit code ExHostConfig) + +"HOST_KUBECTL_PROXY" (Exit code ExHostError) + +"HOST_MOUNT_PID" (Exit code ExHostError) + +"HOST_PATH_MISSING" (Exit code ExHostNotFound) + +"HOST_PATH_STAT" (Exit code ExHostError) + +"HOST_PURGE" (Exit code ExHostError) + +"HOST_SAVE_PROFILE" (Exit code ExHostConfig) + +"PROVIDER_NOT_FOUND" (Exit code ExProviderNotFound) + +"PROVIDER_UNAVAILABLE" (Exit code ExProviderNotFound) + +"DRV_CP_ENDPOINT" (Exit code ExDriverError) + +"DRV_PORT_FORWARD" (Exit code ExDriverError) + +"DRV_UNSUPPORTED_MULTINODE" (Exit code ExDriverConflict) + +"DRV_UNSUPPORTED_OS" (Exit code ExDriverUnsupported) + +"DRV_UNSUPPORTED_PROFILE" (Exit code ExDriverUnsupported) + +"DRV_NOT_FOUND" (Exit code ExDriverNotFound) + +"DRV_NOT_DETECTED" (Exit code ExDriverNotFound) + +"DRV_AS_ROOT" (Exit code ExDriverPermission) + +"DRV_NEEDS_ROOT" (Exit code ExDriverPermission) + +"DRV_NEEDS_ADMINISTRATOR" (Exit code ExDriverPermission) + +"GUEST_CACHE_LOAD" (Exit code ExGuestError) + +"GUEST_CERT" (Exit code ExGuestError) + +"GUEST_CP_CONFIG" (Exit code ExGuestConfig) + +"GUEST_DELETION" (Exit code ExGuestError) + +"GUEST_IMAGE_LIST" (Exit code ExGuestError) + +"GUEST_IMAGE_LOAD" (Exit code ExGuestError) + +"GUEST_IMAGE_REMOVE" (Exit code ExGuestError) + +"GUEST_IMAGE_BUILD" (Exit code ExGuestError) + +"GUEST_LOAD_HOST" (Exit code ExGuestError) + +"GUEST_MOUNT" (Exit code ExGuestError) + +"GUEST_MOUNT_CONFLICT" (Exit code ExGuestConflict) + +"GUEST_NODE_ADD" (Exit code ExGuestError) + +"GUEST_NODE_DELETE" (Exit code ExGuestError) + +"GUEST_NODE_PROVISION" (Exit code ExGuestError) + +"GUEST_NODE_RETRIEVE" (Exit code ExGuestNotFound) + +"GUEST_NODE_START" (Exit code ExGuestError) + +"GUEST_PAUSE" (Exit code ExGuestError) + +"GUEST_PROFILE_DELETION" (Exit code ExGuestError) + +"GUEST_PROVISION" (Exit code ExGuestError) + +"GUEST_START" (Exit code ExGuestError) + +"GUEST_STATUS" (Exit code ExGuestError) + +"GUEST_STOP_TIMEOUT" (Exit code ExGuestTimeout) + +"GUEST_UNPAUSE" (Exit code ExGuestError) + +"GUEST_CHECK_PAUSED" (Exit code ExGuestError) + +"GUEST_DRIVER_MISMATCH" (Exit code ExGuestConflict) + +"GUEST_MISSING_CONNTRACK" (Exit code ExGuestUnsupported) + +"IF_HOST_IP" (Exit code ExLocalNetworkError) + +"IF_MOUNT_IP" (Exit code ExLocalNetworkError) + +"IF_MOUNT_PORT" (Exit code ExLocalNetworkError) + +"IF_SSH_CLIENT" (Exit code ExLocalNetworkError) + +"INET_CACHE_BINARIES" (Exit code ExInternetError) + +"INET_CACHE_KUBECTL" (Exit code ExInternetError) + +"INET_CACHE_TAR" (Exit code ExInternetError) + +"INET_GET_VERSIONS" (Exit code ExInternetError) + +"INET_REPO" (Exit code ExInternetError) + +"INET_REPOS_UNAVAILABLE" (Exit code ExInternetError) + +"INET_VERSION_UNAVAILABLE" (Exit code ExInternetUnavailable) + +"INET_VERSION_EMPTY" (Exit code ExInternetConfig) + +"RUNTIME_ENABLE" (Exit code ExRuntimeError) + +"RUNTIME_CACHE" (Exit code ExRuntimeError) + +"RUNTIME_RESTART" (Exit code ExRuntimeError) + +"SVC_CHECK_TIMEOUT" (Exit code ExSvcTimeout) + +"SVC_TIMEOUT" (Exit code ExSvcTimeout) + +"SVC_LIST" (Exit code ExSvcError) + +"SVC_TUNNEL_START" (Exit code ExSvcError) + +"SVC_TUNNEL_STOP" (Exit code ExSvcError) + +"SVC_URL_TIMEOUT" (Exit code ExSvcTimeout) + +"SVC_NOT_FOUND" (Exit code ExSvcNotFound) + +"ENV_DRIVER_CONFLICT" (Exit code ExDriverConflict) + +"ENV_MULTINODE_CONFLICT" (Exit code ExGuestConflict) + +"ENV_DOCKER_UNAVAILABLE" (Exit code ExRuntimeUnavailable) + +"ENV_PODMAN_UNAVAILABLE" (Exit code ExRuntimeUnavailable) + +"SVC_ADDON_UNSUPPORTED" (Exit code ExSvcUnsupported) + +"SVC_ADDON_NOT_ENABLED" (Exit code ExProgramConflict) + +"K8S_INSTALL_FAILED" (Exit code ExControlPlaneError) + +"K8S_INSTALL_FAILED_CONTAINER_RUNTIME_NOT_RUNNING" (Exit code ExRuntimeNotRunning) + +"K8S_OLD_UNSUPPORTED" (Exit code ExControlPlaneUnsupported) + +"K8S_DOWNGRADE_UNSUPPORTED" (Exit code ExControlPlaneUnsupported) + diff --git a/site/content/en/docs/presentations/_index.md b/site/content/en/docs/presentations/_index.md index 200fbcd3ec..bfde5340da 100644 --- a/site/content/en/docs/presentations/_index.md +++ b/site/content/en/docs/presentations/_index.md @@ -99,6 +99,12 @@ Presentations about the minikube project, mostly from the Kubernetes blog and th * _No results found for minikube_ +### KubeCon EU 2021 (Online, Europe) - Virtual + +* (32:48) + * "Minikube and Three Different Local Kubernetes Learning Environments" + * Anders Björklund & Predrag Rogic + ## Other conferences ### Helm Summit EU 2019 (Amsterdam, The Netherlands) diff --git a/translations/de.json b/translations/de.json index 96b1a40748..de808b5f22 100644 --- a/translations/de.json +++ b/translations/de.json @@ -178,6 +178,7 @@ "Environment variables to pass to the Docker daemon. (format: key=value)": "Umgebungsvariablen, die an den Docker-Daemon übergeben werden. (Format: Schlüssel = Wert)", "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "Fehler beim Prüfen der Treiberversion: {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -642,6 +643,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/es.json b/translations/es.json index e0a4108780..03508b1dcd 100644 --- a/translations/es.json +++ b/translations/es.json @@ -183,6 +183,7 @@ "Environment variables to pass to the Docker daemon. (format: key=value)": "Variables de entorno que se transferirán al daemon de Docker. Formato: clave=valor", "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "No se ha podido comprobar la versión del controlador: {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "Error al crear el directorio minikube", "Error creating view template": "Error al crear la plantilla de vista", "Error detecting shell": "Error al detectar la shell", @@ -647,6 +648,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/fr.json b/translations/fr.json index 8ec5bf34b0..3e5e273c98 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -180,6 +180,7 @@ "Environment variables to pass to the Docker daemon. (format: key=value)": "Variables d'environment à transmettre au daemon Docker (format : clé = valeur).", "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "Erreur lors de la vérification de la version du driver : {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -645,6 +646,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/ja.json b/translations/ja.json index 2912948ade..346d3c0ce0 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -172,6 +172,7 @@ "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "Docker デーモンに渡す環境変数(形式: Key=Value)", "Environment variables to pass to the build. (format: key=value)": "", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "minikube のディレクトリ作成中にエラーが発生しました", "Error creating view template": "表示用のテンプレートを作成中にエラーが発生しました", "Error detecting shell": "シェルの確認中にエラーが発生しました", @@ -641,6 +642,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/ko.json b/translations/ko.json index 20da5a798e..254bdcc25e 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -188,6 +188,7 @@ "Environment variables to pass to the Docker daemon. (format: key=value)": "", "Environment variables to pass to the build. (format: key=value)": "", "Error adding node to cluster": "클러스터에 노드 추가 오류", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "minikube 폴더 생성 오류", "Error creating view template": "", "Error detecting shell": "shell 탐지 오류", @@ -654,6 +655,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/pl.json b/translations/pl.json index dd71b5cbe3..12c6af152a 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -188,6 +188,7 @@ "Environment variables to pass to the Docker daemon. (format: key=value)": "Zmienne środowiskowe do przekazania do demona docker (format: klucz-wartość)", "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "Błąd podczas sprawdzania wersji sterownika : {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -662,6 +663,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/strings.txt b/translations/strings.txt index 68de000f35..71c344818b 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -168,6 +168,7 @@ "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "", "Environment variables to pass to the build. (format: key=value)": "", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -600,6 +601,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index f6f25e94ec..552574e319 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -216,6 +216,7 @@ "Environment variables to pass to the Docker daemon. (format: key=value)": "传递给 Docker 守护进程的环境变量。(格式:键值对)", "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "检查驱动程序版本时出错:{{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error converting status to json": "转换状态为 json 时出错", "Error creating list template": "创建 list template 时出错", "Error creating minikube directory": "创建 minikube 目录时出错", @@ -749,6 +750,7 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "输出的格式。'json' 或者 'table'", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "",