From 445684d44d270c8f6bfd1c7e92bf72228cebf7e2 Mon Sep 17 00:00:00 2001 From: dmpe Date: Sat, 5 Jun 2021 19:17:24 +0200 Subject: [PATCH 01/28] fix(start): minikube start with --image-repository: add new test for URLs with ports, fixing fix validation logic --- cmd/minikube/cmd/start.go | 35 ++++++++++++++++++++++++---------- cmd/minikube/cmd/start_test.go | 24 +++++++++++++---------- 2 files changed, 39 insertions(+), 20 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 0d4f574e29..59d50f1f59 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1263,26 +1263,41 @@ func validateRegistryMirror() { // This function validates if the --image-repository // args match the format of registry.cn-hangzhou.aliyuncs.com/google_containers -func validateImageRepository(imagRepo string) (vaildImageRepo string) { +// also "[:]" +func validateImageRepository(imageRepo string) (validImageRepo string) { - if strings.ToLower(imagRepo) == "auto" { - vaildImageRepo = "auto" + if strings.ToLower(imageRepo) == "auto" { + validImageRepo = "auto" } - URL, err := url.Parse(imagRepo) + URL, err := url.Parse(imageRepo) + if err != nil { klog.Errorln("Error Parsing URL: ", err) } - // tips when imagRepo ended with a trailing /. - if strings.HasSuffix(imagRepo, "/") { + + var hasPorts = false + var imageRepoPort string + + if URL.Port() != "" && strings.Contains(imageRepo, ":"+URL.Port()) { + hasPorts = true + imageRepoPort = ":" + URL.Port() + } + // tips when imageRepo ended with a trailing /. + if strings.HasSuffix(imageRepo, "/") { out.Infof("The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically") } - // tips when imageRepo started with scheme. + // tips when imageRepo started with scheme "http(s)". if URL.Scheme != "" { - out.Infof("The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically", out.V{"scheme": URL.Scheme}) + out.Infof("The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically", out.V{"scheme": URL.Scheme}) } - vaildImageRepo = URL.Hostname() + strings.TrimSuffix(URL.Path, "/") - return + if hasPorts { + validImageRepo = URL.Hostname() + imageRepoPort + strings.TrimSuffix(URL.Path, "/") + } else { + validImageRepo = URL.Hostname() + strings.TrimSuffix(URL.Path, "/") + } + + return validImageRepo } // This function validates if the --listen-address diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go index 5d03d3d95c..c7d4b59e0d 100644 --- a/cmd/minikube/cmd/start_test.go +++ b/cmd/minikube/cmd/start_test.go @@ -320,40 +320,44 @@ func TestBaseImageFlagDriverCombo(t *testing.T) { func TestValidateImageRepository(t *testing.T) { var tests = []struct { imageRepository string - vaildImageRepository string + validImageRepository string }{ { imageRepository: "auto", - vaildImageRepository: "auto", + validImageRepository: "auto", }, { imageRepository: "http://registry.test.com/google_containers/", - vaildImageRepository: "registry.test.com/google_containers", + validImageRepository: "registry.test.com/google_containers", }, { imageRepository: "https://registry.test.com/google_containers/", - vaildImageRepository: "registry.test.com/google_containers", + validImageRepository: "registry.test.com/google_containers", }, { imageRepository: "registry.test.com/google_containers/", - vaildImageRepository: "registry.test.com/google_containers", + validImageRepository: "registry.test.com/google_containers", }, { imageRepository: "http://registry.test.com/google_containers", - vaildImageRepository: "registry.test.com/google_containers", + validImageRepository: "registry.test.com/google_containers", }, { imageRepository: "https://registry.test.com/google_containers", - vaildImageRepository: "registry.test.com/google_containers", + validImageRepository: "registry.test.com/google_containers", + }, + { + imageRepository: "https://registry.test.com:6666/google_containers", + validImageRepository: "registry.test.com:6666/google_containers", }, } for _, test := range tests { t.Run(test.imageRepository, func(t *testing.T) { - vaildImageRepository := validateImageRepository(test.imageRepository) - if vaildImageRepository != test.vaildImageRepository { + validImageRepository := validateImageRepository(test.imageRepository) + if validImageRepository != test.validImageRepository { t.Errorf("validateImageRepository(imageRepo=%v): got %v, expected %v", - test.imageRepository, vaildImageRepository, test.vaildImageRepository) + test.imageRepository, validImageRepository, test.validImageRepository) } }) } From 8badb789e8a62149edb9545acacacce00443c407 Mon Sep 17 00:00:00 2001 From: dmpe Date: Sat, 5 Jun 2021 20:59:52 +0200 Subject: [PATCH 02/28] smaller documentation fix --- cmd/minikube/cmd/start.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 59d50f1f59..8e980e7e7f 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1286,7 +1286,7 @@ func validateImageRepository(imageRepo string) (validImageRepo string) { if strings.HasSuffix(imageRepo, "/") { out.Infof("The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically") } - // tips when imageRepo started with scheme "http(s)". + // tips when imageRepo started with scheme such as http(s). if URL.Scheme != "" { out.Infof("The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically", out.V{"scheme": URL.Scheme}) } From 6f5e85f6bfcaee75a183f8d04f013706e6b74d5d Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Fri, 2 Jul 2021 13:05:44 -0700 Subject: [PATCH 03/28] Move preload existence caching out of checkRemotePreloadExists. --- pkg/minikube/download/download_test.go | 1 - pkg/minikube/download/preload.go | 7 +++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/pkg/minikube/download/download_test.go b/pkg/minikube/download/download_test.go index 3cbe19b6ff..03099dce7d 100644 --- a/pkg/minikube/download/download_test.go +++ b/pkg/minikube/download/download_test.go @@ -208,7 +208,6 @@ func testPreloadExistsCaching(t *testing.T) { checkCalled := false checkRemotePreloadExists = func(k8sVersion, containerRuntime string) bool { checkCalled = true - setPreloadState(k8sVersion, containerRuntime, doesPreloadExist) return doesPreloadExist } existence := PreloadExists("v1", "c1", "docker", true) diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index ce6500d686..48c919f739 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -106,19 +106,16 @@ var checkRemotePreloadExists = func(k8sVersion, containerRuntime string) bool { resp, err := http.Head(url) if err != nil { klog.Warningf("%s fetch error: %v", url, err) - setPreloadState(k8sVersion, containerRuntime, false) return false } // note: err won't be set if it's a 404 if resp.StatusCode != 200 { klog.Warningf("%s status code: %d", url, resp.StatusCode) - setPreloadState(k8sVersion, containerRuntime, false) return false } klog.Infof("Found remote preload: %s", url) - setPreloadState(k8sVersion, containerRuntime, true) return true } @@ -152,7 +149,9 @@ func PreloadExists(k8sVersion, containerRuntime, driverName string, forcePreload return true } - return checkRemotePreloadExists(k8sVersion, containerRuntime) + existence := checkRemotePreloadExists(k8sVersion, containerRuntime) + setPreloadState(k8sVersion, containerRuntime, existence) + return existence } var checkPreloadExists = PreloadExists From c96c69580647cace8c6e3ca188b06f02e728d7f7 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Fri, 2 Jul 2021 13:06:49 -0700 Subject: [PATCH 04/28] Use http.StatusOK instead of 200. --- pkg/minikube/download/preload.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index 48c919f739..b174b1aeca 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -110,7 +110,7 @@ var checkRemotePreloadExists = func(k8sVersion, containerRuntime string) bool { } // note: err won't be set if it's a 404 - if resp.StatusCode != 200 { + if resp.StatusCode != http.StatusOK { klog.Warningf("%s status code: %d", url, resp.StatusCode) return false } From f76b0795d8645a115280dc3d2fd98f7635c3b20a Mon Sep 17 00:00:00 2001 From: Alexandre Garnier Date: Tue, 1 Jun 2021 15:22:15 +0200 Subject: [PATCH 05/28] 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 Date: Thu, 3 Jun 2021 22:57:55 +0200 Subject: [PATCH 06/28] 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 Date: Sat, 3 Jul 2021 16:27:32 +0200 Subject: [PATCH 07/28] 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 3afe680c927e29037985ea75e8fdd4db91afc7f7 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Wed, 7 Jul 2021 13:15:33 -0700 Subject: [PATCH 08/28] Use THE_COMMIT env var instead of ghprbActualCommit. --- hack/jenkins/minikube_set_pending.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/minikube_set_pending.sh b/hack/jenkins/minikube_set_pending.sh index 3c998f8398..a2c81ef5c9 100755 --- a/hack/jenkins/minikube_set_pending.sh +++ b/hack/jenkins/minikube_set_pending.sh @@ -49,7 +49,7 @@ jobs=( 'Docker_Cloud_Shell' ) -SHORT_COMMIT=${ghprbActualCommit:0:7} +SHORT_COMMIT=${THE_COMMIT: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}" From 74d137e76060d0eb33ddc447c190c8e1e0d1cdc4 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Wed, 7 Jul 2021 15:29:05 -0700 Subject: [PATCH 09/28] Use 'gh auth' to get gh token for leaderboard update. --- hack/update_contributions.sh | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/hack/update_contributions.sh b/hack/update_contributions.sh index 9752c29d5c..0ab33a74ec 100755 --- a/hack/update_contributions.sh +++ b/hack/update_contributions.sh @@ -18,11 +18,6 @@ set -eu -o pipefail DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) -if ! [[ -r "${DIR}/gh_token.txt" ]]; then - echo "Missing '${DIR}/gh_token.txt'. Please create a GitHub token at https://github.com/settings/tokens and store in '${DIR}/gh_token.txt'." - exit 1 -fi - install_pullsheet() { pullsheet_workdir="$(mktemp -d)" trap 'rm -rf -- ${pullsheet_workdir}' RETURN @@ -69,11 +64,23 @@ tags_with_range=$( destination="$DIR/../site/content/en/docs/contrib/leaderboard" mkdir -p "$destination" +TMP_TOKEN=$(mktemp) +gh auth status -t 2>&1 | sed -n -r 's/^.*Token: ([a-zA-Z0-9_]*)/\1/p' > "$TMP_TOKEN" +if [ ! -s "$TMP_TOKEN" ]; then + echo "Failed to acquire token from 'gh auth'. Ensure 'gh' is authenticated." 1>&2 + exit 1 +fi +# Ensure the token is deleted when the script exits, so the token is not leaked. +function cleanup_token() { + rm -f "$TMP_TOKEN" +} +trap cleanup_token EXIT + while read -r tag_index tag_name tag_start tag_end; do echo "Generating leaderboard for" "$tag_name" "(from $tag_start to $tag_end)" # Print header for page. printf -- "---\ntitle: \"$tag_name - $tag_end\"\nlinkTitle: \"$tag_name - $tag_end\"\nweight: $tag_index\n---\n" > "$destination/$tag_name.html" # Add pullsheet content (deleting the lines consisting of the command used to generate it). - $DIR/pullsheet leaderboard --token-path "$DIR/gh_token.txt" --repos kubernetes/minikube --since "$tag_start" --until "$tag_end" --logtostderr=false --stderrthreshold=2 \ + $DIR/pullsheet leaderboard --token-path "$TMP_TOKEN" --repos kubernetes/minikube --since "$tag_start" --until "$tag_end" --logtostderr=false --stderrthreshold=2 \ | sed -r -e "/Command\-line/,/pullsheet/d" >> "$destination/$tag_name.html" done <<< "$tags_with_range" From 5a6fe9229b491388b1c1e1f6be3a6a91354a1508 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Wed, 7 Jul 2021 15:51:09 -0700 Subject: [PATCH 10/28] Pass GITHUB_TOKEN env var to update leaderboard script. --- .github/workflows/leaderboard.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/leaderboard.yml b/.github/workflows/leaderboard.yml index 1170b9c9e3..f9e7e52157 100644 --- a/.github/workflows/leaderboard.yml +++ b/.github/workflows/leaderboard.yml @@ -19,6 +19,8 @@ jobs: run: | make update-leaderboard echo "::set-output name=changes::$(git status --porcelain)" + env: + GITHUB_TOKEN: ${{ secrets.MINIKUBE_BOT_PAT }} - name: Create PR if: ${{ steps.leaderboard.outputs.changes != '' }} uses: peter-evans/create-pull-request@v3 From e833905678047bd432388e00785ed5100be55d3b Mon Sep 17 00:00:00 2001 From: balasu Date: Thu, 8 Jul 2021 13:22:01 +0000 Subject: [PATCH 11/28] for portainer add-on --- deploy/addons/assets.go | 4 + deploy/addons/portainer/portainer.yaml.tmpl | 143 ++++++++++++++++++++ pkg/addons/config.go | 5 + pkg/minikube/assets/addons.go | 7 + 4 files changed, 159 insertions(+) create mode 100755 deploy/addons/portainer/portainer.yaml.tmpl mode change 100644 => 100755 pkg/minikube/assets/addons.go diff --git a/deploy/addons/assets.go b/deploy/addons/assets.go index 9031cb4a99..3fa5c6ced3 100644 --- a/deploy/addons/assets.go +++ b/deploy/addons/assets.go @@ -131,4 +131,8 @@ var ( // CsiHostpathDriverAssets assets for csi-hostpath-driver addon //go:embed csi-hostpath-driver/deploy/*.tmpl csi-hostpath-driver/rbac/*.tmpl CsiHostpathDriverAssets embed.FS + + // PortainerAssets assets for portainer addon + //go:embed portainer/portainer.yaml.tmpl + PortainerAssets embed.FS ) diff --git a/deploy/addons/portainer/portainer.yaml.tmpl b/deploy/addons/portainer/portainer.yaml.tmpl new file mode 100755 index 0000000000..32d6a3dca1 --- /dev/null +++ b/deploy/addons/portainer/portainer.yaml.tmpl @@ -0,0 +1,143 @@ +--- +# Source: portainer/templates/namespace.yaml +apiVersion: v1 +kind: Namespace +metadata: + name: portainer +--- +# Source: portainer/templates/serviceaccount.yaml +apiVersion: v1 +kind: ServiceAccount +metadata: + name: portainer-sa-clusteradmin + namespace: portainer + labels: + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + app.kubernetes.io/version: "ce-latest-ee-2.4.0" +--- +# Source: portainer/templates/pvc.yaml +kind: "PersistentVolumeClaim" +apiVersion: "v1" +metadata: + name: portainer + namespace: portainer + annotations: + volume.alpha.kubernetes.io/storage-class: "generic" + labels: + io.portainer.kubernetes.application.stack: portainer + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + app.kubernetes.io/version: "ce-latest-ee-2.4.0" +spec: + accessModes: + - "ReadWriteOnce" + resources: + requests: + storage: "10Gi" +--- +# Source: portainer/templates/rbac.yaml +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: portainer + labels: + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + app.kubernetes.io/version: "ce-latest-ee-2.4.0" +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: cluster-admin +subjects: +- kind: ServiceAccount + namespace: portainer + name: portainer-sa-clusteradmin +--- +# Source: portainer/templates/service.yaml +apiVersion: v1 +kind: Service +metadata: + name: portainer + namespace: portainer + labels: + io.portainer.kubernetes.application.stack: portainer + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + app.kubernetes.io/version: "ce-latest-ee-2.4.0" + kubernetes.io/minikube-addons-endpoint: portainer +spec: + type: NodePort + ports: + - port: 9000 + targetPort: 9000 + protocol: TCP + name: http + nodePort: 30777 + - port: 30776 + targetPort: 30776 + protocol: TCP + name: edge + nodePort: 30776 + selector: + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer +--- +# Source: portainer/templates/deployment.yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: portainer + namespace: portainer + labels: + io.portainer.kubernetes.application.stack: portainer + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + app.kubernetes.io/version: "ce-latest-ee-2.4.0" +spec: + replicas: 1 + strategy: + type: "Recreate" + selector: + matchLabels: + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + template: + metadata: + labels: + app.kubernetes.io/name: portainer + app.kubernetes.io/instance: portainer + spec: + nodeSelector: + {} + serviceAccountName: portainer-sa-clusteradmin + volumes: + - name: "data" + persistentVolumeClaim: + claimName: portainer + containers: + - name: portainer + image: "portainer/portainer-ce:latest" + imagePullPolicy: Always + args: [ '--tunnel-port','30776' ] + volumeMounts: + - name: data + mountPath: /data + ports: + - name: http + containerPort: 9000 + protocol: TCP + - name: tcp-edge + containerPort: 8000 + protocol: TCP + livenessProbe: + httpGet: + path: / + port: 9000 + readinessProbe: + httpGet: + path: / + port: 9000 + resources: + {} + diff --git a/pkg/addons/config.go b/pkg/addons/config.go index a6c060d1d7..7562156cbd 100644 --- a/pkg/addons/config.go +++ b/pkg/addons/config.go @@ -187,4 +187,9 @@ var Addons = []*Addon{ validations: []setFn{IsVolumesnapshotsEnabled}, callbacks: []setFn{EnableOrDisableAddon, verifyAddonStatus}, }, + { + name: "portainer", + set: SetBool, + callbacks: []setFn{EnableOrDisableAddon}, + }, } diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go old mode 100644 new mode 100755 index d249636acc..334946cb20 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -666,6 +666,13 @@ var Addons = map[string]*Addon{ "Snapshotter": "k8s.gcr.io", "Provisioner": "k8s.gcr.io", }), + "portainer": NewAddon([]*BinAsset{ + MustBinAsset(addons.PortainerAssets, + "portainer/portainer.yaml.tmpl", + vmpath.GuestAddonsDir, + "portainer.yaml", + "0640"), + }, false, "portainer", "", nil, nil), } // parseMapString creates a map based on `str` which is encoded as =,=,... From de19bcb77aba1335ca89c3add8bfe93c6e71b382 Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Thu, 8 Jul 2021 18:17:35 +0100 Subject: [PATCH 12/28] Don't strip off container image prefixes --- pkg/minikube/bootstrapper/images/images.go | 8 ++++---- pkg/minikube/bootstrapper/images/repo.go | 8 +++++--- pkg/minikube/node/cache.go | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/pkg/minikube/bootstrapper/images/images.go b/pkg/minikube/bootstrapper/images/images.go index 2d0a13e3a3..4ce501418f 100644 --- a/pkg/minikube/bootstrapper/images/images.go +++ b/pkg/minikube/bootstrapper/images/images.go @@ -138,19 +138,19 @@ func storageProvisioner(mirror string) string { // dashboardFrontend returns the image used for the dashboard frontend func dashboardFrontend(repo string) string { if repo == "" { - repo = "docker.io/kubernetesui" + repo = "docker.io" } // See 'kubernetes-dashboard' in deploy/addons/dashboard/dashboard-dp.yaml - return path.Join(repo, "dashboard:v2.1.0") + return path.Join(repo, "kubernetesui", "dashboard:v2.1.0") } // dashboardMetrics returns the image used for the dashboard metrics scraper func dashboardMetrics(repo string) string { if repo == "" { - repo = "docker.io/kubernetesui" + repo = "docker.io" } // See 'dashboard-metrics-scraper' in deploy/addons/dashboard/dashboard-dp.yaml - return path.Join(repo, "metrics-scraper:v1.0.4") + return path.Join(repo, "kubernetesui", "metrics-scraper:v1.0.4") } // KindNet returns the image used for kindnet diff --git a/pkg/minikube/bootstrapper/images/repo.go b/pkg/minikube/bootstrapper/images/repo.go index ca9e3c366a..d06f0db9a8 100644 --- a/pkg/minikube/bootstrapper/images/repo.go +++ b/pkg/minikube/bootstrapper/images/repo.go @@ -16,6 +16,8 @@ limitations under the License. package images +import "path" + // DefaultKubernetesRepo is the default Kubernetes repository const DefaultKubernetesRepo = "k8s.gcr.io" @@ -29,8 +31,8 @@ func kubernetesRepo(mirror string) string { // minikubeRepo returns the official minikube repository, or an alternate func minikubeRepo(mirror string) string { - if mirror != "" { - return mirror + if mirror == "" { + mirror = "gcr.io" } - return "gcr.io/k8s-minikube" + return path.Join(mirror, "k8s-minikube") } diff --git a/pkg/minikube/node/cache.go b/pkg/minikube/node/cache.go index d58f24ca34..f68df47142 100644 --- a/pkg/minikube/node/cache.go +++ b/pkg/minikube/node/cache.go @@ -120,7 +120,7 @@ func beginDownloadKicBaseImage(g *errgroup.Group, cc *config.ClusterConfig, down g.Go(func() error { baseImg := cc.KicBaseImage if baseImg == kic.BaseImage && len(cc.KubernetesConfig.ImageRepository) != 0 { - baseImg = strings.Replace(baseImg, "gcr.io/k8s-minikube", cc.KubernetesConfig.ImageRepository, 1) + baseImg = strings.Replace(baseImg, "gcr.io", cc.KubernetesConfig.ImageRepository, 1) cc.KicBaseImage = baseImg } var finalImg string From 5e456fd996ad40fd1752877969fc47b90929511b Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 8 Jul 2021 11:58:04 -0700 Subject: [PATCH 13/28] 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 Date: Thu, 8 Jul 2021 13:42:22 -0700 Subject: [PATCH 14/28] 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![time-to-k8s](/images/benchmarks/timeToK8s/%s.png)\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 baa86c389a295fdbc7d5d1d310321615c533f9d9 Mon Sep 17 00:00:00 2001 From: Ilya Zuyev Date: Thu, 8 Jul 2021 13:43:10 -0700 Subject: [PATCH 15/28] fix scripts --- hack/jenkins/common.sh | 6 +++--- .../installers/check_install_golang.sh | 20 +++++++++++++------ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/hack/jenkins/common.sh b/hack/jenkins/common.sh index f1c07e668c..0a04a1cef6 100755 --- a/hack/jenkins/common.sh +++ b/hack/jenkins/common.sh @@ -91,7 +91,7 @@ else fi # installing golang so we could do go get for gopogh -sudo ARCH="$ARCH"./installers/check_install_golang.sh "1.16.4" "/usr/local" || true +ARCH="$ARCH" ./installers/check_install_golang.sh "1.16.4" "/usr/local" || true # install docker and kubectl if not present sudo ARCH="$ARCH" ./installers/check_install_docker.sh || true @@ -444,11 +444,11 @@ if [ -z "${EXTERNAL}" ]; then echo ">> public URL: ${REPORT_URL_BASE}/${JOB_GCS_BUCKET}.json" gsutil -qm cp "${JSON_OUT}" "gs://${JOB_GCS_BUCKET}.json" || true - echo ">> uploading ${HTML_OUT} to ${REPORT_URL_BASE}/${JOB_GCS_BUCKET}.html" + echo ">> uploading ${HTML_OUT} to gs://${JOB_GCS_BUCKET}.html" echo ">> public URL: ${REPORT_URL_BASE}/${JOB_GCS_BUCKET}.html" gsutil -qm cp "${HTML_OUT}" "gs://${JOB_GCS_BUCKET}.html" || true - echo ">> uploading ${SUMMARY_OUT} to ${REPORT_URL_BASE}/${JOB_GCS_BUCKET}_summary.json" + echo ">> uploading ${SUMMARY_OUT} to gs://${JOB_GCS_BUCKET}_summary.json" echo ">> public URL: ${REPORT_URL_BASE}/${JOB_GCS_BUCKET}_summary.json" gsutil -qm cp "${SUMMARY_OUT}" "gs://${JOB_GCS_BUCKET}_summary.json" || true else diff --git a/hack/jenkins/installers/check_install_golang.sh b/hack/jenkins/installers/check_install_golang.sh index 866e1139c3..c927766ad0 100755 --- a/hack/jenkins/installers/check_install_golang.sh +++ b/hack/jenkins/installers/check_install_golang.sh @@ -67,20 +67,28 @@ function check_and_install_golang() { # install_golang takes two parameters version and path to install. function install_golang() { - echo "Installing golang version: $1 on $2" - pushd /tmp >/dev/null + local -r GO_VER="$1" + local -r GO_DIR="$2/go" + echo "Installing golang version: $GO_VER in $GO_DIR" INSTALLOS=linux if [[ "$OSTYPE" == "darwin"* ]]; then INSTALLOS=darwin fi + + local -r GO_TGZ="go${GO_VER}.${INSTALLOS}-${ARCH}.tar.gz" + pushd /tmp + # using sudo because previously installed versions might have been installed by a different user. # as it was the case on jenkins VM. - sudo curl -qL -O "https://storage.googleapis.com/golang/go${1}.${INSTALLOS}-${ARCH}.tar.gz" && - sudo tar -xzf go${1}.${INSTALLOS}-${ARCH}.tar.gz && - sudo rm -rf "${2}/go" && - sudo mv go "${2}/" && sudo chown -R $(whoami): ${2}/go + sudo rm -rf "$GO_TGZ" + curl -qL -O "https://storage.googleapis.com/golang/$GO_TGZ" && + sudo rm -rf "$GO_DIR" && + sudo mkdir -p "$GO_DIR" + sudo tar -C "$GO_DIR" --strip-components=1 -xzf "$GO_TGZ" + popd >/dev/null + echo "installed in $GO_DIR: $($GO_DIR/bin/go version)" } check_and_install_golang From 71e4495a76341aebb1dad9ee21cc06959af4a7c7 Mon Sep 17 00:00:00 2001 From: Steven Powell Date: Thu, 8 Jul 2021 14:01:09 -0700 Subject: [PATCH 16/28] 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![time-to-k8s](/images/benchmarks/timeToK8s/%s.png)\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 579bebda1ae8ed41e07a94c106d540e2e6e24e21 Mon Sep 17 00:00:00 2001 From: Ilya Zuyev Date: Thu, 8 Jul 2021 15:00:13 -0700 Subject: [PATCH 17/28] fix script --- hack/jenkins/installers/check_install_golang.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/jenkins/installers/check_install_golang.sh b/hack/jenkins/installers/check_install_golang.sh index c927766ad0..4ee97d5b1c 100755 --- a/hack/jenkins/installers/check_install_golang.sh +++ b/hack/jenkins/installers/check_install_golang.sh @@ -82,8 +82,8 @@ function install_golang() { # using sudo because previously installed versions might have been installed by a different user. # as it was the case on jenkins VM. sudo rm -rf "$GO_TGZ" - curl -qL -O "https://storage.googleapis.com/golang/$GO_TGZ" && - sudo rm -rf "$GO_DIR" && + curl -qL -O "https://storage.googleapis.com/golang/$GO_TGZ" + sudo rm -rf "$GO_DIR" sudo mkdir -p "$GO_DIR" sudo tar -C "$GO_DIR" --strip-components=1 -xzf "$GO_TGZ" From 7502ffb2297b50384a475eacbc172219c1524dab Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Fri, 9 Jul 2021 00:20:19 +0000 Subject: [PATCH 18/28] 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 +--- + +![time-to-k8s](/images/benchmarks/timeToK8s/v1.22.0.png) 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 From b6e55e6c979d1610624e43ab02ac015cfe354bea Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Fri, 9 Jul 2021 10:28:56 -0700 Subject: [PATCH 19/28] Create common.ps1 to simplify Windows integration tests. --- hack/jenkins/common.ps1 | 78 +++++++++++++++++++ hack/jenkins/minikube_set_pending.sh | 2 +- hack/jenkins/windows_integration_setup.ps1 | 6 ++ hack/jenkins/windows_integration_teardown.ps1 | 8 ++ .../windows_integration_test_docker.ps1 | 72 ++--------------- .../windows_integration_test_hyperv.ps1 | 31 ++------ .../windows_integration_test_virtualbox.ps1 | 32 ++------ 7 files changed, 108 insertions(+), 121 deletions(-) create mode 100644 hack/jenkins/common.ps1 diff --git a/hack/jenkins/common.ps1 b/hack/jenkins/common.ps1 new file mode 100644 index 0000000000..32f242efce --- /dev/null +++ b/hack/jenkins/common.ps1 @@ -0,0 +1,78 @@ +# Copyright 2019 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. + +mkdir -p out + +(New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.8.0/gopogh.exe", "C:\Go\bin\gopogh.exe") + +gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/minikube-windows-amd64.exe out/ +gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/e2e-windows-amd64.exe out/ +gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/testdata . +gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_setup.ps1 out/ +gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_teardown.ps1 out/ + +./out/minikube-windows-amd64.exe delete --all + +./out/windows_integration_setup.ps1 + +$started=Get-Date -UFormat %s + +out/e2e-windows-amd64.exe --minikube-start-args="--driver=$driver" --binary=out/minikube-windows-amd64.exe --test.v --test.timeout=$timeout | Tee-Object -FilePath testout.txt + +$env:result=$lastexitcode +# If the last exit code was 0->success, x>0->error +If($env:result -eq 0){ + $env:status="success" + echo "minikube: SUCCESS" +} Else { + $env:status="failure" + echo "minikube: FAIL" +} + +$ended=Get-Date -UFormat %s +$elapsed=$ended-$started +$elapsed=$elapsed/60 +$elapsed=[math]::Round($elapsed, 2) + +Get-Content testout.txt -Encoding ASCII | go tool test2json -t | Out-File -FilePath testout.json -Encoding ASCII + +$gopogh_status=gopogh --in testout.json --out_html testout.html --out_summary testout_summary.json --name "$env:JOB_NAME" -pr $env:MINIKUBE_LOCATION --repo github.com/kubernetes/minikube/ --details $env:COMMIT + +$failures=echo $gopogh_status | jq '.NumberOfFail' +$tests=echo $gopogh_status | jq '.NumberOfTests' +$bad_status="$failures / $tests failures" + +$description="$status in $elapsed minute(s)." +If($env:status -eq "failure") { + $description="completed with $bad_status in $elapsed minute(s)." +} +echo $description + +$env:SHORT_COMMIT=$env:COMMIT.substring(0, 7) +$gcs_bucket="minikube-builds/logs/$env:MINIKUBE_LOCATION/$env:SHORT_COMMIT" + +#Upload logs to gcs +gsutil -qm cp testout.txt gs://$gcs_bucket/${env:JOB_NAME}out.txt +gsutil -qm cp testout.json gs://$gcs_bucket/${env:JOB_NAME}.json +gsutil -qm cp testout.html gs://$gcs_bucket/${env:JOB_NAME}.html +gsutil -qm cp testout_summary.json gs://$gcs_bucket/${env:JOB_NAME}_summary.json + +$env:target_url="https://storage.googleapis.com/$gcs_bucket/$env:JOB_NAME.html" +# Update the PR with the new info +$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins: $description`", `"target_url`": `"$env:target_url`", `"context`": `"${env:JOB_NAME}`"}" +Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing + +./out/windows_integration_teardown.ps1 + +Exit $env:result diff --git a/hack/jenkins/minikube_set_pending.sh b/hack/jenkins/minikube_set_pending.sh index 3c998f8398..371ba645d3 100755 --- a/hack/jenkins/minikube_set_pending.sh +++ b/hack/jenkins/minikube_set_pending.sh @@ -31,7 +31,7 @@ jobs=( # 'Hyper-V_Windows' # 'VirtualBox_Linux' # 'VirtualBox_macOS' - 'VirtualBox_Windows' + # 'VirtualBox_Windows' # 'KVM-GPU_Linux' - Disabled 'KVM_Linux' 'KVM_Linux_containerd' diff --git a/hack/jenkins/windows_integration_setup.ps1 b/hack/jenkins/windows_integration_setup.ps1 index 510cccbfc3..1c20b66c2b 100644 --- a/hack/jenkins/windows_integration_setup.ps1 +++ b/hack/jenkins/windows_integration_setup.ps1 @@ -16,6 +16,12 @@ $test_home="$env:HOMEDRIVE$env:HOMEPATH\minikube-integration" $env:KUBECONFIG="$test_home\kubeconfig" $env:MINIKUBE_HOME="$test_home\.minikube" +if ($driver == "docker") { + # Remove unused images and containers + docker system prune --all --force --volumes + docker ps -aq | ForEach -Process {docker rm -fv $_} +} + # delete in case previous test was unexpectedly ended and teardown wasn't run rm -r -Force $test_home mkdir -p $test_home diff --git a/hack/jenkins/windows_integration_teardown.ps1 b/hack/jenkins/windows_integration_teardown.ps1 index 2dc1248f7e..6a66241338 100644 --- a/hack/jenkins/windows_integration_teardown.ps1 +++ b/hack/jenkins/windows_integration_teardown.ps1 @@ -14,4 +14,12 @@ $test_home="$env:HOMEDRIVE$env:HOMEPATH\minikube-integration" +if ($driver == "docker") { + # Remove unused images and containers + docker system prune --all --force + + # Just shutdown Docker, it's safer than anything else + Get-Process "*Docker Desktop*" | Stop-Process +} + rm -r -Force $test_home diff --git a/hack/jenkins/windows_integration_test_docker.ps1 b/hack/jenkins/windows_integration_test_docker.ps1 index cd6764067a..186fff9f37 100644 --- a/hack/jenkins/windows_integration_test_docker.ps1 +++ b/hack/jenkins/windows_integration_test_docker.ps1 @@ -14,15 +14,10 @@ mkdir -p out -(New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.8.0/gopogh.exe", "C:\Go\bin\gopogh.exe") (New-Object Net.WebClient).DownloadFile("https://dl.k8s.io/release/v1.20.0/bin/windows/amd64/kubectl.exe", "C:\Program Files\Docker\Docker\resources\bin\kubectl.exe") -gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/minikube-windows-amd64.exe out/ -gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/e2e-windows-amd64.exe out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/testdata . gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/setup_docker_desktop_windows.ps1 out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_setup.ps1 out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_teardown.ps1 out/ +gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/common.ps1 out/ $env:SHORT_COMMIT=$env:COMMIT.substring(0, 7) $gcs_bucket="minikube-builds/logs/$env:MINIKUBE_LOCATION/$env:SHORT_COMMIT" @@ -39,65 +34,8 @@ If ($lastexitcode -gt 0) { Exit $lastexitcode } -./out/minikube-windows-amd64.exe delete --all +$driver="docker" +$timeout="180m" +$env:JOB_NAME="Docker_Windows" -# Remove unused images and containers -docker system prune --all --force --volumes - -./out/windows_integration_setup.ps1 - -docker ps -aq | ForEach -Process {docker rm -fv $_} - -$started=Get-Date -UFormat %s - -out/e2e-windows-amd64.exe --minikube-start-args="--driver=docker" --binary=out/minikube-windows-amd64.exe --test.v --test.timeout=180m | Tee-Object -FilePath testout.txt -$env:result=$lastexitcode -# If the last exit code was 0->success, x>0->error -If($env:result -eq 0){ - $env:status="success" - echo "minikube: SUCCESS" -} Else { - $env:status="failure" - echo "minikube: FAIL" -} - -$ended=Get-Date -UFormat %s -$elapsed=$ended-$started -$elapsed=$elapsed/60 -$elapsed=[math]::Round($elapsed, 2) - -Get-Content testout.txt -Encoding ASCII | go tool test2json -t | Out-File -FilePath testout.json -Encoding ASCII - -$gopogh_status=gopogh --in testout.json --out_html testout.html --out_summary testout_summary.json --name "Docker_Windows" -pr $env:MINIKUBE_LOCATION --repo github.com/kubernetes/minikube/ --details $env:COMMIT - -$failures=echo $gopogh_status | jq '.NumberOfFail' -$tests=echo $gopogh_status | jq '.NumberOfTests' -$bad_status="$failures / $tests failures" - -$description="$status in $elapsed minute(s)." -If($env:status -eq "failure") { - $description="completed with $bad_status in $elapsed minute(s)." -} -echo $description - -$env:target_url="https://storage.googleapis.com/$gcs_bucket/Docker_Windows.html" - -#Upload logs to gcs -gsutil -qm cp testout.txt gs://$gcs_bucket/Docker_Windowsout.txt -gsutil -qm cp testout.json gs://$gcs_bucket/Docker_Windows.json -gsutil -qm cp testout.html gs://$gcs_bucket/Docker_Windows.html -gsutil -qm cp testout_summary.json gs://$gcs_bucket/Docker_Windows_summary.json - -# Update the PR with the new info -$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins: $description`", `"target_url`": `"$env:target_url`", `"context`": `"Docker_Windows`"}" -Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing - -# Remove unused images and containers -docker system prune --all --force - -# Just shutdown Docker, it's safer than anything else -Get-Process "*Docker Desktop*" | Stop-Process - -./out/windows_integration_teardown.ps1 - -Exit $env:result +. ./out/common.ps1 diff --git a/hack/jenkins/windows_integration_test_hyperv.ps1 b/hack/jenkins/windows_integration_test_hyperv.ps1 index 067e64b695..41520a9f8f 100644 --- a/hack/jenkins/windows_integration_test_hyperv.ps1 +++ b/hack/jenkins/windows_integration_test_hyperv.ps1 @@ -12,31 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -(New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.8.0/gopogh.exe", "C:\Go\bin\gopogh.exe") +gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/common.ps1 out/ -mkdir -p out -gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/minikube-windows-amd64.exe out/ -gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/e2e-windows-amd64.exe out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/testdata . -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_setup.ps1 out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_teardown.ps1 out/ +$driver="hyperv" +$timeout="65m" +$env:JOB_NAME="Hyper-V_Windows" -./out/minikube-windows-amd64.exe delete --all - -./out/windows_integration_setup.ps1 - -out/e2e-windows-amd64.exe -minikube-start-args="--driver=hyperv" -binary=out/minikube-windows-amd64.exe -test.v -test.timeout=65m -$env:result=$lastexitcode -# If the last exit code was 0->success, x>0->error -If($env:result -eq 0){$env:status="success"} -Else {$env:status="failure"} - -# $env:SHORT_COMMIT=$env:COMMIT.substring(0, 7) -# to be used later to implement https://github.com/kubernetes/minikube/issues/6593 -$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/Hyper-V_Windows.txt" -$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"Hyper-V_Windows`"}" -Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing - -./out/windows_integration_teardown.ps1 - -Exit $env:result +. ./out/common.ps1 diff --git a/hack/jenkins/windows_integration_test_virtualbox.ps1 b/hack/jenkins/windows_integration_test_virtualbox.ps1 index e4100ddf83..fd3d58d541 100644 --- a/hack/jenkins/windows_integration_test_virtualbox.ps1 +++ b/hack/jenkins/windows_integration_test_virtualbox.ps1 @@ -12,32 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -(New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.8.0/gopogh.exe", "C:\Go\bin\gopogh.exe") +gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/common.ps1 out/ +$driver="virtualbox" +$timeout="30m" +$env:JOB_NAME="VirtualBox_Windows" -mkdir -p out -gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/minikube-windows-amd64.exe out/ -gsutil.cmd -m cp gs://minikube-builds/$env:MINIKUBE_LOCATION/e2e-windows-amd64.exe out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/testdata . -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_setup.ps1 out/ -gsutil.cmd -m cp -r gs://minikube-builds/$env:MINIKUBE_LOCATION/windows_integration_teardown.ps1 out/ - -./out/minikube-windows-amd64.exe delete - -./out/windows_integration_setup.ps1 - -out/e2e-windows-amd64.exe -minikube-start-args="--driver=virtualbox" -binary=out/minikube-windows-amd64.exe -test.v -test.timeout=30m -$env:result=$lastexitcode -# If the last exit code was 0->success, x>0->error -If($env:result -eq 0){$env:status="success"} -Else {$env:status="failure"} - -# $env:SHORT_COMMIT=$env:COMMIT.substring(0, 7) -# to be used later -$env:target_url="https://storage.googleapis.com/minikube-builds/logs/$env:MINIKUBE_LOCATION/VirtualBox_Windows.txt" -$json = "{`"state`": `"$env:status`", `"description`": `"Jenkins`", `"target_url`": `"$env:target_url`", `"context`": `"VirtualBox_Windows`"}" -Invoke-WebRequest -Uri "https://api.github.com/repos/kubernetes/minikube/statuses/$env:COMMIT`?access_token=$env:access_token" -Body $json -ContentType "application/json" -Method Post -usebasicparsing - -./out/windows_integration_teardown.ps1 - -Exit $env:result +. ./out/common.ps1 From 41699a9dd852609ff6beebb6ac62777762408662 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 12 Jul 2021 16:55:26 +0000 Subject: [PATCH 20/28] Update auto-generated docs and translations --- 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 + 8 files changed, 8 insertions(+) diff --git a/translations/de.json b/translations/de.json index 9ee74b5d0d..b69d9d55bd 100644 --- a/translations/de.json +++ b/translations/de.json @@ -334,6 +334,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "", diff --git a/translations/es.json b/translations/es.json index c9bf518e7a..bfeaf9ded7 100644 --- a/translations/es.json +++ b/translations/es.json @@ -339,6 +339,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "", diff --git a/translations/fr.json b/translations/fr.json index 432481c318..8aa6c933b9 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -338,6 +338,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "Installez VirtualBox et assurez-vous qu'il est dans le chemin, ou sélectionnez une valeur alternative pour --driver", "Install the latest hyperkit binary, and run 'minikube delete'": "Installez le dernier binaire hyperkit et exécutez 'minikube delete'", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "Exécution de conteneur non valide : \"{{.runtime}}\". Les environnements d'exécution valides sont : {{.validOptions}}", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "Istio a besoin de {{.minCPUs}} processeurs -- votre configuration n'alloue que {{.cpus}} processeurs", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "Istio a besoin de {{.minMem}}Mo de mémoire -- votre configuration n'alloue que {{.memory}}Mo", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "Il semble que vous exécutiez GCE, ce qui signifie que l'authentification devrait fonctionner sans le module GCP Auth. Si vous souhaitez toujours vous authentifier à l'aide d'un fichier d'informations d'identification, utilisez l'indicateur --force.", diff --git a/translations/ja.json b/translations/ja.json index df7a36fdb9..34d96b54a7 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -325,6 +325,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "", diff --git a/translations/ko.json b/translations/ko.json index f3d6698e35..2c11b9717c 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -356,6 +356,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "", diff --git a/translations/pl.json b/translations/pl.json index 060a594490..b4f8af7bcb 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -343,6 +343,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Invalid size passed in argument: {{.error}}": "Nieprawidłowy rozmiar przekazany w argumencie: {{.error}}", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", diff --git a/translations/strings.txt b/translations/strings.txt index 2a5c665f0d..40d20ea4e8 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -313,6 +313,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index 1566879176..4f187d637f 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -415,6 +415,7 @@ "Install VirtualBox and ensure it is in the path, or select an alternative value for --driver": "", "Install the latest hyperkit binary, and run 'minikube delete'": "", "Invalid Container Runtime: \"{{.runtime}}\". Valid runtimes are: {{.validOptions}}": "", + "Invalid port": "", "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", "It seems that you are running in GCE, which means authentication should work without the GCP Auth addon. If you would still like to authenticate using a credentials file, use the --force flag.": "", From c64ba2c0808d0be0c2af47315b8774e03acc81ab Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Mon, 12 Jul 2021 10:10:54 -0700 Subject: [PATCH 21/28] Fix report scripts to print out only started environments, and use quotes around script names. --- hack/jenkins/test-flake-chart/report_flakes.sh | 4 ++-- hack/jenkins/test-flake-chart/sync_tests.sh | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh index cffc628e9c..9040a71577 100755 --- a/hack/jenkins/test-flake-chart/report_flakes.sh +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -40,7 +40,7 @@ TMP_DATA=$(mktemp) # 3) Sort by environment, then test name. # 4) Store in file $TMP_DATA. gsutil cat $(< "${ENVIRONMENT_LIST}" sed -r "s/^/gs:\\/\\/minikube-builds\\/logs\\/${PR_NUMBER}\\/${SHORT_COMMIT}\\/; s/$/_summary.json/") \ - | $DIR/process_data.sh \ + | "$DIR/process_data.sh" \ | sed -n -r -e "s/[0-9a-f]*,[0-9-]*,([a-zA-Z\/_0-9-]*),([a-zA-Z\/_0-9-]*),Failed,[.0-9]*/\1:\2/p" \ | sort -t, -k\ > "$TMP_DATA" @@ -85,6 +85,6 @@ fi printf "\n\nTo see the flake rates of all tests on $ENVIRONMENT, click [here](https:\/\/storage.googleapis.com\/minikube-flake-rate\/flake_chart.html?env=$ENVIRONMENT)." >> "$TMP_COMMENT" # install gh if not present -$DIR/../installers/check_install_gh.sh +"$DIR/../installers/check_install_gh.sh" gh pr comment "https://github.com/kubernetes/minikube/pull/$PR_NUMBER" --body "$(cat $TMP_COMMENT)" diff --git a/hack/jenkins/test-flake-chart/sync_tests.sh b/hack/jenkins/test-flake-chart/sync_tests.sh index b44002cd31..03b4cf364a 100644 --- a/hack/jenkins/test-flake-chart/sync_tests.sh +++ b/hack/jenkins/test-flake-chart/sync_tests.sh @@ -54,9 +54,11 @@ gsutil cat "${FINISHED_LIST_REMOTE}"\ | uniq > "${FINISHED_LIST}" STARTED_COUNT=$(echo "${STARTED_LIST}" | wc -l) -FINISHED_COUNT=$(\ +FINISHED_LIST_JOINED=$(\ echo "${STARTED_LIST}"\ - | join - "${FINISHED_LIST}"\ + | join - "${FINISHED_LIST}") +FINISHED_COUNT=$(\ + echo "${FINISHED_LIST_JOINED}"\ | wc -l) if [ ${STARTED_COUNT} -ne ${FINISHED_COUNT} ]; then @@ -68,6 +70,7 @@ fi gsutil rm "${BUCKET_PATH}/started_environments_${ROOT_JOB_ID}.txt" # At this point, we know all integration tests are done and we can process all summaries safely. +echo "${FINISHED_LIST_JOINED}" > ${FINISHED_LIST} # Get directory of this script. DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) From 41e4977bcb9c39c10c09ee2275f1446a336b6f1f Mon Sep 17 00:00:00 2001 From: balasu Date: Mon, 12 Jul 2021 23:01:05 +0530 Subject: [PATCH 22/28] Update addons.go --- pkg/minikube/assets/addons.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go index 334946cb20..563be7271b 100755 --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -672,7 +672,7 @@ var Addons = map[string]*Addon{ vmpath.GuestAddonsDir, "portainer.yaml", "0640"), - }, false, "portainer", "", nil, nil), + }, false, "portainer", "portainer.io", nil, nil), } // parseMapString creates a map based on `str` which is encoded as =,=,... From a60b33723739dec0524942a5ff0126ca377cfd8e Mon Sep 17 00:00:00 2001 From: dmpe Date: Mon, 12 Jul 2021 20:15:21 +0200 Subject: [PATCH 23/28] fix an issue with hasPorts variable - further simplification --- cmd/minikube/cmd/start.go | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 579c24cad8..3a6f1ea052 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1286,13 +1286,12 @@ func validateImageRepository(imageRepo string) (validImageRepo string) { klog.Errorln("Error Parsing URL: ", err) } - var hasPorts = false var imageRepoPort string if URL.Port() != "" && strings.Contains(imageRepo, ":"+URL.Port()) { - hasPorts = true imageRepoPort = ":" + URL.Port() } + // tips when imageRepo ended with a trailing /. if strings.HasSuffix(imageRepo, "/") { out.Infof("The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically") @@ -1301,12 +1300,8 @@ func validateImageRepository(imageRepo string) (validImageRepo string) { if URL.Scheme != "" { out.Infof("The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically", out.V{"scheme": URL.Scheme}) } - - if hasPorts { - validImageRepo = URL.Hostname() + imageRepoPort + strings.TrimSuffix(URL.Path, "/") - } else { - validImageRepo = URL.Hostname() + strings.TrimSuffix(URL.Path, "/") - } + + validImageRepo = URL.Hostname() + imageRepoPort + strings.TrimSuffix(URL.Path, "/") return validImageRepo } From 0c721cbacd140feae9de84f177924b8862612b6c Mon Sep 17 00:00:00 2001 From: dmpe Date: Mon, 12 Jul 2021 20:23:07 +0200 Subject: [PATCH 24/28] remove whitespace --- cmd/minikube/cmd/start.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 3a6f1ea052..d51fec280a 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -1300,7 +1300,7 @@ func validateImageRepository(imageRepo string) (validImageRepo string) { if URL.Scheme != "" { out.Infof("The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically", out.V{"scheme": URL.Scheme}) } - + validImageRepo = URL.Hostname() + imageRepoPort + strings.TrimSuffix(URL.Path, "/") return validImageRepo From 0589a42fdf7b751a8059d3ec2a315399c41d2ac9 Mon Sep 17 00:00:00 2001 From: Andriy Dzikh Date: Mon, 12 Jul 2021 14:10:50 -0700 Subject: [PATCH 25/28] Use -eq instead of == because Powershell bad. --- hack/jenkins/windows_integration_setup.ps1 | 2 +- hack/jenkins/windows_integration_teardown.ps1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hack/jenkins/windows_integration_setup.ps1 b/hack/jenkins/windows_integration_setup.ps1 index 1c20b66c2b..e1e2912de4 100644 --- a/hack/jenkins/windows_integration_setup.ps1 +++ b/hack/jenkins/windows_integration_setup.ps1 @@ -16,7 +16,7 @@ $test_home="$env:HOMEDRIVE$env:HOMEPATH\minikube-integration" $env:KUBECONFIG="$test_home\kubeconfig" $env:MINIKUBE_HOME="$test_home\.minikube" -if ($driver == "docker") { +if ($driver -eq "docker") { # Remove unused images and containers docker system prune --all --force --volumes docker ps -aq | ForEach -Process {docker rm -fv $_} diff --git a/hack/jenkins/windows_integration_teardown.ps1 b/hack/jenkins/windows_integration_teardown.ps1 index 6a66241338..eb1c0d953f 100644 --- a/hack/jenkins/windows_integration_teardown.ps1 +++ b/hack/jenkins/windows_integration_teardown.ps1 @@ -14,7 +14,7 @@ $test_home="$env:HOMEDRIVE$env:HOMEPATH\minikube-integration" -if ($driver == "docker") { +if ($driver -eq "docker") { # Remove unused images and containers docker system prune --all --force From f452a08f5cebcb438b501115d722c95c20a2fff4 Mon Sep 17 00:00:00 2001 From: Matt Dainty Date: Mon, 12 Jul 2021 22:39:31 +0100 Subject: [PATCH 26/28] Update tests --- pkg/minikube/bootstrapper/images/images_test.go | 6 +++--- pkg/minikube/bootstrapper/images/kubeadm_test.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pkg/minikube/bootstrapper/images/images_test.go b/pkg/minikube/bootstrapper/images/images_test.go index 5db9d5d181..8075e45d44 100644 --- a/pkg/minikube/bootstrapper/images/images_test.go +++ b/pkg/minikube/bootstrapper/images/images_test.go @@ -96,9 +96,9 @@ func TestAuxiliary(t *testing.T) { func TestAuxiliaryMirror(t *testing.T) { want := []string{ - "test.mirror/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "test.mirror/dashboard:v2.1.0", - "test.mirror/metrics-scraper:v1.0.4", + "test.mirror/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), + "test.mirror/kubernetesui/dashboard:v2.1.0", + "test.mirror/kubernetesui/metrics-scraper:v1.0.4", } got := auxiliary("test.mirror") if diff := cmp.Diff(want, got); diff != "" { diff --git a/pkg/minikube/bootstrapper/images/kubeadm_test.go b/pkg/minikube/bootstrapper/images/kubeadm_test.go index ec97efe25d..0dd8601680 100644 --- a/pkg/minikube/bootstrapper/images/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/images/kubeadm_test.go @@ -54,9 +54,9 @@ func TestKubeadmImages(t *testing.T) { "mirror.k8s.io/coredns:1.6.2", "mirror.k8s.io/etcd:3.3.15-0", "mirror.k8s.io/pause:3.1", - "mirror.k8s.io/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "mirror.k8s.io/dashboard:v2.1.0", - "mirror.k8s.io/metrics-scraper:v1.0.4", + "mirror.k8s.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), + "mirror.k8s.io/kubernetesui/dashboard:v2.1.0", + "mirror.k8s.io/kubernetesui/metrics-scraper:v1.0.4", }}, {"v1.15.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.15.0", From 14c9abefa867b965b6cdcc5d5e98c4c23943b936 Mon Sep 17 00:00:00 2001 From: minikube-bot Date: Mon, 12 Jul 2021 22:00:19 +0000 Subject: [PATCH 27/28] Update auto-generated docs and translations --- translations/de.json | 2 +- translations/es.json | 2 +- translations/fr.json | 1 + translations/ja.json | 2 +- translations/ko.json | 2 +- translations/pl.json | 2 +- translations/strings.txt | 2 +- translations/zh-CN.json | 2 +- 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/translations/de.json b/translations/de.json index b69d9d55bd..a3b463ffe7 100644 --- a/translations/de.json +++ b/translations/de.json @@ -587,7 +587,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "Die CIDR, die für Service-Cluster-IPs verwendet werden soll.", "The CIDR to be used for the minikube VM (virtualbox driver only)": "Die CIDR, die für die minikube-VM verwendet werden soll (nur Virtualbox-Treiber)", diff --git a/translations/es.json b/translations/es.json index bfeaf9ded7..c43aa3c6f6 100644 --- a/translations/es.json +++ b/translations/es.json @@ -592,7 +592,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "El CIDR de las IP del clúster de servicio.", "The CIDR to be used for the minikube VM (virtualbox driver only)": "El CIDR de la VM de minikube (solo con el controlador de Virtualbox)", diff --git a/translations/fr.json b/translations/fr.json index 8aa6c933b9..3cd772ce54 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -593,6 +593,7 @@ "The '{{.name}}' driver does not respect the --cpus flag": "Le pilote '{{.name}}' ne respecte pas l'indicateur --cpus", "The '{{.name}}' driver does not respect the --memory flag": "Le pilote '{{.name}}' ne respecte pas l'indicateur --memory", "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "L'indicateur --image-repository que vous avez fourni contient le schéma : {{.scheme}}, ce sera en tant que domaine, supprimé automatiquement", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "L'indicateur --image-repository que vous avez fourni s'est terminé par un / qui pourrait provoquer un conflit dans kubernetes, supprimé automatiquement", "The CIDR to be used for service cluster IPs.": "Méthode CIDR à exploiter pour les adresses IP des clusters du service.", "The CIDR to be used for the minikube VM (virtualbox driver only)": "Méthode CIDR à exploiter pour la VM minikube (pilote virtualbox uniquement).", diff --git a/translations/ja.json b/translations/ja.json index 34d96b54a7..3768a92e84 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -587,7 +587,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "サービス クラスタ IP に使用される CIDR", "The CIDR to be used for the minikube VM (virtualbox driver only)": "minikube VM に使用される CIDR(virtualbox ドライバのみ)", diff --git a/translations/ko.json b/translations/ko.json index 2c11b9717c..9f3fe4b878 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -606,7 +606,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "", "The CIDR to be used for the minikube VM (virtualbox driver only)": "", diff --git a/translations/pl.json b/translations/pl.json index b4f8af7bcb..e32e4b7930 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -607,7 +607,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "", "The CIDR to be used for the minikube VM (virtualbox driver only)": "", diff --git a/translations/strings.txt b/translations/strings.txt index 40d20ea4e8..ab1849b6d2 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -553,7 +553,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "", "The CIDR to be used for the minikube VM (virtualbox driver only)": "", diff --git a/translations/zh-CN.json b/translations/zh-CN.json index 4f187d637f..6648f05387 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -694,7 +694,7 @@ "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", "The '{{.name}}' driver does not respect the --cpus flag": "", "The '{{.name}}' driver does not respect the --memory flag": "", - "The --image-repository flag your provided contains Scheme: {{.scheme}}, it will be as a domian, removed automatically": "", + "The --image-repository flag your provided contains Scheme: {{.scheme}}, which will be removed automatically": "", "The --image-repository flag your provided ended with a trailing / that could cause conflict in kuberentes, removed automatically": "", "The CIDR to be used for service cluster IPs.": "需要用于服务集群 IP 的 CIDR。", "The CIDR to be used for the minikube VM (virtualbox driver only)": "需要用于 minikube 虚拟机的 CIDR(仅限 virtualbox 驱动程序)", From 92604a3c00890ae8a306ea26c00efac68457f5ca Mon Sep 17 00:00:00 2001 From: Ilya Zuyev Date: Tue, 13 Jul 2021 11:47:20 -0700 Subject: [PATCH 28/28] simplify check_install_golang.sh invocation --- hack/jenkins/common.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hack/jenkins/common.sh b/hack/jenkins/common.sh index 0a04a1cef6..9b89ebdfd4 100755 --- a/hack/jenkins/common.sh +++ b/hack/jenkins/common.sh @@ -91,7 +91,7 @@ else fi # installing golang so we could do go get for gopogh -ARCH="$ARCH" ./installers/check_install_golang.sh "1.16.4" "/usr/local" || true +./installers/check_install_golang.sh "1.16.4" "/usr/local" || true # install docker and kubectl if not present sudo ARCH="$ARCH" ./installers/check_install_docker.sh || true