From 3b533a07cb905cf2e8181329c5819e3407e2d457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anders=20F=20Bj=C3=B6rklund?= <anders.f.bjorklund@gmail.com> Date: Sun, 20 Jun 2021 10:24:14 +0200 Subject: [PATCH 01/31] Make sure to log errors from DaemonInfo --- pkg/drivers/kic/oci/info.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/drivers/kic/oci/info.go b/pkg/drivers/kic/oci/info.go index 06f423eb74..23aff7296a 100644 --- a/pkg/drivers/kic/oci/info.go +++ b/pkg/drivers/kic/oci/info.go @@ -252,9 +252,11 @@ func dockerSystemInfo() (dockerSysInfo, error) { var ds dockerSysInfo rawJSON, err := dockerInfoGetter() if err != nil { + klog.Warningf("docker info: %v", err) return ds, errors.Wrap(err, "docker system info") } if err := json.Unmarshal([]byte(strings.TrimSpace(rawJSON)), &ds); err != nil { + klog.Warningf("unmarshal docker info: %v", err) return ds, errors.Wrapf(err, "unmarshal docker system info") } @@ -272,10 +274,12 @@ func podmanSystemInfo() (podmanSysInfo, error) { var ps podmanSysInfo rawJSON, err := podmanInfoGetter() if err != nil { + klog.Warningf("podman info: %v", err) return ps, errors.Wrap(err, "podman system info") } if err := json.Unmarshal([]byte(strings.TrimSpace(rawJSON)), &ps); err != nil { + klog.Warningf("unmarshal podman info: %v", err) return ps, errors.Wrapf(err, "unmarshal podman system info") } klog.Infof("podman info: %+v", ps) From 659e8c27851547c79f80f2ca4b5f06fe4f605c42 Mon Sep 17 00:00:00 2001 From: Rajwinder Mahal <rajwinder@mahal.dev> Date: Mon, 28 Jun 2021 18:27:28 -0700 Subject: [PATCH 02/31] Replace InternalEnable and InternalDisable with InternalAddonEnable and InternalAddonDisable --- cmd/minikube/cmd/config/disable.go | 2 +- cmd/minikube/cmd/config/enable.go | 2 +- pkg/minikube/reason/reason.go | 8 +++----- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/cmd/minikube/cmd/config/disable.go b/cmd/minikube/cmd/config/disable.go index 198e8b88bd..cdf31b934d 100644 --- a/cmd/minikube/cmd/config/disable.go +++ b/cmd/minikube/cmd/config/disable.go @@ -40,7 +40,7 @@ var addonsDisableCmd = &cobra.Command{ } err := addons.SetAndSave(ClusterFlagValue(), addon, "false") if err != nil { - exit.Error(reason.InternalDisable, "disable failed", err) + exit.Error(reason.InternalAddonDisable, "disable failed", err) } out.Step(style.AddonDisable, `"The '{{.minikube_addon}}' addon is disabled`, out.V{"minikube_addon": addon}) }, diff --git a/cmd/minikube/cmd/config/enable.go b/cmd/minikube/cmd/config/enable.go index 81b655fc91..788a9477ae 100644 --- a/cmd/minikube/cmd/config/enable.go +++ b/cmd/minikube/cmd/config/enable.go @@ -49,7 +49,7 @@ var addonsEnableCmd = &cobra.Command{ viper.Set(config.AddonRegistries, registries) err := addons.SetAndSave(ClusterFlagValue(), addon, "true") if err != nil { - exit.Error(reason.InternalEnable, "enable failed", err) + exit.Error(reason.InternalAddonEnable, "enable failed", err) } if addon == "dashboard" { tipProfileArg := "" diff --git a/pkg/minikube/reason/reason.go b/pkg/minikube/reason/reason.go index f18ff5df1d..24a3fa9615 100644 --- a/pkg/minikube/reason/reason.go +++ b/pkg/minikube/reason/reason.go @@ -74,7 +74,9 @@ var ( // minikube failed to create a new Docker Machine api client NewAPIClient = Kind{ID: "MK_NEW_APICLIENT", ExitCode: ExProgramError} - // minikube could not enable an addon, e.g dashboard addon + // minikube could not disable an addon, e.g. dashboard addon + InternalAddonDisable = Kind{ID: "MK_ADDON_DISABLE", ExitCode: ExProgramError} + // minikube could not enable an addon, e.g. dashboard addon InternalAddonEnable = Kind{ID: "MK_ADDON_ENABLE", ExitCode: ExProgramError} // minikube failed to update internal configuration, such as the cached images config map InternalAddConfig = Kind{ID: "MK_ADD_CONFIG", ExitCode: ExProgramError} @@ -96,12 +98,8 @@ var ( InternalConfigView = Kind{ID: "MK_CONFIG_VIEW", ExitCode: ExProgramError} // minikybe failed to delete an internal configuration, such as a cached image InternalDelConfig = Kind{ID: "MK_DEL_CONFIG", ExitCode: ExProgramError} - // minikube failed to disable a minikube addon - InternalDisable = Kind{ID: "MK_DISABLE", ExitCode: ExProgramError} // minikube failed to generate script to activate minikube docker-env InternalDockerScript = Kind{ID: "MK_DOCKER_SCRIPT", ExitCode: ExProgramError} - // minkube failed to enable a minikube addon - InternalEnable = Kind{ID: "MK_ENABLE", ExitCode: ExProgramError} // an error occurred when viper attempted to bind flags to configuration InternalBindFlags = Kind{ID: "MK_BIND_FLAGS", ExitCode: ExProgramError} // an error occurred when setting cofniguration flags (currently not in use) From 6a3781c57524b895268b56116dd9c8124bdd9e56 Mon Sep 17 00:00:00 2001 From: Rajwinder Mahal <rajwinder@mahal.dev> Date: Tue, 29 Jun 2021 13:22:18 -0700 Subject: [PATCH 03/31] Remove un-used error codes --- pkg/minikube/reason/reason.go | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/pkg/minikube/reason/reason.go b/pkg/minikube/reason/reason.go index 24a3fa9615..49000f4c59 100644 --- a/pkg/minikube/reason/reason.go +++ b/pkg/minikube/reason/reason.go @@ -69,8 +69,6 @@ var ( // user attempted to run a Windows executable (.exe) inside of WSL rather than using the Linux binary WrongBinaryWSL = Kind{ID: "MK_WRONG_BINARY_WSL", ExitCode: ExProgramUnsupported} - // user attempted to run an amd64 executable on a darwin/arm64 system - WrongBinaryM1 = Kind{ID: "MK_WRONG_BINARY_M1", ExitCode: ExProgramUnsupported} // minikube failed to create a new Docker Machine api client NewAPIClient = Kind{ID: "MK_NEW_APICLIENT", ExitCode: ExProgramError} @@ -102,8 +100,6 @@ var ( InternalDockerScript = Kind{ID: "MK_DOCKER_SCRIPT", ExitCode: ExProgramError} // an error occurred when viper attempted to bind flags to configuration InternalBindFlags = Kind{ID: "MK_BIND_FLAGS", ExitCode: ExProgramError} - // an error occurred when setting cofniguration flags (currently not in use) - InternalFlagSet = Kind{ID: "MK_FLAGS_SET", ExitCode: ExProgramError} // minkube was passed an invalid format string in the --format flag InternalFormatUsage = Kind{ID: "MK_FORMAT_USAGE", ExitCode: ExProgramError} // minikube failed to auto-generate markdown-based documentation in the specified folder @@ -114,8 +110,6 @@ var ( InternalKubernetesClient = Kind{ID: "MK_K8S_CLIENT", ExitCode: ExControlPlaneUnavailable} // minikube failed to list some configuration data InternalListConfig = Kind{ID: "MK_LIST_CONFIG", ExitCode: ExProgramError} - // minikube failed to write logs to stdout (currently not in use) - InternalLogtostderrFlag = Kind{ID: "MK_LOGTOSTDERR_FLAG", ExitCode: ExProgramError} // minikube failed to follow or watch minikube logs InternalLogFollow = Kind{ID: "MK_LOG_FOLLOW", ExitCode: ExProgramError} // minikube failed to create an appropriate new runtime based on the driver in use @@ -134,8 +128,6 @@ var ( InternalStatusJSON = Kind{ID: "MK_STATUS_JSON", ExitCode: ExProgramError} // minikube failed to output minikube status text InternalStatusText = Kind{ID: "MK_STATUS_TEXT", ExitCode: ExProgramError} - // minikube failed to generate script to deactivate minikube docker-env - InternalUnsetScript = Kind{ID: "MK_UNSET_SCRIPT", ExitCode: ExProgramError} // minikube failed to execute (i.e. fill in values for) a view template for displaying current config InternalViewExec = Kind{ID: "MK_VIEW_EXEC", ExitCode: ExProgramError} // minikube failed to create view template for displaying current config @@ -258,8 +250,6 @@ var ( HostDelCache = Kind{ID: "HOST_DEL_CACHE", ExitCode: ExHostError} // minikube failed to kill a mount process HostKillMountProc = Kind{ID: "HOST_KILL_MOUNT_PROC", ExitCode: ExHostError} - // minikube failed to unset host Kubernetes resources config - HostKubeconfigUnset = Kind{ID: "HOST_KUBECNOFIG_UNSET", ExitCode: ExHostConfig} // minikube failed to update host Kubernetes resources config HostKubeconfigUpdate = Kind{ID: "HOST_KUBECONFIG_UPDATE", ExitCode: ExHostConfig} // minikube failed to delete Kubernetes config from context for a given profile @@ -310,8 +300,6 @@ var ( DrvAsRoot = Kind{ID: "DRV_AS_ROOT", ExitCode: ExDriverPermission} // the specified driver needs to be run as root DrvNeedsRoot = Kind{ID: "DRV_NEEDS_ROOT", ExitCode: ExDriverPermission} - // the specified driver needs to be run as administrator - DrvNeedsAdministrator = Kind{ID: "DRV_NEEDS_ADMINISTRATOR", ExitCode: ExDriverPermission} // minikube failed to load cached images GuestCacheLoad = Kind{ID: "GUEST_CACHE_LOAD", ExitCode: ExGuestError} @@ -383,8 +371,6 @@ var ( InetCacheKubectl = Kind{ID: "INET_CACHE_KUBECTL", ExitCode: ExInternetError} // minikube failed to cache required images to tar files InetCacheTar = Kind{ID: "INET_CACHE_TAR", ExitCode: ExInternetError} - // minikube failed to get required versions for binaries in use - InetGetVersions = Kind{ID: "INET_GET_VERSIONS", ExitCode: ExInternetError} // minikube was unable to access main repository and mirrors for images InetRepo = Kind{ID: "INET_REPO", ExitCode: ExInternetError} // minikube was unable to access any known image repositories @@ -398,8 +384,6 @@ var ( RuntimeEnable = Kind{ID: "RUNTIME_ENABLE", ExitCode: ExRuntimeError} // minikube failed to cache images for the current container runtime RuntimeCache = Kind{ID: "RUNTIME_CACHE", ExitCode: ExRuntimeError} - // minikube failed to restart the current container runtime - RuntimeRestart = Kind{ID: "RUNTIME_RESTART", ExitCode: ExRuntimeError} // service check timed out while starting minikube dashboard SvcCheckTimeout = Kind{ID: "SVC_CHECK_TIMEOUT", ExitCode: ExSvcTimeout} @@ -420,8 +404,6 @@ var ( EnvDriverConflict = Kind{ID: "ENV_DRIVER_CONFLICT", ExitCode: ExDriverConflict} // user attempted to run a command that is not supported on multi-node setup without some additional configuration EnvMultiConflict = Kind{ID: "ENV_MULTINODE_CONFLICT", ExitCode: ExGuestConflict} - // the docker service was unavailable to the cluster - EnvDockerUnavailable = Kind{ID: "ENV_DOCKER_UNAVAILABLE", ExitCode: ExRuntimeUnavailable} // the podman service was unavailable to the cluster EnvPodmanUnavailable = Kind{ID: "ENV_PODMAN_UNAVAILABLE", ExitCode: ExRuntimeUnavailable} From f76b0795d8645a115280dc3d2fd98f7635c3b20a Mon Sep 17 00:00:00 2001 From: Alexandre Garnier <zigarn@gmail.com> Date: Tue, 1 Jun 2021 15:22:15 +0200 Subject: [PATCH 04/31] Allow to set the dashboard proxyfied port --- cmd/minikube/cmd/dashboard.go | 11 +++++++---- site/content/en/docs/commands/dashboard.md | 3 ++- translations/de.json | 1 + translations/es.json | 1 + translations/fr.json | 1 + translations/ja.json | 1 + translations/ko.json | 1 + translations/pl.json | 1 + translations/strings.txt | 1 + translations/zh-CN.json | 1 + 10 files changed, 17 insertions(+), 5 deletions(-) diff --git a/cmd/minikube/cmd/dashboard.go b/cmd/minikube/cmd/dashboard.go index 68fce8c86e..919e4317f3 100644 --- a/cmd/minikube/cmd/dashboard.go +++ b/cmd/minikube/cmd/dashboard.go @@ -24,6 +24,7 @@ import ( "os/exec" "os/user" "regexp" + "strconv" "time" "github.com/pkg/errors" @@ -44,7 +45,8 @@ import ( ) var ( - dashboardURLMode bool + dashboardURLMode bool + dashboardExposedPort int // Matches: 127.0.0.1:8001 // TODO(tstromberg): Get kubectl to implement a stable supported output format. hostPortRe = regexp.MustCompile(`127.0.0.1:\d{4,}`) @@ -92,7 +94,7 @@ var dashboardCmd = &cobra.Command{ } out.ErrT(style.Launch, "Launching proxy ...") - p, hostPort, err := kubectlProxy(kubectlVersion, cname) + p, hostPort, err := kubectlProxy(kubectlVersion, cname, dashboardExposedPort) if err != nil { exit.Error(reason.HostKubectlProxy, "kubectl proxy", err) } @@ -126,10 +128,10 @@ var dashboardCmd = &cobra.Command{ } // kubectlProxy runs "kubectl proxy", returning host:port -func kubectlProxy(kubectlVersion string, contextName string) (*exec.Cmd, string, error) { +func kubectlProxy(kubectlVersion string, contextName string, port int) (*exec.Cmd, string, error) { // port=0 picks a random system port - kubectlArgs := []string{"--context", contextName, "proxy", "--port=0"} + kubectlArgs := []string{"--context", contextName, "proxy", "--port", strconv.Itoa(port)} var cmd *exec.Cmd if kubectl, err := exec.LookPath("kubectl"); err == nil { @@ -217,4 +219,5 @@ func checkURL(url string) error { func init() { dashboardCmd.Flags().BoolVar(&dashboardURLMode, "url", false, "Display dashboard URL instead of opening a browser") + dashboardCmd.Flags().IntVar(&dashboardExposedPort, "port", 0, "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.") } diff --git a/site/content/en/docs/commands/dashboard.md b/site/content/en/docs/commands/dashboard.md index b498a1adf7..c1e6557d23 100644 --- a/site/content/en/docs/commands/dashboard.md +++ b/site/content/en/docs/commands/dashboard.md @@ -20,7 +20,8 @@ minikube dashboard [flags] ### Options ``` - --url Display dashboard URL instead of opening a browser + --port int Exposed port of the proxyfied dashboard. Set to 0 to pick a random port. + --url Display dashboard URL instead of opening a browser ``` ### Options inherited from parent commands diff --git a/translations/de.json b/translations/de.json index 66431d385d..9ee74b5d0d 100644 --- a/translations/de.json +++ b/translations/de.json @@ -215,6 +215,7 @@ "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "", "Exiting": "Wird beendet", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "", diff --git a/translations/es.json b/translations/es.json index 6df86e67fc..c9bf518e7a 100644 --- a/translations/es.json +++ b/translations/es.json @@ -220,6 +220,7 @@ "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "", "Exiting": "Saliendo", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "", diff --git a/translations/fr.json b/translations/fr.json index 19acb94ba0..5c8792946b 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -218,6 +218,7 @@ "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "Il manque de nouvelles fonctionnalités sur le disque existant ({{.error}}). Pour mettre à niveau, exécutez 'minikube delete'", "Exiting": "Fermeture…", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "Fermeture en raison de {{.fatal_code}} : {{.fatal_msg}}", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "L'adaptateur externe sur lequel un commutateur externe sera créé si aucun commutateur externe n'est trouvé. (pilote hyperv uniquement)", "Fail check if container paused": "Échec de la vérification si le conteneur est en pause", "Failed runtime": "Échec de l'exécution", diff --git a/translations/ja.json b/translations/ja.json index 64f78c1a96..df7a36fdb9 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -208,6 +208,7 @@ "Exiting": "終了しています", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", "Exiting.": "終了しています", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "", diff --git a/translations/ko.json b/translations/ko.json index 6bfb6d2f90..f3d6698e35 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -232,6 +232,7 @@ "Executing \"{{.command}}\" took an unusually long time: {{.duration}}": "", "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "런타임이 실패하였습니다", diff --git a/translations/pl.json b/translations/pl.json index d6c6e83c42..060a594490 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -223,6 +223,7 @@ "Executing \"{{.command}}\" took an unusually long time: {{.duration}}": "", "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "", diff --git a/translations/strings.txt b/translations/strings.txt index 3af38a3ba8..2a5c665f0d 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -201,6 +201,7 @@ "Executing \"{{.command}}\" took an unusually long time: {{.duration}}": "", "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index 1d80c63af2..1566879176 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -280,6 +280,7 @@ "Exiting due to driver incompatibility": "由于驱动程序不兼容而退出", "Exiting due to {{.fatal_code}}: {{.fatal_msg}}": "", "Exiting.": "正在退出。", + "Exposed port of the proxyfied dashboard. Set to 0 to pick a random port.": "", "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", "Fail check if container paused": "", "Failed runtime": "", From e63b223be9f378759dd6efb7efd9e2e63a0de364 Mon Sep 17 00:00:00 2001 From: Alexandre Garnier <zigarn@gmail.com> Date: Thu, 3 Jun 2021 22:57:55 +0200 Subject: [PATCH 05/31] Add dashboard port validation --- cmd/minikube/cmd/dashboard.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/minikube/cmd/dashboard.go b/cmd/minikube/cmd/dashboard.go index 919e4317f3..141b3ab212 100644 --- a/cmd/minikube/cmd/dashboard.go +++ b/cmd/minikube/cmd/dashboard.go @@ -67,6 +67,10 @@ var dashboardCmd = &cobra.Command{ } } + if dashboardExposedPort < 0 || dashboardExposedPort > 65535 { + exit.Message(reason.HostKubectlProxy, "Invalid port") + } + kubectlVersion := co.Config.KubernetesConfig.KubernetesVersion var err error From 97c7a1effae19f8dc078d77856b91641fc1d2b3f Mon Sep 17 00:00:00 2001 From: Alexandre Garnier <alexandre.garnier@zenika.com> Date: Sat, 3 Jul 2021 16:27:32 +0200 Subject: [PATCH 06/31] Add dashboard port option in corresponding functional test --- test/integration/functional_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index f7e62a41e3..0670b4c528 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -815,7 +815,7 @@ func validateDashboardCmd(ctx context.Context, t *testing.T, profile string) { mctx, cancel := context.WithTimeout(ctx, Seconds(300)) defer cancel() - args := []string{"dashboard", "--url", "-p", profile, "--alsologtostderr", "-v=1"} + args := []string{"dashboard", "--url", "--port", "36195", "-p", profile, "--alsologtostderr", "-v=1"} ss, err := Start(t, exec.CommandContext(mctx, Target(), args...)) if err != nil { t.Errorf("failed to run minikube dashboard. args %q : %v", args, err) From 058d2b4201ade46012275c753012746523586721 Mon Sep 17 00:00:00 2001 From: minikube-bot <minikube-bot@google.com> Date: Mon, 5 Jul 2021 08:02:58 +0000 Subject: [PATCH 07/31] bump default/newest kubernetes versions --- pkg/minikube/constants/constants.go | 2 +- site/content/en/docs/commands/start.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go index 555c3ebfab..338f2cdfa7 100644 --- a/pkg/minikube/constants/constants.go +++ b/pkg/minikube/constants/constants.go @@ -34,7 +34,7 @@ var ( const ( // DefaultKubernetesVersion is the default Kubernetes version // dont update till #10545 is solved - DefaultKubernetesVersion = "v1.20.8" + DefaultKubernetesVersion = "v1.21.2" // NewestKubernetesVersion is the newest Kubernetes version to test against // NOTE: You may need to update coreDNS & etcd versions in pkg/minikube/bootstrapper/images/images.go NewestKubernetesVersion = "v1.22.0-beta.0" diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 2cc0fb5e9c..f407a7a3b9 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -66,7 +66,7 @@ minikube start [flags] --interactive Allow user prompts for more information (default true) --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube/iso/minikube-v1.22.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.22.0/minikube-v1.22.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.22.0.iso]) --keep-context This will keep the existing kubectl context and will create a minikube context. - --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.20.8, 'latest' for v1.22.0-beta.0). Defaults to 'stable'. + --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.21.2, 'latest' for v1.22.0-beta.0). Defaults to 'stable'. --kvm-gpu Enable experimental NVIDIA GPU support in minikube --kvm-hidden Hide the hypervisor signature from the guest in minikube (kvm2 driver only) --kvm-network string The KVM default network name. (kvm2 driver only) (default "default") From 79d8e502def740b323c4ac87a337a2b6eea6cf0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 18:25:07 +0000 Subject: [PATCH 08/31] Bump github.com/hashicorp/go-getter from 1.5.4 to 1.5.5 Bumps [github.com/hashicorp/go-getter](https://github.com/hashicorp/go-getter) from 1.5.4 to 1.5.5. - [Release notes](https://github.com/hashicorp/go-getter/releases) - [Changelog](https://github.com/hashicorp/go-getter/blob/main/.goreleaser.yml) - [Commits](https://github.com/hashicorp/go-getter/compare/v1.5.4...v1.5.5) --- updated-dependencies: - dependency-name: github.com/hashicorp/go-getter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9159b94255..07efbd0253 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/google/slowjam v1.0.0 github.com/google/uuid v1.2.0 github.com/gookit/color v1.4.2 // indirect - github.com/hashicorp/go-getter v1.5.4 + github.com/hashicorp/go-getter v1.5.5 github.com/hashicorp/go-retryablehttp v0.7.0 github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 // indirect github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 // indirect diff --git a/go.sum b/go.sum index 7dfc4df222..f08dff4593 100644 --- a/go.sum +++ b/go.sum @@ -613,8 +613,8 @@ github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brv github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-getter v1.5.4 h1:/A0xlardcuhx8SEe1rh1371xV7Yi4j3xeluu53VXeyg= -github.com/hashicorp/go-getter v1.5.4/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI= +github.com/hashicorp/go-getter v1.5.5 h1:kAiuyk4LvTCqXfDkxNcCS/s0j/jye9USXT+iHH3EX68= +github.com/hashicorp/go-getter v1.5.5/go.mod h1:BrrV/1clo8cCYu6mxvboYg+KutTiFnXjMEgDD8+i7ZI= github.com/hashicorp/go-hclog v0.9.2 h1:CG6TE5H9/JXsFWJCfoIVpKFIkFe6ysEuHirp4DxCsHI= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= From 8fcab59f6c42c76d24e8caf5bddcb738748d4a2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 18:25:40 +0000 Subject: [PATCH 09/31] Bump github.com/spf13/cobra from 1.1.3 to 1.2.1 Bumps [github.com/spf13/cobra](https://github.com/spf13/cobra) from 1.1.3 to 1.2.1. - [Release notes](https://github.com/spf13/cobra/releases) - [Changelog](https://github.com/spf13/cobra/blob/master/CHANGELOG.md) - [Commits](https://github.com/spf13/cobra/compare/v1.1.3...v1.2.1) --- updated-dependencies: - dependency-name: github.com/spf13/cobra dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 9159b94255..2d8d3ad7a5 100644 --- a/go.mod +++ b/go.mod @@ -68,7 +68,7 @@ require ( github.com/russross/blackfriday v1.5.3-0.20200218234912-41c5fccfd6f6 // indirect github.com/samalba/dockerclient v0.0.0-20160414174713-91d7393ff859 // indirect github.com/shirou/gopsutil/v3 v3.21.5 - github.com/spf13/cobra v1.1.3 + github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f diff --git a/go.sum b/go.sum index 7dfc4df222..13fe66d67b 100644 --- a/go.sum +++ b/go.sum @@ -1036,8 +1036,8 @@ github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKv github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= +github.com/spf13/cobra v1.2.1 h1:+KmjbUw1hriSNMF55oPrkZcb27aECyrj8V2ytv7kWDw= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= From 6711856ea62937c318821169acac72947b789f1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Jul 2021 18:26:09 +0000 Subject: [PATCH 10/31] Bump google.golang.org/api from 0.49.0 to 0.50.0 Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.49.0 to 0.50.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/master/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.49.0...v0.50.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] <support@github.com> --- go.mod | 4 ++-- go.sum | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 9159b94255..4e401cd178 100644 --- a/go.mod +++ b/go.mod @@ -81,13 +81,13 @@ require ( golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 golang.org/x/exp v0.0.0-20210220032938-85be41e4509f golang.org/x/mod v0.4.2 - golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1 + golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210629170331-7dc0b73dc9fb 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.49.0 + google.golang.org/api v0.50.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 k8s.io/api v0.21.2 diff --git a/go.sum b/go.sum index 7dfc4df222..0bef73ca4c 100644 --- a/go.sum +++ b/go.sum @@ -1321,8 +1321,8 @@ golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/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-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1 h1:x622Z2o4hgCr/4CiKWc51jHVKaWdtVpBNmEI8wI9Qns= -golang.org/x/oauth2 v0.0.0-20210615190721-d04028783cf1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914 h1:3B43BWw0xEBsLZ/NO1VALz6fppU3481pik+2Ksv45z8= +golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/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= @@ -1527,8 +1527,9 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3 h1:L69ShwSZEyCsLKoAxDKeMvLDZkumEe8gXUZAjab0tX8= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4 h1:cVngSRcfgyZCzys3KYOpCFa+4dqX/Oub9tAq00ttGVs= +golang.org/x/tools v0.1.4/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= @@ -1572,8 +1573,8 @@ google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1Avk google.golang.org/api v0.45.0/go.mod h1:ISLIJCedJolbZvDfAk+Ctuq5hf+aJ33WgtUsfyFoLXA= google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.49.0 h1:gjIBDxlTG7vnzMmEnYwTnvLTF8Rjzo+ETCgEX1YZ/fY= -google.golang.org/api v0.49.0/go.mod h1:BECiH72wsfwUvOVn3+btPD5WHi0LzavZReBndi42L18= +google.golang.org/api v0.50.0 h1:LX7NFCFYOHzr7WHaYiRUpeipZe9o5L8T+2F4Z798VDw= +google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= 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= @@ -1636,8 +1637,8 @@ google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQ google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced h1:c5geK1iMU3cDKtFrCVQIcjR3W+JOZMuhIyICMCTbtus= -google.golang.org/genproto v0.0.0-20210617175327-b9e0b3197ced/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84 h1:R1r5J0u6Cx+RNl/6mezTw6oA14cmKC96FeUwL6A9bd4= +google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= 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= From f5cdc4fec3261dd9dd4da138439030b53b605a39 Mon Sep 17 00:00:00 2001 From: Medya Gh <medya@google.com> Date: Tue, 6 Jul 2021 10:14:17 -0400 Subject: [PATCH 11/31] update problematic k8s versions --- pkg/minikube/reason/k8s.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/pkg/minikube/reason/k8s.go b/pkg/minikube/reason/k8s.go index 75c3a38585..2b9dc71041 100644 --- a/pkg/minikube/reason/k8s.go +++ b/pkg/minikube/reason/k8s.go @@ -41,9 +41,6 @@ var k8sIssues = []K8sIssue{ "1.20.4", "1.20.5", "1.20.6", - "1.21.0", - "1.21.1", - "1.21.2", }, Description: "Kubernetes {{.version}} has a known performance issue on cluster startup. It might take 2 to 3 minutes for a cluster to start.", URL: "https://github.com/kubernetes/kubeadm/issues/2395", From 18c841ccff0cb732a49f06d2e9a8f1b8f8f860a0 Mon Sep 17 00:00:00 2001 From: Medya Gh <medya@google.com> Date: Tue, 6 Jul 2021 10:20:13 -0400 Subject: [PATCH 12/31] update comment --- pkg/minikube/reason/k8s.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/minikube/reason/k8s.go b/pkg/minikube/reason/k8s.go index 2b9dc71041..f52246fe9a 100644 --- a/pkg/minikube/reason/k8s.go +++ b/pkg/minikube/reason/k8s.go @@ -30,6 +30,7 @@ type K8sIssue struct { var k8sIssues = []K8sIssue{ { + // fixed by github.com/kubernetes/kubernetes/pull/99336 VersionsAffected: []string{ "1.18.16", "1.18.17", From 89c24e5fac0716d02e25bad53cfa4070e3986096 Mon Sep 17 00:00:00 2001 From: Medya Gh <medya@google.com> Date: Tue, 6 Jul 2021 10:52:41 -0400 Subject: [PATCH 13/31] fix --- pkg/minikube/reason/k8s.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/minikube/reason/k8s.go b/pkg/minikube/reason/k8s.go index f52246fe9a..840403656f 100644 --- a/pkg/minikube/reason/k8s.go +++ b/pkg/minikube/reason/k8s.go @@ -42,6 +42,7 @@ var k8sIssues = []K8sIssue{ "1.20.4", "1.20.5", "1.20.6", + "1.21.0", }, Description: "Kubernetes {{.version}} has a known performance issue on cluster startup. It might take 2 to 3 minutes for a cluster to start.", URL: "https://github.com/kubernetes/kubeadm/issues/2395", From b507dbd751ab46a3758d349cb6fda312e0ebf186 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Jul 2021 18:49:36 +0000 Subject: [PATCH 14/31] Bump github.com/shirou/gopsutil/v3 from 3.21.5 to 3.21.6 Bumps [github.com/shirou/gopsutil/v3](https://github.com/shirou/gopsutil) from 3.21.5 to 3.21.6. - [Release notes](https://github.com/shirou/gopsutil/releases) - [Commits](https://github.com/shirou/gopsutil/compare/v3.21.5...v3.21.6) --- updated-dependencies: - dependency-name: github.com/shirou/gopsutil/v3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] <support@github.com> --- go.mod | 2 +- go.sum | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index c095e3a212..5a8919a982 100644 --- a/go.mod +++ b/go.mod @@ -67,7 +67,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 github.com/russross/blackfriday v1.5.3-0.20200218234912-41c5fccfd6f6 // indirect github.com/samalba/dockerclient v0.0.0-20160414174713-91d7393ff859 // indirect - github.com/shirou/gopsutil/v3 v3.21.5 + github.com/shirou/gopsutil/v3 v3.21.6 github.com/spf13/cobra v1.2.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.8.1 diff --git a/go.sum b/go.sum index 50df4d0601..eb9f8537fe 100644 --- a/go.sum +++ b/go.sum @@ -1005,8 +1005,8 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil/v3 v3.21.5 h1:YUBf0w/KPLk7w1803AYBnH7BmA+1Z/Q5MEZxpREUaB4= -github.com/shirou/gopsutil/v3 v3.21.5/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= +github.com/shirou/gopsutil/v3 v3.21.6 h1:vU7jrp1Ic/2sHB7w6UNs7MIkn7ebVtTb5D9j45o9VYE= +github.com/shirou/gopsutil/v3 v3.21.6/go.mod h1:JfVbDpIBLVzT8oKbvMg9P3wEIMDDpVn+LwHTKj0ST88= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= @@ -1074,10 +1074,10 @@ github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cb github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/thecodeteam/goscaleio v0.1.0/go.mod h1:68sdkZAsK8bvEwBlbQnlLS+xU+hvLYM/iQ8KXej1AwM= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tklauser/go-sysconf v0.3.4 h1:HT8SVixZd3IzLdfs/xlpq0jeSfTX57g1v6wB1EuzV7M= -github.com/tklauser/go-sysconf v0.3.4/go.mod h1:Cl2c8ZRWfHD5IrfHo9VN+FX9kCFjIOyVklgXycLB6ek= -github.com/tklauser/numcpus v0.2.1 h1:ct88eFm+Q7m2ZfXJdan1xYoXKlmwsfP+k88q05KvlZc= -github.com/tklauser/numcpus v0.2.1/go.mod h1:9aU+wOc6WjUIZEwWMP62PL/41d65P+iks1gBkr4QyP8= +github.com/tklauser/go-sysconf v0.3.6 h1:oc1sJWvKkmvIxhDHeKWvZS4f6AW+YcoguSfRF2/Hmo4= +github.com/tklauser/go-sysconf v0.3.6/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI= +github.com/tklauser/numcpus v0.2.2 h1:oyhllyrScuYI6g+h/zUvNXNp1wy7x8qQy3t/piefldA= +github.com/tklauser/numcpus v0.2.2/go.mod h1:x3qojaO3uyYt0i56EW/VUYs7uBvdl2fkfZFu0T9wgjM= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -1419,11 +1419,11 @@ golang.org/x/sys v0.0.0-20201223074533-0d417f636930/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 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-20210316164454-77fc1eacc6aa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From 064257c0ffd3e3a757ac67514393cd72940380fc Mon Sep 17 00:00:00 2001 From: minikube-bot <minikube-bot@google.com> Date: Tue, 6 Jul 2021 23:50:19 +0000 Subject: [PATCH 15/31] Update auto-generated docs and translations --- site/content/en/docs/contrib/errorcodes.en.md | 38 ++----------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/site/content/en/docs/contrib/errorcodes.en.md b/site/content/en/docs/contrib/errorcodes.en.md index 124bf65e1b..69b480d68e 100644 --- a/site/content/en/docs/contrib/errorcodes.en.md +++ b/site/content/en/docs/contrib/errorcodes.en.md @@ -129,14 +129,14 @@ minikube was interrupted by an OS signal "MK_WRONG_BINARY_WSL" (Exit code ExProgramUnsupported) user attempted to run a Windows executable (.exe) inside of WSL rather than using the Linux binary -"MK_WRONG_BINARY_M1" (Exit code ExProgramUnsupported) -user attempted to run an amd64 executable on a darwin/arm64 system - "MK_NEW_APICLIENT" (Exit code ExProgramError) minikube failed to create a new Docker Machine api client +"MK_ADDON_DISABLE" (Exit code ExProgramError) +minikube could not disable an addon, e.g. dashboard addon + "MK_ADDON_ENABLE" (Exit code ExProgramError) -minikube could not enable an addon, e.g dashboard addon +minikube could not enable an addon, e.g. dashboard addon "MK_ADD_CONFIG" (Exit code ExProgramError) minikube failed to update internal configuration, such as the cached images config map @@ -168,21 +168,12 @@ minikube failed to view current config values "MK_DEL_CONFIG" (Exit code ExProgramError) minikybe failed to delete an internal configuration, such as a cached image -"MK_DISABLE" (Exit code ExProgramError) -minikube failed to disable a minikube addon - "MK_DOCKER_SCRIPT" (Exit code ExProgramError) minikube failed to generate script to activate minikube docker-env -"MK_ENABLE" (Exit code ExProgramError) -minkube failed to enable a minikube addon - "MK_BIND_FLAGS" (Exit code ExProgramError) an error occurred when viper attempted to bind flags to configuration -"MK_FLAGS_SET" (Exit code ExProgramError) -an error occurred when setting cofniguration flags (currently not in use) - "MK_FORMAT_USAGE" (Exit code ExProgramError) minkube was passed an invalid format string in the --format flag @@ -198,9 +189,6 @@ minikube failed to create a Kubernetes client set which is necessary for queryin "MK_LIST_CONFIG" (Exit code ExProgramError) minikube failed to list some configuration data -"MK_LOGTOSTDERR_FLAG" (Exit code ExProgramError) -minikube failed to write logs to stdout (currently not in use) - "MK_LOG_FOLLOW" (Exit code ExProgramError) minikube failed to follow or watch minikube logs @@ -228,9 +216,6 @@ minikube failed to output JSON-formatted minikube status "MK_STATUS_TEXT" (Exit code ExProgramError) minikube failed to output minikube status text -"MK_UNSET_SCRIPT" (Exit code ExProgramError) -minikube failed to generate script to deactivate minikube docker-env - "MK_VIEW_EXEC" (Exit code ExProgramError) minikube failed to execute (i.e. fill in values for) a view template for displaying current config @@ -309,9 +294,6 @@ minikube failed to delete cached images from host "HOST_KILL_MOUNT_PROC" (Exit code ExHostError) minikube failed to kill a mount process -"HOST_KUBECNOFIG_UNSET" (Exit code ExHostConfig) -minikube failed to unset host Kubernetes resources config - "HOST_KUBECONFIG_UPDATE" (Exit code ExHostConfig) minikube failed to update host Kubernetes resources config @@ -375,9 +357,6 @@ the driver in use is being run as root "DRV_NEEDS_ROOT" (Exit code ExDriverPermission) the specified driver needs to be run as root -"DRV_NEEDS_ADMINISTRATOR" (Exit code ExDriverPermission) -the specified driver needs to be run as administrator - "GUEST_CACHE_LOAD" (Exit code ExGuestError) minikube failed to load cached images @@ -480,9 +459,6 @@ minikube failed to cache the kubectl binary "INET_CACHE_TAR" (Exit code ExInternetError) minikube failed to cache required images to tar files -"INET_GET_VERSIONS" (Exit code ExInternetError) -minikube failed to get required versions for binaries in use - "INET_REPO" (Exit code ExInternetError) minikube was unable to access main repository and mirrors for images @@ -501,9 +477,6 @@ minikube failed to enable the current container runtime "RUNTIME_CACHE" (Exit code ExRuntimeError) minikube failed to cache images for the current container runtime -"RUNTIME_RESTART" (Exit code ExRuntimeError) -minikube failed to restart the current container runtime - "SVC_CHECK_TIMEOUT" (Exit code ExSvcTimeout) service check timed out while starting minikube dashboard @@ -531,9 +504,6 @@ user attempted to use a command that is not supported by the driver currently in "ENV_MULTINODE_CONFLICT" (Exit code ExGuestConflict) user attempted to run a command that is not supported on multi-node setup without some additional configuration -"ENV_DOCKER_UNAVAILABLE" (Exit code ExRuntimeUnavailable) -the docker service was unavailable to the cluster - "ENV_PODMAN_UNAVAILABLE" (Exit code ExRuntimeUnavailable) the podman service was unavailable to the cluster From ae294d2067daa3c8a6469bb1d950bd0fd597354d Mon Sep 17 00:00:00 2001 From: Andriy Dzikh <andriydzikh@gmail.com> Date: Wed, 7 Jul 2021 09:21:00 -0700 Subject: [PATCH 16/31] Make sync_tests.sh remove any _integration suffix. --- hack/jenkins/test-flake-chart/sync_tests.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hack/jenkins/test-flake-chart/sync_tests.sh b/hack/jenkins/test-flake-chart/sync_tests.sh index 2bab1fd8f9..b44002cd31 100644 --- a/hack/jenkins/test-flake-chart/sync_tests.sh +++ b/hack/jenkins/test-flake-chart/sync_tests.sh @@ -39,9 +39,10 @@ set -eu -o pipefail FINISHED_LIST_REMOTE="${BUCKET_PATH}/finished_environments_${ROOT_JOB_ID}.txt" # Ensure FINISHED_LIST_REMOTE exists so we can append (but don't erase any existing entries in FINISHED_LIST_REMOTE) < /dev/null gsutil cp -n - "${FINISHED_LIST_REMOTE}" -# Copy the job name to APPEND_TMP +# Copy the job name to APPEND_TMP. If the job name ends in "_integration" remove it. APPEND_TMP="${BUCKET_PATH}/$(basename $(mktemp))" echo "${UPSTREAM_JOB}"\ + | sed -r 's/_integration$//'\ | gsutil cp - "${APPEND_TMP}" # Append job name to remote finished list. gsutil compose "${FINISHED_LIST_REMOTE}" "${APPEND_TMP}" "${FINISHED_LIST_REMOTE}" From 2b5fce0b176a52d043d9ee5acee2f350dd351c85 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh <andriydzikh@gmail.com> Date: Wed, 7 Jul 2021 10:47:44 -0700 Subject: [PATCH 17/31] Create Github Action automation of update-leaderboard. --- .github/workflows/leaderboard.yml | 40 +++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 .github/workflows/leaderboard.yml diff --git a/.github/workflows/leaderboard.yml b/.github/workflows/leaderboard.yml new file mode 100644 index 0000000000..1170b9c9e3 --- /dev/null +++ b/.github/workflows/leaderboard.yml @@ -0,0 +1,40 @@ +name: "update-leaderboard" +on: + push: + tags-ignore: + - 'v*-beta.*' + release: + types: [published] +jobs: + update-leaderboard: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Update Leaderboard + id: leaderboard + run: | + make update-leaderboard + echo "::set-output name=changes::$(git status --porcelain)" + - name: Create PR + if: ${{ steps.leaderboard.outputs.changes != '' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.MINIKUBE_BOT_PAT }} + commit-message: Update leaderboard + committer: minikube-bot <minikube-bot@google.com> + author: minikube-bot <minikube-bot@google.com> + branch: leaderboard + push-to-fork: minikube-bot/minikube + base: master + delete-branch: true + title: 'Update leaderboard' + body: | + Committing changes resulting from `make update-leaderboard`. + This PR is auto-generated by the [update-leaderboard](https://github.com/kubernetes/minikube/blob/master/.github/workflows/leaderboard.yml) CI workflow. + ``` + ${{ steps.leaderboard.outputs.changes }} + ``` \ No newline at end of file From 50e07ae7ec66621a550daff4422c042ea3daf6a2 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh <andriydzikh@gmail.com> Date: Wed, 7 Jul 2021 11:19:35 -0700 Subject: [PATCH 18/31] Move environment start saving up in minikube_set_pending. --- hack/jenkins/minikube_set_pending.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/hack/jenkins/minikube_set_pending.sh b/hack/jenkins/minikube_set_pending.sh index 7aaa745a29..3c998f8398 100755 --- a/hack/jenkins/minikube_set_pending.sh +++ b/hack/jenkins/minikube_set_pending.sh @@ -26,11 +26,6 @@ set -eux -o pipefail -if [ "${ghprbPullId}" == "master" ]; then - echo "not setting github status for continuous builds" - exit 0 -fi - jobs=( 'Hyperkit_macOS' # 'Hyper-V_Windows' @@ -54,6 +49,15 @@ jobs=( 'Docker_Cloud_Shell' ) +SHORT_COMMIT=${ghprbActualCommit:0:7} +STARTED_LIST_REMOTE="gs://minikube-builds/logs/${ghprbPullId}/${SHORT_COMMIT}/started_environments_${BUILD_NUMBER}.txt" +printf "%s\n" "${jobs[@]}" | gsutil cp - "${STARTED_LIST_REMOTE}" + +if [ "${ghprbPullId}" == "master" ]; then + echo "not setting github status for continuous builds" + exit 0 +fi + # retry_github_status provides reliable github status updates function retry_github_status() { local commit=$1 @@ -88,11 +92,7 @@ function retry_github_status() { done } -SHORT_COMMIT=${ghprbActualCommit:0:7} for j in ${jobs[@]}; do retry_github_status "${ghprbActualCommit}" "${j}" "pending" "${access_token}" \ "https://storage.googleapis.com/minikube-builds/logs/${ghprbPullId}/${SHORT_COMMIT}/${j}.pending" done - -STARTED_LIST_REMOTE="gs://minikube-builds/logs/${ghprbPullId}/${SHORT_COMMIT}/started_environments_${BUILD_NUMBER}.txt" -printf "%s\n" "${jobs[@]}" | gsutil cp - "${STARTED_LIST_REMOTE}" From 69148296d4eb619b79d391432a1bcdf52922ecb7 Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Wed, 7 Jul 2021 14:40:47 -0700 Subject: [PATCH 19/31] Make required changes to release v1.22.0 --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ Makefile | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d76cf2cf4c..ab0ded5a07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # Release Notes +## Version 1.22.0 - 2021-07-07 + +Features: +* `minikube version`: add `--components` flag to list all included software [#11843](https://github.com/kubernetes/minikube/pull/11843) + +Minor Improvements: +* auto-pause: add support for other container runtimes [#11834](https://github.com/kubernetes/minikube/pull/11834) +* windows: support renaming binary to `kubectl.exe` and running as kubectl [#11819](https://github.com/kubernetes/minikube/pull/11819) + +Bugs: +* Fix "kubelet Default-Start contains no runlevels" error [#11815](https://github.com/kubernetes/minikube/pull/11815) + +Version Upgrades: +* bump default kubernetes version to v1.21.2 & newest kubernetes version to v1.22.0-beta.0 [#11901](https://github.com/kubernetes/minikube/pull/11901) + +For a more detailed changelog, including changes occuring in pre-release versions, see [CHANGELOG.md](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md). + +Thank you to our contributors for this release! + +- Anders F Björklund +- Andriy Dzikh +- Dakshraj Sharma +- Ilya Zuyev +- Jeff MAURY +- Maxime Kjaer +- Medya Ghazizadeh +- Rajwinder Mahal +- Sharif Elgamal +- Steven Powell + +Thank you to our PR reviewers for this release! + +- medyagh (27 comments) +- sharifelgamal (10 comments) +- andriyDev (5 comments) +- spowelljr (4 comments) +- ilya-zuyev (3 comments) + +Thank you to our triage members for this release! + +- medyagh (16 comments) +- spowelljr (7 comments) +- afbjorklund (4 comments) +- mahalrs (4 comments) +- sharifelgamal (3 comments) + ## Version 1.22.0-beta.0 - 2021-06-28 Features: diff --git a/Makefile b/Makefile index 72a09df818..29f8822abe 100644 --- a/Makefile +++ b/Makefile @@ -15,7 +15,7 @@ # Bump these on release - and please check ISO_VERSION for correctness. VERSION_MAJOR ?= 1 VERSION_MINOR ?= 22 -VERSION_BUILD ?= 0-beta.0 +VERSION_BUILD ?= 0 RAW_VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD) VERSION ?= v$(RAW_VERSION) From af60c5de9049a9b22e08d42195b52589f158a171 Mon Sep 17 00:00:00 2001 From: minikube-bot <minikube-bot@google.com> Date: Wed, 7 Jul 2021 14:59:10 -0700 Subject: [PATCH 20/31] Update releases.json to include v1.22.0 --- deploy/minikube/releases.json | 8 ++++++++ site/content/en/docs/_index.md | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/deploy/minikube/releases.json b/deploy/minikube/releases.json index af0d047a75..14d9feb5d3 100644 --- a/deploy/minikube/releases.json +++ b/deploy/minikube/releases.json @@ -1,4 +1,12 @@ [ + { + "name": "v1.22.0", + "checksums": { + "darwin": "932a278393cdcb90bff79c4e49d72c1c34910a71010f1466ce92f51d8332fb58", + "linux": "7579e5763a4e441500e5709eb058384c9cfe9c9dd888b39905b2cdf3d30fbf36", + "windows": "8764ca0e290b4420c5ec82371bcc1b542990a93bdf771578623554be32319d08" + } + }, { "name": "v1.21.0", "checksums": { diff --git a/site/content/en/docs/_index.md b/site/content/en/docs/_index.md index 69776d0fe3..5fdd320072 100644 --- a/site/content/en/docs/_index.md +++ b/site/content/en/docs/_index.md @@ -11,7 +11,7 @@ minikube quickly sets up a local Kubernetes cluster on macOS, Linux, and Windows  -🎉 Latest Release: v1.21.0 - Jun 11, 2021 ([changelog](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md)) +🎉 Latest Release: v1.22.0 - Jul 07, 2021 ([changelog](https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md)) ## Highlights From bc7995f81b487aa126e23b821d59a1c1822a8317 Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Wed, 7 Jul 2021 15:14:53 -0700 Subject: [PATCH 21/31] update contact to Medya --- hack/jenkins/release_update_brew.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/release_update_brew.sh b/hack/jenkins/release_update_brew.sh index ee10433ec5..8032533d9c 100755 --- a/hack/jenkins/release_update_brew.sh +++ b/hack/jenkins/release_update_brew.sh @@ -51,7 +51,7 @@ cd "${SRC_DIR}" brew bump-formula-pr \ --strict minikube \ --revision="${revision}" \ - --message="This PR was automatically created by minikube release scripts. Contact @tstromberg with any questions." \ + --message="This PR was automatically created by minikube release scripts. Contact @medyagh with any questions." \ --no-browse \ --tag="${TAG}" \ && status=0 || status=$? From e1f2679f7070b79521dd747ff87882b844e5eafe Mon Sep 17 00:00:00 2001 From: Medya Gh <medya@google.com> Date: Wed, 7 Jul 2021 19:05:43 -0400 Subject: [PATCH 22/31] add twitter to site footer --- site/config.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/site/config.toml b/site/config.toml index 3e6c1da9db..1b61223354 100644 --- a/site/config.toml +++ b/site/config.toml @@ -129,6 +129,13 @@ no = 'Sorry to hear that. Please <a href="https://github.com/kubernetes/minikube icon = "fas fa-envelope" desc = "Interact with the minikube users here" +[[params.links.user]] + name = "twitter" + url = "https://twitter.com/minikube_dev" + icon = "fas fa-twitter" + desc = "Follow minikube's official twitter for news/releases" + + # Developer relevant links. These will show up on right side of footer and in the community page if you have one. [[params.links.developer]] name = "GitHub" From 1348ae86444ce3fae17b7cf50208b46a81f01ee0 Mon Sep 17 00:00:00 2001 From: Medya Gh <medya@google.com> Date: Wed, 7 Jul 2021 19:10:51 -0400 Subject: [PATCH 23/31] icon --- site/config.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/config.toml b/site/config.toml index 1b61223354..96d504946a 100644 --- a/site/config.toml +++ b/site/config.toml @@ -132,7 +132,7 @@ no = 'Sorry to hear that. Please <a href="https://github.com/kubernetes/minikube [[params.links.user]] name = "twitter" url = "https://twitter.com/minikube_dev" - icon = "fas fa-twitter" + icon = "fab fa-twitter" desc = "Follow minikube's official twitter for news/releases" From e4c21af8fb4ab776c5d00efb00ce0689d0148513 Mon Sep 17 00:00:00 2001 From: Rajwinder Mahal <rajwinder@mahal.dev> Date: Wed, 7 Jul 2021 16:33:45 -0700 Subject: [PATCH 24/31] Fix typo in README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9d08c8953a..a42a6b16a9 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ minikube runs the latest stable release of Kubernetes, with support for standard * [Persistent Volumes](https://minikube.sigs.k8s.io/docs/handbook/persistent_volumes/) * [Ingress](https://kubernetes.io/docs/tasks/access-application-cluster/ingress-minikube/) * [Dashboard](https://minikube.sigs.k8s.io/docs/handbook/dashboard/) - `minikube dashboard` -* [Container runtimes](https://minikube.sigs.k8s.io/docs/handbook/config/#runtime-configuration) - `start --container-runtime` +* [Container runtimes](https://minikube.sigs.k8s.io/docs/handbook/config/#runtime-configuration) - `minikube start --container-runtime` * [Configure apiserver and kubelet options](https://minikube.sigs.k8s.io/docs/handbook/config/#modifying-kubernetes-defaults) via command-line flags As well as developer-friendly features: From 0da9c4b4c1cea1204df1d3808af8dd2b1d47d759 Mon Sep 17 00:00:00 2001 From: Rajwinder Mahal <rajwinder@mahal.dev> Date: Wed, 7 Jul 2021 16:35:16 -0700 Subject: [PATCH 25/31] Fix typo in multinode_test.go --- test/integration/multinode_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/multinode_test.go b/test/integration/multinode_test.go index d4fc80220e..3a2964edb5 100644 --- a/test/integration/multinode_test.go +++ b/test/integration/multinode_test.go @@ -466,13 +466,13 @@ func validateDeployAppToMultiNode(ctx context.Context, t *testing.T, profile str _, err = Run(t, exec.CommandContext(ctx, Target(), "kubectl", "-p", profile, "--", "rollout", "status", "deployment/busybox")) if err != nil { - t.Errorf("failed to delploy busybox to multinode cluster") + t.Errorf("failed to deploy busybox to multinode cluster") } // resolve Pod IPs rr, err := Run(t, exec.CommandContext(ctx, Target(), "kubectl", "-p", profile, "--", "get", "pods", "-o", "jsonpath='{.items[*].status.podIP}'")) if err != nil { - t.Errorf("failed retrieve Pod IPs") + t.Errorf("failed to retrieve Pod IPs") } podIPs := strings.Split(strings.Trim(rr.Stdout.String(), "'"), " ") if len(podIPs) != 2 { From 3403648ddcc7e887efacec650f4387f01a4637f1 Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Wed, 7 Jul 2021 16:59:31 -0700 Subject: [PATCH 26/31] update creating PR for time-to-k8s --- .github/workflows/time-to-k8s.yml | 16 +++++++++++++++- hack/benchmark/time-to-k8s/time-to-k8s.sh | 15 --------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/.github/workflows/time-to-k8s.yml b/.github/workflows/time-to-k8s.yml index 18762b1093..a664f683c0 100644 --- a/.github/workflows/time-to-k8s.yml +++ b/.github/workflows/time-to-k8s.yml @@ -18,4 +18,18 @@ jobs: stable: true - name: Benchmark run: | - ./hack/benchmark/time-to-k8s/time-to-k8s.sh ${{ secrets.MINIKUBE_BOT_PAT }} + ./hack/benchmark/time-to-k8s/time-to-k8s.sh + echo "::set-output name=version::$(minikube version --short)" + - name: Create PR + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.MINIKUBE_BOT_PAT }} + commit-message: add time-to-k8s benchmark for ${{ steps.gendocs.outputs.version }} + committer: minikube-bot <minikube-bot@google.com> + author: minikube-bot <minikube-bot@google.com> + branch: addTimeToK8s${{ steps.gendocs.outputs.version }} + push-to-fork: minikube-bot/minikube + base: master + delete-branch: true + title: Add time-to-k8s benchmark for ${{ steps.gendocs.outputs.version }} + body: Updating time-to-k8s benchmark as part of the release process diff --git a/hack/benchmark/time-to-k8s/time-to-k8s.sh b/hack/benchmark/time-to-k8s/time-to-k8s.sh index c074eb4026..ace4521c4b 100755 --- a/hack/benchmark/time-to-k8s/time-to-k8s.sh +++ b/hack/benchmark/time-to-k8s/time-to-k8s.sh @@ -31,13 +31,6 @@ install_minikube() { sudo install ./out/minikube /usr/local/bin/minikube } -install_gh() { - export access_token="$1" - - # Make sure gh is installed and configured - ./hack/jenkins/installers/check_install_gh.sh -} - config_git() { git config user.name "minikube-bot" git config user.email "minikube-bot@google.com" @@ -67,16 +60,9 @@ commit_changes() { git commit -m "add time-to-k8s benchmark for $1" } -create_pr() { - git remote add minikube-bot https://minikube-bot:"$2"@github.com/minikube-bot/minikube.git - git push -u minikube-bot addTimeToK8s"$1" - gh pr create --repo kubernetes/minikube --base master --title "Add time-to-k8s benchmark for $1" --body "Updating time-to-k8s benchmark as part of the release process" -} - install_kind install_k3d install_minikube -install_gh "$1" config_git VERSION=$(minikube version --short) @@ -85,4 +71,3 @@ run_benchmark generate_chart "$VERSION" create_page "$VERSION" commit_changes "$VERSION" -create_pr "$VERSION" "$1" From 853cc04fd2520307d63ee280628338838827f84b Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Thu, 8 Jul 2021 10:29:19 -0700 Subject: [PATCH 27/31] update time-to-k8s repo --- hack/benchmark/time-to-k8s/time-to-k8s-repo | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/benchmark/time-to-k8s/time-to-k8s-repo b/hack/benchmark/time-to-k8s/time-to-k8s-repo index 72506e9487..f6f6b2db9e 160000 --- a/hack/benchmark/time-to-k8s/time-to-k8s-repo +++ b/hack/benchmark/time-to-k8s/time-to-k8s-repo @@ -1 +1 @@ -Subproject commit 72506e948764aeeafc01e58e6bec0ea741c61ca0 +Subproject commit f6f6b2db9e718f7c9af698b6247b232a7251522f From 5e456fd996ad40fd1752877969fc47b90929511b Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Thu, 8 Jul 2021 11:58:04 -0700 Subject: [PATCH 28/31] allow manual triggering of GitHub Actions --- .github/workflows/build.yml | 1 + .github/workflows/docs.yml | 1 + .github/workflows/leaderboard.yml | 3 ++- .github/workflows/master.yml | 1 + .github/workflows/pr.yml | 1 + .github/workflows/pr_verified.yaml | 1 + .github/workflows/time-to-k8s.yml | 1 + .github/workflows/translations.yml | 1 + .github/workflows/twitter-bot.yml | 3 ++- .github/workflows/update-k8s-versions.yml | 1 + 10 files changed, 12 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ef19d0102d..a53bdca6ca 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,6 @@ name: build on: + workflow_dispatch: push: branches: - master diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 5ba1f50ae7..9f5139c41b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -1,5 +1,6 @@ name: "generate-docs" on: + workflow_dispatch: push: branches: - master diff --git a/.github/workflows/leaderboard.yml b/.github/workflows/leaderboard.yml index 1170b9c9e3..47fb3f0713 100644 --- a/.github/workflows/leaderboard.yml +++ b/.github/workflows/leaderboard.yml @@ -1,5 +1,6 @@ name: "update-leaderboard" on: + workflow_dispatch: push: tags-ignore: - 'v*-beta.*' @@ -37,4 +38,4 @@ jobs: This PR is auto-generated by the [update-leaderboard](https://github.com/kubernetes/minikube/blob/master/.github/workflows/leaderboard.yml) CI workflow. ``` ${{ steps.leaderboard.outputs.changes }} - ``` \ No newline at end of file + ``` diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index a98f97bc9e..49f1a384a0 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -1,5 +1,6 @@ name: Master on: + workflow_dispatch: push: branches: - master diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 4f0280d88a..27d1af6884 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -1,5 +1,6 @@ name: PR on: + workflow_dispatch: pull_request: paths: - "go.mod" diff --git a/.github/workflows/pr_verified.yaml b/.github/workflows/pr_verified.yaml index 7b674572ce..17e6e5b5cd 100644 --- a/.github/workflows/pr_verified.yaml +++ b/.github/workflows/pr_verified.yaml @@ -1,5 +1,6 @@ name: PR_Verified on: + workflow_dispatch: pull_request: paths: - "go.mod" diff --git a/.github/workflows/time-to-k8s.yml b/.github/workflows/time-to-k8s.yml index a664f683c0..9411c79aa7 100644 --- a/.github/workflows/time-to-k8s.yml +++ b/.github/workflows/time-to-k8s.yml @@ -1,5 +1,6 @@ name: "time-to-k8s benchmark" on: + workflow_dispatch: release: types: [released] env: diff --git a/.github/workflows/translations.yml b/.github/workflows/translations.yml index 1287f0dc35..97360d0857 100644 --- a/.github/workflows/translations.yml +++ b/.github/workflows/translations.yml @@ -1,5 +1,6 @@ name: Translations Validation on: + workflow_dispatch: pull_request: paths: - "translations/**" diff --git a/.github/workflows/twitter-bot.yml b/.github/workflows/twitter-bot.yml index 315718b332..1a7c97b56a 100644 --- a/.github/workflows/twitter-bot.yml +++ b/.github/workflows/twitter-bot.yml @@ -1,5 +1,6 @@ name: "Tweet the release" on: + workflow_dispatch: push: tags: - 'v*' @@ -15,4 +16,4 @@ jobs: consumer-key: ${{ secrets.TWITTER_API_KEY }} consumer-secret: ${{ secrets.TWITTER_API_SECRET }} access-token: ${{ secrets.TWITTER_ACCESS_TOKEN }} - access-token-secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} \ No newline at end of file + access-token-secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} diff --git a/.github/workflows/update-k8s-versions.yml b/.github/workflows/update-k8s-versions.yml index c421c0a5be..03a9eaeeed 100644 --- a/.github/workflows/update-k8s-versions.yml +++ b/.github/workflows/update-k8s-versions.yml @@ -1,5 +1,6 @@ name: "update-kubernetes-versions" on: + workflow_dispatch: schedule: # every Monday at around 1 am pacific/8 am UTC - cron: "0 8 * * 1" From bb1cffe96a44030751e582a37241dc5e557f0383 Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Thu, 8 Jul 2021 13:42:22 -0700 Subject: [PATCH 29/31] remove commands handled by the GitHub Action --- hack/benchmark/time-to-k8s/time-to-k8s.sh | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/hack/benchmark/time-to-k8s/time-to-k8s.sh b/hack/benchmark/time-to-k8s/time-to-k8s.sh index ace4521c4b..c6015b05d2 100755 --- a/hack/benchmark/time-to-k8s/time-to-k8s.sh +++ b/hack/benchmark/time-to-k8s/time-to-k8s.sh @@ -31,15 +31,6 @@ install_minikube() { sudo install ./out/minikube /usr/local/bin/minikube } -config_git() { - git config user.name "minikube-bot" - git config user.email "minikube-bot@google.com" -} - -create_branch() { - git checkout -b addTimeToK8s"$1" -} - run_benchmark() { pwd ( cd ./hack/benchmark/time-to-k8s/time-to-k8s-repo/ && @@ -55,19 +46,11 @@ create_page() { printf -- "---\ntitle: \"%s Benchmark\"\nlinkTitle: \"%s Benchmark\"\nweight: 1\n---\n\n\n" "$1" "$1" "$1" > ./site/content/en/docs/benchmarks/timeToK8s/"$1".md } -commit_changes() { - git add ./site/static/images/benchmarks/timeToK8s/"$1".png ./site/content/en/docs/benchmarks/timeToK8s/"$1".md - git commit -m "add time-to-k8s benchmark for $1" -} - install_kind install_k3d install_minikube -config_git VERSION=$(minikube version --short) -create_branch "$VERSION" run_benchmark generate_chart "$VERSION" create_page "$VERSION" -commit_changes "$VERSION" From 71e4495a76341aebb1dad9ee21cc06959af4a7c7 Mon Sep 17 00:00:00 2001 From: Steven Powell <spowellgrr@gmail.com> Date: Thu, 8 Jul 2021 14:01:09 -0700 Subject: [PATCH 30/31] add cleanup --- hack/benchmark/time-to-k8s/time-to-k8s.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hack/benchmark/time-to-k8s/time-to-k8s.sh b/hack/benchmark/time-to-k8s/time-to-k8s.sh index c6015b05d2..cdce28dee4 100755 --- a/hack/benchmark/time-to-k8s/time-to-k8s.sh +++ b/hack/benchmark/time-to-k8s/time-to-k8s.sh @@ -46,6 +46,10 @@ create_page() { printf -- "---\ntitle: \"%s Benchmark\"\nlinkTitle: \"%s Benchmark\"\nweight: 1\n---\n\n\n" "$1" "$1" "$1" > ./site/content/en/docs/benchmarks/timeToK8s/"$1".md } +cleanup() { + rm ./hack/benchmark/time-to-k8s/time-to-k8s-repo/output.csv +} + install_kind install_k3d install_minikube @@ -54,3 +58,4 @@ VERSION=$(minikube version --short) run_benchmark generate_chart "$VERSION" create_page "$VERSION" +cleanup From 7502ffb2297b50384a475eacbc172219c1524dab Mon Sep 17 00:00:00 2001 From: minikube-bot <minikube-bot@google.com> Date: Fri, 9 Jul 2021 00:20:19 +0000 Subject: [PATCH 31/31] add time-to-k8s benchmark for --- .../en/docs/benchmarks/timeToK8s/v1.22.0.md | 7 +++++++ .../images/benchmarks/timeToK8s/v1.22.0.png | Bin 0 -> 35371 bytes 2 files changed, 7 insertions(+) create mode 100644 site/content/en/docs/benchmarks/timeToK8s/v1.22.0.md create mode 100644 site/static/images/benchmarks/timeToK8s/v1.22.0.png diff --git a/site/content/en/docs/benchmarks/timeToK8s/v1.22.0.md b/site/content/en/docs/benchmarks/timeToK8s/v1.22.0.md new file mode 100644 index 0000000000..170e37e62d --- /dev/null +++ b/site/content/en/docs/benchmarks/timeToK8s/v1.22.0.md @@ -0,0 +1,7 @@ +--- +title: "v1.22.0 Benchmark" +linkTitle: "v1.22.0 Benchmark" +weight: 1 +--- + + diff --git a/site/static/images/benchmarks/timeToK8s/v1.22.0.png b/site/static/images/benchmarks/timeToK8s/v1.22.0.png new file mode 100644 index 0000000000000000000000000000000000000000..f5656c515d4f90d1ca02f28e94a35bcb238904e0 GIT binary patch literal 35371 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 literal 0 HcmV?d00001