diff --git a/.github/ISSUE_TEMPLATE/fa.md b/.github/ISSUE_TEMPLATE/fa.md index f8c9156731..973186dce2 100644 --- a/.github/ISSUE_TEMPLATE/fa.md +++ b/.github/ISSUE_TEMPLATE/fa.md @@ -1,6 +1,7 @@ --- name: فارسی about: مشكلی را گرزارش كن +labels: l/fa --- diff --git a/.github/ISSUE_TEMPLATE/ku.md b/.github/ISSUE_TEMPLATE/ku.md index 6fada925a9..97b52ae62f 100644 --- a/.github/ISSUE_TEMPLATE/ku.md +++ b/.github/ISSUE_TEMPLATE/ku.md @@ -1,6 +1,7 @@ --- name: Kurdî about: Girêftek gozarîş bike +labels: l/ku --- diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 47f11dcd8f..a24f20a20c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,5 +1,6 @@ name: build on: + workflow_dispatch: push: branches: - master @@ -11,7 +12,7 @@ on: - "!deploy/iso/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: 1.16.1 + GO_VERSION: '1.16.6' jobs: build_minikube: runs-on: ubuntu-18.04 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000000..7ca895ee57 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,42 @@ +name: "generate-docs" +on: + workflow_dispatch: + push: + branches: + - master +env: + GOPROXY: https://proxy.golang.org + GO_VERSION: '1.16.6' +jobs: + generate-docs: + runs-on: ubuntu-18.04 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Generate Docs + id: gendocs + run: | + make generate-docs + echo "::set-output name=changes::$(git status --porcelain)" + - name: Create PR + if: ${{ steps.gendocs.outputs.changes != '' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.MINIKUBE_BOT_PAT }} + commit-message: Update auto-generated docs and translations + committer: minikube-bot + author: minikube-bot + branch: gendocs + push-to-fork: minikube-bot/minikube + base: master + delete-branch: true + title: 'Update auto-generated docs and translations' + body: | + Committing changes resulting from `make generate-docs`. + This PR is auto-generated by the [gendocs](https://github.com/kubernetes/minikube/blob/master/.github/workflows/docs.yml) CI workflow. + ``` + ${{ steps.gendocs.outputs.changes }} + ``` diff --git a/.github/workflows/leaderboard.yml b/.github/workflows/leaderboard.yml new file mode 100644 index 0000000000..deee9681cc --- /dev/null +++ b/.github/workflows/leaderboard.yml @@ -0,0 +1,45 @@ +name: "update-leaderboard" +on: + workflow_dispatch: + push: + tags-ignore: + - 'v*-beta.*' + release: + types: [published] +env: + GO_VERSION: '1.16.6' +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)" + env: + GITHUB_TOKEN: ${{ secrets.MINIKUBE_BOT_PAT }} + - 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 + author: minikube-bot + 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 }} + ``` diff --git a/.github/workflows/master.yml b/.github/workflows/master.yml index 849f31988d..6dddc2eea1 100644 --- a/.github/workflows/master.yml +++ b/.github/workflows/master.yml @@ -1,5 +1,6 @@ name: Master on: + workflow_dispatch: push: branches: - master @@ -13,7 +14,7 @@ on: - "!deploy/iso/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: 1.16.1 + GO_VERSION: '1.16.6' jobs: # Runs before all other jobs # builds the minikube binaries @@ -122,7 +123,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -221,7 +222,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -323,7 +324,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -409,7 +410,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-darwin-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-darwin-amd64 sudo install gopogh-darwin-amd64 /usr/local/bin/gopogh - name: Install docker shell: bash @@ -555,7 +556,7 @@ jobs: continue-on-error: true shell: powershell run: | - (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") + (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") choco install -y kubernetes-cli choco install -y jq choco install -y caffeine @@ -693,7 +694,7 @@ jobs: shell: powershell run: | $ErrorActionPreference = "SilentlyContinue" - (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") + (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") choco install -y kubernetes-cli choco install -y jq choco install -y caffeine @@ -798,7 +799,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -866,6 +867,28 @@ jobs: GOPOGH_RESULT: "" SHELL: "/bin/bash" # To prevent https://github.com/kubernetes/minikube/issues/6643 steps: + - name: Install tools + shell: bash + run: | + sudo apt update + sudo apt install -y jq docker git cron + sudo usermod -aG docker $USER + + - name: Init + shell: bash + run: | + if [[ -f /var/run/reboot.in.progress ]]; then + echo "reboot in progress" + exit 1 + fi + sudo touch /var/run/job.in.progress + rm -rf cleanup.sh install_cleanup.sh + # after this PR is merged, update URLs to get the scripts from github master + wget https://storage.googleapis.com/minikube-ci-utils/cleanup.sh + wget https://storage.googleapis.com/minikube-ci-utils/install_cleanup.sh + chmod +x cleanup.sh install_cleanup.sh + ./install_cleanup.sh + - name: Install kubectl shell: bash run: | @@ -876,15 +899,9 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-arm64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-arm64 sudo install gopogh-linux-arm64 /usr/local/bin/gopogh - - name: Install tools - shell: bash - run: | - sudo apt update - sudo apt install -y jq docker - - name: Docker Info shell: bash run: | diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 23e898472d..ad8b8cd1c7 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" @@ -11,7 +12,7 @@ on: - "!deploy/iso/**" env: GOPROXY: https://proxy.golang.org - GO_VERSION: 1.16.1 + GO_VERSION: '1.16.6' jobs: # Runs before all other jobs # builds the minikube binaries @@ -119,7 +120,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -137,6 +138,7 @@ jobs: chmod a+x minikube-* sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld + MINIKUBE_HOME=$(pwd)/testhome ./minikube-linux-amd64 delete --all --purge START_TIME=$(date -u +%s) KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-amd64 -minikube-start-args=--vm-driver=docker -test.run TestFunctional -test.timeout=10m -test.v -timeout-multiplier=1.5 -binary=./minikube-linux-amd64 2>&1 | tee ./report/testout.txt END_TIME=$(date -u +%s) @@ -218,7 +220,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -236,6 +238,7 @@ jobs: chmod a+x minikube-* sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld + MINIKUBE_HOME=$(pwd)/testhome ./minikube-linux-amd64 delete --all --purge START_TIME=$(date -u +%s) KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-amd64 -minikube-start-args="--vm-driver=docker --container-runtime=containerd" -test.run TestFunctional -test.timeout=30m -test.v -timeout-multiplier=1.5 -binary=./minikube-linux-amd64 2>&1 | tee ./report/testout.txt END_TIME=$(date -u +%s) @@ -320,7 +323,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -338,6 +341,7 @@ jobs: chmod a+x minikube-* sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld + MINIKUBE_HOME=$(pwd)/testhome ./minikube-linux-amd64 delete --all --purge START_TIME=$(date -u +%s) KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-amd64 -minikube-start-args=--vm-driver=podman -v=6 --alsologtostderr -test.run TestFunctional -test.timeout=10m -test.v -timeout-multiplier=1.5 -binary=./minikube-linux-amd64 2>&1 | tee ./report/testout.txt END_TIME=$(date -u +%s) @@ -406,7 +410,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-darwin-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-darwin-amd64 sudo install gopogh-darwin-amd64 /usr/local/bin/gopogh - name: Install docker shell: bash @@ -437,6 +441,7 @@ jobs: mkdir -p testhome chmod a+x e2e-* chmod a+x minikube-* + MINIKUBE_HOME=$(pwd)/testhome ./minikube-darwin-amd64 delete --all --purge START_TIME=$(date -u +%s) KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-darwin-amd64 -minikube-start-args=--vm-driver=virtualbox -test.run "TestFunctional" -test.timeout=35m -test.v -timeout-multiplier=1.5 -binary=./minikube-darwin-amd64 2>&1 | tee ./report/testout.txt END_TIME=$(date -u +%s) @@ -552,7 +557,7 @@ jobs: continue-on-error: true shell: powershell run: | - (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") + (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") choco install -y kubernetes-cli choco install -y jq choco install -y caffeine @@ -690,7 +695,7 @@ jobs: shell: powershell run: | $ErrorActionPreference = "SilentlyContinue" - (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") + (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") choco install -y kubernetes-cli choco install -y jq choco install -y caffeine @@ -795,7 +800,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -811,6 +816,7 @@ jobs: mkdir -p testhome chmod a+x e2e-* chmod a+x minikube-* + MINIKUBE_HOME=$(pwd)/testhome ./minikube-linux-amd64 delete --all --purge START_TIME=$(date -u +%s) KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome sudo -E ./e2e-linux-amd64 -minikube-start-args=--driver=none -test.timeout=10m -test.v -timeout-multiplier=1.5 -test.run TestFunctional -binary=./minikube-linux-amd64 2>&1 | tee ./report/testout.txt END_TIME=$(date -u +%s) @@ -863,6 +869,28 @@ jobs: GOPOGH_RESULT: "" SHELL: "/bin/bash" # To prevent https://github.com/kubernetes/minikube/issues/6643 steps: + - name: Install tools + shell: bash + run: | + sudo apt update + sudo apt install -y jq docker git cron + sudo usermod -aG docker $USER + + - name: Init + shell: bash + run: | + if [[ -f /var/run/reboot.in.progress ]]; then + echo "reboot in progress" + exit 1 + fi + sudo touch /var/run/job.in.progress + rm -rf cleanup.sh install_cleanup.sh + # after this PR is merged, update URLs to get the scripts from github master + wget https://storage.googleapis.com/minikube-ci-utils/cleanup.sh + wget https://storage.googleapis.com/minikube-ci-utils/install_cleanup.sh + chmod +x cleanup.sh install_cleanup.sh + ./install_cleanup.sh + - name: Install kubectl shell: bash run: | @@ -873,15 +901,9 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-arm64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-arm64 sudo install gopogh-linux-arm64 /usr/local/bin/gopogh - - name: Install tools - shell: bash - run: | - sudo apt update - sudo apt install -y jq docker - - name: Docker Info shell: bash run: | @@ -928,6 +950,7 @@ jobs: mkdir -p testhome chmod a+x e2e-* chmod a+x minikube-* + MINIKUBE_HOME=$(pwd)/testhome ./minikube-linux-arm64 delete --all --purge START_TIME=$(date -u +%s) KUBECONFIG=$(pwd)/testhome/kubeconfig MINIKUBE_HOME=$(pwd)/testhome ./e2e-linux-arm64 -minikube-start-args=--vm-driver=docker -test.run TestFunctional -test.timeout=25m -test.v -timeout-multiplier=1.5 -binary=./minikube-linux-arm64 2>&1 | tee ./report/testout.txt END_TIME=$(date -u +%s) @@ -973,6 +996,10 @@ jobs: if [ "$numPass" -eq 0 ];then echo "*** 0 Passed! ***";exit 2;fi if [ "$numPass" -lt 0 ];then echo "*** Failed to pass at least 20! ***";exit 2;fi if [ "$numPass" -eq 0 ];then echo "*** Passed! ***";exit 0;fi + + - name: finalize + shell: bash + run: sudo rm -rf /var/run/job.in.progress # After all integration tests finished # collect all the reports and upload them upload_all_reports: diff --git a/.github/workflows/pr_verified.yaml b/.github/workflows/pr_verified.yaml index 50fe09ae19..40692f470e 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" @@ -20,7 +21,7 @@ on: - deleted env: GOPROXY: https://proxy.golang.org - GO_VERSION: 1.16.1 + GO_VERSION: '1.16.6' jobs: # Runs before all other jobs @@ -40,7 +41,7 @@ jobs: run: | sudo apt-get update sudo apt-get install -y libvirt-dev - make cross e2e-cross debs + MINIKUBE_BUILD_IN_DOCKER=y make cross e2e-cross debs cp -r test/integration/testdata ./out whoami echo github ref $GITHUB_REF @@ -66,7 +67,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.4.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Install Go @@ -154,7 +155,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.4.0/gopogh-linux-arm64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-arm64 sudo install gopogh-linux-arm64 /usr/local/bin/gopogh - name: Install Go @@ -267,7 +268,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -349,7 +350,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-darwin-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-darwin-amd64 sudo install gopogh-darwin-amd64 /usr/local/bin/gopogh - name: Install docker shell: bash @@ -461,7 +462,7 @@ jobs: - name: Install gopogh shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -545,7 +546,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-darwin-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-darwin-amd64 sudo install gopogh-darwin-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -652,7 +653,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-linux-amd64 sudo install gopogh-linux-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -734,7 +735,7 @@ jobs: shell: bash run: | - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-darwin-amd64 + curl -LO https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-darwin-amd64 sudo install gopogh-darwin-amd64 /usr/local/bin/gopogh - name: Download Binaries uses: actions/download-artifact@v1 @@ -873,7 +874,7 @@ jobs: continue-on-error: true shell: powershell run: | - (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.3.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") + (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") choco install -y kubernetes-cli choco install -y jq choco install -y caffeine @@ -967,7 +968,7 @@ jobs: shell: powershell run: | $ErrorActionPreference = "SilentlyContinue" - (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.3.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") + (New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh.exe", "C:\ProgramData\chocolatey\bin\gopogh.exe") choco install -y kubernetes-cli choco install -y jq choco install -y caffeine diff --git a/.github/workflows/time-to-k8s-public-chart.yml b/.github/workflows/time-to-k8s-public-chart.yml new file mode 100644 index 0000000000..f1521149fb --- /dev/null +++ b/.github/workflows/time-to-k8s-public-chart.yml @@ -0,0 +1,30 @@ +name: "time-to-k8s Public Chart" +on: + workflow_dispatch: + schedule: + # every day at 7am & 7pm pacific + - cron: "0 2,14 * * *" +env: + GOPROXY: https://proxy.golang.org + GO_VERSION: '1.16.6' +jobs: + time-to-k8s-public-chart: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Set up Cloud SDK + uses: google-github-actions/setup-gcloud@master + with: + project_id: ${{ secrets.GCP_PROJECT_ID }} + service_account_key: ${{ secrets.GCP_TIME_TO_K8S_SA_KEY }} + export_default_credentials: true + - name: Benchmark time-to-k8s for Docker + run: | + ./hack/benchmark/time-to-k8s/public-chart/public-chart.sh docker + - name: Benchmark time-to-k8s for Containerd + run: | + ./hack/benchmark/time-to-k8s/public-chart/public-chart.sh containerd diff --git a/.github/workflows/time-to-k8s.yml b/.github/workflows/time-to-k8s.yml new file mode 100644 index 0000000000..ae2deee431 --- /dev/null +++ b/.github/workflows/time-to-k8s.yml @@ -0,0 +1,36 @@ +name: "time-to-k8s benchmark" +on: + workflow_dispatch: + release: + types: [released] +env: + GOPROXY: https://proxy.golang.org + GO_VERSION: '1.16.6' +jobs: + benchmark: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - name: Checkout submodules + run: git submodule update --init + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Benchmark + run: | + ./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 + author: minikube-bot + 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/.github/workflows/translations.yml b/.github/workflows/translations.yml new file mode 100644 index 0000000000..9b82733ab7 --- /dev/null +++ b/.github/workflows/translations.yml @@ -0,0 +1,29 @@ +name: Translations Validation +on: + workflow_dispatch: + pull_request: + paths: + - "translations/**" +env: + GOPROXY: https://proxy.golang.org + GO_VERSION: '1.16.6' +jobs: + unit_test: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Install libvirt + run: | + sudo apt-get update + sudo apt-get install -y libvirt-dev + - name: Download Dependencies + run: go mod download + - name: Unit Test + env: + TESTSUITE: unittest + run: make test + continue-on-error: false diff --git a/.github/workflows/twitter-bot.yml b/.github/workflows/twitter-bot.yml new file mode 100644 index 0000000000..1a7c97b56a --- /dev/null +++ b/.github/workflows/twitter-bot.yml @@ -0,0 +1,19 @@ +name: "Tweet the release" +on: + workflow_dispatch: + push: + tags: + - 'v*' + release: + types: [published] +jobs: + twitter-release: + runs-on: ubuntu-latest + steps: + - uses: ethomson/send-tweet-action@v1 + with: + status: "A new minikube version just released ! check it out https://github.com/kubernetes/minikube/blob/master/CHANGELOG.md" + 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 }} diff --git a/.github/workflows/update-golang-version.yml b/.github/workflows/update-golang-version.yml new file mode 100644 index 0000000000..7d7c50bb71 --- /dev/null +++ b/.github/workflows/update-golang-version.yml @@ -0,0 +1,45 @@ +name: "update-golang-versions" +on: + workflow_dispatch: + schedule: + # every Monday at around 2 am pacific/9 am UTC + - cron: "0 9 * * 1" +env: + GOPROXY: https://proxy.golang.org + GO_VERSION: '1.16.6' +jobs: + bump-k8s-versions: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Bump Golang Versions + id: bumpGolang + run: | + make update-golang-version + echo "::set-output name=changes::$(git status --porcelain)" + - name: Create PR + if: ${{ steps.bumpGolang.outputs.changes != '' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.MINIKUBE_BOT_PAT }} + commit-message: bump golang versions + committer: minikube-bot + author: minikube-bot + branch: auto_bump_golang_version + push-to-fork: minikube-bot/minikube + base: master + delete-branch: true + title: 'bump golang version' + labels: ok-to-test + body: | + Kubernetes Project just updated the [golang version](https://github.com/kubernetes/kubernetes/blob/master/build/build-image/cross/VERSION), updating minikube golang to match Kubernetes. + + This PR was auto-generated by `make update-golang-version` using [update-golang-versions.yml](https://github.com/kubernetes/minikube/tree/master/.github/workflows/update-golang-version.yml) CI Workflow. + + + + diff --git a/.github/workflows/update-k8s-versions.yml b/.github/workflows/update-k8s-versions.yml new file mode 100644 index 0000000000..a8310e17fa --- /dev/null +++ b/.github/workflows/update-k8s-versions.yml @@ -0,0 +1,43 @@ +name: "update-kubernetes-versions" +on: + workflow_dispatch: + schedule: + # every Monday at around 1 am pacific/8 am UTC + - cron: "0 8 * * 1" +env: + GOPROXY: https://proxy.golang.org + GO_VERSION: '1.16.6' +jobs: + bump-k8s-versions: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{env.GO_VERSION}} + stable: true + - name: Bump Kuberenetes Versions + id: bumpk8s + run: | + make update-kubernetes-version + echo "::set-output name=changes::$(git status --porcelain)" + - name: Create PR + if: ${{ steps.bumpk8s.outputs.changes != '' }} + uses: peter-evans/create-pull-request@v3 + with: + token: ${{ secrets.MINIKUBE_BOT_PAT }} + commit-message: bump default/newest kubernetes versions + committer: minikube-bot + author: minikube-bot + branch: auto_bump_k8s_versions + push-to-fork: minikube-bot/minikube + base: master + delete-branch: true + title: 'bump default/newest kubernetes versions' + labels: ok-to-test + body: | + This PR was auto-generated by `make update-kubernetes-version` using [update-k8s-versions.yml](https://github.com/kubernetes/minikube/tree/master/.github/workflows) CI Workflow. + Please only merge if all the tests pass. + + ${{ steps.bumpk8s.outputs.changes }} + diff --git a/.gitignore b/.gitignore index e090af9bad..cf6f99bc49 100644 --- a/.gitignore +++ b/.gitignore @@ -35,10 +35,6 @@ _testmain.go #iso version file deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/etc/VERSION -/pkg/minikube/assets/assets.go-e -/pkg/minikube/assets/assets.go -/pkg/minikube/translate/translations.go -/pkg/minikube/translate/translations.go-e /minikube .DS_Store diff --git a/.gitmodules b/.gitmodules index 29c209d1ea..d398a94cf9 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "site/themes/docsy"] path = site/themes/docsy url = https://github.com/google/docsy.git +[submodule "hack/benchmark/time-to-k8s/time-to-k8s-repo"] + path = hack/benchmark/time-to-k8s/time-to-k8s-repo + url = https://github.com/tstromberg/time-to-k8s.git diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f6716e6e7..ab0ded5a07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,219 @@ # 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: + +* auto-pause addon: add support for arm64 [#11743](https://github.com/kubernetes/minikube/pull/11743) +* `addon list`: add info on each addon's maintainer [#11753](https://github.com/kubernetes/minikube/pull/11753) +* add ability to pass max to `--cpu` and `--memory` flags [#11692](https://github.com/kubernetes/minikube/pull/11692) + +Bugs: + +* Fix `--base-image` caching for images specified by name:tag [#11603](https://github.com/kubernetes/minikube/pull/11603) +* Fix embed-certs global config [#11576](https://github.com/kubernetes/minikube/pull/11576) +* Fix a download link to use arm64 instead of amd64 [#11653](https://github.com/kubernetes/minikube/pull/11653) +* fix downloading duplicate base image [#11690](https://github.com/kubernetes/minikube/pull/11690) +* fix multi-node loosing track of nodes after second restart [#11731](https://github.com/kubernetes/minikube/pull/11731) +* gcp-auth: do not override existing environment variables in pods [#11665](https://github.com/kubernetes/minikube/pull/11665) + +Minor improvements: + +* Allow running amd64 binary on M1 [#11674](https://github.com/kubernetes/minikube/pull/11674) +* improve containerd experience on cgroup v2 [#11632](https://github.com/kubernetes/minikube/pull/11632) +* Improve French locale [#11728](https://github.com/kubernetes/minikube/pull/11728) +* Fix UI error for stoppping systemd service [#11667](https://github.com/kubernetes/minikube/pull/11667) +* international languages: allow using LC_ALL env to set local language for windows [#11721](https://github.com/kubernetes/minikube/pull/11721) +* Change registery_mirror to registery-mirror [#11678](https://github.com/kubernetes/minikube/pull/11678) + +Version Upgrades: + +* ISO: Upgrade podman to 3.1.2 [#11704](https://github.com/kubernetes/minikube/pull/11704) +* Upgrade Buildroot to 2021.02 LTS with Linux 4.19 [#11688](https://github.com/kubernetes/minikube/pull/11688) + +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 +- Daehyeok Mun +- Dongjoon Hyun +- Felipe Crescencio de Oliveira +- Ilya Zuyev +- JacekDuszenko +- Jeff MAURY +- Medya Ghazizadeh +- Peixuan Ding +- RA489 +- Sharif Elgamal +- Steven Powell +- Vishal Jain +- zhangdb-git + +Thank you to our PR reviewers for this release! + +- medyagh (63 comments) +- sharifelgamal (9 comments) +- ilya-zuyev (6 comments) +- andriyDev (3 comments) +- spowelljr (3 comments) +- afbjorklund (1 comments) +- prezha (1 comments) +- tharun208 (1 comments) + +Thank you to our triage members for this release! + +## Version 1.21.0 - 2021-06-10 +* add more polish translations [#11587](https://github.com/kubernetes/minikube/pull/11587) +* Modify MetricsServer to use v1 api version (instead of v1beta1). [#11584](https://github.com/kubernetes/minikube/pull/11584) + +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! + +- Andriy Dzikh +- Ilya Zuyev +- JacekDuszenko +- Medya Ghazizadeh +- Sharif Elgamal +- Steven Powell + +Thank you to our PR reviewers for this release! + +- spowelljr (11 comments) +- medyagh (2 comments) +- sharifelgamal (2 comments) +- andriyDev (1 comments) + +Thank you to our triage members for this release! + +- RA489 (12 comments) +- andriyDev (10 comments) +- sharifelgamal (10 comments) +- JacekDuszenko (7 comments) +- spowelljr (5 comments) + +Check out our [contributions leaderboard](https://minikube.sigs.k8s.io/docs/contrib/leaderboard/v1.21.0/) for this release! + +## Version 1.21.0-beta.0 - 2021-06-02 +Features: +* Support setting addons from environmental variables [#11469](https://github.com/kubernetes/minikube/pull/11469) +* Add "resume" as an alias for "unpause" [#11431](https://github.com/kubernetes/minikube/pull/11431) +* Implement target node option for `cp` command [#11304](https://github.com/kubernetes/minikube/pull/11304) + +Bugs: +* Fix delete command for paused kic driver with containerd/crio runtime [#11504](https://github.com/kubernetes/minikube/pull/11504) +* kicbase: try image without sha before failing [#11559](https://github.com/kubernetes/minikube/pull/11559) +* bug: return error on invalid function name in extract.TranslatableStrings [#11454](https://github.com/kubernetes/minikube/pull/11454) +* Prevent downloading duplicate binaries already present in preload [#11461](https://github.com/kubernetes/minikube/pull/11461) +* gcp-auth addon: do not reapply gcp-auth yamls on minikube restart [#11486](https://github.com/kubernetes/minikube/pull/11486) +* Disable Non-Active Containers Runtimes [#11516](https://github.com/kubernetes/minikube/pull/11516) +* Persist custom addon image/registry settings. [#11432](https://github.com/kubernetes/minikube/pull/11432) +* Fix auto-pause on VMs (detect right control-plane IP) [#11438](https://github.com/kubernetes/minikube/pull/11438) + +Version Upgrades: +* bump default k8s version to v1.20.7 and newest to v1.22.0-alpha.2 [#11525](https://github.com/kubernetes/minikube/pull/11525) +* containerd: upgrade `io.containerd.runtime.v1.linux` to `io.containerd.runc.v2` (suppot cgroup v2) [#11325](https://github.com/kubernetes/minikube/pull/11325) +* metallb-addon: Update metallb from 0.8.2 to 0.9.6 [#11410](https://github.com/kubernetes/minikube/pull/11410) + +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! + +- Akihiro Suda +- Alessandro Lenzen +- Anders F Björklund +- Andriy Dzikh +- Brian de Alwis +- Claudia J. Kang +- Daehyeok Mun +- Emma +- Evan Anderson +- Evan Baker +- Garen Torikian +- Ilya Zuyev +- Jasmine Hegman +- Kent Iso +- KushagraIndurkhya +- Li Zhijian +- Medya Ghazizadeh +- Peixuan Ding +- Predrag Rogic +- Sharif Elgamal +- Steven Powell +- TAKAHASHI Shuuji +- Thomas Güttler +- Tomasz Janiszewski +- Utkarsh Srivastava +- VigoTheHacker +- hex0punk + +Thank you to our PR reviewers for this release! + +- medyagh (129 comments) +- ilya-zuyev (20 comments) +- afbjorklund (10 comments) +- spowelljr (9 comments) +- sharifelgamal (5 comments) +- AkihiroSuda (1 comments) +- andriyDev (1 comments) + +Thank you to our triage members for this release! + +- afbjorklund (34 comments) +- medyagh (32 comments) +- andriyDev (14 comments) +- dinever (13 comments) +- ilya-zuyev (11 comments) + + ## Version 1.20.0 - 2021-05-06 Feature: diff --git a/Makefile b/Makefile index 674b637c7c..68b6c39702 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ # Bump these on release - and please check ISO_VERSION for correctness. VERSION_MAJOR ?= 1 -VERSION_MINOR ?= 20 +VERSION_MINOR ?= 22 VERSION_BUILD ?= 0 RAW_VERSION=$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_BUILD) VERSION ?= v$(RAW_VERSION) @@ -23,7 +23,7 @@ KUBERNETES_VERSION ?= $(shell egrep "DefaultKubernetesVersion =" pkg/minikube/co KIC_VERSION ?= $(shell egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f2) # Default to .0 for higher cache hit rates, as build increments typically don't require new ISO versions -ISO_VERSION ?= v1.20.0 +ISO_VERSION ?= v1.22.0-1627488369-11483 # Dashes are valid in semver, but not Linux packaging. Use ~ to delimit alpha/beta DEB_VERSION ?= $(subst -,~,$(RAW_VERSION)) DEB_REVISION ?= 0 @@ -32,7 +32,7 @@ RPM_VERSION ?= $(DEB_VERSION) RPM_REVISION ?= 0 # used by hack/jenkins/release_build_and_upload.sh and KVM_BUILD_IMAGE, see also BUILD_IMAGE below -GO_VERSION ?= 1.16.1 +GO_VERSION ?= 1.16.6 # replace "x.y.0" => "x.y". kube-cross and golang.org/dl use different formats for x.y.0 go versions KVM_GO_VERSION ?= $(GO_VERSION:.0=) @@ -40,7 +40,7 @@ KVM_GO_VERSION ?= $(GO_VERSION:.0=) INSTALL_SIZE ?= $(shell du out/minikube-windows-amd64.exe | cut -f1) BUILDROOT_BRANCH ?= 2020.02.12 -REGISTRY?=gcr.io/k8s-minikube +REGISTRY ?= gcr.io/k8s-minikube # Get git commit id COMMIT_NO := $(shell git rev-parse HEAD 2> /dev/null || true) @@ -54,7 +54,9 @@ HYPERKIT_BUILD_IMAGE ?= neilotoole/xcgo:go1.15 BUILD_IMAGE ?= us.gcr.io/k8s-artifacts-prod/build-image/kube-cross:v$(GO_VERSION)-1 ISO_BUILD_IMAGE ?= $(REGISTRY)/buildroot-image -KVM_BUILD_IMAGE ?= $(REGISTRY)/kvm-build-image:$(KVM_GO_VERSION) + +KVM_BUILD_IMAGE_AMD64 ?= $(REGISTRY)/kvm-build-image_amd64:$(KVM_GO_VERSION) +KVM_BUILD_IMAGE_ARM64 ?= $(REGISTRY)/kvm-build-image_arm64:$(KVM_GO_VERSION) ISO_BUCKET ?= minikube/iso @@ -74,8 +76,7 @@ GOLINT_GOGC ?= 100 GOLINT_OPTIONS = --timeout 7m \ --build-tags "${MINIKUBE_INTEGRATION_BUILD_TAGS}" \ --enable gofmt,goimports,gocritic,golint,gocyclo,misspell,nakedret,stylecheck,unconvert,unparam,dogsled \ - --exclude 'variable on range scope.*in function literal|ifElseChain' \ - --skip-files "pkg/minikube/translate/translations.go|pkg/minikube/assets/assets.go" + --exclude 'variable on range scope.*in function literal|ifElseChain' export GO111MODULE := on @@ -130,13 +131,15 @@ MINIKUBE_MARKDOWN_FILES := README.md CONTRIBUTING.md CHANGELOG.md MINIKUBE_BUILD_TAGS := MINIKUBE_INTEGRATION_BUILD_TAGS := integration $(MINIKUBE_BUILD_TAGS) -CMD_SOURCE_DIRS = cmd pkg +CMD_SOURCE_DIRS = cmd pkg deploy/addons translations SOURCE_DIRS = $(CMD_SOURCE_DIRS) test -SOURCE_PACKAGES = ./cmd/... ./pkg/... ./test/... +SOURCE_PACKAGES = ./cmd/... ./pkg/... ./deploy/addons/... ./translations/... ./test/... -SOURCE_GENERATED = pkg/minikube/assets/assets.go pkg/minikube/translate/translations.go SOURCE_FILES = $(shell find $(CMD_SOURCE_DIRS) -type f -name "*.go" | grep -v _test.go) GOTEST_FILES = $(shell find $(CMD_SOURCE_DIRS) -type f -name "*.go" | grep _test.go) +ADDON_FILES = $(shell find "deploy/addons" -type f | grep -v "\.go") +TRANSLATION_FILES = $(shell find "translations" -type f | grep -v "\.go") +ASSET_FILES = $(ADDON_FILES) $(TRANSLATION_FILES) # kvm2 ldflags KVM2_LDFLAGS := -X k8s.io/minikube/pkg/drivers/kvm.version=$(VERSION) -X k8s.io/minikube/pkg/drivers/kvm.gitCommitID=$(COMMIT) @@ -195,7 +198,7 @@ ifneq ($(TEST_FILES),) INTEGRATION_TESTS_TO_RUN := $(addprefix ./test/integration/, $(TEST_HELPERS) $(TEST_FILES)) endif -out/minikube$(IS_EXE): $(SOURCE_GENERATED) $(SOURCE_FILES) go.mod +out/minikube$(IS_EXE): $(SOURCE_FILES) $(ASSET_FILES) go.mod ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) $(call DOCKER,$(BUILD_IMAGE),GOOS=$(GOOS) GOARCH=$(GOARCH) GOARM=$(GOARM) /usr/bin/make $@) else @@ -207,6 +210,10 @@ out/minikube-windows-amd64.exe: out/minikube-windows-amd64 $(if $(quiet),@echo " CP $@") $(Q)cp $< $@ +out/minikube-linux-i686: out/minikube-linux-386 + $(if $(quiet),@echo " CP $@") + $(Q)cp $< $@ + out/minikube-linux-x86_64: out/minikube-linux-amd64 $(if $(quiet),@echo " CP $@") $(Q)cp $< $@ @@ -240,7 +247,7 @@ minikube-windows-amd64.exe: out/minikube-windows-amd64.exe ## Build Minikube for eq = $(and $(findstring x$(1),x$(2)),$(findstring x$(2),x$(1))) -out/minikube-%: $(SOURCE_GENERATED) $(SOURCE_FILES) +out/minikube-%: $(SOURCE_FILES) $(ASSET_FILES) ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) $(call DOCKER,$(BUILD_IMAGE),/usr/bin/make $@) else @@ -249,6 +256,10 @@ else go build -tags "$(MINIKUBE_BUILD_TAGS)" -ldflags="$(MINIKUBE_LDFLAGS)" -a -o $@ k8s.io/minikube/cmd/minikube endif +out/minikube-linux-armv6: $(SOURCE_FILES) $(ASSET_FILES) + $(Q)GOOS=linux GOARCH=arm GOARM=6 \ + go build -tags "$(MINIKUBE_BUILD_TAGS)" -ldflags="$(MINIKUBE_LDFLAGS)" -a -o $@ k8s.io/minikube/cmd/minikube + .PHONY: e2e-linux-amd64 e2e-linux-arm64 e2e-darwin-amd64 e2e-windows-amd64.exe e2e-linux-amd64: out/e2e-linux-amd64 ## build end2end binary for Linux x86 64bit e2e-linux-arm64: out/e2e-linux-arm64 ## build end2end binary for Linux ARM 64bit @@ -302,18 +313,23 @@ iso_in_docker: --user $(shell id -u):$(shell id -g) --env HOME=/tmp --env IN_DOCKER=1 \ $(ISO_BUILD_IMAGE) /bin/bash -test-iso: $(SOURCE_GENERATED) +test-iso: go test -v $(INTEGRATION_TESTS_TO_RUN) --tags=iso --minikube-start-args="--iso-url=file://$(shell pwd)/out/buildroot/output/images/rootfs.iso9660" .PHONY: test-pkg -test-pkg/%: $(SOURCE_GENERATED) ## Trigger packaging test +test-pkg/%: ## Trigger packaging test go test -v -test.timeout=60m ./$* --tags="$(MINIKUBE_BUILD_TAGS)" .PHONY: all -all: cross drivers e2e-cross cross-tars exotic out/gvisor-addon ## Build all different minikube components +all: cross drivers e2e-cross cross-tars exotic retro out/gvisor-addon ## Build all different minikube components .PHONY: drivers -drivers: docker-machine-driver-hyperkit docker-machine-driver-kvm2 ## Build Hyperkit and KVM2 drivers +drivers: ## Build Hyperkit and KVM2 drivers +drivers: docker-machine-driver-hyperkit \ + docker-machine-driver-kvm2 \ + out/docker-machine-driver-kvm2-amd64 \ + out/docker-machine-driver-kvm2-arm64 + .PHONY: docker-machine-driver-hyperkit docker-machine-driver-hyperkit: out/docker-machine-driver-hyperkit ## Build Hyperkit driver @@ -356,15 +372,15 @@ else endif .PHONY: test -test: $(SOURCE_GENERATED) ## Trigger minikube test +test: ## Trigger minikube test MINIKUBE_LDFLAGS="${MINIKUBE_LDFLAGS}" ./test.sh .PHONY: generate-docs -generate-docs: out/minikube ## Automatically generate commands documentation. - out/minikube generate-docs --path ./site/content/en/docs/commands/ --test-path ./site/content/en/docs/contrib/tests.en.md +generate-docs: extract out/minikube ## Automatically generate commands documentation. + out/minikube generate-docs --path ./site/content/en/docs/commands/ --test-path ./site/content/en/docs/contrib/tests.en.md --code-path ./site/content/en/docs/contrib/errorcodes.en.md .PHONY: gotest -gotest: $(SOURCE_GENERATED) ## Trigger minikube test +gotest: ## Trigger minikube test $(if $(quiet),@echo " TEST $@") $(Q)go test -tags "$(MINIKUBE_BUILD_TAGS)" -ldflags="$(MINIKUBE_LDFLAGS)" $(MINIKUBE_TEST_FILES) @@ -385,43 +401,19 @@ out/coverage.html: out/coverage.out $(if $(quiet),@echo " COVER $@") $(Q)go tool cover -html=$< -o $@ -.PHONY: extract -extract: ## Compile extract tool +.PHONY: extract +extract: ## extract internationalization words for translations go run cmd/extract/extract.go -# Regenerates assets.go when template files have been updated -pkg/minikube/assets/assets.go: $(shell find "deploy/addons" -type f) -ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) - $(call DOCKER,$(BUILD_IMAGE),/usr/bin/make $@) -endif - @which go-bindata >/dev/null 2>&1 || GO111MODULE=off GOBIN="$(GOPATH)$(DIRSEP)bin" go get github.com/go-bindata/go-bindata/... - $(if $(quiet),@echo " GEN $@") - $(Q)PATH="$(PATH)$(PATHSEP)$(GOPATH)$(DIRSEP)bin" go-bindata -nomemcopy -o $@ -pkg assets deploy/addons/... - $(Q)-gofmt -s -w $@ - @#golint: Dns should be DNS (compat sed) - @sed -i -e 's/Dns/DNS/g' $@ && rm -f ./-e - @#golint: Html should be HTML (compat sed) - @sed -i -e 's/Html/HTML/g' $@ && rm -f ./-e - @#golint: don't use underscores in Go names - @sed -i -e 's/SnapshotStorageK8sIo_volumesnapshot/SnapshotStorageK8sIoVolumesnapshot/g' $@ && rm -f ./-e - -pkg/minikube/translate/translations.go: $(shell find "translations/" -type f) -ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) - $(call DOCKER,$(BUILD_IMAGE),/usr/bin/make $@) -endif - @which go-bindata >/dev/null 2>&1 || GO111MODULE=off GOBIN="$(GOPATH)$(DIRSEP)bin" go get github.com/go-bindata/go-bindata/... - $(if $(quiet),@echo " GEN $@") - $(Q)PATH="$(PATH)$(PATHSEP)$(GOPATH)$(DIRSEP)bin" go-bindata -nomemcopy -o $@ -pkg translate translations/... - $(Q)-gofmt -s -w $@ - @#golint: Json should be JSON (compat sed) - @sed -i -e 's/Json/JSON/' $@ && rm -f ./-e - .PHONY: cross cross: minikube-linux-amd64 minikube-darwin-amd64 minikube-windows-amd64.exe ## Build minikube for all platform .PHONY: exotic exotic: out/minikube-linux-arm out/minikube-linux-arm64 out/minikube-linux-ppc64le out/minikube-linux-s390x ## Build minikube for non-amd64 linux +.PHONY: retro +retro: out/minikube-linux-386 out/minikube-linux-armv6 ## Build minikube for legacy 32-bit linux + .PHONY: windows windows: minikube-windows-amd64.exe ## Build minikube for Windows 64bit @@ -439,7 +431,8 @@ checksum: ## Generate checksums for f in out/minikube.iso out/minikube-linux-amd64 out/minikube-linux-arm \ out/minikube-linux-arm64 out/minikube-linux-ppc64le out/minikube-linux-s390x \ out/minikube-darwin-amd64 out/minikube-windows-amd64.exe \ - out/docker-machine-driver-kvm2 out/docker-machine-driver-hyperkit; do \ + out/docker-machine-driver-kvm2 out/docker-machine-driver-kvm2-amd64 out/docker-machine-driver-kvm2-arm64 \ + out/docker-machine-driver-hyperkit; do \ if [ -f "$${f}" ]; then \ openssl sha256 "$${f}" | awk '{print $$2}' > "$${f}.sha256" ; \ fi ; \ @@ -479,7 +472,7 @@ goimports: ## Run goimports and list the files differs from goimport's @test -z "`goimports -l $(SOURCE_DIRS)`" .PHONY: golint -golint: $(SOURCE_GENERATED) ## Run golint +golint: ## Run golint @golint -set_exit_status $(SOURCE_PACKAGES) .PHONY: gocyclo @@ -494,17 +487,17 @@ out/linters/golangci-lint-$(GOLINT_VERSION): # this one is meant for local use .PHONY: lint ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) -lint: $(SOURCE_GENERATED) +lint: docker run --rm -v $(pwd):/app -w /app golangci/golangci-lint:$(GOLINT_VERSION) \ golangci-lint run ${GOLINT_OPTIONS} --skip-dirs "cmd/drivers/kvm|cmd/drivers/hyperkit|pkg/drivers/kvm|pkg/drivers/hyperkit" ./... else -lint: $(SOURCE_GENERATED) out/linters/golangci-lint-$(GOLINT_VERSION) ## Run lint +lint: out/linters/golangci-lint-$(GOLINT_VERSION) ## Run lint ./out/linters/golangci-lint-$(GOLINT_VERSION) run ${GOLINT_OPTIONS} ./... endif # lint-ci is slower version of lint and is meant to be used in ci (travis) to avoid out of memory leaks. .PHONY: lint-ci -lint-ci: $(SOURCE_GENERATED) out/linters/golangci-lint-$(GOLINT_VERSION) ## Run lint-ci +lint-ci: out/linters/golangci-lint-$(GOLINT_VERSION) ## Run lint-ci GOGC=${GOLINT_GOGC} ./out/linters/golangci-lint-$(GOLINT_VERSION) run \ --concurrency ${GOLINT_JOBS} ${GOLINT_OPTIONS} ./... @@ -522,15 +515,15 @@ mdlint: verify-iso: # Make sure the current ISO exists in the expected bucket gsutil stat gs://$(ISO_BUCKET)/minikube-$(ISO_VERSION).iso -out/docs/minikube.md: $(shell find "cmd") $(shell find "pkg/minikube/constants") $(SOURCE_GENERATED) +out/docs/minikube.md: $(shell find "cmd") $(shell find "pkg/minikube/constants") go run -ldflags="$(MINIKUBE_LDFLAGS)" -tags gendocs hack/help_text/gen_help_text.go - .PHONY: debs ## Build all deb packages debs: out/minikube_$(DEB_VERSION)-$(DEB_REVISION)_amd64.deb \ out/minikube_$(DEB_VERSION)-$(DEB_REVISION)_arm64.deb \ - out/docker-machine-driver-kvm2_$(DEB_VERSION).deb - + out/docker-machine-driver-kvm2_$(DEB_VERSION).deb \ + out/docker-machine-driver-kvm2_$(DEB_VERSION)-$(DEB_REVISION)_amd64.deb \ + out/docker-machine-driver-kvm2_$(DEB_VERSION)-$(DEB_REVISION)_arm64.deb .PHONY: deb_version deb_version: @@ -595,7 +588,9 @@ out/repodata/repomd.xml: out/minikube-$(RPM_VERSION).rpm .SECONDEXPANSION: TAR_TARGETS_linux-amd64 := out/minikube-linux-amd64 out/docker-machine-driver-kvm2 +TAR_TARGETS_linux-arm64 := out/minikube-linux-arm64 #out/docker-machine-driver-kvm2 TAR_TARGETS_darwin-amd64 := out/minikube-darwin-amd64 out/docker-machine-driver-hyperkit +TAR_TARGETS_darwin-arm64 := out/minikube-darwin-arm64 #out/docker-machine-driver-hyperkit TAR_TARGETS_windows-amd64 := out/minikube-windows-amd64.exe out/minikube-%.tar.gz: $$(TAR_TARGETS_$$*) $(if $(quiet),@echo " TAR $@") @@ -649,8 +644,8 @@ release-hyperkit-driver: install-hyperkit-driver checksum ## Copy hyperkit using gsutil cp $(GOBIN)/docker-machine-driver-hyperkit.sha256 gs://minikube/drivers/hyperkit/$(VERSION)/ .PHONY: check-release -check-release: $(SOURCE_GENERATED) ## Execute go test - go test -v ./deploy/minikube/release_sanity_test.go -tags=release +check-release: ## Execute go test + go test -timeout 42m -v ./deploy/minikube/release_sanity_test.go buildroot-image: $(ISO_BUILD_IMAGE) # convenient alias to build the docker container $(ISO_BUILD_IMAGE): deploy/iso/minikube-iso/Dockerfile @@ -692,8 +687,23 @@ KICBASE_IMAGE_GCR ?= $(REGISTRY)/kicbase:$(KIC_VERSION) KICBASE_IMAGE_HUB ?= kicbase/stable:$(KIC_VERSION) KICBASE_IMAGE_REGISTRIES ?= $(KICBASE_IMAGE_GCR) $(KICBASE_IMAGE_HUB) +.PHONY: local-kicbase +local-kicbase: ## Builds the kicbase image and tags it local/kicbase:latest and local/kicbase:$(KIC_VERSION)-$(COMMIT_SHORT) + docker build -f ./deploy/kicbase/Dockerfile -t local/kicbase:$(KIC_VERSION) --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) --cache-from $(KICBASE_IMAGE_GCR) . + docker tag local/kicbase:$(KIC_VERSION) local/kicbase:latest + docker tag local/kicbase:$(KIC_VERSION) local/kicbase:$(KIC_VERSION)-$(COMMIT_SHORT) + +SED = sed -i +ifeq ($(GOOS),darwin) + SED = sed -i '' +endif + +.PHONY: local-kicbase-debug +local-kicbase-debug: local-kicbase ## Builds a local kicbase image and switches source code to point to it + $(SED) 's|Version = .*|Version = \"$(KIC_VERSION)-$(COMMIT_SHORT)\"|;s|baseImageSHA = .*|baseImageSHA = \"\"|;s|gcrRepo = .*|gcrRepo = \"local/kicbase\"|;s|dockerhubRepo = .*|dockerhubRepo = \"local/kicbase\"|' pkg/drivers/kic/types.go + .PHONY: push-kic-base-image -push-kic-base-image: deploy/kicbase/auto-pause docker-multi-arch-builder ## Push multi-arch local/kicbase:latest to all remote registries +push-kic-base-image: docker-multi-arch-builder ## Push multi-arch local/kicbase:latest to all remote registries ifdef AUTOPUSH docker login gcr.io/k8s-minikube docker login docker.pkg.github.com @@ -704,7 +714,7 @@ endif ifndef CIBUILD $(call user_confirm, 'Are you sure you want to push $(KICBASE_IMAGE_REGISTRIES) ?') endif - env $(X_BUILD_ENV) docker buildx build --builder $(X_DOCKER_BUILDER) --platform $(KICBASE_ARCH) $(addprefix -t ,$(KICBASE_IMAGE_REGISTRIES)) --push --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) ./deploy/kicbase + env $(X_BUILD_ENV) docker buildx build -f ./deploy/kicbase/Dockerfile --builder $(X_DOCKER_BUILDER) --platform $(KICBASE_ARCH) $(addprefix -t ,$(KICBASE_IMAGE_REGISTRIES)) --push --build-arg COMMIT_SHA=${VERSION}-$(COMMIT) . out/preload-tool: go build -ldflags="$(MINIKUBE_LDFLAGS)" -o $@ ./hack/preload-images/*.go @@ -723,11 +733,13 @@ TAG = $(STORAGE_PROVISIONER_TAG) .PHONY: push-storage-provisioner-manifest push-storage-provisioner-manifest: $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~storage\-provisioner\-image\-&~g") ## Push multi-arch storage-provisioner image +ifndef CIBUILD docker login gcr.io/k8s-minikube +endif set -x; for arch in $(ALL_ARCH); do docker push ${IMAGE}-$${arch}:${TAG}; done - docker manifest create --amend $(IMAGE):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(IMAGE)\-&:$(TAG)~g") - set -x; for arch in $(ALL_ARCH); do docker manifest annotate --arch $${arch} ${IMAGE}:${TAG} ${IMAGE}-$${arch}:${TAG}; done - docker manifest push $(STORAGE_PROVISIONER_MANIFEST) + $(X_BUILD_ENV) docker manifest create --amend $(IMAGE):$(TAG) $(shell echo $(ALL_ARCH) | sed -e "s~[^ ]*~$(IMAGE)\-&:$(TAG)~g") + set -x; for arch in $(ALL_ARCH); do $(X_BUILD_ENV) docker manifest annotate --arch $${arch} ${IMAGE}:${TAG} ${IMAGE}-$${arch}:${TAG}; done + $(X_BUILD_ENV) docker manifest push $(STORAGE_PROVISIONER_MANIFEST) .PHONY: push-docker push-docker: # Push docker image base on to IMAGE variable (used internally by other targets) @@ -738,7 +750,7 @@ endif docker push $(IMAGE) .PHONY: out/gvisor-addon -out/gvisor-addon: $(SOURCE_GENERATED) ## Build gvisor addon +out/gvisor-addon: ## Build gvisor addon $(if $(quiet),@echo " GO $@") $(Q)GOOS=linux CGO_ENABLED=0 go build -o $@ cmd/gvisor/gvisor.go @@ -761,6 +773,14 @@ release-minikube: out/minikube checksum ## Minikube release gsutil cp out/minikube-$(GOOS)-$(GOARCH) $(MINIKUBE_UPLOAD_LOCATION)/$(MINIKUBE_VERSION)/minikube-$(GOOS)-$(GOARCH) gsutil cp out/minikube-$(GOOS)-$(GOARCH).sha256 $(MINIKUBE_UPLOAD_LOCATION)/$(MINIKUBE_VERSION)/minikube-$(GOOS)-$(GOARCH).sha256 +.PHONY: release-notes +release-notes: + hack/release_notes.sh + +.PHONY: update-leaderboard +update-leaderboard: + hack/update_contributions.sh + out/docker-machine-driver-kvm2: out/docker-machine-driver-kvm2-amd64 $(if $(quiet),@echo " CP $@") $(Q)cp $< $@ @@ -773,10 +793,81 @@ out/docker-machine-driver-kvm2-aarch64: out/docker-machine-driver-kvm2-arm64 $(if $(quiet),@echo " CP $@") $(Q)cp $< $@ + +out/docker-machine-driver-kvm2_$(DEB_VERSION).deb: out/docker-machine-driver-kvm2_$(DEB_VERSION)-0_amd64.deb + cp $< $@ + +out/docker-machine-driver-kvm2_$(DEB_VERSION)-0_%.deb: out/docker-machine-driver-kvm2-% + cp -r installers/linux/deb/kvm2_deb_template out/docker-machine-driver-kvm2_$(DEB_VERSION) + chmod 0755 out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN + sed -E -i -e 's/--VERSION--/$(DEB_VERSION)/g' out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN/control + sed -E -i -e 's/--ARCH--/'$*'/g' out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN/control + mkdir -p out/docker-machine-driver-kvm2_$(DEB_VERSION)/usr/bin + cp $< out/docker-machine-driver-kvm2_$(DEB_VERSION)/usr/bin/docker-machine-driver-kvm2 + fakeroot dpkg-deb --build out/docker-machine-driver-kvm2_$(DEB_VERSION) $@ + rm -rf out/docker-machine-driver-kvm2_$(DEB_VERSION) + +out/docker-machine-driver-kvm2-$(RPM_VERSION).rpm: out/docker-machine-driver-kvm2-$(RPM_VERSION)-0.x86_64.rpm + cp $< $@ + +out/docker-machine-driver-kvm2_$(RPM_VERSION).amd64.rpm: out/docker-machine-driver-kvm2-$(RPM_VERSION)-0.x86_64.rpm + cp $< $@ + +out/docker-machine-driver-kvm2_$(RPM_VERSION).arm64.rpm: out/docker-machine-driver-kvm2-$(RPM_VERSION)-0.aarch64.rpm + cp $< $@ + +out/docker-machine-driver-kvm2-$(RPM_VERSION)-0.%.rpm: out/docker-machine-driver-kvm2-% + cp -r installers/linux/rpm/kvm2_rpm_template out/docker-machine-driver-kvm2-$(RPM_VERSION) + sed -E -i -e 's/--VERSION--/'$(RPM_VERSION)'/g' out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec + sed -E -i -e 's|--OUT--|'$(PWD)/out'|g' out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec + rpmbuild -bb -D "_rpmdir $(PWD)/out" --target $* \ + out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec + @mv out/$*/docker-machine-driver-kvm2-$(RPM_VERSION)-0.$*.rpm out/ && rmdir out/$* + rm -rf out/docker-machine-driver-kvm2-$(RPM_VERSION) + +.PHONY: kvm-image-amd64 +kvm-image-amd64: installers/linux/kvm/Dockerfile.amd64 ## Convenient alias to build the docker container + docker build --build-arg "GO_VERSION=$(KVM_GO_VERSION)" -t $(KVM_BUILD_IMAGE_AMD64) -f $< $(dir $<) + @echo "" + @echo "$(@) successfully built" + +.PHONY: kvm-image-arm64 +kvm-image-arm64: installers/linux/kvm/Dockerfile.arm64 ## Convenient alias to build the docker container + docker build --build-arg "GO_VERSION=$(KVM_GO_VERSION)" -t $(KVM_BUILD_IMAGE_ARM64) -f $< $(dir $<) + @echo "" + @echo "$(@) successfully built" + +kvm_in_docker: + docker image inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE_AMD64) || $(MAKE) kvm-image-amd64 + rm -f out/docker-machine-driver-kvm2 + $(call DOCKER,$(KVM_BUILD_IMAGE_AMD64),/usr/bin/make out/docker-machine-driver-kvm2 COMMIT=$(COMMIT)) + +.PHONY: install-kvm-driver +install-kvm-driver: out/docker-machine-driver-kvm2 ## Install KVM Driver + mkdir -p $(GOBIN) + cp out/docker-machine-driver-kvm2 $(GOBIN)/docker-machine-driver-kvm2 + + +out/docker-machine-driver-kvm2-arm64: +ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) + docker image inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE_ARM64) || $(MAKE) kvm-image-arm64 + $(call DOCKER,$(KVM_BUILD_IMAGE_ARM64),/usr/bin/make $@ COMMIT=$(COMMIT)) +else + $(if $(quiet),@echo " GO $@") + $(Q)GOARCH=arm64 \ + go build \ + -installsuffix "static" \ + -ldflags="$(KVM2_LDFLAGS)" \ + -tags "libvirt.1.3.1 without_lxc" \ + -o $@ \ + k8s.io/minikube/cmd/drivers/kvm +endif + chmod +X $@ + out/docker-machine-driver-kvm2-%: ifeq ($(MINIKUBE_BUILD_IN_DOCKER),y) - docker image inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE) || $(MAKE) kvm-image - $(call DOCKER,$(KVM_BUILD_IMAGE),/usr/bin/make $@ COMMIT=$(COMMIT)) + docker image inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE_AMD64) || $(MAKE) kvm-image-amd64 + $(call DOCKER,$(KVM_BUILD_IMAGE_AMD64),/usr/bin/make $@ COMMIT=$(COMMIT)) # make extra sure that we are linking with the older version of libvirt (1.3.1) test "`strings $@ | grep '^LIBVIRT_[0-9]' | sort | tail -n 1`" = "LIBVIRT_1.2.9" else @@ -791,51 +882,6 @@ else endif chmod +X $@ -out/docker-machine-driver-kvm2_$(DEB_VERSION).deb: out/docker-machine-driver-kvm2_$(DEB_VERSION)-0_amd64.deb - cp $< $@ - -out/docker-machine-driver-kvm2_$(DEB_VERSION)-0_%.deb: out/docker-machine-driver-kvm2-% - cp -r installers/linux/deb/kvm2_deb_template out/docker-machine-driver-kvm2_$(DEB_VERSION) - chmod 0755 out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN - sed -E -i 's/--VERSION--/'$(DEB_VERSION)'/g' out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN/control - sed -E -i 's/--ARCH--/'$*'/g' out/docker-machine-driver-kvm2_$(DEB_VERSION)/DEBIAN/control - mkdir -p out/docker-machine-driver-kvm2_$(DEB_VERSION)/usr/bin - cp $< out/docker-machine-driver-kvm2_$(DEB_VERSION)/usr/bin/docker-machine-driver-kvm2 - fakeroot dpkg-deb --build out/docker-machine-driver-kvm2_$(DEB_VERSION) $@ - rm -rf out/docker-machine-driver-kvm2_$(DEB_VERSION) - -out/docker-machine-driver-kvm2-$(RPM_VERSION).rpm: out/docker-machine-driver-kvm2-$(RPM_VERSION)-0.x86_64.deb - cp $< $@ - -out/docker-machine-driver-kvm2-$(RPM_VERSION)-0.%.rpm: out/docker-machine-driver-kvm2-% - cp -r installers/linux/rpm/kvm2_rpm_template out/docker-machine-driver-kvm2-$(RPM_VERSION) - sed -E -i 's/--VERSION--/'$(RPM_VERSION)'/g' out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec - sed -E -i 's|--OUT--|'$(PWD)/out'|g' out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec - rpmbuild -bb -D "_rpmdir $(PWD)/out" --target $* \ - out/docker-machine-driver-kvm2-$(RPM_VERSION)/docker-machine-driver-kvm2.spec - @mv out/$*/docker-machine-driver-kvm2-$(RPM_VERSION)-0.$*.rpm out/ && rmdir out/$* - rm -rf out/docker-machine-driver-kvm2-$(RPM_VERSION) - -.PHONY: kvm-image -kvm-image: installers/linux/kvm/Dockerfile ## Convenient alias to build the docker container - docker build --build-arg "GO_VERSION=$(KVM_GO_VERSION)" -t $(KVM_BUILD_IMAGE) -f $< $(dir $<) - @echo "" - @echo "$(@) successfully built" - -kvm_in_docker: - docker image inspect -f '{{.Id}} {{.RepoTags}}' $(KVM_BUILD_IMAGE) || $(MAKE) kvm-image - rm -f out/docker-machine-driver-kvm2 - $(call DOCKER,$(KVM_BUILD_IMAGE),/usr/bin/make out/docker-machine-driver-kvm2 COMMIT=$(COMMIT)) - -.PHONY: install-kvm-driver -install-kvm-driver: out/docker-machine-driver-kvm2 ## Install KVM Driver - mkdir -p $(GOBIN) - cp out/docker-machine-driver-kvm2 $(GOBIN)/docker-machine-driver-kvm2 - -.PHONY: release-kvm-driver -release-kvm-driver: install-kvm-driver checksum ## Release KVM Driver - gsutil cp $(GOBIN)/docker-machine-driver-kvm2 gs://minikube/drivers/kvm/$(VERSION)/ - gsutil cp $(GOBIN)/docker-machine-driver-kvm2.sha256 gs://minikube/drivers/kvm/$(VERSION)/ site/themes/docsy/assets/vendor/bootstrap/package.js: ## update the website docsy theme git submodule git submodule update -f --init --recursive @@ -843,8 +889,7 @@ site/themes/docsy/assets/vendor/bootstrap/package.js: ## update the website docs out/hugo/hugo: mkdir -p out test -d out/hugo || git clone https://github.com/gohugoio/hugo.git out/hugo - go get golang.org/dl/go1.16 && go1.16 download - (cd out/hugo && go1.16 build --tags extended) + (cd out/hugo && go build --tags extended) .PHONY: site site: site/themes/docsy/assets/vendor/bootstrap/package.js out/hugo/hugo ## Serve the documentation site to localhost @@ -858,17 +903,14 @@ site: site/themes/docsy/assets/vendor/bootstrap/package.js out/hugo/hugo ## Serv out/mkcmp: GOOS=$(GOOS) GOARCH=$(GOARCH) go build -o $@ cmd/performance/mkcmp/main.go -.PHONY: deploy/kicbase/auto-pause # auto pause binary to be used for kic image work around for not passing the whole repo as docker context -deploy/kicbase/auto-pause: $(SOURCE_GENERATED) $(SOURCE_FILES) - GOOS=linux GOARCH=$(GOARCH) go build -o $@ cmd/auto-pause/auto-pause.go # auto pause binary to be used for ISO -deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/bin/auto-pause: $(SOURCE_GENERATED) $(SOURCE_FILES) +deploy/iso/minikube-iso/board/coreos/minikube/rootfs-overlay/usr/bin/auto-pause: $(SOURCE_FILES) $(ASSET_FILES) GOOS=linux GOARCH=$(GOARCH) go build -o $@ cmd/auto-pause/auto-pause.go .PHONY: deploy/addons/auto-pause/auto-pause-hook -deploy/addons/auto-pause/auto-pause-hook: $(SOURCE_GENERATED) ## Build auto-pause hook addon +deploy/addons/auto-pause/auto-pause-hook: ## Build auto-pause hook addon $(if $(quiet),@echo " GO $@") $(Q)GOOS=linux CGO_ENABLED=0 go build -a --ldflags '-extldflags "-static"' -tags netgo -installsuffix netgo -o $@ cmd/auto-pause/auto-pause-hook/main.go cmd/auto-pause/auto-pause-hook/config.go cmd/auto-pause/auto-pause-hook/certs.go @@ -916,6 +958,12 @@ help: @grep -h -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +.PHONY: update-golang-version +update-golang-version: + (cd hack/update/golang_version && \ + go run update_golang_version.go) + .PHONY: update-kubernetes-version update-kubernetes-version: (cd hack/update/kubernetes_version && \ @@ -949,6 +997,10 @@ cpu-benchmark-idle: ## run the cpu usage 5 minutes idle benchmark cpu-benchmark-autopause: ## run the cpu usage auto-pause benchmark ./hack/benchmark/cpu_usage/auto_pause/benchmark_local_k8s.sh +.PHONY: time-to-k8s-benchmark +time-to-k8s-benchmark: + ./hack/benchmark/time-to-k8s/time-to-k8s.sh + .PHONY: update-gopogh-version update-gopogh-version: ## update gopogh version (cd hack/update/gopogh_version && \ diff --git a/OWNERS b/OWNERS index 7b7cf22528..b5400a2f91 100644 --- a/OWNERS +++ b/OWNERS @@ -1,21 +1,19 @@ # See the OWNERS docs at https://go.k8s.io/owners reviewers: - - tstromberg - afbjorklund - sharifelgamal - - RA489 - medyagh - blueelvis - prasadkatti - - ilya-zuyev - prezha + - spowelljr approvers: - - tstromberg - afbjorklund - sharifelgamal - medyagh - - ilya-zuyev + - spowelljr + - prezha emeritus_approvers: - dlorenc - luxas @@ -24,3 +22,4 @@ emeritus_approvers: - aaron-prindle - priyawadhwa - josedonizetti + - tstromberg 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: diff --git a/cmd/auto-pause/auto-pause.go b/cmd/auto-pause/auto-pause.go index 0eb0830e8d..1fe405d3e9 100644 --- a/cmd/auto-pause/auto-pause.go +++ b/cmd/auto-pause/auto-pause.go @@ -17,6 +17,7 @@ limitations under the License. package main import ( + "flag" "fmt" "log" "net/http" @@ -39,10 +40,11 @@ var mu sync.Mutex var runtimePaused bool var version = "0.0.1" -// TODO: #10597 make this configurable to support containerd/cri-o -var runtime = "docker" +var runtime = flag.String("container-runtime", "docker", "Container runtime to use for (un)pausing") func main() { + flag.Parse() + // TODO: #10595 make this configurable const interval = time.Minute * 1 @@ -89,7 +91,7 @@ func runPause() { r := command.NewExecRunner(true) - cr, err := cruntime.New(cruntime.Config{Type: runtime, Runner: r}) + cr, err := cruntime.New(cruntime.Config{Type: *runtime, Runner: r}) if err != nil { exit.Error(reason.InternalNewRuntime, "Failed runtime", err) } @@ -111,7 +113,7 @@ func runUnpause() { r := command.NewExecRunner(true) - cr, err := cruntime.New(cruntime.Config{Type: runtime, Runner: r}) + cr, err := cruntime.New(cruntime.Config{Type: *runtime, Runner: r}) if err != nil { exit.Error(reason.InternalNewRuntime, "Failed runtime", err) } @@ -130,7 +132,7 @@ func alreadyPaused() { defer mu.Unlock() r := command.NewExecRunner(true) - cr, err := cruntime.New(cruntime.Config{Type: runtime, Runner: r}) + cr, err := cruntime.New(cruntime.Config{Type: *runtime, Runner: r}) if err != nil { exit.Error(reason.InternalNewRuntime, "Failed runtime", err) } diff --git a/cmd/minikube/cmd/cache.go b/cmd/minikube/cmd/cache.go index 7933f4f7ec..df260cfb47 100644 --- a/cmd/minikube/cmd/cache.go +++ b/cmd/minikube/cmd/cache.go @@ -52,7 +52,7 @@ var addCacheCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { out.WarningT("\"minikube cache\" will be deprecated in upcoming versions, please switch to \"minikube image load\"") // Cache and load images into docker daemon - if err := machine.CacheAndLoadImages(args, cacheAddProfiles()); err != nil { + if err := machine.CacheAndLoadImages(args, cacheAddProfiles(), false); err != nil { exit.Error(reason.InternalCacheLoad, "Failed to cache and load images", err) } // Add images to config file diff --git a/cmd/minikube/cmd/completion.go b/cmd/minikube/cmd/completion.go index ee1fd083d9..f7d9dec0fc 100644 --- a/cmd/minikube/cmd/completion.go +++ b/cmd/minikube/cmd/completion.go @@ -77,25 +77,52 @@ var completionCmd = &cobra.Command{ } if args[0] != "bash" && args[0] != "zsh" && args[0] != "fish" { exit.Message(reason.Usage, "Sorry, completion support is not yet implemented for {{.name}}", out.V{"name": args[0]}) - } else if args[0] == "bash" { - err := GenerateBashCompletion(os.Stdout, cmd.Parent()) - if err != nil { - exit.Error(reason.InternalCompletion, "bash completion failed", err) - } - } else if args[0] == "zsh" { - err := GenerateZshCompletion(os.Stdout, cmd.Parent()) - if err != nil { - exit.Error(reason.InternalCompletion, "zsh completion failed", err) - } - } else { - err := GenerateFishCompletion(os.Stdout, cmd.Parent()) - if err != nil { - exit.Error(reason.InternalCompletion, "fish completion failed", err) - } } }, } +var bashCmd = &cobra.Command{ + Use: "bash", + Short: "bash completion.", + Long: "Generate command completion for bash.", + Run: func(cmd *cobra.Command, args []string) { + err := GenerateBashCompletion(os.Stdout, cmd.Root()) + if err != nil { + exit.Error(reason.InternalCompletion, "bash completion failed", err) + } + }, +} + +var zshCmd = &cobra.Command{ + Use: "zsh", + Short: "zsh completion.", + Long: "Generate command completion for zsh.", + Run: func(cmd *cobra.Command, args []string) { + err := GenerateZshCompletion(os.Stdout, cmd.Root()) + if err != nil { + exit.Error(reason.InternalCompletion, "zsh completion failed", err) + } + }, +} + +var fishCmd = &cobra.Command{ + Use: "fish", + Short: "fish completion.", + Long: "Generate command completion for fish .", + Run: func(cmd *cobra.Command, args []string) { + err := GenerateFishCompletion(os.Stdout, cmd.Root()) + if err != nil { + exit.Error(reason.InternalCompletion, "fish completion failed", err) + } + }, +} + +func init() { + completionCmd.AddCommand(bashCmd) + completionCmd.AddCommand(zshCmd) + completionCmd.AddCommand(fishCmd) +} + // GenerateBashCompletion generates the completion for the bash shell func GenerateBashCompletion(w io.Writer, cmd *cobra.Command) error { _, err := w.Write([]byte(boilerPlate)) diff --git a/cmd/minikube/cmd/config/addons_list.go b/cmd/minikube/cmd/config/addons_list.go index eb344aafce..4ee0a19a75 100644 --- a/cmd/minikube/cmd/config/addons_list.go +++ b/cmd/minikube/cmd/config/addons_list.go @@ -98,7 +98,7 @@ var printAddonsList = func(cc *config.ClusterConfig) { var tData [][]string table := tablewriter.NewWriter(os.Stdout) - table.SetHeader([]string{"Addon Name", "Profile", "Status"}) + table.SetHeader([]string{"Addon Name", "Profile", "Status", "Maintainer"}) table.SetAutoFormatHeaders(true) table.SetBorders(tablewriter.Border{Left: true, Top: true, Right: true, Bottom: true}) table.SetCenterSeparator("|") @@ -106,7 +106,11 @@ var printAddonsList = func(cc *config.ClusterConfig) { for _, addonName := range addonNames { addonBundle := assets.Addons[addonName] enabled := addonBundle.IsEnabled(cc) - tData = append(tData, []string{addonName, cc.Name, fmt.Sprintf("%s %s", stringFromStatus(enabled), iconFromStatus(enabled))}) + maintainer := addonBundle.Maintainer + if maintainer == "" { + maintainer = "unknown (third-party)" + } + tData = append(tData, []string{addonName, cc.Name, fmt.Sprintf("%s %s", stringFromStatus(enabled), iconFromStatus(enabled)), maintainer}) } table.AppendBulk(tData) diff --git a/cmd/minikube/cmd/config/config.go b/cmd/minikube/cmd/config/config.go index 8ef3630915..738ac8badc 100644 --- a/cmd/minikube/cmd/config/config.go +++ b/cmd/minikube/cmd/config/config.go @@ -76,7 +76,7 @@ var settings = []Setting{ { name: "cpus", set: SetInt, - validations: []setFn{IsPositive}, + validations: []setFn{IsValidCPUs}, callbacks: []setFn{RequiresRestartMsg}, }, { @@ -122,22 +122,14 @@ var settings = []Setting{ name: config.ReminderWaitPeriodInHours, set: SetInt, }, - { - name: config.WantReportError, - set: SetBool, - }, - { - name: config.WantReportErrorPrompt, - set: SetBool, - }, - { - name: config.WantKubectlDownloadMsg, - set: SetBool, - }, { name: config.WantNoneDriverWarning, set: SetBool, }, + { + name: config.WantVirtualBoxDriverWarning, + set: SetBool, + }, { name: config.ProfileName, set: SetString, @@ -146,14 +138,6 @@ var settings = []Setting{ name: Bootstrapper, set: SetString, }, - { - name: config.ShowDriverDeprecationNotification, - set: SetBool, - }, - { - name: config.ShowBootstrapperDeprecationNotification, - set: SetBool, - }, { name: "insecure-registry", set: SetString, @@ -172,7 +156,7 @@ var settings = []Setting{ setMap: SetMap, }, { - name: "embed-certs", + name: config.EmbedCerts, set: SetBool, }, { 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 0df2abb534..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 := "" @@ -77,5 +77,6 @@ func init() { addonsEnableCmd.Flags().StringVar(&images, "images", "", "Images used by this addon. Separated by commas.") addonsEnableCmd.Flags().StringVar(®istries, "registries", "", "Registries used by this addon. Separated by commas.") addonsEnableCmd.Flags().BoolVar(&addons.Force, "force", false, "If true, will perform potentially dangerous operations. Use with discretion.") + addonsEnableCmd.Flags().BoolVar(&addons.Refresh, "refresh", false, "If true, pods might get deleted and restarted on addon enable") AddonsCmd.AddCommand(addonsEnableCmd) } diff --git a/cmd/minikube/cmd/config/validations.go b/cmd/minikube/cmd/config/validations.go index c88de5c7f3..5a06786cd9 100644 --- a/cmd/minikube/cmd/config/validations.go +++ b/cmd/minikube/cmd/config/validations.go @@ -25,6 +25,7 @@ import ( "strings" units "github.com/docker/go-units" + "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/cruntime" "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/out" @@ -53,8 +54,19 @@ func IsValidDiskSize(name string, disksize string) error { return nil } +// IsValidCPUs checks if a string is a valid number of CPUs +func IsValidCPUs(name string, cpus string) error { + if cpus == constants.MaxResources { + return nil + } + return IsPositive(name, cpus) +} + // IsValidMemory checks if a string is a valid memory size func IsValidMemory(name string, memsize string) error { + if memsize == constants.MaxResources { + return nil + } _, err := units.FromHumanSize(memsize) if err != nil { return fmt.Errorf("invalid memory size: %v", err) diff --git a/cmd/minikube/cmd/cp.go b/cmd/minikube/cmd/cp.go index e63be90b19..2ad6290085 100644 --- a/cmd/minikube/cmd/cp.go +++ b/cmd/minikube/cmd/cp.go @@ -20,13 +20,18 @@ import ( "github.com/pkg/errors" "github.com/spf13/cobra" + "fmt" "os" pt "path" "strings" + "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" + "k8s.io/minikube/pkg/minikube/command" "k8s.io/minikube/pkg/minikube/exit" + "k8s.io/minikube/pkg/minikube/machine" "k8s.io/minikube/pkg/minikube/mustload" + "k8s.io/minikube/pkg/minikube/node" "k8s.io/minikube/pkg/minikube/out" "k8s.io/minikube/pkg/minikube/reason" ) @@ -35,14 +40,16 @@ import ( var ( srcPath string dstPath string + dstNode string ) // cpCmd represents the cp command, similar to docker cp var cpCmd = &cobra.Command{ - Use: "cp ", + Use: "cp :", Short: "Copy the specified file into minikube", Long: "Copy the specified file into minikube, it will be saved at path in your minikube.\n" + - "Example Command : \"minikube cp a.txt /home/docker/b.txt\"\n", + "Example Command : \"minikube cp a.txt /home/docker/b.txt\"\n" + + " \"minikube cp a.txt minikube-m02:/home/docker/b.txt\"\n", Run: func(cmd *cobra.Command, args []string) { if len(args) != 2 { exit.Message(reason.Usage, `Please specify the path to copy: @@ -51,18 +58,51 @@ var cpCmd = &cobra.Command{ srcPath = args[0] dstPath = args[1] + + // if destination path is not a absolute path, trying to parse with : format + if !strings.HasPrefix(dstPath, "/") { + if sp := strings.SplitN(dstPath, ":", 2); len(sp) == 2 { + dstNode = sp[0] + dstPath = sp[1] + } + } + validateArgs(srcPath, dstPath) - co := mustload.Running(ClusterFlagValue()) fa, err := assets.NewFileAsset(srcPath, pt.Dir(dstPath), pt.Base(dstPath), "0644") if err != nil { out.ErrLn("%v", errors.Wrap(err, "getting file asset")) os.Exit(1) } + defer func() { + if err := fa.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", fa.GetSourcePath(), err) + } + }() - if err = co.CP.Runner.Copy(fa); err != nil { - out.ErrLn("%v", errors.Wrap(err, "copying file")) - os.Exit(1) + co := mustload.Running(ClusterFlagValue()) + var runner command.Runner + if dstNode == "" { + runner = co.CP.Runner + } else { + n, _, err := node.Retrieve(*co.Config, dstNode) + if err != nil { + exit.Message(reason.GuestNodeRetrieve, "Node {{.nodeName}} does not exist.", out.V{"nodeName": dstNode}) + } + + h, err := machine.GetHost(co.API, *co.Config, *n) + if err != nil { + exit.Error(reason.GuestLoadHost, "Error getting host", err) + } + + runner, err = machine.CommandRunner(h) + if err != nil { + exit.Error(reason.InternalCommandRunner, "Failed to get command runner", err) + } + } + + if err = runner.Copy(fa); err != nil { + exit.Error(reason.InternalCommandRunner, fmt.Sprintf("Fail to copy file %s", fa.GetSourcePath()), err) } }, } diff --git a/cmd/minikube/cmd/dashboard.go b/cmd/minikube/cmd/dashboard.go index f1fa86d726..141b3ab212 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,}`) @@ -65,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 @@ -92,7 +98,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 +132,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 { @@ -172,8 +178,8 @@ func kubectlProxy(kubectlVersion string, contextName string) (*exec.Cmd, string, // readByteWithTimeout returns a byte from a reader or an indicator that a timeout has occurred. func readByteWithTimeout(r io.ByteReader, timeout time.Duration) (byte, bool, error) { - bc := make(chan byte) - ec := make(chan error) + bc := make(chan byte, 1) + ec := make(chan error, 1) go func() { b, err := r.ReadByte() if err != nil { @@ -217,4 +223,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/cmd/minikube/cmd/delete.go b/cmd/minikube/cmd/delete.go index 0dd3839bb1..ec657fe817 100644 --- a/cmd/minikube/cmd/delete.go +++ b/cmd/minikube/cmd/delete.go @@ -87,6 +87,24 @@ func (error DeletionError) Error() string { return error.Err.Error() } +var hostAndDirsDeleter = func(api libmachine.API, cc *config.ClusterConfig, profileName string) error { + if err := killMountProcess(); err != nil { + out.FailureT("Failed to kill mount process: {{.error}}", out.V{"error": err}) + } + + deleteHosts(api, cc) + + // In case DeleteHost didn't complete the job. + deleteProfileDirectory(profileName) + deleteMachineDirectories(cc) + + if err := deleteConfig(profileName); err != nil { + return err + } + + return deleteContext(profileName) +} + func init() { deleteCmd.Flags().BoolVar(&deleteAll, "all", false, "Set flag to delete all profiles") deleteCmd.Flags().BoolVar(&purge, "purge", false, "Set this flag to delete the '.minikube' folder from your user directory.") @@ -210,25 +228,30 @@ func DeleteProfiles(profiles []*config.Profile) []error { klog.Infof("DeleteProfiles") var errs []error for _, profile := range profiles { - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) - defer cancel() - err := deleteProfile(ctx, profile) - if err != nil { - mm, loadErr := machine.LoadMachine(profile.Name) - - if !profile.IsValid() || (loadErr != nil || !mm.IsValid()) { - invalidProfileDeletionErrs := deleteInvalidProfile(profile) - if len(invalidProfileDeletionErrs) > 0 { - errs = append(errs, invalidProfileDeletionErrs...) - } - } else { - errs = append(errs, err) - } - } + errs = append(errs, deleteProfileTimeout(profile)...) } return errs } +func deleteProfileTimeout(profile *config.Profile) []error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer cancel() + + if err := deleteProfile(ctx, profile); err != nil { + + mm, loadErr := machine.LoadMachine(profile.Name) + if !profile.IsValid() || (loadErr != nil || !mm.IsValid()) { + invalidProfileDeletionErrs := deleteInvalidProfile(profile) + if len(invalidProfileDeletionErrs) > 0 { + return invalidProfileDeletionErrs + } + } else { + return []error{err} + } + } + return nil +} + func deleteProfile(ctx context.Context, profile *config.Profile) error { klog.Infof("Deleting %s", profile.Name) register.Reg.SetStep(register.Deleting) @@ -239,6 +262,9 @@ func deleteProfile(ctx context.Context, profile *config.Profile) error { // if driver is oci driver, delete containers and volumes if driver.IsKIC(profile.Config.Driver) { + if err := unpauseIfNeeded(profile); err != nil { + klog.Warningf("failed to unpause %s : %v", profile.Name, err) + } out.Step(style.DeletingHost, `Deleting "{{.profile_name}}" in {{.driver_name}} ...`, out.V{"profile_name": profile.Name, "driver_name": profile.Config.Driver}) for _, n := range profile.Config.Nodes { machineName := config.MachineName(*profile.Config, n) @@ -274,27 +300,57 @@ func deleteProfile(ctx context.Context, profile *config.Profile) error { } } - if err := killMountProcess(); err != nil { - out.FailureT("Failed to kill mount process: {{.error}}", out.V{"error": err}) - } - - deleteHosts(api, cc) - - // In case DeleteHost didn't complete the job. - deleteProfileDirectory(profile.Name) - deleteMachineDirectories(cc) - - if err := deleteConfig(profile.Name); err != nil { + if err := hostAndDirsDeleter(api, cc, profile.Name); err != nil { return err } - if err := deleteContext(profile.Name); err != nil { - return err - } out.Step(style.Deleted, `Removed all traces of the "{{.name}}" cluster.`, out.V{"name": profile.Name}) return nil } +func unpauseIfNeeded(profile *config.Profile) error { + // there is a known issue with removing kicbase container with paused containerd/crio containers inside + // unpause it before we delete it + crName := profile.Config.KubernetesConfig.ContainerRuntime + if crName == "docker" { + return nil + } + + api, err := machine.NewAPIClient() + if err != nil { + return err + } + defer api.Close() + + host, err := machine.LoadHost(api, profile.Name) + if err != nil { + return err + } + + r, err := machine.CommandRunner(host) + if err != nil { + exit.Error(reason.InternalCommandRunner, "Failed to get command runner", err) + } + + cr, err := cruntime.New(cruntime.Config{Type: crName, Runner: r}) + if err != nil { + exit.Error(reason.InternalNewRuntime, "Failed to create runtime", err) + } + + paused, err := cluster.CheckIfPaused(cr, nil) + if err != nil { + return err + } + + if !paused { + return nil + } + + klog.Infof("Unpause cluster %q", profile.Name) + _, err = cluster.Unpause(cr, r, nil) + return err +} + func deleteHosts(api libmachine.API, cc *config.ClusterConfig) { register.Reg.SetStep(register.Deleting) diff --git a/cmd/minikube/cmd/delete_test.go b/cmd/minikube/cmd/delete_test.go index 6c6a98939f..fff2ffabf8 100644 --- a/cmd/minikube/cmd/delete_test.go +++ b/cmd/minikube/cmd/delete_test.go @@ -17,15 +17,18 @@ limitations under the License. package cmd import ( + "fmt" "io/ioutil" "os" "path/filepath" "testing" + "github.com/docker/machine/libmachine" "github.com/google/go-cmp/cmp" "github.com/otiai10/copy" "github.com/spf13/viper" + cmdcfg "k8s.io/minikube/cmd/minikube/cmd/config" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/localpath" ) @@ -114,6 +117,7 @@ func TestDeleteProfile(t *testing.T) { t.Logf("load failure: %v", err) } + hostAndDirsDeleter = hostAndDirsDeleterMock errs := DeleteProfiles([]*config.Profile{profile}) if len(errs) > 0 { HandleDeletionErrors(errs) @@ -154,6 +158,17 @@ func TestDeleteProfile(t *testing.T) { } } +var hostAndDirsDeleterMock = func(api libmachine.API, cc *config.ClusterConfig, profileName string) error { + return deleteContextTest() +} + +func deleteContextTest() error { + if err := cmdcfg.Unset(config.ProfileName); err != nil { + return DeletionError{Err: fmt.Errorf("unset minikube profile: %v", err), Errtype: Fatal} + } + return nil +} + func TestDeleteAllProfiles(t *testing.T) { td, err := ioutil.TempDir("", "all") if err != nil { @@ -207,6 +222,7 @@ func TestDeleteAllProfiles(t *testing.T) { } profiles := append(validProfiles, inValidProfiles...) + hostAndDirsDeleter = hostAndDirsDeleterMock errs := DeleteProfiles(profiles) if errs != nil { diff --git a/cmd/minikube/cmd/generate-docs.go b/cmd/minikube/cmd/generate-docs.go index 74adef5eb5..8b9a847c7b 100644 --- a/cmd/minikube/cmd/generate-docs.go +++ b/cmd/minikube/cmd/generate-docs.go @@ -29,6 +29,7 @@ import ( var docsPath string var testPath string +var codePath string // generateDocs represents the generate-docs command var generateDocs = &cobra.Command{ @@ -45,16 +46,18 @@ var generateDocs = &cobra.Command{ } // generate docs - if err := generate.Docs(RootCmd, docsPath, testPath); err != nil { + if err := generate.Docs(RootCmd, docsPath, testPath, codePath); err != nil { exit.Error(reason.InternalGenerateDocs, "Unable to generate docs", err) } out.Step(style.Documentation, "Docs have been saved at - {{.path}}", out.V{"path": docsPath}) out.Step(style.Documentation, "Test docs have been saved at - {{.path}}", out.V{"path": testPath}) + out.Step(style.Documentation, "Error code docs have been saved at - {{.path}}", out.V{"path": codePath}) }, } func init() { generateDocs.Flags().StringVar(&docsPath, "path", "", "The path on the file system where the docs in markdown need to be saved") generateDocs.Flags().StringVar(&testPath, "test-path", "", "The path on the file system where the testing docs in markdown need to be saved") + generateDocs.Flags().StringVar(&codePath, "code-path", "", "The path on the file system where the error code docs in markdown need to be saved") RootCmd.AddCommand(generateDocs) } diff --git a/cmd/minikube/cmd/generate-docs_test.go b/cmd/minikube/cmd/generate-docs_test.go index b8dab4e720..91ce515de6 100644 --- a/cmd/minikube/cmd/generate-docs_test.go +++ b/cmd/minikube/cmd/generate-docs_test.go @@ -17,37 +17,47 @@ limitations under the License. package cmd import ( - "fmt" "io/ioutil" + "os" "path/filepath" + "strings" "testing" - "github.com/google/go-cmp/cmp" - "github.com/spf13/pflag" "k8s.io/minikube/pkg/generate" ) -func TestGenerateDocs(t *testing.T) { - pflag.BoolP("help", "h", false, "") // avoid 'Docs are not updated. Please run `make generate-docs` to update commands documentation' error - dir := "../../../site/content/en/docs/commands/" +func TestGenerateTestDocs(t *testing.T) { + tempdir, err := ioutil.TempDir("", "") + if err != nil { + t.Fatalf("creating temp dir failed: %v", err) + } + defer os.RemoveAll(tempdir) + docPath := filepath.Join(tempdir, "tests.md") - for _, sc := range RootCmd.Commands() { - t.Run(sc.Name(), func(t *testing.T) { - if sc.Hidden { - t.Skip() - } - fp := filepath.Join(dir, fmt.Sprintf("%s.md", sc.Name())) - expectedContents, err := ioutil.ReadFile(fp) - if err != nil { - t.Fatalf("Docs are not updated. Please run `make generate-docs` to update commands documentation: %v", err) - } - actualContents, err := generate.DocForCommand(sc) - if err != nil { - t.Fatalf("error getting contents: %v", err) - } - if diff := cmp.Diff(actualContents, string(expectedContents)); diff != "" { - t.Fatalf("Docs are not updated. Please run `make generate-docs` to update commands documentation: %s", diff) - } - }) + err = generate.TestDocs(docPath, "../../../test/integration") + if err != nil { + t.Fatalf("error generating test docs: %v", err) + } + actualContents, err := ioutil.ReadFile(docPath) + if err != nil { + t.Fatalf("error reading generated file: %v", err) + } + + rest := string(actualContents) + for rest != "" { + rest = checkForNeedsDoc(t, rest) } } + +func checkForNeedsDoc(t *testing.T, content string) string { + needs := "\nNEEDS DOC\n" + index := strings.Index(content, needs) + if index < 0 { + return "" + } + + topHalf := content[:index] + testName := topHalf[strings.LastIndex(topHalf, "\n"):] + t.Errorf("%s is missing a doc string.", testName) + return content[index+len(needs):] +} diff --git a/cmd/minikube/cmd/image.go b/cmd/minikube/cmd/image.go index fe9d364fe7..85616c09c4 100644 --- a/cmd/minikube/cmd/image.go +++ b/cmd/minikube/cmd/image.go @@ -45,6 +45,7 @@ var ( pull bool imgDaemon bool imgRemote bool + overwrite bool tag string push bool dockerFile string @@ -130,13 +131,13 @@ var loadImageCmd = &cobra.Command{ if imgDaemon || imgRemote { image.UseDaemon(imgDaemon) image.UseRemote(imgRemote) - if err := machine.CacheAndLoadImages(args, []*config.Profile{profile}); err != nil { + if err := machine.CacheAndLoadImages(args, []*config.Profile{profile}, overwrite); err != nil { exit.Error(reason.GuestImageLoad, "Failed to load image", err) } } else if local { // Load images from local files, without doing any caching or checks in container runtime // This is similar to tarball.Image but it is done by the container runtime in the cluster. - if err := machine.DoLoadImages(args, []*config.Profile{profile}, ""); err != nil { + if err := machine.DoLoadImages(args, []*config.Profile{profile}, "", overwrite); err != nil { exit.Error(reason.GuestImageLoad, "Failed to load image", err) } } @@ -152,7 +153,7 @@ $ minikube image rm image busybox $ minikube image unload image busybox `, Args: cobra.MinimumNArgs(1), - Aliases: []string{"unload"}, + Aliases: []string{"remove", "unload"}, Run: func(cmd *cobra.Command, args []string) { profile, err := config.LoadProfile(viper.GetString(config.ProfileName)) if err != nil { @@ -226,12 +227,12 @@ var buildImageCmd = &cobra.Command{ } var listImageCmd = &cobra.Command{ - Use: "list", + Use: "ls", Short: "List images", Example: ` -$ minikube image list +$ minikube image ls `, - Aliases: []string{"ls"}, + Aliases: []string{"list"}, Run: func(cmd *cobra.Command, args []string) { profile, err := config.LoadProfile(viper.GetString(config.ProfileName)) if err != nil { @@ -248,6 +249,7 @@ func init() { loadImageCmd.Flags().BoolVarP(&pull, "pull", "", false, "Pull the remote image (no caching)") loadImageCmd.Flags().BoolVar(&imgDaemon, "daemon", false, "Cache image from docker daemon") loadImageCmd.Flags().BoolVar(&imgRemote, "remote", false, "Cache image from remote registry") + loadImageCmd.Flags().BoolVar(&overwrite, "overwrite", true, "Overwrite image even if same image:tag name exists") imageCmd.AddCommand(loadImageCmd) imageCmd.AddCommand(removeImageCmd) buildImageCmd.Flags().StringVarP(&tag, "tag", "t", "", "Tag to apply to the new image (optional)") diff --git a/cmd/minikube/cmd/kubectl.go b/cmd/minikube/cmd/kubectl.go index 9472caf8a1..35c776d0eb 100644 --- a/cmd/minikube/cmd/kubectl.go +++ b/cmd/minikube/cmd/kubectl.go @@ -27,6 +27,7 @@ import ( "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" + "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/machine" "k8s.io/minikube/pkg/minikube/mustload" "k8s.io/minikube/pkg/minikube/node" @@ -80,6 +81,19 @@ host. Please be aware that when using --ssh all paths will apply to the remote m return } + supported := false + arch := detect.RuntimeArch() + for _, a := range constants.SupportedArchitectures { + if arch == a { + supported = true + break + } + } + if !supported { + fmt.Fprintf(os.Stderr, "Not supported on: %s\n", arch) + os.Exit(1) + } + if len(args) > 1 && args[0] != "--help" { cluster := []string{"--cluster", cname} args = append(cluster, args...) diff --git a/cmd/minikube/cmd/mount.go b/cmd/minikube/cmd/mount.go index 55a37c1082..d1908b0e63 100644 --- a/cmd/minikube/cmd/mount.go +++ b/cmd/minikube/cmd/mount.go @@ -50,6 +50,7 @@ const ( // placeholders for flag values var ( mountIP string + mountPort uint16 mountVersion string mountType string isKill bool @@ -191,6 +192,9 @@ var mountCmd = &cobra.Command{ err = cluster.Mount(co.CP.Runner, ip.String(), vmPath, cfg) if err != nil { + if rtErr, ok := err.(*cluster.MountError); ok && rtErr.ErrorType == cluster.MountErrorConnect { + exit.Error(reason.GuestMountCouldNotConnect, "mount could not connect", rtErr) + } exit.Error(reason.GuestMount, "mount failed", err) } out.Step(style.Success, "Successfully mounted {{.sourcePath}} to {{.destinationPath}}", out.V{"sourcePath": hostPath, "destinationPath": vmPath}) @@ -202,6 +206,7 @@ var mountCmd = &cobra.Command{ func init() { mountCmd.Flags().StringVar(&mountIP, "ip", "", "Specify the ip that the mount should be setup on") + mountCmd.Flags().Uint16Var(&mountPort, "port", 0, "Specify the port that the mount should be setup on, where 0 means any free port.") mountCmd.Flags().StringVar(&mountType, "type", nineP, "Specify the mount filesystem type (supported types: 9p)") mountCmd.Flags().StringVar(&mountVersion, "9p-version", defaultMountVersion, "Specify the 9p version that the mount should use") mountCmd.Flags().BoolVar(&isKill, "kill", false, "Kill the mount process spawned by minikube start") @@ -212,9 +217,9 @@ func init() { mountCmd.Flags().IntVar(&mSize, "msize", defaultMsize, "The number of bytes to use for 9p packet payload") } -// getPort asks the kernel for a free open port that is ready to use +// getPort uses the requested port or asks the kernel for a free open port that is ready to use func getPort() (int, error) { - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%d", mountPort)) if err != nil { panic(err) } diff --git a/cmd/minikube/cmd/pause.go b/cmd/minikube/cmd/pause.go index d11a3d83e3..4fd7ceefe2 100644 --- a/cmd/minikube/cmd/pause.go +++ b/cmd/minikube/cmd/pause.go @@ -104,7 +104,7 @@ func runPause(cmd *cobra.Command, args []string) { } func init() { - pauseCmd.Flags().StringSliceVarP(&namespaces, "--namespaces", "n", constants.DefaultNamespaces, "namespaces to pause") + pauseCmd.Flags().StringSliceVarP(&namespaces, "namespaces", "n", constants.DefaultNamespaces, "namespaces to pause") pauseCmd.Flags().BoolVarP(&allNamespaces, "all-namespaces", "A", false, "If set, pause all namespaces") pauseCmd.Flags().StringVarP(&outputFormat, "output", "o", "text", "Format to print stdout in. Options include: [text,json]") } diff --git a/cmd/minikube/cmd/root.go b/cmd/minikube/cmd/root.go index cfcd7f0276..785a2db36b 100644 --- a/cmd/minikube/cmd/root.go +++ b/cmd/minikube/cmd/root.go @@ -25,9 +25,6 @@ import ( "strings" "time" - "k8s.io/minikube/pkg/minikube/notify" - "k8s.io/minikube/pkg/version" - "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/spf13/viper" @@ -41,9 +38,11 @@ import ( "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/exit" "k8s.io/minikube/pkg/minikube/localpath" + "k8s.io/minikube/pkg/minikube/notify" "k8s.io/minikube/pkg/minikube/out" "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/minikube/translate" + "k8s.io/minikube/pkg/version" ) var dirs = [...]string{ @@ -91,16 +90,17 @@ func Execute() { } } if !found { - exit.Message(reason.WrongBinaryWSL, "You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force") + exit.Message(reason.WrongBinaryWSL, "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force") } } if runtime.GOOS == "darwin" && detect.IsAmd64M1Emulation() { - exit.Message(reason.WrongBinaryM1, "You are trying to run amd64 binary on M1 system. Please use darwin/arm64 binary instead (Download at {{.url}}.)", - out.V{"url": notify.DownloadURL(version.GetVersion(), "darwin", "amd64")}) + out.Infof("You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)", + out.V{"url": notify.DownloadURL(version.GetVersion(), "darwin", "arm64")}) } _, callingCmd := filepath.Split(os.Args[0]) + callingCmd = strings.TrimSuffix(callingCmd, ".exe") if callingCmd == "kubectl" { // If the user is using the minikube binary as kubectl, allow them to specify the kubectl context without also specifying minikube profile @@ -301,14 +301,11 @@ func setupViper() { viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_")) viper.AutomaticEnv() + viper.RegisterAlias(config.EmbedCerts, embedCerts) viper.SetDefault(config.WantUpdateNotification, true) viper.SetDefault(config.ReminderWaitPeriodInHours, 24) - viper.SetDefault(config.WantReportError, false) - viper.SetDefault(config.WantReportErrorPrompt, true) - viper.SetDefault(config.WantKubectlDownloadMsg, true) viper.SetDefault(config.WantNoneDriverWarning, true) - viper.SetDefault(config.ShowDriverDeprecationNotification, true) - viper.SetDefault(config.ShowBootstrapperDeprecationNotification, true) + viper.SetDefault(config.WantVirtualBoxDriverWarning, true) } func addToPath(dir string) { diff --git a/cmd/minikube/cmd/start.go b/cmd/minikube/cmd/start.go index 52ddb0ea0e..d51fec280a 100644 --- a/cmd/minikube/cmd/start.go +++ b/cmd/minikube/cmd/start.go @@ -28,10 +28,11 @@ import ( "os/user" "regexp" "runtime" + "sort" "strconv" "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/docker/machine/libmachine/ssh" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" @@ -50,8 +51,10 @@ import ( "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/cruntime" + "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/download" "k8s.io/minikube/pkg/minikube/driver" + "k8s.io/minikube/pkg/minikube/driver/auxdriver" "k8s.io/minikube/pkg/minikube/exit" "k8s.io/minikube/pkg/minikube/kubeconfig" "k8s.io/minikube/pkg/minikube/localpath" @@ -120,7 +123,7 @@ func platform() string { // This environment is exotic, let's output a bit more. if vrole == "guest" || runtime.GOARCH != "amd64" { - if vsys != "" { + if vrole == "guest" && vsys != "" { s.WriteString(fmt.Sprintf(" (%s/%s)", vsys, runtime.GOARCH)) } else { s.WriteString(fmt.Sprintf(" (%s)", runtime.GOARCH)) @@ -159,14 +162,13 @@ func runStart(cmd *cobra.Command, args []string) { // can be configured as MINIKUBE_IMAGE_REPOSITORY and IMAGE_MIRROR_COUNTRY // this should be updated to documentation if len(registryMirror) == 0 { - registryMirror = viper.GetStringSlice("registry_mirror") + registryMirror = viper.GetStringSlice("registry-mirror") } if !config.ProfileNameValid(ClusterFlagValue()) { out.WarningT("Profile name '{{.name}}' is not valid", out.V{"name": ClusterFlagValue()}) exit.Message(reason.Usage, "Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.") } - existing, err := config.Load(ClusterFlagValue()) if err != nil && !config.IsNotExist(err) { kind := reason.HostConfigLoad @@ -177,7 +179,7 @@ func runStart(cmd *cobra.Command, args []string) { } if existing != nil { - upgradeExistingConfig(existing) + upgradeExistingConfig(cmd, existing) } else { validateProfileName() } @@ -214,7 +216,7 @@ func runStart(cmd *cobra.Command, args []string) { // Walk down the rest of the options for _, alt := range alts { // Skip non-default drivers - if !ds.Default { + if !alt.Default { continue } out.WarningT("Startup with {{.old_driver}} driver failed, trying with alternate driver {{.new_driver}}: {{.error}}", out.V{"old_driver": ds.Name, "new_driver": alt.Name, "error": err}) @@ -401,7 +403,7 @@ func updateDriver(driverName string) { v, err := version.GetSemverVersion() if err != nil { out.WarningT("Error parsing minikube version: {{.error}}", out.V{"error": err}) - } else if err := driver.InstallOrUpdate(driverName, localpath.MakeMiniPath("bin"), v, viper.GetBool(interactive), viper.GetBool(autoUpdate)); err != nil { + } else if err := auxdriver.InstallOrUpdate(driverName, localpath.MakeMiniPath("bin"), v, viper.GetBool(interactive), viper.GetBool(autoUpdate)); err != nil { out.WarningT("Unable to update {{.driver}} driver: {{.error}}", out.V{"driver": driverName, "error": err}) } } @@ -588,10 +590,39 @@ func selectDriver(existing *config.ClusterConfig) (registry.DriverState, []regis pick, alts, rejects := driver.Suggest(choices) if pick.Name == "" { out.Step(style.ThumbsDown, "Unable to pick a default driver. Here is what was considered, in preference order:") + sort.Slice(rejects, func(i, j int) bool { + if rejects[i].Priority == rejects[j].Priority { + return rejects[i].Preference > rejects[j].Preference + } + return rejects[i].Priority > rejects[j].Priority + }) for _, r := range rejects { + if !r.Default { + continue + } out.Infof("{{ .name }}: {{ .rejection }}", out.V{"name": r.Name, "rejection": r.Rejection}) + if r.Suggestion != "" { + out.Infof("{{ .name }}: Suggestion: {{ .suggestion}}", out.V{"name": r.Name, "suggestion": r.Suggestion}) + } + } + foundStoppedDocker := false + foundUnhealthy := false + for _, reject := range rejects { + if reject.Name == driver.Docker && reject.State.Installed && !reject.State.Running { + foundStoppedDocker = true + break + } else if reject.State.Installed && !reject.State.Healthy { + foundUnhealthy = true + break + } + } + if foundStoppedDocker { + exit.Message(reason.DrvDockerNotRunning, "Found docker, but the docker service isn't running. Try restarting the docker service.") + } else if foundUnhealthy { + exit.Message(reason.DrvNotHealthy, "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.") + } else { + exit.Message(reason.DrvNotDetected, "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/") } - exit.Message(reason.DrvNotDetected, "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/") } if len(alts) > 1 { @@ -715,9 +746,11 @@ func validateSpecifiedDriver(existing *config.ClusterConfig) { // validateDriver validates that the selected driver appears sane, exits if not func validateDriver(ds registry.DriverState, existing *config.ClusterConfig) { name := ds.Name + os := detect.RuntimeOS() + arch := detect.RuntimeArch() klog.Infof("validating driver %q against %+v", name, existing) if !driver.Supported(name) { - exit.Message(reason.DrvUnsupportedOS, "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}", out.V{"driver": name, "os": runtime.GOOS, "arch": runtime.GOARCH}) + exit.Message(reason.DrvUnsupportedOS, "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}", out.V{"driver": name, "os": os, "arch": arch}) } // if we are only downloading artifacts for a driver, we can stop validation here @@ -997,56 +1030,49 @@ func validateRequestedMemorySize(req int, drvName string) { // validateCPUCount validates the cpu count matches the minimum recommended & not exceeding the available cpu count func validateCPUCount(drvName string) { - var cpuCount int - if driver.BareMetal(drvName) { + var availableCPUs int - // Uses the gopsutil cpu package to count the number of logical cpu cores + cpuCount := getCPUCount(drvName) + isKIC := driver.IsKIC(drvName) + + if isKIC { + si, err := oci.CachedDaemonInfo(drvName) + if err != nil { + si, err = oci.DaemonInfo(drvName) + if err != nil { + exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)}) + } + } + availableCPUs = si.CPUs + } else { ci, err := cpu.Counts(true) if err != nil { - klog.Warningf("Unable to get CPU info: %v", err) - } else { - cpuCount = ci + exit.Message(reason.Usage, "Unable to get CPU info: {{.err}}", out.V{"err": err}) } - } else { - cpuCount = viper.GetInt(cpus) + availableCPUs = ci } if cpuCount < minimumCPUS { exitIfNotForced(reason.RsrcInsufficientCores, "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}", out.V{"requested_cpus": cpuCount, "minimum_cpus": minimumCPUS}) } - if !driver.IsKIC((drvName)) { - return - } - - si, err := oci.CachedDaemonInfo(drvName) - if err != nil { - out.Styled(style.Confused, "Failed to verify '{{.driver_name}} info' will try again ...", out.V{"driver_name": drvName}) - si, err = oci.DaemonInfo(drvName) - if err != nil { - exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)}) - } - - } - - if si.CPUs < cpuCount { - + if availableCPUs < cpuCount { if driver.IsDockerDesktop(drvName) { out.Styled(style.Empty, `- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.`, out.V{"driver_name": drvName}) if runtime.GOOS == "darwin" { - out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-mac/#resources`, out.V{"driver_name": drvName}) + out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-mac/#resources`) } if runtime.GOOS == "windows" { out.String("\n\t") - out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-windows/#resources`, out.V{"driver_name": drvName}) + out.Styled(style.Empty, `- Docs https://docs.docker.com/docker-for-windows/#resources`) } } - exitIfNotForced(reason.RsrcInsufficientCores, "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}", out.V{"requested_cpus": cpuCount, "avail_cpus": si.CPUs}) + exitIfNotForced(reason.RsrcInsufficientCores, "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}", out.V{"requested_cpus": cpuCount, "avail_cpus": availableCPUs}) } // looks good - if si.CPUs >= 2 { + if availableCPUs >= 2 { return } @@ -1114,6 +1140,8 @@ func validateFlags(cmd *cobra.Command, drvName string) { if !validRuntime { exit.Message(reason.Usage, `Invalid Container Runtime: "{{.runtime}}". Valid runtimes are: {{.validOptions}}`, out.V{"runtime": runtime, "validOptions": strings.Join(cruntime.ValidRuntimes(), ", ")}) } + + validateCNI(cmd, runtime) } if driver.BareMetal(drvName) { @@ -1176,7 +1204,20 @@ func validateFlags(cmd *cobra.Command, drvName string) { validateRegistryMirror() validateInsecureRegistry() +} +// if container runtime is not docker, check that cni is not disabled +func validateCNI(cmd *cobra.Command, runtime string) { + if runtime == "docker" { + return + } + if cmd.Flags().Changed(cniFlag) && strings.ToLower(viper.GetString(cniFlag)) == "false" { + if viper.GetBool(force) { + out.WarnReason(reason.Usage, "You have chosen to disable the CNI but the \"{{.name}}\" container runtime requires CNI", out.V{"name": runtime}) + } else { + exit.Message(reason.Usage, "The \"{{.name}}\" container runtime requires CNI", out.V{"name": runtime}) + } + } } // validateChangedMemoryFlags validates memory related flags. @@ -1188,13 +1229,32 @@ func validateChangedMemoryFlags(drvName string) { if !driver.HasResourceLimits(drvName) { out.WarningT("The '{{.name}}' driver does not respect the --memory flag", out.V{"name": drvName}) } - req, err := util.CalculateSizeInMB(viper.GetString(memory)) - if err != nil { - exitIfNotForced(reason.Usage, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err}) + var req int + var err error + memString := viper.GetString(memory) + if memString == constants.MaxResources { + sysLimit, containerLimit, err := memoryLimits(drvName) + if err != nil { + klog.Warningf("Unable to query memory limits: %+v", err) + } + req = noLimitMemory(sysLimit, containerLimit) + } else { + req, err = util.CalculateSizeInMB(memString) + if err != nil { + exitIfNotForced(reason.Usage, "Unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": memString, "error": err}) + } } validateRequestedMemorySize(req, drvName) } +func noLimitMemory(sysLimit int, containerLimit int) int { + if containerLimit != 0 { + return containerLimit + } + // Recommend 1GB to handle OS/VM overhead + return sysLimit - 1024 +} + // This function validates if the --registry-mirror // args match the format of http://localhost func validateRegistryMirror() { @@ -1214,26 +1274,36 @@ 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, "/") { - 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. - 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}) + + var imageRepoPort string + + if URL.Port() != "" && strings.Contains(imageRepo, ":"+URL.Port()) { + imageRepoPort = ":" + URL.Port() } - vaildImageRepo = URL.Hostname() + strings.TrimSuffix(URL.Path, "/") - return + // 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 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}) + } + + validImageRepo = URL.Hostname() + imageRepoPort + strings.TrimSuffix(URL.Path, "/") + + return validImageRepo } // This function validates if the --listen-address @@ -1462,5 +1532,8 @@ func exitGuestProvision(err error) { if errors.Cause(err) == oci.ErrInsufficientDockerStorage { exit.Message(reason.RsrcInsufficientDockerStorage, "preload extraction failed: \"No space left on device\"") } - exit.Error(reason.GuestProvision, "error provisioning host", err) + if errors.Cause(err) == oci.ErrGetSSHPortContainerNotRunning { + exit.Message(reason.GuestProvisionContainerExited, "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.") + } + exit.Error(reason.GuestProvision, "error provisioning guest", err) } diff --git a/cmd/minikube/cmd/start_flags.go b/cmd/minikube/cmd/start_flags.go index ffbc70b83f..bfc39bda3a 100644 --- a/cmd/minikube/cmd/start_flags.go +++ b/cmd/minikube/cmd/start_flags.go @@ -21,12 +21,14 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" + "github.com/shirou/gopsutil/v3/cpu" "github.com/spf13/cobra" "github.com/spf13/viper" "k8s.io/klog/v2" "k8s.io/minikube/pkg/drivers/kic" + "k8s.io/minikube/pkg/drivers/kic/oci" "k8s.io/minikube/pkg/minikube/bootstrapper/bsutil" "k8s.io/minikube/pkg/minikube/bootstrapper/bsutil/kverify" "k8s.io/minikube/pkg/minikube/cni" @@ -118,6 +120,7 @@ const ( defaultSSHUser = "root" defaultSSHPort = 22 listenAddress = "listen-address" + extraDisks = "extra-disks" ) var ( @@ -135,8 +138,8 @@ func initMinikubeFlags() { startCmd.Flags().Bool(interactive, true, "Allow user prompts for more information") startCmd.Flags().Bool(dryRun, false, "dry-run mode. Validates configuration, but does not mutate system state") - startCmd.Flags().Int(cpus, 2, "Number of CPUs allocated to Kubernetes.") - startCmd.Flags().String(memory, "", "Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g).") + startCmd.Flags().String(cpus, "2", fmt.Sprintf("Number of CPUs allocated to Kubernetes. Use %q to use the maximum number of CPUs.", constants.MaxResources)) + startCmd.Flags().String(memory, "", fmt.Sprintf("Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). Use %q to use the maximum amount of memory.", constants.MaxResources)) startCmd.Flags().String(humanReadableDiskSize, defaultDiskSize, "Disk size allocated to the minikube VM (format: [], where unit = b, k, m or g).") startCmd.Flags().Bool(downloadOnly, false, "If true, only download and cache files for later use - don't install or start anything.") startCmd.Flags().Bool(cacheImages, true, "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.") @@ -147,7 +150,7 @@ func initMinikubeFlags() { startCmd.Flags().String(containerRuntime, constants.DefaultContainerRuntime, fmt.Sprintf("The container runtime to be used (%s).", strings.Join(cruntime.ValidRuntimes(), ", "))) startCmd.Flags().Bool(createMount, false, "This will start the mount daemon and automatically mount files into minikube.") startCmd.Flags().String(mountString, constants.DefaultMountDir+":/minikube-host", "The argument to pass the minikube mount command on start.") - startCmd.Flags().StringSliceVar(&config.AddonList, "addons", nil, "Enable addons. see `minikube addons list` for a list of valid addon names.") + startCmd.Flags().StringSlice(config.AddonListFlag, nil, "Enable addons. see `minikube addons list` for a list of valid addon names.") startCmd.Flags().String(criSocket, "", "The cri socket path to be used.") startCmd.Flags().String(networkPlugin, "", "Kubelet network plug-in to use (default: auto)") startCmd.Flags().Bool(enableDefaultCNI, false, "DEPRECATED: Replaced by --cni=bridge") @@ -160,10 +163,11 @@ func initMinikubeFlags() { startCmd.Flags().IntP(nodes, "n", 1, "The number of nodes to spin up. Defaults to 1.") startCmd.Flags().Bool(preload, true, "If set, download tarball of preloaded images if available to improve start time. Defaults to true.") startCmd.Flags().Bool(deleteOnFailure, false, "If set, delete the current cluster if start fails and try again. Defaults to false.") - startCmd.Flags().Bool(forceSystemd, false, "If set, force the container runtime to use sytemd as cgroup manager. Defaults to false.") + startCmd.Flags().Bool(forceSystemd, false, "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.") startCmd.Flags().StringP(network, "", "", "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.") startCmd.Flags().StringVarP(&outputFormat, "output", "o", "text", "Format to print stdout in. Options include: [text,json]") startCmd.Flags().StringP(trace, "", "", "Send trace events. Options include: [gcp]") + startCmd.Flags().Int(extraDisks, 0, "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)") } // initKubernetesFlags inits the commandline flags for Kubernetes related options @@ -290,10 +294,31 @@ func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k return createNode(cc, kubeNodeName, existing) } -// generateNewConfigFromFlags generate a config.ClusterConfig based on flags -func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName string) config.ClusterConfig { - var cc config.ClusterConfig +func getCPUCount(drvName string) int { + if viper.GetString(cpus) != constants.MaxResources { + return viper.GetInt(cpus) + } + if !driver.IsKIC(drvName) { + ci, err := cpu.Counts(true) + if err != nil { + exit.Message(reason.Usage, "Unable to get CPU info: {{.err}}", out.V{"err": err}) + } + return ci + } + + si, err := oci.CachedDaemonInfo(drvName) + if err != nil { + si, err = oci.DaemonInfo(drvName) + if err != nil { + exit.Message(reason.Usage, "Ensure your {{.driver_name}} is running and is healthy.", out.V{"driver_name": driver.FullName(drvName)}) + } + } + + return si.CPUs +} + +func getMemorySize(cmd *cobra.Command, drvName string) int { sysLimit, containerLimit, err := memoryLimits(drvName) if err != nil { klog.Warningf("Unable to query memory limits: %+v", err) @@ -301,10 +326,15 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s mem := suggestMemoryAllocation(sysLimit, containerLimit, viper.GetInt(nodes)) if cmd.Flags().Changed(memory) || viper.IsSet(memory) { + memString := viper.GetString(memory) var err error - mem, err = pkgutil.CalculateSizeInMB(viper.GetString(memory)) - if err != nil { - exit.Message(reason.Usage, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": viper.GetString(memory), "error": err}) + if memString == constants.MaxResources { + mem = noLimitMemory(sysLimit, containerLimit) + } else { + mem, err = pkgutil.CalculateSizeInMB(memString) + if err != nil { + exit.Message(reason.Usage, "Generate unable to parse memory '{{.memory}}': {{.error}}", out.V{"memory": memString, "error": err}) + } } if driver.IsKIC(drvName) && mem > containerLimit { exit.Message(reason.Usage, "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": driver.FullName(drvName)}) @@ -314,11 +344,19 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s klog.Infof("Using suggested %dMB memory alloc based on sys=%dMB, container=%dMB", mem, sysLimit, containerLimit) } + return mem +} + +func getDiskSize() int { diskSize, err := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize)) if err != nil { exit.Message(reason.Usage, "Generate unable to parse disk size '{{.diskSize}}': {{.error}}", out.V{"diskSize": viper.GetString(humanReadableDiskSize), "error": err}) } + return diskSize +} + +func getRepository(cmd *cobra.Command, k8sVersion string) string { repository := viper.GetString(imageRepository) mirrorCountry := strings.ToLower(viper.GetString(imageMirrorCountry)) if strings.ToLower(repository) == "auto" || (mirrorCountry != "" && repository == "") { @@ -342,12 +380,23 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s out.Styled(style.Success, "Using image repository {{.name}}", out.V{"name": repository}) } + return repository +} + +func getCNIConfig(cmd *cobra.Command) string { // Backwards compatibility with --enable-default-cni chosenCNI := viper.GetString(cniFlag) if viper.GetBool(enableDefaultCNI) && !cmd.Flags().Changed(cniFlag) { klog.Errorf("Found deprecated --enable-default-cni flag, setting --cni=bridge") chosenCNI = "bridge" } + return chosenCNI +} + +// generateNewConfigFromFlags generate a config.ClusterConfig based on flags +func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName string) config.ClusterConfig { + var cc config.ClusterConfig + // networkPlugin cni deprecation warning chosenNetworkPlugin := viper.GetString(networkPlugin) if chosenNetworkPlugin == "cni" { @@ -360,6 +409,8 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s checkNumaCount(k8sVersion) + checkExtraDiskOptions(cmd, drvName) + cc = config.ClusterConfig{ Name: ClusterFlagValue(), KeepContext: viper.GetBool(keepContext), @@ -367,9 +418,9 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s MinikubeISO: viper.GetString(isoURL), KicBaseImage: viper.GetString(kicBaseImage), Network: viper.GetString(network), - Memory: mem, - CPUs: viper.GetInt(cpus), - DiskSize: diskSize, + Memory: getMemorySize(cmd, drvName), + CPUs: getCPUCount(drvName), + DiskSize: getDiskSize(), Driver: drvName, ListenAddress: viper.GetString(listenAddress), HyperkitVpnKitSock: viper.GetString(vpnkitSock), @@ -402,6 +453,7 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s SSHUser: viper.GetString(sshSSHUser), SSHKey: viper.GetString(sshSSHKey), SSHPort: viper.GetInt(sshSSHPort), + ExtraDisks: viper.GetInt(extraDisks), KubernetesConfig: config.KubernetesConfig{ KubernetesVersion: k8sVersion, ClusterName: ClusterFlagValue(), @@ -415,10 +467,10 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, drvName s CRISocket: viper.GetString(criSocket), NetworkPlugin: chosenNetworkPlugin, ServiceCIDR: viper.GetString(serviceCIDR), - ImageRepository: repository, + ImageRepository: getRepository(cmd, k8sVersion), ExtraOptions: config.ExtraOptions, ShouldLoadCachedImages: viper.GetBool(cacheImages), - CNI: chosenCNI, + CNI: getCNIConfig(cmd), NodePort: viper.GetInt(apiServerPort), }, MultiNodeRequested: viper.GetInt(nodes) > 1, @@ -448,7 +500,7 @@ func checkNumaCount(k8sVersion string) { } // upgradeExistingConfig upgrades legacy configuration files -func upgradeExistingConfig(cc *config.ClusterConfig) { +func upgradeExistingConfig(cmd *cobra.Command, cc *config.ClusterConfig) { if cc == nil { return } @@ -468,6 +520,26 @@ func upgradeExistingConfig(cc *config.ClusterConfig) { cc.KicBaseImage = viper.GetString(kicBaseImage) klog.Infof("config upgrade: KicBaseImage=%s", cc.KicBaseImage) } + + if cc.CPUs == 0 { + klog.Info("Existing config file was missing cpu. (could be an old minikube config), will use the default value") + cc.CPUs = viper.GetInt(cpus) + } + + if cc.Memory == 0 { + klog.Info("Existing config file was missing memory. (could be an old minikube config), will use the default value") + memInMB := getMemorySize(cmd, cc.Driver) + cc.Memory = memInMB + } + + // pre minikube 1.9.2 cc.KubernetesConfig.NodePort was not populated. + // in minikube config there were two fields for api server port. + // one in cc.KubernetesConfig.NodePort and one in cc.Nodes.Port + // this makes sure api server port not be set as 0! + if cc.KubernetesConfig.NodePort == 0 { + cc.KubernetesConfig.NodePort = viper.GetInt(apiServerPort) + } + } // updateExistingConfigFromFlags will update the existing config from the flags - used on a second start @@ -478,222 +550,79 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC cc := *existing - if cmd.Flags().Changed(containerRuntime) { - cc.KubernetesConfig.ContainerRuntime = viper.GetString(containerRuntime) + if cmd.Flags().Changed(memory) && getMemorySize(cmd, cc.Driver) != cc.Memory { + out.WarningT("You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.") } - if cmd.Flags().Changed(keepContext) { - cc.KeepContext = viper.GetBool(keepContext) - } - - if cmd.Flags().Changed(embedCerts) { - cc.EmbedCerts = viper.GetBool(embedCerts) - } - - if cmd.Flags().Changed(isoURL) { - cc.MinikubeISO = viper.GetString(isoURL) - } - - if cc.Memory == 0 { - klog.Info("Existing config file was missing memory. (could be an old minikube config), will use the default value") - memInMB, err := pkgutil.CalculateSizeInMB(viper.GetString(memory)) - if err != nil { - klog.Warningf("error calculate memory size in mb : %v", err) - } - cc.Memory = memInMB - } - - if cmd.Flags().Changed(memory) { - memInMB, err := pkgutil.CalculateSizeInMB(viper.GetString(memory)) - if err != nil { - klog.Warningf("error calculate memory size in mb : %v", err) - } - if memInMB != cc.Memory { - out.WarningT("You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.") - } + if cmd.Flags().Changed(cpus) && viper.GetInt(cpus) != cc.CPUs { + out.WarningT("You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.") } // validate the memory size in case user changed their system memory limits (example change docker desktop or upgraded memory.) validateRequestedMemorySize(cc.Memory, cc.Driver) - if cc.CPUs == 0 { - klog.Info("Existing config file was missing cpu. (could be an old minikube config), will use the default value") - cc.CPUs = viper.GetInt(cpus) - } - if cmd.Flags().Changed(cpus) { - if viper.GetInt(cpus) != cc.CPUs { - out.WarningT("You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.") - } + if cmd.Flags().Changed(humanReadableDiskSize) && getDiskSize() != existing.DiskSize { + out.WarningT("You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.") } - if cmd.Flags().Changed(humanReadableDiskSize) { - memInMB, err := pkgutil.CalculateSizeInMB(viper.GetString(humanReadableDiskSize)) - if err != nil { - klog.Warningf("error calculate disk size in mb : %v", err) - } - - if memInMB != existing.DiskSize { - out.WarningT("You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.") - } + checkExtraDiskOptions(cmd, cc.Driver) + if cmd.Flags().Changed(extraDisks) && viper.GetInt(extraDisks) != existing.ExtraDisks { + out.WarningT("You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.") } - if cmd.Flags().Changed(vpnkitSock) { - cc.HyperkitVpnKitSock = viper.GetString(vpnkitSock) - } - - if cmd.Flags().Changed(vsockPorts) { - cc.HyperkitVSockPorts = viper.GetStringSlice(vsockPorts) - } - - if cmd.Flags().Changed(nfsShare) { - cc.NFSShare = viper.GetStringSlice(nfsShare) - } - - if cmd.Flags().Changed(nfsSharesRoot) { - cc.NFSSharesRoot = viper.GetString(nfsSharesRoot) - } - - if cmd.Flags().Changed(hostOnlyCIDR) { - cc.HostOnlyCIDR = viper.GetString(hostOnlyCIDR) - } - - if cmd.Flags().Changed(hypervVirtualSwitch) { - cc.HypervVirtualSwitch = viper.GetString(hypervVirtualSwitch) - } - - if cmd.Flags().Changed(hypervUseExternalSwitch) { - cc.HypervUseExternalSwitch = viper.GetBool(hypervUseExternalSwitch) - } - - if cmd.Flags().Changed(hypervExternalAdapter) { - cc.HypervExternalAdapter = viper.GetString(hypervExternalAdapter) - } - - if cmd.Flags().Changed(kvmNetwork) { - cc.KVMNetwork = viper.GetString(kvmNetwork) - } - - if cmd.Flags().Changed(kvmQemuURI) { - cc.KVMQemuURI = viper.GetString(kvmQemuURI) - } - - if cmd.Flags().Changed(kvmGPU) { - cc.KVMGPU = viper.GetBool(kvmGPU) - } - - if cmd.Flags().Changed(kvmHidden) { - cc.KVMHidden = viper.GetBool(kvmHidden) - } - - if cmd.Flags().Changed(kvmNUMACount) { - cc.KVMNUMACount = viper.GetInt(kvmNUMACount) - } - - if cmd.Flags().Changed(disableDriverMounts) { - cc.DisableDriverMounts = viper.GetBool(disableDriverMounts) - } - - if cmd.Flags().Changed(uuid) { - cc.UUID = viper.GetString(uuid) - } - - if cmd.Flags().Changed(noVTXCheck) { - cc.NoVTXCheck = viper.GetBool(noVTXCheck) - } - - if cmd.Flags().Changed(dnsProxy) { - cc.DNSProxy = viper.GetBool(dnsProxy) - } - - if cmd.Flags().Changed(hostDNSResolver) { - cc.HostDNSResolver = viper.GetBool(hostDNSResolver) - } - - if cmd.Flags().Changed(hostOnlyNicType) { - cc.HostOnlyNicType = viper.GetString(hostOnlyNicType) - } - - if cmd.Flags().Changed(natNicType) { - cc.NatNicType = viper.GetString(natNicType) - } + updateStringFromFlag(cmd, &cc.MinikubeISO, isoURL) + updateBoolFromFlag(cmd, &cc.KeepContext, keepContext) + updateBoolFromFlag(cmd, &cc.EmbedCerts, embedCerts) + updateStringFromFlag(cmd, &cc.MinikubeISO, isoURL) + updateStringFromFlag(cmd, &cc.KicBaseImage, kicBaseImage) + updateStringFromFlag(cmd, &cc.Network, network) + updateStringFromFlag(cmd, &cc.HyperkitVpnKitSock, vpnkitSock) + updateStringSliceFromFlag(cmd, &cc.HyperkitVSockPorts, vsockPorts) + updateStringSliceFromFlag(cmd, &cc.NFSShare, nfsShare) + updateStringFromFlag(cmd, &cc.NFSSharesRoot, nfsSharesRoot) + updateStringFromFlag(cmd, &cc.HostOnlyCIDR, hostOnlyCIDR) + updateStringFromFlag(cmd, &cc.HypervVirtualSwitch, hypervVirtualSwitch) + updateBoolFromFlag(cmd, &cc.HypervUseExternalSwitch, hypervUseExternalSwitch) + updateStringFromFlag(cmd, &cc.HypervExternalAdapter, hypervExternalAdapter) + updateStringFromFlag(cmd, &cc.KVMNetwork, kvmNetwork) + updateStringFromFlag(cmd, &cc.KVMQemuURI, kvmQemuURI) + updateBoolFromFlag(cmd, &cc.KVMGPU, kvmGPU) + updateBoolFromFlag(cmd, &cc.KVMHidden, kvmHidden) + updateBoolFromFlag(cmd, &cc.DisableDriverMounts, disableDriverMounts) + updateStringFromFlag(cmd, &cc.UUID, uuid) + updateBoolFromFlag(cmd, &cc.NoVTXCheck, noVTXCheck) + updateBoolFromFlag(cmd, &cc.DNSProxy, dnsProxy) + updateBoolFromFlag(cmd, &cc.HostDNSResolver, hostDNSResolver) + updateStringFromFlag(cmd, &cc.HostOnlyNicType, hostOnlyNicType) + updateStringFromFlag(cmd, &cc.NatNicType, natNicType) + updateDurationFromFlag(cmd, &cc.StartHostTimeout, waitTimeout) + updateStringSliceFromFlag(cmd, &cc.ExposedPorts, ports) + updateStringFromFlag(cmd, &cc.SSHIPAddress, sshIPAddress) + updateStringFromFlag(cmd, &cc.SSHUser, sshSSHUser) + updateStringFromFlag(cmd, &cc.SSHKey, sshSSHKey) + updateIntFromFlag(cmd, &cc.SSHPort, sshSSHPort) + updateStringFromFlag(cmd, &cc.KubernetesConfig.Namespace, startNamespace) + updateStringFromFlag(cmd, &cc.KubernetesConfig.APIServerName, apiServerName) + updateStringSliceFromFlag(cmd, &cc.KubernetesConfig.APIServerNames, "apiserver-names") + updateStringFromFlag(cmd, &cc.KubernetesConfig.DNSDomain, dnsDomain) + updateStringFromFlag(cmd, &cc.KubernetesConfig.FeatureGates, featureGates) + updateStringFromFlag(cmd, &cc.KubernetesConfig.ContainerRuntime, containerRuntime) + updateStringFromFlag(cmd, &cc.KubernetesConfig.CRISocket, criSocket) + updateStringFromFlag(cmd, &cc.KubernetesConfig.NetworkPlugin, networkPlugin) + updateStringFromFlag(cmd, &cc.KubernetesConfig.ServiceCIDR, serviceCIDR) + updateBoolFromFlag(cmd, &cc.KubernetesConfig.ShouldLoadCachedImages, cacheImages) + updateIntFromFlag(cmd, &cc.KubernetesConfig.NodePort, apiServerPort) if cmd.Flags().Changed(kubernetesVersion) { cc.KubernetesConfig.KubernetesVersion = getKubernetesVersion(existing) } - if cmd.Flags().Changed(startNamespace) { - cc.KubernetesConfig.Namespace = viper.GetString(startNamespace) - } - - if cmd.Flags().Changed(apiServerName) { - cc.KubernetesConfig.APIServerName = viper.GetString(apiServerName) - } - - if cmd.Flags().Changed("apiserver-names") { - cc.KubernetesConfig.APIServerNames = viper.GetStringSlice("apiserver-names") - } - - if cmd.Flags().Changed(apiServerPort) { - cc.KubernetesConfig.NodePort = viper.GetInt(apiServerPort) - } - - if cmd.Flags().Changed(vsockPorts) { - cc.ExposedPorts = viper.GetStringSlice(ports) - } - - // pre minikube 1.9.2 cc.KubernetesConfig.NodePort was not populated. - // in minikube config there were two fields for api server port. - // one in cc.KubernetesConfig.NodePort and one in cc.Nodes.Port - // this makes sure api server port not be set as 0! - if existing.KubernetesConfig.NodePort == 0 { - cc.KubernetesConfig.NodePort = viper.GetInt(apiServerPort) - } - - if cmd.Flags().Changed(dnsDomain) { - cc.KubernetesConfig.DNSDomain = viper.GetString(dnsDomain) - } - - if cmd.Flags().Changed(featureGates) { - cc.KubernetesConfig.FeatureGates = viper.GetString(featureGates) - } - - if cmd.Flags().Changed(containerRuntime) { - cc.KubernetesConfig.ContainerRuntime = viper.GetString(containerRuntime) - } - - if cmd.Flags().Changed(criSocket) { - cc.KubernetesConfig.CRISocket = viper.GetString(criSocket) - } - - if cmd.Flags().Changed(networkPlugin) { - cc.KubernetesConfig.NetworkPlugin = viper.GetString(networkPlugin) - } - - if cmd.Flags().Changed(serviceCIDR) { - cc.KubernetesConfig.ServiceCIDR = viper.GetString(serviceCIDR) - } - - if cmd.Flags().Changed(cacheImages) { - cc.KubernetesConfig.ShouldLoadCachedImages = viper.GetBool(cacheImages) - } - - if cmd.Flags().Changed(imageRepository) { - cc.KubernetesConfig.ImageRepository = viper.GetString(imageRepository) - } - if cmd.Flags().Changed("extra-config") { cc.KubernetesConfig.ExtraOptions = config.ExtraOptions } - if cmd.Flags().Changed(enableDefaultCNI) && !cmd.Flags().Changed(cniFlag) { - if viper.GetBool(enableDefaultCNI) { - klog.Errorf("Found deprecated --enable-default-cni flag, setting --cni=bridge") - cc.KubernetesConfig.CNI = "bridge" - } - } - - if cmd.Flags().Changed(cniFlag) { - cc.KubernetesConfig.CNI = viper.GetString(cniFlag) + if cmd.Flags().Changed(cniFlag) || cmd.Flags().Changed(enableDefaultCNI) { + cc.KubernetesConfig.CNI = getCNIConfig(cmd) } if cmd.Flags().Changed(waitComponents) { @@ -708,6 +637,41 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC return cc } +// updateStringFromFlag will update the existing string from the flag. +func updateStringFromFlag(cmd *cobra.Command, v *string, key string) { + if cmd.Flags().Changed(key) { + *v = viper.GetString(key) + } +} + +// updateBoolFromFlag will update the existing bool from the flag. +func updateBoolFromFlag(cmd *cobra.Command, v *bool, key string) { + if cmd.Flags().Changed(key) { + *v = viper.GetBool(key) + } +} + +// updateStringSliceFromFlag will update the existing []string from the flag. +func updateStringSliceFromFlag(cmd *cobra.Command, v *[]string, key string) { + if cmd.Flags().Changed(key) { + *v = viper.GetStringSlice(key) + } +} + +// updateIntFromFlag will update the existing int from the flag. +func updateIntFromFlag(cmd *cobra.Command, v *int, key string) { + if cmd.Flags().Changed(key) { + *v = viper.GetInt(key) + } +} + +// updateDurationFromFlag will update the existing duration from the flag. +func updateDurationFromFlag(cmd *cobra.Command, v *time.Duration, key string) { + if cmd.Flags().Changed(key) { + *v = viper.GetDuration(key) + } +} + // interpretWaitFlag interprets the wait flag and respects the legacy minikube users // returns map of components to wait for func interpretWaitFlag(cmd cobra.Command) map[string]bool { @@ -752,3 +716,20 @@ func interpretWaitFlag(cmd cobra.Command) map[string]bool { klog.Infof("Waiting for components: %+v", waitComponents) return waitComponents } + +func checkExtraDiskOptions(cmd *cobra.Command, driverName string) { + supportedDrivers := []string{driver.HyperKit} + + if cmd.Flags().Changed(extraDisks) { + supported := false + for _, driver := range supportedDrivers { + if driverName == driver { + supported = true + break + } + } + if !supported { + out.WarningT("Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.", out.V{"supported_drivers": supportedDrivers}) + } + } +} diff --git a/cmd/minikube/cmd/start_test.go b/cmd/minikube/cmd/start_test.go index 5d03d3d95c..30b91b5a30 100644 --- a/cmd/minikube/cmd/start_test.go +++ b/cmd/minikube/cmd/start_test.go @@ -21,7 +21,7 @@ import ( "strings" "testing" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -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) } }) } diff --git a/cmd/minikube/cmd/stop.go b/cmd/minikube/cmd/stop.go index 55917bce3a..1db7ab2038 100644 --- a/cmd/minikube/cmd/stop.go +++ b/cmd/minikube/cmd/stop.go @@ -64,7 +64,7 @@ func init() { stopCmd.Flags().StringVarP(&outputFormat, "output", "o", "text", "Format to print stdout in. Options include: [text,json]") if err := viper.GetViper().BindPFlags(stopCmd.Flags()); err != nil { - exit.Error(reason.InternalFlagsBind, "unable to bind flags", err) + exit.Error(reason.InternalBindFlags, "unable to bind flags", err) } } diff --git a/cmd/minikube/cmd/unpause.go b/cmd/minikube/cmd/unpause.go index 0f52ca240d..e1c590961e 100644 --- a/cmd/minikube/cmd/unpause.go +++ b/cmd/minikube/cmd/unpause.go @@ -39,8 +39,9 @@ import ( // unpauseCmd represents the docker-pause command var unpauseCmd = &cobra.Command{ - Use: "unpause", - Short: "unpause Kubernetes", + Use: "unpause", + Aliases: []string{"resume"}, + Short: "unpause Kubernetes", Run: func(cmd *cobra.Command, args []string) { cname := ClusterFlagValue() register.SetEventLogPath(localpath.EventLog(cname)) @@ -105,7 +106,7 @@ var unpauseCmd = &cobra.Command{ } func init() { - unpauseCmd.Flags().StringSliceVarP(&namespaces, "--namespaces", "n", constants.DefaultNamespaces, "namespaces to unpause") + unpauseCmd.Flags().StringSliceVarP(&namespaces, "namespaces", "n", constants.DefaultNamespaces, "namespaces to unpause") unpauseCmd.Flags().BoolVarP(&allNamespaces, "all-namespaces", "A", false, "If set, unpause all namespaces") unpauseCmd.Flags().StringVarP(&outputFormat, "output", "o", "text", "Format to print stdout in. Options include: [text,json]") } diff --git a/cmd/minikube/cmd/version.go b/cmd/minikube/cmd/version.go index 3ea5341acb..7b45f6f0ea 100644 --- a/cmd/minikube/cmd/version.go +++ b/cmd/minikube/cmd/version.go @@ -18,18 +18,23 @@ package cmd import ( "encoding/json" + "os/exec" + "strings" "github.com/spf13/cobra" "gopkg.in/yaml.v2" + "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/exit" + "k8s.io/minikube/pkg/minikube/mustload" "k8s.io/minikube/pkg/minikube/out" "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/version" ) var ( - versionOutput string - shortVersion bool + versionOutput string + shortVersion bool + listComponentsVersions bool ) var versionCmd = &cobra.Command{ @@ -43,6 +48,33 @@ var versionCmd = &cobra.Command{ "minikubeVersion": minikubeVersion, "commit": gitCommitID, } + + if listComponentsVersions && !shortVersion { + co := mustload.Running(ClusterFlagValue()) + runner := co.CP.Runner + versionCMDS := map[string]*exec.Cmd{ + "docker": exec.Command("docker", "version", "--format={{.Client.Version}}"), + "containerd": exec.Command("containerd", "--version"), + "crio": exec.Command("crio", "version"), + "podman": exec.Command("sudo", "podman", "version"), + "crictl": exec.Command("sudo", "crictl", "version"), + "buildctl": exec.Command("buildctl", "--version"), + "ctr": exec.Command("sudo", "ctr", "version"), + "runc": exec.Command("runc", "--version"), + } + for k, v := range versionCMDS { + rr, err := runner.RunCmd(v) + if err != nil { + klog.Warningf("error getting %s's version: %v", k, err) + data[k] = "error" + } else { + data[k] = strings.TrimSpace(rr.Stdout.String()) + } + + } + + } + switch versionOutput { case "": if !shortVersion { @@ -50,6 +82,15 @@ var versionCmd = &cobra.Command{ if gitCommitID != "" { out.Ln("commit: %v", gitCommitID) } + for k, v := range data { + // for backward compatibility we keep displaying the old way for these two + if k == "minikubeVersion" || k == "commit" { + continue + } + if v != "" { + out.Ln("\n%s:\n%s", k, v) + } + } } else { out.Ln("%v", minikubeVersion) } @@ -74,4 +115,5 @@ var versionCmd = &cobra.Command{ func init() { versionCmd.Flags().StringVarP(&versionOutput, "output", "o", "", "One of 'yaml' or 'json'.") versionCmd.Flags().BoolVar(&shortVersion, "short", false, "Print just the version number.") + versionCmd.Flags().BoolVar(&listComponentsVersions, "components", false, "list versions of all components included with minikube. (the cluster must be running)") } diff --git a/cmd/minikube/main.go b/cmd/minikube/main.go index 150b60e0a6..496ec6e9fd 100644 --- a/cmd/minikube/main.go +++ b/cmd/minikube/main.go @@ -28,6 +28,7 @@ import ( "path/filepath" "regexp" "strconv" + "strings" "github.com/spf13/pflag" "k8s.io/klog/v2" @@ -67,6 +68,7 @@ func main() { // Don't parse flags when running as kubectl _, callingCmd := filepath.Split(os.Args[0]) + callingCmd = strings.TrimSuffix(callingCmd, ".exe") parse := callingCmd != "kubectl" setFlags(parse) @@ -152,7 +154,7 @@ func logFileName(dir string, logIdx int64) string { klog.Warningf("Unable to add username %s to log filename hash: %v", user.Username, err) } } - for _, s := range os.Args { + for _, s := range pflag.Args() { if _, err := h.Write([]byte(s)); err != nil { klog.Warningf("Unable to add arg %s to log filename hash: %v", s, err) } @@ -160,10 +162,10 @@ func logFileName(dir string, logIdx int64) string { hs := hex.EncodeToString(h.Sum(nil)) var logfilePath string // check if subcommand specified - if len(os.Args) < 2 { + if len(pflag.Args()) < 1 { logfilePath = filepath.Join(dir, fmt.Sprintf("minikube_%s_%d.log", hs, logIdx)) } else { - logfilePath = filepath.Join(dir, fmt.Sprintf("minikube_%s_%s_%d.log", os.Args[1], hs, logIdx)) + logfilePath = filepath.Join(dir, fmt.Sprintf("minikube_%s_%s_%d.log", pflag.Arg(0), hs, logIdx)) } // if log has reached max size 1M, generate new logfile name by incrementing count if checkLogFileMaxSize(logfilePath, 1024) { diff --git a/deploy/addons/assets.go b/deploy/addons/assets.go new file mode 100644 index 0000000000..3fa5c6ced3 --- /dev/null +++ b/deploy/addons/assets.go @@ -0,0 +1,138 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package addons + +import "embed" + +var ( + // AutoPauseAssets assets for auto-pause addon + //go:embed auto-pause/*.tmpl + //go:embed auto-pause/unpause.lua + AutoPauseAssets embed.FS + + // DashboardAssets assets for dashboard addon + //go:embed dashboard/*.yaml dashboard/*.tmpl + DashboardAssets embed.FS + + // DefaultStorageClassAssets assets for default-storageclass addon + //go:embed storageclass/storageclass.yaml.tmpl + DefaultStorageClassAssets embed.FS + + // PodSecurityPolicyAssets assets for pod-security-policy addon + //go:embed pod-security-policy/pod-security-policy.yaml.tmpl + PodSecurityPolicyAssets embed.FS + + // StorageProvisionerAssets assets for storage-provisioner addon + //go:embed storage-provisioner/storage-provisioner.yaml.tmpl + StorageProvisionerAssets embed.FS + + // StorageProvisionerGlusterAssets assets for storage-provisioner-gluster addon + //go:embed storage-provisioner-gluster/*.tmpl + StorageProvisionerGlusterAssets embed.FS + + // EfkAssets assets for efk addon + //go:embed efk/*.tmpl + EfkAssets embed.FS + + // IngressAssets assets for ingress addon + //go:embed ingress/*.tmpl + IngressAssets embed.FS + + // IstioProvisionerAssets assets for istio-provisioner addon + //go:embed istio-provisioner/istio-operator.yaml.tmpl + IstioProvisionerAssets embed.FS + + // IstioAssets assets for istio addon + //go:embed istio/istio-default-profile.yaml.tmpl + IstioAssets embed.FS + + // KubevirtAssets assets for kubevirt addon + //go:embed kubevirt/pod.yaml.tmpl + KubevirtAssets embed.FS + + // MetricsServerAssets assets for metrics-server addon + //go:embed metrics-server/*.tmpl + MetricsServerAssets embed.FS + + // OlmAssets assets for olm addon + //go:embed olm/*.tmpl + OlmAssets embed.FS + + // RegistryAssets assets for registry addon + //go:embed registry/*.tmpl + RegistryAssets embed.FS + + // RegistryCredsAssets assets for registry-creds addon + //go:embed registry-creds/registry-creds-rc.yaml.tmpl + RegistryCredsAssets embed.FS + + // RegistryAliasesAssets assets for registry-aliases addon + //go:embed registry-aliases/*.tmpl + RegistryAliasesAssets embed.FS + + // FreshpodAssets assets for freshpod addon + //go:embed freshpod/freshpod-rc.yaml.tmpl + FreshpodAssets embed.FS + + // NvidiaDriverInstallerAssets assets for nvidia-driver-installer addon + //go:embed gpu/nvidia-driver-installer.yaml.tmpl + NvidiaDriverInstallerAssets embed.FS + + // NvidiaGpuDevicePluginAssets assets for nvidia-gpu-device-plugin addon + //go:embed gpu/nvidia-gpu-device-plugin.yaml.tmpl + NvidiaGpuDevicePluginAssets embed.FS + + // LogviewerAssets assets for logviewer addon + //go:embed logviewer/*.tmpl + LogviewerAssets embed.FS + + // GvisorAssets assets for gvisor addon + //go:embed gvisor/*.tmpl gvisor/*.toml + GvisorAssets embed.FS + + // HelmTillerAssets assets for helm-tiller addon + //go:embed helm-tiller/*.tmpl + HelmTillerAssets embed.FS + + // IngressDNSAssets assets for ingress-dns addon + //go:embed ingress-dns/ingress-dns-pod.yaml.tmpl + IngressDNSAssets embed.FS + + // MetallbAssets assets for metallb addon + //go:embed metallb/*.tmpl + MetallbAssets embed.FS + + // AmbassadorAssets assets for ambassador addon + //go:embed ambassador/*.tmpl + AmbassadorAssets embed.FS + + // GcpAuthAssets assets for gcp-auth addon + //go:embed gcp-auth/*.tmpl + GcpAuthAssets embed.FS + + // VolumeSnapshotsAssets assets for volumesnapshots addon + //go:embed volumesnapshots/*.tmpl + VolumeSnapshotsAssets embed.FS + + // 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/auto-pause/auto-pause.service b/deploy/addons/auto-pause/auto-pause.service.tmpl similarity index 62% rename from deploy/addons/auto-pause/auto-pause.service rename to deploy/addons/auto-pause/auto-pause.service.tmpl index 7d763ca68a..0a5260a7b4 100644 --- a/deploy/addons/auto-pause/auto-pause.service +++ b/deploy/addons/auto-pause/auto-pause.service.tmpl @@ -3,7 +3,7 @@ Description=Auto Pause Service [Service] Type=simple -ExecStart=/bin/auto-pause +ExecStart=/bin/auto-pause --container-runtime={{.ContainerRuntime}} Restart=always [Install] diff --git a/deploy/addons/auto-pause/haproxy.cfg b/deploy/addons/auto-pause/haproxy.cfg.tmpl similarity index 86% rename from deploy/addons/auto-pause/haproxy.cfg rename to deploy/addons/auto-pause/haproxy.cfg.tmpl index 8443084fb0..6120aea85b 100644 --- a/deploy/addons/auto-pause/haproxy.cfg +++ b/deploy/addons/auto-pause/haproxy.cfg.tmpl @@ -28,10 +28,10 @@ backend k8s-api-https #tcp-request inspect-delay 10s #tcp-request content lua.foo_action tcp-request inspect-delay 10s - tcp-request content lua.unpause 192.168.49.2 8080 + tcp-request content lua.unpause {{.NetworkInfo.ControlPlaneNodeIP}} 8080 tcp-request content reject if { var(req.blocked) -m bool } option tcplog option tcp-check default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100 - server k8s-api-1 192.168.49.2:8443 check + server k8s-api-1 {{.NetworkInfo.ControlPlaneNodeIP}}:{{.NetworkInfo.ControlPlaneNodePort}} check diff --git a/deploy/addons/dashboard/dashboard-secret.yaml b/deploy/addons/dashboard/dashboard-secret.yaml index 3e2b877dd8..1a247dffe6 100644 --- a/deploy/addons/dashboard/dashboard-secret.yaml +++ b/deploy/addons/dashboard/dashboard-secret.yaml @@ -18,7 +18,7 @@ metadata: labels: k8s-app: kubernetes-dashboard kubernetes.io/minikube-addons: dashboard - addonmanager.kubernetes.io/mode: Reconcile + addonmanager.kubernetes.io/mode: Reconcile name: kubernetes-dashboard-certs namespace: kubernetes-dashboard type: Opaque @@ -31,7 +31,7 @@ metadata: labels: k8s-app: kubernetes-dashboard kubernetes.io/minikube-addons: dashboard - addonmanager.kubernetes.io/mode: Reconcile + addonmanager.kubernetes.io/mode: Reconcile name: kubernetes-dashboard-csrf namespace: kubernetes-dashboard type: Opaque @@ -46,7 +46,7 @@ metadata: labels: k8s-app: kubernetes-dashboard kubernetes.io/minikube-addons: dashboard - addonmanager.kubernetes.io/mode: Reconcile + addonmanager.kubernetes.io/mode: Reconcile name: kubernetes-dashboard-key-holder namespace: kubernetes-dashboard type: Opaque diff --git a/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl.tmpl b/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl.tmpl index 3c539b86d3..3923a5ed75 100644 --- a/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl.tmpl +++ b/deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl.tmpl @@ -164,7 +164,7 @@ webhooks: namespace: gcp-auth path: "/mutate" rules: - - operations: ["CREATE", "UPDATE"] + - operations: ["CREATE"] apiGroups: ["*"] apiVersions: ["*"] resources: ["pods"] diff --git a/deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl b/deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl index a644200fa5..324294329b 100644 --- a/deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl +++ b/deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl @@ -1,4 +1,4 @@ -apiVersion: apiregistration.k8s.io/v1beta1 +apiVersion: apiregistration.k8s.io/v1 kind: APIService metadata: name: v1beta1.metrics.k8s.io 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/deploy/iso/minikube-iso/package/automount/minikube-automount b/deploy/iso/minikube-iso/package/automount/minikube-automount index 478280ec15..bfe8f3a87c 100755 --- a/deploy/iso/minikube-iso/package/automount/minikube-automount +++ b/deploy/iso/minikube-iso/package/automount/minikube-automount @@ -9,9 +9,15 @@ MAGIC="boot2docker, please format-me" # If there is a partition with `boot2docker-data` as its label, use it and be # very happy. Thus, you can come along if you feel like a room without a roof. BOOT2DOCKER_DATA=`blkid -o device -l -t LABEL=$LABEL` -UNPARTITIONED_HD="/dev/$(lsblk | grep disk | cut -f1 -d' ')" +DISKS="$(lsblk | grep disk | cut -f1 -d' ')" echo $BOOT2DOCKER_DATA -if [ ! -n "$BOOT2DOCKER_DATA" ]; then +for DISK in $DISKS; do + if [ -n "$BOOT2DOCKER_DATA" ]; then + # The primary minikube disk has been found or provisioned; stop provisioning other disks + break + fi + + UNPARTITIONED_HD="/dev/$DISK" echo "Is the disk unpartitioned?, test for the 'boot2docker format-me' string" # Is the disk unpartitioned?, test for the 'boot2docker format-me' string @@ -61,10 +67,10 @@ if [ ! -n "$BOOT2DOCKER_DATA" ]; then BOOT2DOCKER_DATA=`echo "${UNPARTITIONED_HD}1"` mkfs.ext4 -i 2048 -L $LABEL $BOOT2DOCKER_DATA else - echo "Disk unpartitioned but something is there... not doing anything" + echo "Disk ($UNPARTITIONED_HD) unpartitioned but something is there... not doing anything" fi else - echo "Partition table found on disk, not doing anything" + echo "Partition table found on disk ($UNPARTITIONED_HD), not doing anything" fi fi else @@ -72,7 +78,7 @@ if [ ! -n "$BOOT2DOCKER_DATA" ]; then # TODO: mount all Linux partitions and look for a /var/lib/docker... BOOT2DOCKER_DATA=`blkid | grep -e 'TYPE="btrfs"' -e 'TYPE="ext4"' | head -n 1 | sed 's/:.*//'` fi -fi +done echo $BOOT2DOCKER_DATA diff --git a/deploy/iso/minikube-iso/package/containerd-bin/containerd.service b/deploy/iso/minikube-iso/package/containerd-bin/containerd.service index 97758f26bb..2d3d1e5ec9 100644 --- a/deploy/iso/minikube-iso/package/containerd-bin/containerd.service +++ b/deploy/iso/minikube-iso/package/containerd-bin/containerd.service @@ -16,7 +16,7 @@ ExecStart=/usr/bin/containerd \ --root ${PERSISTENT_DIR}/var/lib/containerd TasksMax=8192 Delegate=yes -KillMode=process +KillMode=mixed LimitNOFILE=1048576 # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. diff --git a/deploy/kicbase/Dockerfile b/deploy/kicbase/Dockerfile index e099763fe1..714c6ce23b 100644 --- a/deploy/kicbase/Dockerfile +++ b/deploy/kicbase/Dockerfile @@ -17,6 +17,14 @@ # For systemd + docker configuration used below, see the following references: # https://systemd.io/CONTAINER_INTERFACE/ + +# multi-tage docker build so we can build auto-pause for arm64 +FROM golang:1.16 +WORKDIR /src +# becaue auto-pause binary depends on minikube's code we need to pass the whole source code as the context +ADD . . +RUN cd ./cmd/auto-pause/ && go build + # start from ubuntu 20.04, this image is reasonably small as a starting point # for a kubernetes node image, it doesn't contain much we don't need FROM ubuntu:focal-20210401 @@ -24,12 +32,11 @@ FROM ubuntu:focal-20210401 ARG BUILDKIT_VERSION="v0.8.2" # copy in static files (configs, scripts) -COPY 10-network-security.conf /etc/sysctl.d/10-network-security.conf -COPY 11-tcp-mtu-probing.conf /etc/sysctl.d/11-tcp-mtu-probing.conf -COPY clean-install /usr/local/bin/clean-install -COPY entrypoint /usr/local/bin/entrypoint -# must first run `make deploy/kicbase/auto-pause` -COPY auto-pause /bin/auto-pause +COPY deploy/kicbase/10-network-security.conf /etc/sysctl.d/10-network-security.conf +COPY deploy/kicbase/11-tcp-mtu-probing.conf /etc/sysctl.d/11-tcp-mtu-probing.conf +COPY deploy/kicbase/clean-install /usr/local/bin/clean-install +COPY deploy/kicbase/entrypoint /usr/local/bin/entrypoint +COPY --from=0 /src/cmd/auto-pause/auto-pause /bin/auto-pause # Install dependencies, first from apt, then from release tarballs. # NOTE: we use one RUN to minimize layers. @@ -63,6 +70,7 @@ RUN echo "Ensuring scripts are executable ..." \ libseccomp2 pigz \ bash ca-certificates curl rsync \ nfs-common \ + iputils-ping netcat-openbsd vim-tiny \ && find /lib/systemd/system/sysinit.target.wants/ -name "systemd-tmpfiles-setup.service" -delete \ && rm -f /lib/systemd/system/multi-user.target.wants/* \ && rm -f /etc/systemd/system/*.wants/* \ @@ -151,14 +159,14 @@ RUN sh -c "echo 'deb http://download.opensuse.org/repositories/devel:/kubic:/lib systemd-tmpfiles --create # automount service -COPY automount/minikube-automount /usr/sbin/minikube-automount -COPY automount/minikube-automount.service /usr/lib/systemd/system/minikube-automount.service +COPY deploy/kicbase/automount/minikube-automount /usr/sbin/minikube-automount +COPY deploy/kicbase/automount/minikube-automount.service /usr/lib/systemd/system/minikube-automount.service RUN ln -fs /usr/lib/systemd/system/minikube-automount.service \ /etc/systemd/system/multi-user.target.wants/minikube-automount.service # scheduled stop service -COPY scheduled-stop/minikube-scheduled-stop /var/lib/minikube/scheduled-stop/minikube-scheduled-stop -COPY scheduled-stop/minikube-scheduled-stop.service /usr/lib/systemd/system/minikube-scheduled-stop.service +COPY deploy/kicbase/scheduled-stop/minikube-scheduled-stop /var/lib/minikube/scheduled-stop/minikube-scheduled-stop +COPY deploy/kicbase/scheduled-stop/minikube-scheduled-stop.service /usr/lib/systemd/system/minikube-scheduled-stop.service RUN chmod +x /var/lib/minikube/scheduled-stop/minikube-scheduled-stop # disable non-docker runtimes by default diff --git a/deploy/minikube/release_sanity_test.go b/deploy/minikube/release_sanity_test.go index 07eba31e8d..9b55312c36 100644 --- a/deploy/minikube/release_sanity_test.go +++ b/deploy/minikube/release_sanity_test.go @@ -1,5 +1,3 @@ -// +build release - /* Copyright 2016 The Kubernetes Authors All rights reserved. @@ -47,13 +45,30 @@ func getSHAFromURL(url string) (string, error) { return hex.EncodeToString(b[:]), nil } +// TestReleasesJSON checks if all *GA* releases +// enlisted in https://storage.googleapis.com/minikube/releases.json +// are available to download and have correct hashsum func TestReleasesJSON(t *testing.T) { - releases, err := notify.GetAllVersionsFromURL(notify.GithubMinikubeReleasesURL) + releases, err := notify.AllVersionsFromURL(notify.GithubMinikubeReleasesURL) if err != nil { t.Fatalf("Error getting releases.json: %v", err) } + checkReleases(t, releases) +} - for _, r := range releases { +// TestBetaReleasesJSON checks if all *BETA* releases +// enlisted in https://storage.googleapis.com/minikube/releases-beta.json +// are available to download and have correct hashsum +func TestBetaReleasesJSON(t *testing.T) { + releases, err := notify.AllVersionsFromURL(notify.GithubMinikubeBetaReleasesURL) + if err != nil { + t.Fatalf("Error getting releases-bets.json: %v", err) + } + checkReleases(t, releases) +} + +func checkReleases(t *testing.T, rs notify.Releases) { + for _, r := range rs { fmt.Printf("Checking release: %s\n", r.Name) for platform, sha := range r.Checksums { fmt.Printf("Checking SHA for %s.\n", platform) diff --git a/deploy/minikube/releases-beta.json b/deploy/minikube/releases-beta.json index 6b8b28e98d..98c98af88b 100644 --- a/deploy/minikube/releases-beta.json +++ b/deploy/minikube/releases-beta.json @@ -1,10 +1,26 @@ [ { + "name": "v1.22.0-beta.0", + "checksums": { + "darwin": "1ec06c37be5c6c79a7255da09ff83490a44d1e8cd2b2f45e4b489edfdeacde94", + "linux": "c9d9ac605a94748379188cced6b832037b8069441744b889214990c4ca3485a5", + "windows": "68fb9c24f0ea55b985856d0cce9fa0c288b8a4d7e13519d6f0790038165d7ef1" + } + }, + { + "name": "v1.21.0-beta.0", + "checksums": { + "darwin": "69ab001eb4984d09ed731d5ac92afd8310e5c7672c2275b39d7a4c7e2dcfb4c6", + "linux": "41a26190c6774e1f3cc568986d4043431022d5dff4a619f131e9bb49d13e2874", + "windows": "e7d41c8c40e33633d47976047a48600ff23657c824db7e60fe5a4f2d2daeb135" + } + }, + { "name": "v1.20.0-beta.0", "checksums": { - "darwin": "", - "linux": "", - "windows": "" + "darwin": "686f8d7c06c93f28543f982ec56a68544ab2ad6c7f70b39ede5174d7bac29651", + "linux": "fe0796852c9ef266597fc93fa4b7a88d2cab9ba7008f0e9f644b633c51d269a1", + "windows": "84a0686c90ab88d04a0aab57b8cadacf9197d3ea6b467f9f807d071efe7fad3c" } } ] diff --git a/deploy/minikube/releases.json b/deploy/minikube/releases.json index 5172ffb61c..14d9feb5d3 100644 --- a/deploy/minikube/releases.json +++ b/deploy/minikube/releases.json @@ -1,4 +1,20 @@ [ + { + "name": "v1.22.0", + "checksums": { + "darwin": "932a278393cdcb90bff79c4e49d72c1c34910a71010f1466ce92f51d8332fb58", + "linux": "7579e5763a4e441500e5709eb058384c9cfe9c9dd888b39905b2cdf3d30fbf36", + "windows": "8764ca0e290b4420c5ec82371bcc1b542990a93bdf771578623554be32319d08" + } + }, + { + "name": "v1.21.0", + "checksums": { + "darwin": "e2043883ca993b2a65396d379823dab6404dd842d0cc2a81348d247b01785070", + "linux": "5d423a00a24fdfbb95627a3fadbf58540fc4463be2338619257c529f93cf061b", + "windows": "74c961877798531ab8e53e2590bfae3cee7690d0c2e0614fdb44339e065124b5" + } + }, { "name": "v1.20.0", "checksums": { diff --git a/enhancements/implemented/20210624-flake-rate/flake-rate.md b/enhancements/implemented/20210624-flake-rate/flake-rate.md new file mode 100644 index 0000000000..36cda17b08 --- /dev/null +++ b/enhancements/implemented/20210624-flake-rate/flake-rate.md @@ -0,0 +1,74 @@ +# Public Flake Rate Charts + +* First proposed: 2021-05-17 +* Authors: Andriy Dzikh (@andriyDev) + +## Reviewer Priorities + +Please review this proposal with the following priorities: + +* Does this fit with minikube's [principles](https://minikube.sigs.k8s.io/docs/concepts/principles/)? +* Are there other approaches to consider? +* Could the implementation be made simpler? +* Are there usability, reliability, or technical debt concerns? + +## Summary + +As of June 2021, public users have no way to view the flake rates of integration tests. This can make it tricky to determine whether an individual PR is causing a new error, or if the test failure is just a flake, or if the test is entirely broken. While each test failure should be investigated, sometimes an unrelated test fails, and knowing that the test has been flaky can increase confidence in a particular PR. + +This proposal is for a system to inform users, both public and internal, of the flake rates of various tests on the master branch. + +## Goals + +* Comments on PRs describing the flake rates of failing tests +* Charts to visualize the flake rates of any test + +## Design Details + +### Overview + +The full overview of the system is as follows: +* The `minikube` Jenkins job builds all binaries for integration tests. On completion, it triggers `minikube_set_pending.sh`, which updates the PR status of integration tests to pending. In addition, `minikube_set_pending.sh` will upload the list of environments to wait for to `gs://minikube-builds/logs///started_environments.txt` +* Jenkins integration test jobs running on master generate gopogh summaries. Each job then triggers `Flake Rate Upload` which appends the completed environment to `gs://minikube-builds/logs///finished_environments.txt` +* Once all started environments are present in finished environments, if running on master, all gopogh reports are processed through `upload_tests.sh` and appended into the dataset of all test runs at `gs://minikube-flake-rate/data.csv`. If running on a PR, the gopogh reports are used with `report_flakes.sh` to write a comment on PRs about the flake rates of all failed tests. +* A Jenkins job runs regularly to compute the flake rates of tests in `gs://minikube-flake-rate/data.csv` and outputs the results into `gs://minikube-flake-rate/flake_rates.csv`, including the environment (e.g. `Docker_Linux`), the test name, the flake rate as a percentage, and the average duration +* An HTML+JS file, hosted on `gs://minikube-flake-rate/flake_chart.html`, will read the full test data (`gs://minikube-flake-rate/data.csv`), and parse it into a chart displaying the daily flake rates and average durations of the requested tests (specified by url query arguments) + +### Test Data Collection + +Our system needs a way to collect data from our existing integration tests. As of June 2021, all integration Jenkins jobs run the integration tests, then use gopogh to create HTML files for viewing, and JSON files for summarizing the test results. The new system will then take these JSON summaries, and pass them into a script named `upload_tests.sh`. This script will process the summary into a CSV file of its test runs and related data, and upload this to a dataset of all test runs at `gs://minikube-flake-rate/data.csv`. This file will be publicly accessible to all users to read (and later chart the data). + +### Flake Rate Computation + +On a regular schedule (every 4 hours for example), a Jenkins job named `Flake Rate Computation` will download `gs://minikube-flake-rate/data.csv` and compute a failure percentage for each test/environment combination, based on the number of failures occurring in the past 15 days (this will be configurable). Note that this will be the past 15 dates that the test actually ran, since this can allow a test to be skipped for a long period of time and then unskipped while maintaining the old flake rate. This will also compute the average duration of the test for the past 15 days. The resulting data will then be stored in `gs://minikube-flake-rate/flake_rates.csv`. + +### Charts + +To allow users to see the daily "flakiness" of a test/environment combination, we will have an HTML file at `gs://minikube-flake-rate/flake_chart.html` and a JS file at `gs://minikube-flake-rate/flake_chart.js`. These will fetch `gs://minikube-flake-rate/data.csv` and parse it into Google Charts allowing us to visualize the "flakiness" over time. This can help track down exactly when a test became flaky by telling us the commits associated with each test date. The flake rate charts will use two query parameters (e.g. `https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?test=TestFunctional/parallel/LogsCmd&env=Docker_Linux`): `test` which will control which test to view (`TestFunctional/parallel/LogsCmd`), and `env` which will control the environment to view (e.g. `Docker_Linux`). If `test` is omitted, a chart describing all tests for `env` will be displayed. By hosting this in a GCS bucket, we can avoid needing to create actual servers to manage this. Since these files are incredibly lightweight, there is little concern over the workload of hosting these files. + +### PR Comments + +As PRs can have many failures, it is useful to be told the flake rates of some of these tests. Some of our tests could be more stable, and knowing that a failed test is known to be unreliable can be informative for both the PR creators and the PR reviewers. To that end, once all integration tests have finished, it will call a script named `report_flakes.sh`. This script will use gopogh summaries of all environments (for the test run that should be reported about) and the public `gs://minikube-flake-rate/flake_rates.csv` to comment on the PR about all failed tests, their flake rates, and links to the flake charts for the test and the environment the failure occurred on. + +### Additional Information + +The raw data `gs://minikube-flake-rate/data.csv` can become quite large if stored as simple CSV data. Since this is a CSV file, it will contain columns for each field which includes commit hash, test date, test name, etc. Some of these fields can be repetitive like commit hash and test date. Since test runs are generally added such that all the tests for a single commit hash are added consecutively, we can use a sentinel value to repeat values. Specifically, if the previous row had the same value for the current column, we can replace the current column value with an empty space. When parsing the reverse can be performed - whenever a blank space is found, simply repeat the value of the previous row. + +``` +Input: +hash,2021-06-10,Docker_Linux,TestFunctional,Passed,0.5 +hash,2021-06-10,Docker_Linux_containerd,TestFunctional,Failed,0.6 + +Output: +hash,2021-06-10,Docker_Linux,TestFunctional,Passed,0.5 +,,DockerLinux_containerd,,Failed,0.6 +``` + +This optimization will be done in `optimize_data.sh`. + + +## Alternatives Considered + +Another optimization technique that can be used on `gs://minikube-flake-rate/data.csv` is to use a string table. The string table would be stored at `gs://minikube-flake-rate/data_strings.txt` and would contain an ordered list of unique strings. The index of each string can then be used in place of the actual text in `gs://minikube-flake-rate/data.csv`. The index into the string table will very likely be shorter than the text it represents, saving space. For non-consecutive strings, this can be a very big saving. For example, test names are repeated very often in `gs://minikube-flake-rate/data.csv`, but almost never consecutively. With this technique, the dataset can be compressed even further. + +The trouble with this technique is complexity - any users of the dataset would need to also manage the string table. More importantly, if a new string needs to be added to the string table, the order is critical, meaning synchronization can be a problem (since our integration tests run in parallel). Due to these concerns, this option was rejected. diff --git a/enhancements/proposed/20210618-tips/tips.md b/enhancements/proposed/20210618-tips/tips.md new file mode 100644 index 0000000000..a42d21c59b --- /dev/null +++ b/enhancements/proposed/20210618-tips/tips.md @@ -0,0 +1,205 @@ +# Periodically tell user about minikube features/tips and tricks + +* First proposed: 2021-06-18 +* Authors: Peixuan Ding (@dinever) + +## Reviewer Priorities + +Please review this proposal with the following priorities: + +* Does this fit with minikube's [principles](https://minikube.sigs.k8s.io/docs/concepts/principles/)? +* Are there other approaches to consider? +* Could the implementation be made simpler? +* Are there usability, reliability, or technical debt concerns? + +Please leave the above text in your proposal as instructions to the reader. + +## Summary + +minikube has lots of great features. We want to proactively remind users that +those features are available. + +To achieve this, we can have a tips feature that randomly shows a tip +from a curated list whenever the user starts a new minikube profile. + +For example: + +![Screenshot from 2021-06-18 00-58-02](https://user-images.githubusercontent.com/1311594/122508665-53bd6380-cfd0-11eb-9e99-a6c5935514d5.png) + +## Goals + +* Store a list of tips in a static file +* Show a random minikube usage tip each time a user starts a minikube profile +* Have the tips synced to the Hugo docs website to make those available through docs +* Allow user to disable the Tips feature with minikube config + +## Non-Goals + +* Modify any existing functionalities or docs + +## Design Details + +First, we need a static file to store all the tips, we can have a YAML file at [pkg/generate/tips/tips.yaml](https://github.com/kubernetes/minikube/tree/master/pkg/generate): + +```YAML +tips: + - | + You can specify any Kubernetes version you want. For example: + + ``` + minikube start --kubernetes-version=v1.19.0 + ``` + - | + You can use minikube's built-in kubectl. For example: + + ``` + minikube kubectl -- get pods + ``` + - | + minikube has the built-in Kubernetes Dashboard UI. To access it: + + ``` + minikube dashboard + ``` +``` + +Use `goembed` to embed this file into the minikube binary. + +The current `out.Boxed` has a hard-coded style (red). I propose to add another `out.BoxedWithConfig` method to allow +output with customized style: + +```go +// BoxedWithConfig writes a templated message in a box with customized style config to stdout +func BoxedWithConfig(cfg box.Config, st style.Enum, title string, format string, a ...V) { +} +``` + +Whenever minikube successfully starts, we randomly choose a tip. + +Before printing it out, we need to do some regex replacement to strip the markdown syntax +for better view experience in Terminal: + +From this: + +``````markdown +You can specify any Kubernetes version you want. For example: + +``` +minikube start --kubernetes-version=v1.19.0 +``` +`````` + +To this: + +```markdown +You can specify any Kubernetes version you want. For example: + +minikube start --kubernetes-version=v1.19.0 +``` + +Then we can print out the tip: + + +```go +boxCfg := out.BoxConfig{ + Config: box.Config{ + Py: 1, + Px: 5, + TitlePos: "Top", + Type: "Round", + Color: tipBoxColor, + }, + Title: tipTitle, + Icon: style.Tip, +} + +out.BoxedWithConfig(boxCfg, tips.Tips[chosen] + "\n\n" + tipSuffix) +``` + +![Screenshot from 2021-06-18 00-58-02](https://user-images.githubusercontent.com/1311594/122508665-53bd6380-cfd0-11eb-9e99-a6c5935514d5.png) + +User can choose to disable this through `minikube config set disable-tips true` + +We will have `make generate-docs` generating the docs site based on this YAML file as well. + +We can have a `Nice to know` sub-page under `FAQ`? + +![Screenshot from 2021-06-18 01-00-30](https://user-images.githubusercontent.com/1311594/122508827-a139d080-cfd0-11eb-98bb-f7c3c1c604c2.png) + + +### About the tip collection + +I plan to start with the command lines and cover almost all CLI usages of minikube. + +That includes but not limited to: +- addons +- cached images +- command line completion +- config +- file copy +- dashboard +- delete minikube cluster +- configure minikube's docker/podman env +- image build / load / ls / rm +- ip +- logging +- kubectl +- mount file directory +- multi-node +- pause/unpause to save resource +- multi-profile +- surface URL to a k8s service +- ssh into minikube +- status +- tunnel to connect to LB +- update-check to check versions +- update-context + +### Implementation + +I plan to open at least 4 PRs: + +1. `out.Boxed` with custom style +2. random `tips` display with ability to disable through config, with an initial set of about 10 tips +3. `make generate-docs` to sync tips to docs +4. Add more tips + +## Alternatives Considered + +1. Is there a more preferred file format to YAML? + +2. Maybe we just want to sync the tips to the `FAQ` page list instead of creating a new page? + +3. Instead of the file format I proposed, maybe add a `question` field? + + ```yaml + tips: + - question: How to specify a different Kubernetes version? + answer: | + You can specify any Kubernetes version you want. For example: + + ``` + minikube start --kubernetes-version=v1.19.0 + ``` + - question: Do I have to install `kubectl` myself? + answer: | + You can use minikube's built-in kubectl. For example: + + ``` + minikube kubectl -- get pods + ``` + - question: How do I access the Kubernetes Dashboard UI? + answer: | + minikube has the built-in Kubernetes Dashboard UI. To access it: + + ``` + minikube dashboard + ``` + ``` + + On the docs side we can show both questions and answers. On the CLI side + we can either show both questions and answers, or just show the answers + to make it more compact. + + ![Screenshot from 2021-06-18 01-25-54](https://user-images.githubusercontent.com/1311594/122510785-2c689580-cfd4-11eb-9fd0-0a0ff344e3cc.png) + diff --git a/go.mod b/go.mod index 9b4fdd8515..62d25daa6d 100644 --- a/go.mod +++ b/go.mod @@ -5,35 +5,32 @@ go 1.16 require ( cloud.google.com/go/storage v1.15.0 contrib.go.opencensus.io/exporter/stackdriver v0.12.1 - github.com/Azure/azure-sdk-for-go v43.3.0+incompatible github.com/Delta456/box-cli-maker/v2 v2.2.1 github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/trace v0.16.0 - github.com/Microsoft/hcsshim v0.8.15 // indirect + github.com/Microsoft/hcsshim v0.8.17 // indirect github.com/Parallels/docker-machine-parallels/v2 v2.0.1 - github.com/VividCortex/godaemon v0.0.0-20201030160542-15e3f4925a21 - github.com/blang/semver v3.5.1+incompatible + github.com/VividCortex/godaemon v1.0.0 + github.com/blang/semver/v4 v4.0.0 github.com/briandowns/spinner v1.11.1 - github.com/c4milo/gotoolkit v0.0.0-20170318115440-bcc06269efa9 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible - github.com/cenkalti/backoff/v4 v4.1.0 + github.com/c4milo/gotoolkit v0.0.0-20190525173301-67483a18c17a // indirect + github.com/cenkalti/backoff/v4 v4.1.1 github.com/cheggaaa/pb/v3 v3.0.8 github.com/cloudevents/sdk-go/v2 v2.3.1 github.com/cloudfoundry-attic/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 github.com/cloudfoundry/jibber_jabber v0.0.0-20151120183258-bcc4c8345a21 // indirect github.com/docker/cli v0.0.0-20200303162255-7d407207c304 // indirect - github.com/docker/docker v17.12.0-ce-rc1.0.20210128214336-420b1d36250f+incompatible + github.com/docker/docker v20.10.7+incompatible github.com/docker/go-units v0.4.0 github.com/docker/machine v0.16.2 - github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f - github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f // indirect + github.com/elazarl/goproxy v0.0.0-20210110162100-a92cc753f88e github.com/golang-collections/collections v0.0.0-20130729185459-604e922904d3 - github.com/google/go-cmp v0.5.5 + github.com/google/go-cmp v0.5.6 github.com/google/go-containerregistry v0.4.1 - github.com/google/go-github v17.0.0+incompatible - github.com/google/go-github/v32 v32.1.0 - github.com/google/slowjam v0.0.0-20200530021616-df27e642fe7b - github.com/google/uuid v1.2.0 - github.com/hashicorp/go-getter v1.5.2 + github.com/google/go-github/v36 v36.0.0 + github.com/google/slowjam v1.0.0 + github.com/google/uuid v1.3.0 + github.com/gookit/color v1.4.2 // indirect + 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 @@ -52,14 +49,16 @@ require ( github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/klauspost/cpuid v1.2.0 github.com/libvirt/libvirt-go v3.9.0+incompatible - github.com/machine-drivers/docker-machine-driver-vmware v0.1.1 + github.com/machine-drivers/docker-machine-driver-vmware v0.1.3 github.com/mattbaird/jsonpatch v0.0.0-20200820163806-098863c1fc24 - github.com/mattn/go-isatty v0.0.12 + github.com/mattn/go-isatty v0.0.13 + github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mitchellh/go-ps v1.0.0 github.com/moby/hyperkit v0.0.0-20210108224842-2f061e447e14 + github.com/moby/sys/mount v0.2.0 // indirect github.com/olekukonko/tablewriter v0.0.5 github.com/opencontainers/go-digest v1.0.0 - github.com/otiai10/copy v1.5.1 + github.com/otiai10/copy v1.6.0 github.com/pborman/uuid v1.2.1 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 github.com/pkg/browser v0.0.0-20160118053552-9302be274faa @@ -68,10 +67,10 @@ 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.4 - github.com/spf13/cobra v1.1.3 + 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.7.1 + github.com/spf13/viper v1.8.1 github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f github.com/zchee/go-vmnet v0.0.0-20161021174912-97ebf9174097 go.opencensus.io v0.23.0 @@ -79,59 +78,55 @@ require ( go.opentelemetry.io/otel/sdk v0.16.0 go.opentelemetry.io/otel/trace v0.17.0 golang.org/x/build v0.0.0-20190927031335-2835ba2e683f - golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 - golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 + 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-20210413134643-5e61552d6c78 + 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-20210412220455-f1c623a9e750 + golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c 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.45.0 + google.golang.org/api v0.51.0 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect gopkg.in/yaml.v2 v2.4.0 - gotest.tools/v3 v3.0.3 // indirect - k8s.io/api v0.20.5 - k8s.io/apimachinery v0.20.5 - k8s.io/client-go v0.20.5 - k8s.io/klog/v2 v2.8.0 - k8s.io/kubectl v0.0.0 - k8s.io/kubernetes v1.20.5 + k8s.io/api v0.21.3 + k8s.io/apimachinery v0.21.3 + k8s.io/client-go v0.21.3 + k8s.io/klog/v2 v2.10.0 + k8s.io/kubectl v0.21.3 + k8s.io/kubernetes v1.21.3 sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 ) replace ( git.apache.org/thrift.git => github.com/apache/thrift v0.0.0-20180902110319-2566ecd5d999 github.com/briandowns/spinner => github.com/alonyb/spinner v1.12.7 - github.com/docker/docker => github.com/afbjorklund/moby v0.0.0-20210308214533-2fa72faf0e8b - github.com/docker/machine => github.com/machine-drivers/machine v0.7.1-0.20210306082426-fcb2ad5bcb17 + github.com/docker/machine => github.com/machine-drivers/machine v0.7.1-0.20210719174735-6eca26732baa github.com/google/go-containerregistry => github.com/afbjorklund/go-containerregistry v0.4.1-0.20210321165649-761f6f9626b1 github.com/samalba/dockerclient => github.com/sayboras/dockerclient v1.0.0 - k8s.io/api => k8s.io/api v0.20.5 - k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.20.5 - k8s.io/apimachinery => k8s.io/apimachinery v0.20.5 - k8s.io/apiserver => k8s.io/apiserver v0.20.5 - k8s.io/cli-runtime => k8s.io/cli-runtime v0.20.5 - k8s.io/client-go => k8s.io/client-go v0.20.5 - k8s.io/cloud-provider => k8s.io/cloud-provider v0.20.5 - k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.20.5 - k8s.io/code-generator => k8s.io/code-generator v0.20.5 - k8s.io/component-base => k8s.io/component-base v0.20.5 - k8s.io/component-helpers => k8s.io/component-helpers v0.20.5 - k8s.io/controller-manager => k8s.io/controller-manager v0.20.5 - k8s.io/cri-api => k8s.io/cri-api v0.20.5 - k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.20.5 - k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.20.5 - k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.20.5 - k8s.io/kube-proxy => k8s.io/kube-proxy v0.20.5 - k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.20.5 - k8s.io/kubectl => k8s.io/kubectl v0.20.5 - k8s.io/kubelet => k8s.io/kubelet v0.20.5 - k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.20.5 - k8s.io/metrics => k8s.io/metrics v0.20.5 - k8s.io/mount-utils => k8s.io/mount-utils v0.20.5 - k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.20.5 - k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.20.5 - k8s.io/sample-controller => k8s.io/sample-controller v0.20.5 + k8s.io/api => k8s.io/api v0.21.2 + k8s.io/apiextensions-apiserver => k8s.io/apiextensions-apiserver v0.21.2 + k8s.io/apimachinery => k8s.io/apimachinery v0.21.2 + k8s.io/apiserver => k8s.io/apiserver v0.21.2 + k8s.io/cli-runtime => k8s.io/cli-runtime v0.21.2 + k8s.io/client-go => k8s.io/client-go v0.21.2 + k8s.io/cloud-provider => k8s.io/cloud-provider v0.21.2 + k8s.io/cluster-bootstrap => k8s.io/cluster-bootstrap v0.21.2 + k8s.io/code-generator => k8s.io/code-generator v0.21.2 + k8s.io/component-base => k8s.io/component-base v0.21.2 + k8s.io/component-helpers => k8s.io/component-helpers v0.21.2 + k8s.io/controller-manager => k8s.io/controller-manager v0.21.2 + k8s.io/cri-api => k8s.io/cri-api v0.21.2 + k8s.io/csi-translation-lib => k8s.io/csi-translation-lib v0.21.2 + k8s.io/kube-aggregator => k8s.io/kube-aggregator v0.21.2 + k8s.io/kube-controller-manager => k8s.io/kube-controller-manager v0.21.2 + k8s.io/kube-proxy => k8s.io/kube-proxy v0.21.2 + k8s.io/kube-scheduler => k8s.io/kube-scheduler v0.21.2 + k8s.io/kubectl => k8s.io/kubectl v0.21.2 + k8s.io/kubelet => k8s.io/kubelet v0.21.2 + k8s.io/legacy-cloud-providers => k8s.io/legacy-cloud-providers v0.21.2 + k8s.io/metrics => k8s.io/metrics v0.21.2 + k8s.io/mount-utils => k8s.io/mount-utils v0.21.2 + k8s.io/sample-apiserver => k8s.io/sample-apiserver v0.21.2 ) diff --git a/go.sum b/go.sum index 91252e3f64..02276d1066 100644 --- a/go.sum +++ b/go.sum @@ -21,8 +21,11 @@ cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKP cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0 h1:at8Tk2zUz63cLPR0JPWm5vp77pEZmzxEQBEfRKn1VV8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= +cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= +cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= +cloud.google.com/go v0.87.0 h1:8ZtzmY4a2JIO2sljMbpqkDYxA8aJQveYr3AMa+X40oc= +cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -47,26 +50,22 @@ contrib.go.opencensus.io/exporter/stackdriver v0.12.1 h1:Dll2uFfOVI3fa8UzsHyP6z0 contrib.go.opencensus.io/exporter/stackdriver v0.12.1/go.mod h1:iwB6wGarfphGGe/e5CWqyUk/cLzKnWsOKPVW3no6OTw= contrib.go.opencensus.io/resource v0.1.1/go.mod h1:F361eGI91LCmW1I/Saf+rX0+OFcigGlFvXwEGEnkRLA= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v43.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go v43.3.0+incompatible h1:o0G4JAsOzeVJEwU0Ud9bh+lUHPUc0GkFENJ02dk51Uo= -github.com/Azure/azure-sdk-for-go v43.3.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78 h1:w+iIsaOQNcT7OZ575w+acHgRric5iCyQh+xv+KJ4HB8= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= +github.com/Azure/go-autorest/autorest v0.11.12/go.mod h1:eipySxLmqSyC5s5k1CLupqet0PSENBEDP93LQ9a8QYw= github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.2.0/go.mod h1:GunWKJp1AEqgMaGLV+iocmRAJWqST1wQYhyyjXJ3SJc= github.com/Azure/go-autorest/autorest/validation v0.1.0/go.mod h1:Ha3z/SqBeaalWQvokg3NZAlQTalVMtOIAs1aGK7G6u8= github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Delta456/box-cli-maker/v2 v2.2.1 h1:uTcuvT6Ty+LBHuRUdFrJBpqP9RhtLxI5+5ZpKYAUuVw= @@ -83,18 +82,24 @@ github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tT github.com/Microsoft/go-winio v0.4.15/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3 h1:mw6pDQqv38/WGF1cO/jF5t/jyAJ2yi7CmtFLLO5tGFI= github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.4.17 h1:iT12IBVClFevaf8PuVyi3UmZOVh4OqnaLxDTW2O6j3w= +github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= github.com/Microsoft/hcsshim v0.8.10-0.20200715222032-5eafd1556990/go.mod h1:ay/0dTb7NsG8QMDfsRfLHgZo/6xAJShLe1+ePPflihk= github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15 h1:Aof83YILRs2Vx3GhHqlvvfyx1asRJKMFIMeVlHsZKtI= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= +github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.17 h1:yFHH5bghP9ij5Y34PPaMOE8g//oXZ0uJQeMENVo2zcI= +github.com/Microsoft/hcsshim v0.8.17/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= +github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Parallels/docker-machine-parallels/v2 v2.0.1 h1:3Rj+4tcm/UqMU5g2bLJmpxD0ssn1BB5am4Cd6yUDbVI= github.com/Parallels/docker-machine-parallels/v2 v2.0.1/go.mod h1:NKwI5KryEmEHMZVj80t9JQcfXWZp4/ZYNBuw4C5sQ9E= @@ -106,12 +111,10 @@ github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUW github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= -github.com/VividCortex/godaemon v0.0.0-20201030160542-15e3f4925a21 h1:Pgxfz/g+XyfRjYqRjKUFpDh5IciFncmA/Uio6AU/z9g= -github.com/VividCortex/godaemon v0.0.0-20201030160542-15e3f4925a21/go.mod h1:Y8CJ3IwPIAkMhv/rRUWIlczaeqd9ty9yrl+nc2AbaL4= +github.com/VividCortex/godaemon v1.0.0 h1:aHYrScWvgaSOdAoYCdObWXLm+e1rldP9Pwb1ZvuZkQw= +github.com/VividCortex/godaemon v1.0.0/go.mod h1:hBWe/72KbGt/lb95E+Sh9ersdYbB57Dt6CG66S1YPno= github.com/afbjorklund/go-containerregistry v0.4.1-0.20210321165649-761f6f9626b1 h1:AI8EIk8occ3pruhaTpkaQxQGlC1dHx3J9hAtg7t+FLI= github.com/afbjorklund/go-containerregistry v0.4.1-0.20210321165649-761f6f9626b1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= -github.com/afbjorklund/moby v0.0.0-20210308214533-2fa72faf0e8b h1:wmyy8gOOzYzMD6SfMs44yCPoOWAAHcjxCio/zQjOlDU= -github.com/afbjorklund/moby v0.0.0-20210308214533-2fa72faf0e8b/go.mod h1:qXUBi22bjTfxOV8XyOI/W1PklPSinepyWoJ6eYSLwwo= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= @@ -124,6 +127,7 @@ github.com/alonyb/spinner v1.12.7 h1:FflTMA9I2xRd8OQ5swyZY6Q1DFeaicA/bWo6/oM82a8 github.com/alonyb/spinner v1.12.7/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -148,10 +152,13 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bifurcation/mint v0.0.0-20180715133206-93c51c6ce115/go.mod h1:zVt7zX3K/aDCk9Tj+VM7YymsX66ERvzCJzw8rFCX2JU= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdnnjpJbkM4JQ= github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= +github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= @@ -161,14 +168,13 @@ github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/c4milo/gotoolkit v0.0.0-20170318115440-bcc06269efa9 h1:+ziP/wVJWuAORkjv7386TRidVKY57X0bXBZFMeFlW+U= -github.com/c4milo/gotoolkit v0.0.0-20170318115440-bcc06269efa9/go.mod h1:txokOny9wavBtq2PWuHmj1P+eFwpCsj+gQeNNANChfU= +github.com/c4milo/gotoolkit v0.0.0-20190525173301-67483a18c17a h1:+uvtaGSLJh0YpLLHCQ9F+UVGy4UOS542hsjj8wBjvH0= +github.com/c4milo/gotoolkit v0.0.0-20190525173301-67483a18c17a/go.mod h1:txokOny9wavBtq2PWuHmj1P+eFwpCsj+gQeNNANChfU= github.com/caddyserver/caddy v1.0.3/go.mod h1:G+ouvOY32gENkJC+jhgl62TyhvqEsFaDiZ4uw0RzP1E= +github.com/cenkalti/backoff v2.1.1+incompatible h1:tKJnvO2kl0zmb/jA5UKAt4VoEVw1qxKWjE/Bpp46npY= github.com/cenkalti/backoff v2.1.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.0 h1:c8LkOFQTzuO0WBM/ae5HdGQuZPfPxp7lqBRwQRm4fSc= -github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= +github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -178,6 +184,7 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chai2010/gettext-go v0.0.0-20160711120539-c6fed771bfd5/go.mod h1:/iP1qXHoty45bqomnu2LM+VVyAEdWN+vtSHGlQgyxbw= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/genny v0.0.0-20170328200008-9127e812e1e9/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/cheggaaa/pb v1.0.27 h1:wIkZHkNfC7R6GI5w7l/PdAdzXzlrbcI3p8OAlnkTsnc= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= @@ -189,6 +196,8 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= +github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.5.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/v2 v2.3.1 h1:QRTu0yRA4FbznjRSds0/4Hy6cVYpWV2wInlNJSHWAtw= github.com/cloudevents/sdk-go/v2 v2.3.1/go.mod h1:4fO2UjPMYYR1/7KPJQCwTPb0lFA8zYuitkUpAZFSY1Q= @@ -200,21 +209,29 @@ github.com/clusterhq/flocker-go v0.0.0-20160920122132-2b8b7259d313/go.mod h1:P1w github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codegangsta/negroni v1.0.0/go.mod h1:v0y3T5G7Y1UlFfyxFn/QLRU4a2EuNau2iZY63YTKWo0= -github.com/container-storage-interface/spec v1.2.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= +github.com/container-storage-interface/spec v1.3.0/go.mod h1:6URME8mwIBbpVyZV93Ce5St17xBiQJQY67NDsuohiy4= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= +github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= +github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= +github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= +github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= +github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= +github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= +github.com/containerd/cgroups v1.0.1 h1:iJnMvco9XGvKUvNQkv88bE4uJXxRQH18efbKo9w5vHQ= +github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.0/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= +github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= @@ -222,24 +239,42 @@ github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1: github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1 h1:IK6yirB4X7wpKyFSikWiT++nZsyIxGAAgNEv3fEGuls= +github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= +github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= +github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= +github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= +github.com/containerd/containerd v1.5.1 h1:xWHPAoe6VkUiI9GAvndJM7s/0MTrmwX3AQiYTr3olf0= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7 h1:6ejg6Lkk8dskcM7wQ28gONkukbQkM4qpj4RnYbpFzrI= github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= +github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= +github.com/containerd/continuity v0.1.0 h1:UFRRY5JemiAhPZrr/uE0n8fMTLcZsUvySPr1+D7pgr8= +github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= +github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= +github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= +github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= +github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= +github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= +github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= +github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= +github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= +github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= +github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= github.com/containerd/stargz-snapshotter/estargz v0.4.1 h1:5e7heayhB7CcgdTkqfZqrNaNv15gABwr3Q2jBTbLlt4= github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= @@ -250,16 +285,26 @@ github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8h github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= +github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= +github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= +github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= +github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= +github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= +github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/coredns/corefile-migration v1.0.10/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= +github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= +github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= +github.com/coredns/corefile-migration v1.0.11/go.mod h1:RMy/mXdeDlYwzt0vdMEJvT2hGJ2I86/eO0UdXmH9XNI= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= +github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -269,6 +314,8 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/go-systemd/v22 v22.3.1/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -276,6 +323,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= @@ -297,6 +346,12 @@ github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TT github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20181225093023-5ddb1d410a8b+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v17.12.0-ce-rc1.0.20190115220918-5ec31380a5d3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v20.10.7+incompatible h1:Z6O9Nhsjv+ayUEeI1IojKbYcsGdgYSNqxe1s2MYzUhQ= +github.com/docker/docker v20.10.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.6.3 h1:zI2p9+1NQYdnG6sMU26EX4aVGlqbInSQxQXLvzJ4RPQ= github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -309,16 +364,14 @@ github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f h1:8GDPb0tCY8LQ+OJ3dbHb5sA6YZWXFORQYZx5sdsTlMs= -github.com/elazarl/goproxy v0.0.0-20190421051319-9d40249d3c2f/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f h1:AUj1VoZUfhPhOPHULCQQDnGhRelpFWHMLhQVWDsS0v4= -github.com/elazarl/goproxy/ext v0.0.0-20190421051319-9d40249d3c2f/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/elazarl/goproxy v0.0.0-20210110162100-a92cc753f88e h1:/cwV7t2xezilMljIftb7WlFtzGANRCnoOhPjtl2ifcs= +github.com/elazarl/goproxy v0.0.0-20210110162100-a92cc753f88e/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2 h1:dWB6v3RcOy03t/bUadywsbyrQwCqZeNIEX6M1OtSZOM= +github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -327,8 +380,10 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/euank/go-kmsg-parser v2.0.0+incompatible/go.mod h1:MhmAMZ8V4CYH4ybgdRwPr2TU5ThnS43puaKEMpja1uw= +github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.9.0+incompatible h1:kLcOMZeuLAJvL2BPWLMIj5oaZQobrkAqrL+WFZwQses= github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZMPRZwes7CROmyNKgQzC3XPs6L/G2EJLHddWejkmf4= @@ -341,19 +396,20 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= +github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0= github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-acme/lego v2.5.0+incompatible/go.mod h1:yzMNe9CasVUhkquNvti5nAtPmG94USbYxYrZfTkIn0M= github.com/go-bindata/go-bindata v3.1.1+incompatible/go.mod h1:xK8Dsgwmeed+BBsSy2XTopBn/8uK2HWuGSnA11C3Joo= +github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= github.com/go-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= @@ -404,23 +460,27 @@ github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsd github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/spec v0.19.5/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= +github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= -github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= +github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-ozzo/ozzo-validation v3.5.0+incompatible/go.mod h1:gsEKFIVnabGBt6mXmxK0MoFy+cZoTJY6mu5Ll3LVLBU= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobuffalo/here v0.6.0/go.mod h1:wAG085dHOYqUpf+Ap+WOdrPTp5IYcDAs/x7PLa8Y5fM= github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -447,8 +507,9 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -467,12 +528,11 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golangplus/bytes v0.0.0-20160111154220-45c989fe5450/go.mod h1:Bk6SMAONeMXrxql8uvOKuAZSu8aM5RUGv+1C6IJaEho= -github.com/golangplus/fmt v0.0.0-20150411045040-2a5d6d7d2995/go.mod h1:lJgMEyOkYFkPcDKwRXegd+iM6E7matEszMG5HhwytU8= +github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangplus/testing v0.0.0-20180327235837-af21d9c3145e/go.mod h1:0AA//k/eakGydO4jKRoRL2j92ZKSzTgj9tclaCrvXHk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/cadvisor v0.38.8/go.mod h1:1OFB9sOOMkBdUBGCO/1SArawTnDscgMzTodacVDe8mA= +github.com/google/cadvisor v0.39.0/go.mod h1:rjQFmK4jPCpxeUdLq9bYhNFFsjgGOtpnDmDeap0+nsw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -483,12 +543,13 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= -github.com/google/go-github/v32 v32.1.0 h1:GWkQOdXqviCPx7Q7Fj+KyPoGm4SwHRh8rheoPhd27II= -github.com/google/go-github/v32 v32.1.0/go.mod h1:rIEpZD9CTDQwDK9GDrtMTycQNA4JU3qBsCizh3q2WCI= +github.com/google/go-github/v36 v36.0.0 h1:ndCzM616/oijwufI7nBRa+5eZHLldT+4yIB68ib5ogs= +github.com/google/go-github/v36 v36.0.0/go.mod h1:LFlKC047IOqiglRGNqNb9s/iAPTnnjtlshm+bxp+kwk= github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -497,8 +558,9 @@ github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.2.1 h1:d8MncMlErDFTwQGBK1xhv026j9kqhvw1Qv9IbWT1VLQ= +github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -510,14 +572,18 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/slowjam v0.0.0-20200530021616-df27e642fe7b h1:x3aElhKtGmXLo6RI2FJSBaPBT0acmn2LFfKVP1CqH8o= -github.com/google/slowjam v0.0.0-20200530021616-df27e642fe7b/go.mod h1:i4b4iDjZbKPkbD7z9Ycy4gtcALPoh8E9O3+wvtw7IB0= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/slowjam v1.0.0 h1:dA9flW4oGTJcSy8FpEvdq8JKwPFVgqYwMmjhqlb2L+s= +github.com/google/slowjam v1.0.0/go.mod h1:mNktULbvWfYVMKKmpt94Rp3jMtmhQZLS0iR+W84S0mM= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -525,12 +591,12 @@ github.com/googleapis/gnostic v0.4.1 h1:DLJCy1n/vrD4HPjOvYcT8aYQXpPIzoRZONaYwyyc github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3 h1:eHv/jVY/JNop1xg2J9cBb4EzyMpWZoNCP1BslSAIkOI= github.com/googleinterns/cloud-operations-api-mock v0.0.0-20200709193332-a1e58c29bdd3/go.mod h1:h/KNeRx7oYU4SpA4SoY7W2/NxDKEEVuwA6j9A27L4OI= -github.com/gookit/color v1.3.6 h1:Rgbazd4JO5AgSTVGS3o0nvaSdwdrS8bzvIXwtK6OiMk= github.com/gookit/color v1.3.6/go.mod h1:R3ogXq2B9rTbXoSHJ1HyUVAZ3poOJHpd9nQmyGZsfvQ= +github.com/gookit/color v1.4.2 h1:tXy44JFSFkKnELV6WaMo/lLfu/meqITX3iAV52do7lk= +github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= @@ -545,15 +611,16 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-getter v1.5.2 h1:XDo8LiAcDisiqZdv0TKgz+HtX3WN7zA2JD1R1tjsabE= -github.com/hashicorp/go-getter v1.5.2/go.mod h1:orNH3BTYLu/fIxGIdLjLoAJHWMDQ/UKQr5O4m3iBuoo= +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.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= @@ -586,20 +653,20 @@ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2p github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95 h1:S4qyfL2sEm5Budr4KVMyEniCy+PbS55651I/a+Kn/NQ= github.com/hectane/go-acl v0.0.0-20190604041725-da78bae5fc95/go.mod h1:QiyDdbZLaJ/mZP4Zwc9g2QsfaEA4o7XvvgZegSci5/E= -github.com/heketi/heketi v9.0.1-0.20190917153846-c2e2a4ab7ab9+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= +github.com/heketi/heketi v10.2.0+incompatible/go.mod h1:bB9ly3RchcQqsQ9CpyaQwvva7RS5ytVoSoholZQON6o= github.com/heketi/tests v0.0.0-20151005000721-f3775cbcefd6/go.mod h1:xGMAM8JLi7UkZt1i4FQeQy0R2T8GLUwQhOP5M1gBhy4= github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214 h1:WgfvpuKg42WVLkxNwzfFraXkTXPK36bMqXvMFN67clI= github.com/hooklift/assert v0.0.0-20170704181755-9d1defd6d214/go.mod h1:kj6hFWqfwSjFjLnYW5PK1DoxZ4O0uapwHRmd9jhln4E= github.com/hooklift/iso9660 v0.0.0-20170318115843-1cf07e5970d8 h1:ARl0RuGZTqBOMXQIfXen0twVSJ8kMojd7ThJf4EBcrc= github.com/hooklift/iso9660 v0.0.0-20170318115843-1cf07e5970d8/go.mod h1:sOC47ru8lB0DlU0EZ7BJ0KCP5rDqOvx0c/5K5ADm8H0= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/intel-go/cpuid v0.0.0-20181003105527-1a4a6f06a1c6 h1:XboatR7lasl05yel5hNXF7kQBw2oFUGdMztcgisfhNU= @@ -622,8 +689,9 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= @@ -658,13 +726,15 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.11.2/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.3 h1:dB4Bn0tN3wdCzQxnS8r06kV74qN/TAfaIS0bVE8h3jc= github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= +github.com/klauspost/compress v1.11.13 h1:eSvu8Tmq6j2psUJqJrLcWH6K3w5Dwc+qipbaA6eVEN4= +github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid v1.2.0 h1:NMpwD2G9JSFOE1/TJjGSo5zG7Yb2bTe7eq1jH+irmeE= github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -689,18 +759,20 @@ github.com/lucas-clemente/aes12 v0.0.0-20171027163421-cd47fb39b79f/go.mod h1:JpH github.com/lucas-clemente/quic-clients v0.1.0/go.mod h1:y5xVIEoObKqULIKivu+gD/LU90pL73bTdtQjPBvtCBk= github.com/lucas-clemente/quic-go v0.10.2/go.mod h1:hvaRS9IHjFLMq76puFJeWNfmn+H70QZ/CXoxqw9bzao= github.com/lucas-clemente/quic-go-certificates v0.0.0-20160823095156-d2f86524cced/go.mod h1:NCcRLrOTZbzhZvixZLlERbJtDtYsmMw8Jc4vS8Z0g58= -github.com/machine-drivers/docker-machine-driver-vmware v0.1.1 h1:+E1IKKk+6kaQrCPg6edJZ/zISZijuZTPnzy6RE4C/Ho= -github.com/machine-drivers/docker-machine-driver-vmware v0.1.1/go.mod h1:ej014C83EmSnxJeJ8PtVb8OLJ91PJKO1Q8Y7sM5CK0o= -github.com/machine-drivers/machine v0.7.1-0.20210306082426-fcb2ad5bcb17 h1:fQoDTuCuJ30R+D6TSB9SALB+J3jUMa8ID8YPfmSDA20= -github.com/machine-drivers/machine v0.7.1-0.20210306082426-fcb2ad5bcb17/go.mod h1:79Uwa2hGd5S39LDJt58s8JZcIhGEK6pkq9bsuTbFWbk= +github.com/machine-drivers/docker-machine-driver-vmware v0.1.3 h1:CIdHhp5vSr+7i3DYmXyJHjVOeo27AGWtvq5SfmjyMVs= +github.com/machine-drivers/docker-machine-driver-vmware v0.1.3/go.mod h1:p2hY99UqqG4FNLvAotM0K5kPlShyQ486ymrkNqv1NiA= +github.com/machine-drivers/machine v0.7.1-0.20210719174735-6eca26732baa h1:RDn5zVjqpQP8yElV/30YUNiDsjksDSqq30JVQfo1wzY= +github.com/machine-drivers/machine v0.7.1-0.20210719174735-6eca26732baa/go.mod h1:79Uwa2hGd5S39LDJt58s8JZcIhGEK6pkq9bsuTbFWbk= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls= +github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= +github.com/markbates/pkger v0.17.1/go.mod h1:0JoVlrol20BSywW79rN3kdFFsE5xYM+rSCQDXbLhiuI= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= github.com/maruel/panicparse v1.5.0/go.mod h1:aOutY/MUjdj80R0AEVI9qE2zHqig+67t2ffUDDiLzAM= @@ -714,13 +786,16 @@ github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA= +github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.12 h1:Y41i/hVW3Pgwr8gV+J23B9YEY0zxjptBuCWEaxmAOow= github.com/mattn/go-runewidth v0.0.12/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= @@ -730,9 +805,10 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyex github.com/mholt/certmagic v0.6.2-0.20190624175158-6a42ef9fe8c2/go.mod h1:g4cOPxcjV0oFq3qwpjSA30LReKD8AoIfwAY9VvG35NY= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.3/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.4/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.35 h1:oTfOaDH+mZkdcgdIjH6yBajRGtIwcwcaR+rt23ZSrJs= +github.com/miekg/dns v1.1.35/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/mindprince/gonvml v0.0.0-20190828220739-9ebdce4bb989/go.mod h1:2eu9pRWp8mo84xCg6KswZ+USQHjwgRhNp06sozOdsTY= github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -748,17 +824,24 @@ github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUb github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/moby/hyperkit v0.0.0-20210108224842-2f061e447e14 h1:XGy4iMfaG4r1uZKZQmEPSYSH0Nj5JJuKgPNUhWGQ08E= github.com/moby/hyperkit v0.0.0-20210108224842-2f061e447e14/go.mod h1:aBcAEoy5u01cPAYvosR85gzSrMZ0TVVnkPytOQN+9z8= github.com/moby/ipvs v1.0.1/go.mod h1:2pngiyseZbIKXNv7hsKj3O9UEz30c53MT9005gt2hxQ= -github.com/moby/sys/mountinfo v0.1.3/go.mod h1:w2t2Avltqx8vE7gX5l+QiBKxODu2TX0+Syr3h52Tw4o= +github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= +github.com/moby/spdystream v0.2.0 h1:cjW1zVyyoiM0T7b6UoySUFqzXMoqRckQtXwGPiBhOM8= +github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= +github.com/moby/sys/mount v0.2.0 h1:WhCW5B355jtxndN5ovugJlMFJawbUODuW8fSnEH6SSM= +github.com/moby/sys/mount v0.2.0/go.mod h1:aAivFE2LB3W4bACsUXChRHQ0qKWsetY4Y9V7sxOougM= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= +github.com/moby/sys/mountinfo v0.4.1 h1:1O+1cHA1aujwEwwVMa2Xm2l+gIpUHyd3+D+d7LZh1kM= +github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd h1:aY7OQNf2XqY/JQ6qREWamhI/81os/agb2BAGpcx5yWI= -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635 h1:rzf0wL0CHVc8CEsgyygG0Mn9CNCCPZqOPaz8RiiHYQk= +github.com/moby/term v0.0.0-20201216013528-df9cb8a40635/go.mod h1:FBS0z0QWA44HXygs7VXDUOGoN/1TV3RuWkLO04am3wc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -766,9 +849,9 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mohae/deepcopy v0.0.0-20170603005431-491d3605edfb/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= -github.com/mrunalp/fileutils v0.0.0-20200520151820-abd8a0e76976/go.mod h1:x8F1gnqOkIEiO4rqoeEEEqQbo7HjGMTvyoq3gej4iT0= github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= @@ -779,8 +862,11 @@ github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= @@ -791,15 +877,17 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1 h1:mFwc4LvZ0xpSvDZ3E+k8Yte0hLOMxXUlP+yXtJqkYfQ= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -813,20 +901,20 @@ github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5X github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc92/go.mod h1:X1zlU4p7wOlX4+WRCz+hvlRv8phdL7UqbYD+vQwNMmE= -github.com/opencontainers/runc v1.0.0-rc93 h1:x2UMpOOVf3kQ8arv/EsDGwim8PTNqzL1/EYDr/+scOM= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.0-rc95 h1:RMuWVfY3E1ILlVsC3RhIq38n4sJtlOFwU9gfFZSqrd0= +github.com/opencontainers/runc v1.0.0-rc95/go.mod h1:z+bZxa/+Tz/FmYVWkhUajJdzFeOqjc5vrqskhVyHGUM= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200728170252-4d89ac9fbff6/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/otiai10/copy v1.5.1 h1:a/cs2E1/1V0az8K5nblbl+ymEa4E11AfaOLMar8V34w= -github.com/otiai10/copy v1.5.1/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= +github.com/otiai10/copy v1.6.0 h1:IinKAryFFuPONZ7cm6T6E2QX/vcJwSnlaA5lfoaXIiQ= +github.com/otiai10/copy v1.6.0/go.mod h1:XWfuS3CrI0R6IE0FbgHsEazaXO8G0LpMp9o8tos0x4E= github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= @@ -836,8 +924,10 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/pelletier/go-toml v1.9.3 h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ= +github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoUmOs6V/G4D5nPVUW73rKvXxP4XUJc= github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= @@ -853,6 +943,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v0.0.0-20161223203901-3a8809bd8a80 h1:DQFOykp5w+HOykOMzd2yOX5P6ty58Ggiu2rthHgcNQg= github.com/pkg/profile v0.0.0-20161223203901-3a8809bd8a80/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -888,8 +979,9 @@ github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDa github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/quobyte/api v0.1.8/go.mod h1:jL7lIHrmqQ7yh05OJ+eEEdHr0u/kmT1Ff9iHd+4H6VI= github.com/remyoudompheng/bigfft v0.0.0-20170806203942-52369c62f446/go.mod h1:uYEyJGbgTkfkS4+E/PavXkNJcbFIpEtjt2B0KDQ5+9M= @@ -898,6 +990,7 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/robfig/cron v1.1.0/go.mod h1:JGuDeoQd7Z6yL4zQhZ3OPEVHB7fL6Ka6skscFHfmt2k= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= @@ -917,13 +1010,15 @@ github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24 github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= 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/shirou/gopsutil/v3 v3.21.4 h1:XB/+p+kVnyYLuPHCfa99lxz2aJyvVhnyd+FxZqH/k7M= -github.com/shirou/gopsutil/v3 v3.21.4/go.mod h1:ghfMypLDrFSWN2c9cDYFLHyynQ+QUht0cv/18ZqVczw= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +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= github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -937,16 +1032,18 @@ github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/afero v1.6.0 h1:xoax2sJ2DT8S8xA2paPFjDCScCNeWsg75VG0DLRreiY= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= 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= @@ -958,8 +1055,9 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.8.1 h1:Kq1fyeebqsBfbjZj4EL7gj2IO0mMaiyjYUWcUsl2O44= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= +github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/storageos/go-api v2.2.0+incompatible/go.mod h1:ZrLn+e0ZuF3Y65PNF6dIwbJPZqfmtCXxFm9ckv0agOY= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -982,10 +1080,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= @@ -1002,6 +1100,7 @@ github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyC github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= +github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= @@ -1015,13 +1114,16 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1: github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f h1:mvXjJIHRZyhNuGassLTcXTwjiWq7NmjdavZsUnmFybQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xo/terminfo v0.0.0-20200218205459-454e5b68f9e8 h1:woqigIZtZUZxws1zZA99nAvuz2mQrxtWsuZSR9c8I/A= +github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xo/terminfo v0.0.0-20200218205459-454e5b68f9e8/go.mod h1:6Yhx5ZJl5942QrNRWLwITArVT9okUXc5c3brgWJMoDc= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8= +github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= @@ -1031,9 +1133,13 @@ go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= +go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.1/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.2/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= +go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1053,13 +1159,18 @@ go.opentelemetry.io/otel/sdk v0.16.0 h1:5o+fkNsOfH5Mix1bHUApNBqeDcAYczHDa7Ix+R73 go.opentelemetry.io/otel/sdk v0.16.0/go.mod h1:Jb0B4wrxerxtBeapvstmAZvJGQmvah4dHgKSngDpiCo= go.opentelemetry.io/otel/trace v0.17.0 h1:SBOj64/GAOyWzs5F680yW1ITIfJkm6cJWL2YAvuL9xY= go.opentelemetry.io/otel/trace v0.17.0/go.mod h1:bIujpqg6ZL6xUTubIUgziI1jSaUPthmabA/ygf/6Cfg= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.starlark.net v0.0.0-20200306205701-8dd3e2ee1dd5/go.mod h1:nmDLcffg48OtT/PSW0Hg7FvpRQsQh5OSqIylirxKC7o= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.17.0 h1:MTjgFu6ZLKvY6Pvaqk97GlxNBuMpV4Hy/3P6tRGlI2U= +go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= golang.org/x/build v0.0.0-20190927031335-2835ba2e683f h1:hXVePvSFG7tPGX4Pwk1d10ePFfoTCc0QmISfpKOHsS8= golang.org/x/build v0.0.0-20190927031335-2835ba2e683f/go.mod h1:fYw7AShPAhGMdXqA9gRadk/CcMsvLlClpE5oBwnS3dM= @@ -1067,6 +1178,7 @@ golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190123085648-057139ce5d2b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190228161510-8dd112bcdc25/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -1078,11 +1190,15 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0 h1:hb9wdF1z5waM+dSIICn1l0DkLVDT3hqhhQsDNUmHPRE= golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1090,6 +1206,7 @@ golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190312203227-4b39c73a6495/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= @@ -1097,8 +1214,9 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20210220032938-85be41e4509f h1:GrkO5AtFUU9U/1f5ctbIBXtBGeSJbWwIYfIsTcFMaX4= +golang.org/x/exp v0.0.0-20210220032938-85be41e4509f/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1119,16 +1237,20 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= @@ -1178,15 +1300,19 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210224082022-3d97a244fca7/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4 h1:b0LrWgu8+q7z4J+0Y3Umo5q1dL7NXBkKBWkaVkAq17E= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420 h1:a8jGStKg0XqKDlKqjLrXn0ioF5MH36pT7Z0BRTqLhbk= +golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1199,8 +1325,11 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78 h1:rPRtHfUb0UKZeZ6GH4K4Nt4YRbE9V1u+QZX5upZXqJQ= +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-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= @@ -1221,6 +1350,7 @@ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190115152922-a457fd036447/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190124100055-b90733256f2e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1246,9 +1376,11 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191002063906-3421d5a6bb1c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1275,16 +1407,18 @@ golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201110211018-35f3e6cf4a65/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1292,16 +1426,27 @@ 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= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750 h1:ZBu6861dZq7xBnG1bn5SRU0vA8nx42at4+kP07FMTog= golang.org/x/sys v0.0.0-20210412220455-f1c623a9e750/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72 h1:VqE9gduFZ4dbR7XoL77lHFp0/DyDUBKSXK7CMFkVcV0= golang.org/x/term v0.0.0-20210406210042-72f3dc4e9b72/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1318,8 +1463,9 @@ golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxb golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e h1:EHBhcS0mlXEAVwNyO2dLfjToGsyY4j24pTs2ScHnX7s= golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba h1:O8mE0/t419eoIwhTFpKVkHiTs/Igowgfkj25AcZrtiE= +golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1355,6 +1501,7 @@ golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1370,7 +1517,6 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200701151220-7cb253f4c4f8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1385,8 +1531,13 @@ golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA= +golang.org/x/tools v0.1.5/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= @@ -1426,8 +1577,13 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.45.0 h1:pqMffJFLBVUDIoYsHcqtxgQVTsmxMDpYLOc5MT4Jrww= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= 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.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= +google.golang.org/api v0.51.0 h1:SQaA2Cx57B+iPw2MBgyjEkoeMkRK2IenSGoia0U3lCk= +google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= 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= @@ -1462,6 +1618,7 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1484,8 +1641,15 @@ google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210413151531-c14fb6ef47c3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2 h1:g2sJMUGCpeHZqTx8p3wsAWRS64nFq20i4dvJWcKGqvY= google.golang.org/genproto v0.0.0-20210420162539-3c870d7478d2/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= +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-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= +google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea h1:8ZyCcgugUqamxp/vZSEJw9CMy7VZlSWYJLLJPi/dSDA= +google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= 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= @@ -1504,13 +1668,18 @@ google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0 h1:uSZWeQJX5j11bIQ4AJoj+McDBo29cY1MCoC1wO3ts+c= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= +google.golang.org/grpc v1.39.0 h1:Klz8I9kdtkIN6EpHHUOMLCYhTn/2WAe5a0s1hcBkdTI= +google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1522,8 +1691,9 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1536,14 +1706,14 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/gcfg.v1 v1.2.0/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/mcuadros/go-syslog.v2 v2.2.1/go.mod h1:l5LPIyOOyIdQquNg+oU6Z3524YwrcqEm0aKH+5zpt2U= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= @@ -1551,21 +1721,25 @@ gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24 gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.1/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776 h1:tQIYjPdBoyREyB9XMu+nnTclpTYkz2zFM+lzLJFO4gQ= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= @@ -1579,51 +1753,53 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -k8s.io/api v0.20.5 h1:zsMTffV0Le2EiI0aKvlTHEnXGxk1HiqGRhJcCPiI7JI= -k8s.io/api v0.20.5/go.mod h1:FQjAceXnVaWDeov2YUWhOb6Yt+5UjErkp6UO3nczO1Y= -k8s.io/apiextensions-apiserver v0.20.5/go.mod h1:1HoTwgjWNizJBIgg0Y9P4RdLtaQquilJ5ArGHv9ZpFk= -k8s.io/apimachinery v0.20.5 h1:wO/FxMVRn223rAKxnBbwCyuN96bS9MFTIvP0e/V7cps= -k8s.io/apimachinery v0.20.5/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apiserver v0.20.5/go.mod h1:AY3lKhcJ2Tm81XvvcBzk2VnKINSoN+qczYsdo2YEvIc= -k8s.io/cli-runtime v0.20.5/go.mod h1:ihjPeQWDk7NGVIkNEvpwxA3gJvqtU+LtkDj11TvyXn4= -k8s.io/client-go v0.20.5 h1:dJGtYUvFrFGjQ+GjXEIby0gZWdlAOc0xJBJqY3VyDxA= -k8s.io/client-go v0.20.5/go.mod h1:Ee5OOMMYvlH8FCZhDsacjMlCBwetbGZETwo1OA+e6Zw= -k8s.io/cloud-provider v0.20.5/go.mod h1:GrzNM+VAk1cy88FJPnF9F/PUPeeD5aqfIZmp2QONG7Y= -k8s.io/cluster-bootstrap v0.20.5 h1:yKT3X85pa54buS/aoNP9e4NBSaiqMIHdjvzo1HOGEjk= -k8s.io/cluster-bootstrap v0.20.5/go.mod h1:vr2e5AAGqdWBupioz62IRLvk+SjWqAOq2J2DtIuK6Ak= -k8s.io/code-generator v0.20.5/go.mod h1:UsqdF+VX4PU2g46NC2JRs4gc+IfrctnwHb76RNbWHJg= -k8s.io/component-base v0.20.5 h1:8BZQKLJGhWrxtB7kIOEejKDtAKr1HOYvB0PZNeTyLS0= -k8s.io/component-base v0.20.5/go.mod h1:l0isoBLGyQKwRoTWbPHR6jNDd3/VqQD43cNlsjddGng= -k8s.io/component-helpers v0.20.5/go.mod h1:AzTdoPj6YAN2SUfhBX/FUUU3ntfFuse03q/VMLovEsE= -k8s.io/controller-manager v0.20.5/go.mod h1:r6R3hxyqNz5De1apuLEJxsZ6hvf3TQPhiH+uPWZXB38= -k8s.io/cri-api v0.20.5/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/csi-translation-lib v0.20.5/go.mod h1:KASK4nHVw/T8YW8pyMPh/sLkCpICxXN+A+Z83BplHUk= +k8s.io/api v0.21.2 h1:vz7DqmRsXTCSa6pNxXwQ1IYeAZgdIsua+DZU+o+SX3Y= +k8s.io/api v0.21.2/go.mod h1:Lv6UGJZ1rlMI1qusN8ruAp9PUBFyBwpEHAdG24vIsiU= +k8s.io/apiextensions-apiserver v0.21.2/go.mod h1:+Axoz5/l3AYpGLlhJDfcVQzCerVYq3K3CvDMvw6X1RA= +k8s.io/apimachinery v0.21.2 h1:vezUc/BHqWlQDnZ+XkrpXSmnANSLbpnlpwo0Lhk0gpc= +k8s.io/apimachinery v0.21.2/go.mod h1:CdTY8fU/BlvAbJ2z/8kBwimGki5Zp8/fbVuLY8gJumM= +k8s.io/apiserver v0.21.2/go.mod h1:lN4yBoGyiNT7SC1dmNk0ue6a5Wi6O3SWOIw91TsucQw= +k8s.io/cli-runtime v0.21.2/go.mod h1:8u/jFcM0QpoI28f6sfrAAIslLCXUYKD5SsPPMWiHYrI= +k8s.io/client-go v0.21.2 h1:Q1j4L/iMN4pTw6Y4DWppBoUxgKO8LbffEMVEV00MUp0= +k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA= +k8s.io/cloud-provider v0.21.2/go.mod h1:2mYI/l+eJESZ0Ye0fRHKMJ55t/j/TZ+gj3NUQkgIcBI= +k8s.io/cluster-bootstrap v0.21.2 h1:GXvCxl619A0edhAprX8U5gUZ5lQCUf7xhDa7SkXnlx0= +k8s.io/cluster-bootstrap v0.21.2/go.mod h1:OEm/gajtWz/ohbS4NGxkyTp/6f1fW3TBThgCQ1ljhHo= +k8s.io/code-generator v0.21.2/go.mod h1:8mXJDCB7HcRo1xiEQstcguZkbxZaqeUOrO9SsicWs3U= +k8s.io/component-base v0.21.2 h1:EsnmFFoJ86cEywC0DoIkAUiEV6fjgauNugiw1lmIjs4= +k8s.io/component-base v0.21.2/go.mod h1:9lvmIThzdlrJj5Hp8Z/TOgIkdfsNARQ1pT+3PByuiuc= +k8s.io/component-helpers v0.21.2/go.mod h1:DbyFt/A0p6Cv+R5+QOGSJ5f5t4xDfI8Yb89a57DgJlQ= +k8s.io/controller-manager v0.21.2/go.mod h1:tkiSDYJj4H/QRxGNefy5ibFAmhEvqmEh9yLzYI3XUH4= +k8s.io/cri-api v0.21.2/go.mod h1:ukzeKnOkrG9/+ghKZA57WeZbQfRtqlGLF5GcF3RtHZ8= +k8s.io/csi-translation-lib v0.21.2/go.mod h1:LgswOMSIdOntgqxcHsspcG61R34t954N//9jiSD/TTM= k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= +k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/heapster v1.2.0-beta.1/go.mod h1:h1uhptVXMwC8xtZBYsPXKVi8fpdlYkTs6k949KozGrM= k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.3.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.8.0 h1:Q3gmuM9hKEjefWFFYF0Mat+YyFJvsUyYuwyNNJ5C9Ts= k8s.io/klog/v2 v2.8.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/kube-aggregator v0.20.5/go.mod h1:0S88kjWs/0UzOMOko6fjy4nwu1OTRrxlpa7rsx0PErA= -k8s.io/kube-controller-manager v0.20.5/go.mod h1:oC7TO9YGTI23FDtgens9eIX8ceXntHeG8xhaPSEgAV4= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd h1:sOHNzJIkytDF6qadMNKhhDRpc6ODik8lVC6nOur7B2c= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-proxy v0.20.5/go.mod h1:DBxEvwMdK9/dJHxY6+VCONxHzBMWeebPMQM0Icr0VfY= -k8s.io/kube-scheduler v0.20.5/go.mod h1:oCOwGvakNU458nFM1jRC5rzp1USDOFBFoie0OAEN4I8= -k8s.io/kubectl v0.20.5 h1:/wndy8hw5TsL8G8KWPDJrtPKS8D34uSdWS0BMRmtzWs= -k8s.io/kubectl v0.20.5/go.mod h1:mlNQgyV18D4XFt5BmfSkrxQNS+arT2pXDQxxnH5lMiw= -k8s.io/kubelet v0.20.5/go.mod h1:iM18y0xm/1VlznuHFGBd9YVT9MM15TgEWJrJHrZ4mtQ= +k8s.io/klog/v2 v2.10.0 h1:R2HDMDJsHVTHA2n4RjwbeYXdOcBymXdX/JRb1v0VGhE= +k8s.io/klog/v2 v2.10.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= +k8s.io/kube-aggregator v0.21.2/go.mod h1:7NgmUXJziySAJ7GxMRBBwcJay7MLUoxms31fw/ICpYk= +k8s.io/kube-controller-manager v0.21.2/go.mod h1:gu0rV2UWy1k05E3kZxJFQE1F7RR1PZlq83+9J+lWlno= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7 h1:vEx13qjvaZ4yfObSSXW7BrMc/KQBBT/Jyee8XtLf4x0= +k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE= +k8s.io/kube-proxy v0.21.2/go.mod h1:gZXWzR5wi2lVfGeol0yp37rJZVIsCbPWqfeUXSykUUU= +k8s.io/kube-scheduler v0.21.2/go.mod h1:uMnMNvgw2EAoujObL1tuJ5+tvj2Pnv3k7i3X069crrs= +k8s.io/kubectl v0.21.2 h1:9XPCetvOMDqrIZZXb1Ei+g8t6KrIp9ENJaysQjUuLiE= +k8s.io/kubectl v0.21.2/go.mod h1:PgeUclpG8VVmmQIl8zpLar3IQEpFc9mrmvlwY3CK1xo= +k8s.io/kubelet v0.21.2/go.mod h1:1EqOUgp3BqvMXuZZRIlPDNkpgT5MfbJrpEnS4Gxn/mo= k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/kubernetes v1.20.5 h1:oY1KI7d/2rHETR3xngvQ46vuC1cNPp7R/5vQAVd2vqs= -k8s.io/kubernetes v1.20.5/go.mod h1:aOH+RZJ0PFt6Y/G3vbR0zLeGURGW8X4aX9khigekwAo= -k8s.io/legacy-cloud-providers v0.20.5/go.mod h1:YhCukXmwAh+PLncIZMMMIUD0wSZqw4UGukAKe6ZDMbI= -k8s.io/metrics v0.20.5/go.mod h1:vsptOayjKWKWHvWR1vFQY++vxydzaEo/2+JC7kSDKPU= -k8s.io/mount-utils v0.20.5/go.mod h1:Jv9NRZ5L2LF87A17GaGlArD+r3JAJdZFvo4XD1cG4Kc= -k8s.io/sample-apiserver v0.20.5/go.mod h1:QX9q+uZk/a9+EoRTH56rpoUlgLrsBIaRJukuck27K1o= -k8s.io/system-validators v1.2.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= +k8s.io/kubernetes v1.21.3 h1:wBFDBWqkKtr010Sp9dGv8gmG87Yr5BsTCaJpYKrL3NU= +k8s.io/kubernetes v1.21.3/go.mod h1:7X44Q251LxNEMElkIC4X0v6kuiVSuHE3V/4IppweQ4A= +k8s.io/legacy-cloud-providers v0.21.2/go.mod h1:9dFEf/WGCqPhOIGQiAwcPfgAYWRot6txrCshWCg225c= +k8s.io/metrics v0.21.2/go.mod h1:wzlOINZMCtWq8dR9gHlyaOemmYlOpAoldEIXE82gAhI= +k8s.io/mount-utils v0.21.2/go.mod h1:dwXbIPxKtTjrBEaX1aK/CMEf1KZ8GzMHpe3NEBfdFXI= +k8s.io/sample-apiserver v0.21.2/go.mod h1:NXFq8jUrB3UyYhoGstFMXdHFSxfHZSHX6cUdVBVZKFM= +k8s.io/system-validators v1.4.0/go.mod h1:bPldcLgkIUK22ALflnsXk8pvkTEndYdNuaHH6gRrl0Q= k8s.io/utils v0.0.0-20201110183641-67b214c5f920 h1:CbnUZsM497iRC5QMVkHwyl8s2tB3g7yaSHkYPkpgelw= k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= @@ -1635,12 +1811,17 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.19/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= +sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY= +sigs.k8s.io/kustomize/cmd/config v0.9.10/go.mod h1:Mrby0WnRH7hA6OwOYnYpfpiY0WJIMgYrEDfwOeFdMK0= +sigs.k8s.io/kustomize/kustomize/v4 v4.1.2/go.mod h1:PxBvo4WGYlCLeRPL+ziT64wBXqbgfcalOS/SXa/tcyo= +sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg= sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0 h1:IKsKAnscMyIOqyl8s8V7guTcx0QBEa6OT57EPgAgpmM= sigs.k8s.io/sig-storage-lib-external-provisioner/v6 v6.3.0/go.mod h1:DhZ52sQMJHW21+JXyA2LRUPRIxKnrNrwh+QFV+2tVA4= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2 h1:YHQV7Dajm86OuqnIR6zAelnDWBRjo+YhYV9PmGrh1s8= sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.0/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2 h1:Hr/htKFmJEbtMgS/UD0N+gtgctAqz81t3nu+sPzynno= +sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/hack/benchmark/time-to-k8s/chart.go b/hack/benchmark/time-to-k8s/chart.go new file mode 100644 index 0000000000..ae3ef9cb65 --- /dev/null +++ b/hack/benchmark/time-to-k8s/chart.go @@ -0,0 +1,240 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "encoding/csv" + "flag" + "fmt" + "io" + "log" + "os" + "strconv" + + "gonum.org/v1/plot" + "gonum.org/v1/plot/plotter" + "gonum.org/v1/plot/plotutil" + "gonum.org/v1/plot/vg" +) + +type run struct { + cmd float64 + api float64 + k8s float64 + dnsSvc float64 + app float64 + dnsAns float64 +} + +type runs struct { + version string + runs []run +} + +func main() { + csvPath := flag.String("csv", "", "path to the CSV file") + chartPath := flag.String("output", "", "path to output the chart to") + flag.Parse() + + // map of the apps (minikube, kind, k3d) and their runs + apps := make(map[string]runs) + + if err := readInCSV(*csvPath, apps); err != nil { + log.Fatal(err) + } + + values, totals, names := values(apps) + + if err := createChart(*chartPath, values, totals, names); err != nil { + log.Fatal(err) + } +} + +func readInCSV(csvPath string, apps map[string]runs) error { + f, err := os.Open(csvPath) + if err != nil { + return err + } + + r := csv.NewReader(f) + for { + d, err := r.Read() + if err == io.EOF { + break + } + if err != nil { + return err + } + + // skip the first line of the CSV file + if d[0] == "name" { + continue + } + + values := []float64{} + + // 8-13 contain the run results + for i := 8; i <= 13; i++ { + v, err := strconv.ParseFloat(d[i], 64) + if err != nil { + return err + } + values = append(values, v) + } + newRun := run{values[0], values[1], values[2], values[3], values[4], values[5]} + + // get the app from the map and add the new run to it + name := d[0] + k, ok := apps[name] + if !ok { + k = runs{version: d[5]} + } + k.runs = append(k.runs, newRun) + apps[name] = k + } + + return nil +} + +func values(apps map[string]runs) ([]plotter.Values, []float64, []string) { + var cmdValues, apiValues, k8sValues, dnsSvcValues, appValues, dnsAnsValues plotter.Values + names := []string{} + totals := []float64{} + + // for each app, calculate the average for all the runs, and append them to the charting values + for _, name := range []string{"minikube", "kind", "k3d"} { + app := apps[name] + var cmd, api, k8s, dnsSvc, appRun, dnsAns float64 + names = append(names, app.version) + + for _, l := range app.runs { + cmd += l.cmd + api += l.api + k8s += l.k8s + dnsSvc += l.dnsSvc + appRun += l.app + dnsAns += l.dnsAns + } + + c := float64(len(app.runs)) + + cmdAvg := cmd / c + apiAvg := api / c + k8sAvg := k8s / c + dnsSvcAvg := dnsSvc / c + appAvg := appRun / c + dnsAnsAvg := dnsAns / c + + cmdValues = append(cmdValues, cmdAvg) + apiValues = append(apiValues, apiAvg) + k8sValues = append(k8sValues, k8sAvg) + dnsSvcValues = append(dnsSvcValues, dnsSvcAvg) + appValues = append(appValues, appAvg) + dnsAnsValues = append(dnsAnsValues, dnsAnsAvg) + + total := cmdAvg + apiAvg + k8sAvg + dnsSvcAvg + appAvg + dnsAnsAvg + totals = append(totals, total) + } + + values := []plotter.Values{cmdValues, apiValues, k8sValues, dnsSvcValues, appValues, dnsAnsValues} + + return values, totals, names +} + +func createChart(chartPath string, values []plotter.Values, totals []float64, names []string) error { + p := plot.New() + p.Title.Text = "Time to go from 0 to successful Kubernetes deployment" + p.Y.Label.Text = "time (seconds)" + + bars := []*plotter.BarChart{} + + // create bars for all the values + for i, v := range values { + bar, err := createBars(v, i) + if err != nil { + return err + } + bars = append(bars, bar) + p.Add(bar) + } + + // stack the bars + bars[0].StackOn(bars[1]) + bars[1].StackOn(bars[2]) + bars[2].StackOn(bars[3]) + bars[3].StackOn(bars[4]) + bars[4].StackOn(bars[5]) + + // max Y value of the chart + p.Y.Max = 80 + + // add all the bars to the legend + legends := []string{"Command Exec", "API Server Answering", "Kubernetes SVC", "DNS SVC", "App Running", "DNS Answering"} + for i, bar := range bars { + p.Legend.Add(legends[i], bar) + } + + p.Legend.Top = true + + // add app name to the bars + p.NominalX(names...) + + // create total time labels + var labels []string + for _, total := range totals { + label := fmt.Sprintf("%.2f", total) + labels = append(labels, label) + } + + // create label positions + var labelPositions []plotter.XY + for i := range totals { + x := float64(i) - 0.03 + y := totals[i] + 0.3 + labelPosition := plotter.XY{X: x, Y: y} + labelPositions = append(labelPositions, labelPosition) + } + + l, err := plotter.NewLabels(plotter.XYLabels{ + XYs: labelPositions, + Labels: labels, + }, + ) + if err != nil { + return err + } + + p.Add(l) + + if err := p.Save(12*vg.Inch, 8*vg.Inch, chartPath); err != nil { + return err + } + + return nil +} + +func createBars(values plotter.Values, index int) (*plotter.BarChart, error) { + bars, err := plotter.NewBarChart(values, vg.Points(20)) + if err != nil { + return nil, err + } + bars.LineStyle.Width = vg.Length(0) + bars.Width = vg.Length(80) + bars.Color = plotutil.Color(index) + + return bars, nil +} diff --git a/hack/benchmark/time-to-k8s/public-chart/containerd-benchmark.yaml b/hack/benchmark/time-to-k8s/public-chart/containerd-benchmark.yaml new file mode 100644 index 0000000000..2fc4ff15ca --- /dev/null +++ b/hack/benchmark/time-to-k8s/public-chart/containerd-benchmark.yaml @@ -0,0 +1,4 @@ +testcases: + minikube: + setup: minikube start --container-runtime=containerd --memory=max --cpus=max + teardown: minikube delete diff --git a/hack/benchmark/time-to-k8s/public-chart/docker-benchmark.yaml b/hack/benchmark/time-to-k8s/public-chart/docker-benchmark.yaml new file mode 100644 index 0000000000..cfc224e1c2 --- /dev/null +++ b/hack/benchmark/time-to-k8s/public-chart/docker-benchmark.yaml @@ -0,0 +1,4 @@ +testcases: + minikube: + setup: minikube start --container-runtime=docker --memory=max --cpus=max + teardown: minikube delete diff --git a/hack/benchmark/time-to-k8s/public-chart/generate-chart.go b/hack/benchmark/time-to-k8s/public-chart/generate-chart.go new file mode 100644 index 0000000000..95a8a65ab0 --- /dev/null +++ b/hack/benchmark/time-to-k8s/public-chart/generate-chart.go @@ -0,0 +1,219 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "encoding/csv" + "encoding/json" + "flag" + "image/color" + "io" + "log" + "os" + "strconv" + "time" + + "gonum.org/v1/plot" + "gonum.org/v1/plot/plotter" + "gonum.org/v1/plot/vg" + "gonum.org/v1/plot/vg/draw" +) + +// benchmark contains the duration of the benchmark steps +type benchmark struct { + Date time.Time `json:"date"` + Cmd float64 `json:"cmd"` + API float64 `json:"api"` + K8s float64 `json:"k8s"` + DNSSvc float64 `json:"dnsSvc"` + App float64 `json:"app"` + DNSAns float64 `json:"dnsAns"` + Total float64 `json:"total"` +} + +// benchmarks contains a list of benchmarks, used for storing benchmark results to JSON +type benchmarks struct { + Benchmarks []benchmark `json:"benchmarks"` +} + +func main() { + latestBenchmarkPath := flag.String("csv", "", "path to the CSV file containing the latest benchmark result") + chartOutputPath := flag.String("output", "", "path to output the chart to") + pastBenchmarksPath := flag.String("past-runs", "", "path to the JSON file containing the past benchmark results") + flag.Parse() + + latestBenchmark := readInLatestBenchmark(*latestBenchmarkPath) + pastBenchmarks := readInPastBenchmarks(*pastBenchmarksPath) + pastBenchmarks.Benchmarks = append(pastBenchmarks.Benchmarks, latestBenchmark) + updateRunsFile(pastBenchmarks, *pastBenchmarksPath) + createChart(pastBenchmarks.Benchmarks, *chartOutputPath) +} + +// readInLatestBenchmark reads in the latest benchmark result from a CSV file +func readInLatestBenchmark(latestBenchmarkPath string) benchmark { + f, err := os.Open(latestBenchmarkPath) + if err != nil { + log.Fatal(err) + } + + var cmd, api, k8s, dnsSvc, app, dnsAns float64 + steps := []*float64{&cmd, &api, &k8s, &dnsSvc, &app, &dnsAns} + count := 0 + + r := csv.NewReader(f) + for { + line, err := r.Read() + if err == io.EOF { + break + } + if err != nil { + log.Fatal(err) + } + + // skip the first line of the CSV file + if line[0] == "name" { + continue + } + + values := []float64{} + + // 8-13 contain the benchmark results + for i := 8; i <= 13; i++ { + v, err := strconv.ParseFloat(line[i], 64) + if err != nil { + log.Fatal(err) + } + values = append(values, v) + } + count++ + for i, step := range steps { + *step += values[i] + } + } + + var total float64 + for _, step := range steps { + *step /= float64(count) + total += *step + } + + return benchmark{time.Now(), cmd, api, k8s, dnsSvc, app, dnsAns, total} +} + +// readInPastBenchmarks reads in the past benchmark results from a JSON file +func readInPastBenchmarks(pastBenchmarksPath string) *benchmarks { + data, err := os.ReadFile(pastBenchmarksPath) + if err != nil { + log.Fatal(err) + } + + b := &benchmarks{} + if err := json.Unmarshal(data, b); err != nil { + log.Fatal(err) + } + + return b +} + +// updateRunsFile overwrites the run file with the updated benchmarks list +func updateRunsFile(h *benchmarks, pastRunsPath string) { + b, err := json.Marshal(h) + if err != nil { + log.Fatal(err) + } + + if err := os.WriteFile(pastRunsPath, b, 0600); err != nil { + log.Fatal(err) + } +} + +// createChart creates a time series chart of the benchmarks +func createChart(benchmarks []benchmark, chartOutputPath string) { + n := len(benchmarks) + var cmdXYs, apiXYs, k8sXYs, dnsSvcXYs, appXYs, dnsAnsXYs, totalXYs plotter.XYs + xys := []*plotter.XYs{&cmdXYs, &apiXYs, &k8sXYs, &dnsSvcXYs, &appXYs, &dnsAnsXYs, &totalXYs} + + for _, xy := range xys { + *xy = make(plotter.XYs, n) + } + + for i, b := range benchmarks { + date := float64(b.Date.Unix()) + xyValues := []struct { + xys *plotter.XYs + value float64 + }{ + {&cmdXYs, b.Cmd}, + {&apiXYs, b.API}, + {&k8sXYs, b.K8s}, + {&dnsSvcXYs, b.DNSSvc}, + {&appXYs, b.App}, + {&dnsAnsXYs, b.DNSAns}, + {&totalXYs, b.Total}, + } + for _, xyValue := range xyValues { + xy := &(*xyValue.xys)[i] + xy.Y = xyValue.value + xy.X = date + } + } + + p := plot.New() + p.Add(plotter.NewGrid()) + p.Legend.Top = true + p.Title.Text = "time-to-k8s" + p.X.Label.Text = "date" + p.X.Tick.Marker = plot.TimeTicks{Format: "2006-01-02"} + p.Y.Label.Text = "time (seconds)" + p.Y.Max = 95 + + steps := []struct { + xys plotter.XYs + rgba color.RGBA + label string + }{ + {cmdXYs, color.RGBA{R: 255, A: 255}, "Command Exec"}, + {apiXYs, color.RGBA{G: 255, A: 255}, "API Server Answering"}, + {k8sXYs, color.RGBA{B: 255, A: 255}, "Kubernetes SVC"}, + {dnsSvcXYs, color.RGBA{R: 255, B: 255, A: 255}, "DNS SVC"}, + {appXYs, color.RGBA{R: 255, G: 255, A: 255}, "App Running"}, + {dnsAnsXYs, color.RGBA{G: 255, B: 255, A: 255}, "DNS Answering"}, + {totalXYs, color.RGBA{B: 255, R: 140, A: 255}, "Total"}, + } + + for _, step := range steps { + line, points := newLinePoints(step.xys, step.rgba) + p.Add(line, points) + p.Legend.Add(step.label, line) + } + + if err := p.Save(12*vg.Inch, 8*vg.Inch, chartOutputPath); err != nil { + log.Fatal(err) + } +} + +func newLinePoints(xys plotter.XYs, lineColor color.RGBA) (*plotter.Line, *plotter.Scatter) { + line, points, err := plotter.NewLinePoints(xys) + if err != nil { + log.Fatal(err) + } + line.Color = lineColor + points.Color = lineColor + points.Shape = draw.CircleGlyph{} + + return line, points +} diff --git a/hack/benchmark/time-to-k8s/public-chart/public-chart.sh b/hack/benchmark/time-to-k8s/public-chart/public-chart.sh new file mode 100755 index 0000000000..5bffd172c0 --- /dev/null +++ b/hack/benchmark/time-to-k8s/public-chart/public-chart.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +# container-runtime (docker or containerd) +RUNTIME="$1" + +install_minikube() { + make + sudo install ./out/minikube /usr/local/bin/minikube +} + +run_benchmark() { + ( cd ./hack/benchmark/time-to-k8s/time-to-k8s-repo/ && + git submodule update --init && + go run . --config "../public-chart/$RUNTIME-benchmark.yaml" --iterations 10 --output ./output.csv ) +} + +generate_chart() { + go run ./hack/benchmark/time-to-k8s/public-chart/generate-chart.go --csv ./hack/benchmark/time-to-k8s/time-to-k8s-repo/output.csv --output ./chart.png --past-runs ./runs.json +} + +cleanup() { + rm ./runs.json + rm ./hack/benchmark/time-to-k8s/time-to-k8s-repo/output.csv + rm ./chart.png +} + +gsutil -m cp "gs://minikube-time-to-k8s/$RUNTIME-runs.json" ./runs.json + +install_minikube + +run_benchmark +generate_chart + +gsutil -m cp ./runs.json "gs://minikube-time-to-k8s/$RUNTIME-runs.json" +gsutil -m cp ./runs.json "gs://minikube-time-to-k8s/$(date +'%Y-%m-%d')-$RUNTIME.json" +gsutil -m cp ./chart.png "gs://minikube-time-to-k8s/$RUNTIME-chart.png" + +cleanup diff --git a/hack/benchmark/time-to-k8s/time-to-k8s-repo b/hack/benchmark/time-to-k8s/time-to-k8s-repo new file mode 160000 index 0000000000..f6f6b2db9e --- /dev/null +++ b/hack/benchmark/time-to-k8s/time-to-k8s-repo @@ -0,0 +1 @@ +Subproject commit f6f6b2db9e718f7c9af698b6247b232a7251522f diff --git a/hack/benchmark/time-to-k8s/time-to-k8s.sh b/hack/benchmark/time-to-k8s/time-to-k8s.sh new file mode 100755 index 0000000000..a1f217cbc3 --- /dev/null +++ b/hack/benchmark/time-to-k8s/time-to-k8s.sh @@ -0,0 +1,60 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -e + +install_kind() { + curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/latest/download/kind-linux-amd64 + chmod +x ./kind + sudo mv ./kind /usr/local/bin/kind +} + +install_k3d() { + curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash +} + +install_minikube() { + make + sudo install ./out/minikube /usr/local/bin/minikube +} + +run_benchmark() { + ( cd ./hack/benchmark/time-to-k8s/time-to-k8s-repo/ && + git submodule update --init && + go run . --config local-kubernetes.yaml --iterations 10 --output output.csv ) +} + +generate_chart() { + go run ./hack/benchmark/time-to-k8s/chart.go --csv ./hack/benchmark/time-to-k8s/time-to-k8s-repo/output.csv --output ./site/static/images/benchmarks/timeToK8s/"$1".png +} + +create_page() { + printf -- "---\ntitle: \"%s Benchmark\"\nlinkTitle: \"%s Benchmark\"\nweight: -$(date +'%Y%m%d')\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 + +VERSION=$(minikube version --short) +run_benchmark +generate_chart "$VERSION" +create_page "$VERSION" +cleanup diff --git a/hack/gh_actions/cleanup.sh b/hack/gh_actions/cleanup.sh new file mode 100644 index 0000000000..eb12251e47 --- /dev/null +++ b/hack/gh_actions/cleanup.sh @@ -0,0 +1,48 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +PROGRESS_MARK=/var/run/job.in.progress +REBOOT_MARK=/var/run/reboot.in.progress + +timeout=900 # 15 minutes + +# $PROGRESS_MARK file is touched when a new GitHub Actions job is started +# check that no job was started in the last 15 minutes +function check_running_job() { + if [[ -f "$PROGRESS_MARK" ]]; then + started=$(date -r "$PROGRESS_MARK" +%s) + elapsed=$(($(date +%s) - started)) + if (( elapsed > timeout )); then + echo "Job started ${elapsed} seconds ago, going to restart" + sudo rm -rf "$PROGRESS_MARK" + else + echo "Job is running. exit." + exit 1 + fi + fi +} + +check_running_job +sudo touch "$REBOOT_MARK" +# avoid race if a job was started between two lines above and recheck +check_running_job + +echo "cleanup docker..." +docker kill $(docker ps -aq) >/dev/null 2>&1 || true +docker system prune --volumes --force || true + +echo "rebooting..." +sudo reboot diff --git a/hack/gh_actions/install_cleanup.sh b/hack/gh_actions/install_cleanup.sh new file mode 100644 index 0000000000..020ac6e610 --- /dev/null +++ b/hack/gh_actions/install_cleanup.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +if [[ ! -f cleanup.sh ]]; then + echo "cleanup.sh is missing" + exit 1 +fi + +# update cron to run the cleanup script every hour +if [ ! -f /etc/cron.hourly/cleanup.sh ]; then + sudo install cleanup.sh /etc/cron.hourly/cleanup.sh || echo "FAILED TO INSTALL CLEANUP" +fi + +# install a cron rule to remove /var/run/reboot.in.progress file immediately after reboot +if (crontab -l 2>/dev/null | grep '@reboot rm -rf /var/run/reboot.in.progress'); then + echo "reboot cron rule already installed" + exit 0 +fi +(crontab -l 2>/dev/null; echo '@reboot rm -rf /var/run/reboot.in.progress') | crontab - diff --git a/hack/jenkins/build_iso.sh b/hack/jenkins/build_iso.sh index ec5b4291a9..c796ba61c4 100755 --- a/hack/jenkins/build_iso.sh +++ b/hack/jenkins/build_iso.sh @@ -45,16 +45,11 @@ make release-iso | tee iso-logs.txt ec=$? if [ $ec -gt 0 ]; then if [ "$release" = false ]; then - err=$(tail -100 iso-logs.txt) - gh pr comment ${ghprbPullId} --body "Hi ${ghprbPullAuthorLoginMention}, building a new ISO failed, with the error below: - -
-
-		${err}
-		
-
- - Full logs are at https://storage.cloud.google.com/minikube-builds/logs/${ghprbPullId}/${ghprbActualCommit:0:7}/iso_build.txt + gh pr comment ${ghprbPullId} --body "Hi ${ghprbPullAuthorLoginMention}, building a new ISO failed. + See the logs at: + ``` + https://storage.cloud.google.com/minikube-builds/logs/${ghprbPullId}/iso-${BUILD_NUMBER}/iso_build.txt + ``` " fi exit $ec diff --git a/hack/jenkins/cloud_shell_functional_tests_docker.sh b/hack/jenkins/cloud_shell_functional_tests_docker.sh index 8a9a05a66e..70c937fd23 100755 --- a/hack/jenkins/cloud_shell_functional_tests_docker.sh +++ b/hack/jenkins/cloud_shell_functional_tests_docker.sh @@ -25,8 +25,9 @@ set -ex gcloud cloud-shell ssh --authorize-session << EOF - OS_ARCH="linux-amd64" - VM_DRIVER="docker" + OS="linux" + ARCH="amd64" + DRIVER="docker" JOB_NAME="Docker_Cloud_Shell" CONTAINER_RUNTIME="docker" EXTRA_TEST_ARGS="-test.run (TestFunctional|TestAddons)" diff --git a/hack/jenkins/common.ps1 b/hack/jenkins/common.ps1 new file mode 100644 index 0000000000..108a6f30b1 --- /dev/null +++ b/hack/jenkins/common.ps1 @@ -0,0 +1,81 @@ +# 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.9.0/gopogh.exe", "C:\Go\bin\gopogh.exe") +(New-Object Net.WebClient).DownloadFile("https://github.com/gotestyourself/gotestsum/releases/download/v1.6.4/gotestsum_1.6.4_windows_amd64.tar.gz", "$env:TEMP\gotestsum.tar.gz") +tar --directory "C:\Go\bin\" -xzvf "$env:TEMP\gotestsum.tar.gz" "gotestsum.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 + +gotestsum --jsonfile testout.json -f standard-verbose --raw-command -- ` + go tool test2json -t ` + 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) + +$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}:$(Get-Date -Format "yyyy-MM-dd"):$env:ROOT_JOB_ID" + +$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:ROOT_JOB_ID" + +#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/common.sh b/hack/jenkins/common.sh index 06f5331d21..b76cb638e1 100755 --- a/hack/jenkins/common.sh +++ b/hack/jenkins/common.sh @@ -18,46 +18,96 @@ # This script downloads the test files from the build bucket and makes some executable. # The script expects the following env variables: -# OS_ARCH: The operating system and the architecture separated by a hyphen '-' (e.g. darwin-amd64, linux-amd64, windows-amd64) -# VM_DRIVER: the driver to use for the test +# OS: The operating system +# ARCH: The architecture +# DRIVER: the driver to use for the test # CONTAINER_RUNTIME: the container runtime to use for the test # EXTRA_START_ARGS: additional flags to pass into minikube start # EXTRA_TEST_ARGS: additional flags to pass into go test # JOB_NAME: the name of the logfile and check name to update on github +readonly OS_ARCH="${OS}-${ARCH}" readonly TEST_ROOT="${HOME}/minikube-integration" -readonly TEST_HOME="${TEST_ROOT}/${OS_ARCH}-${VM_DRIVER}-${CONTAINER_RUNTIME}-${MINIKUBE_LOCATION}-$$-${COMMIT}" +readonly TEST_HOME="${TEST_ROOT}/${OS_ARCH}-${DRIVER}-${CONTAINER_RUNTIME}-${MINIKUBE_LOCATION}-$$-${COMMIT}" + export GOPATH="$HOME/go" export KUBECONFIG="${TEST_HOME}/kubeconfig" export PATH=$PATH:"/usr/local/bin/:/usr/local/go/bin/:$GOPATH/bin" -readonly TIMEOUT=${1:-90m} +readonly TIMEOUT=${1:-120m} + +public_log_url="https://storage.googleapis.com/minikube-builds/logs/${MINIKUBE_LOCATION}/${ROOT_JOB_ID}/${JOB_NAME}.html" + +# retry_github_status provides reliable github status updates +function retry_github_status() { + local commit=$1 + local context=$2 + local state=$3 + local token=$4 + local target=$5 + local desc=$6 + + # Retry in case we hit our GitHub API quota or fail other ways. + local attempt=0 + local timeout=2 + local code=-1 + + echo "set GitHub status $context to $desc" + + while [[ "${attempt}" -lt 8 ]]; do + local out=$(mktemp) + code=$(curl -o "${out}" -s --write-out "%{http_code}" -L -u minikube-bot:${token} \ + "https://api.github.com/repos/kubernetes/minikube/statuses/${commit}" \ + -H "Content-Type: application/json" \ + -X POST \ + -d "{\"state\": \"${state}\", \"description\": \"Jenkins: ${desc}\", \"target_url\": \"${target}\", \"context\": \"${context}\"}" || echo 999) + + # 2xx HTTP codes + if [[ "${code}" =~ ^2 ]]; then + break + fi + + cat "${out}" && rm -f "${out}" + echo "HTTP code ${code}! Retrying in ${timeout} .." + sleep "${timeout}" + attempt=$(( attempt + 1 )) + timeout=$(( timeout * 5 )) + done +} + +if [ "$(uname)" = "Darwin" ]; then + if ! bash setup_docker_desktop_macos.sh; then + retry_github_status "${COMMIT}" "${JOB_NAME}" "failure" "${access_token}" "${public_log_url}" "Jenkins: docker failed to start" + exit 1 + fi +fi # We need pstree for the restart cronjobs if [ "$(uname)" != "Darwin" ]; then sudo apt-get -y install lsof psmisc else - brew install pstree + brew install pstree coreutils pidof + ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout || true fi # installing golang so we could do go get for gopogh -sudo ./installers/check_install_golang.sh "1.16" "/usr/local" || true +./installers/check_install_golang.sh "1.16.6" "/usr/local" || true -# install docker and kubectl if not present, currently skipping since it fails -#sudo ./installers/check_install_docker.sh || true +# install docker and kubectl if not present +sudo ARCH="$ARCH" ./installers/check_install_docker.sh || true + +# install gotestsum if not present +GOROOT="/usr/local/go" ./installers/check_install_gotestsum.sh || true # let's just clean all docker artifacts up docker system prune --force --volumes || true docker system df || true -# clean up /tmp -find /tmp -name . -o -prune -exec rm -rf -- {} + >/dev/null 2>&1 || true - echo ">> Starting at $(date)" echo "" echo "arch: ${OS_ARCH}" echo "build: ${MINIKUBE_LOCATION}" -echo "driver: ${VM_DRIVER}" +echo "driver: ${DRIVER}" echo "runtime: ${CONTAINER_RUNTIME}" echo "job: ${JOB_NAME}" echo "test home: ${TEST_HOME}" @@ -71,7 +121,7 @@ echo "podman: $(sudo podman version --format '{{.Version}}' || true)" echo "go: $(go version || true)" -case "${VM_DRIVER}" in +case "${DRIVER}" in kvm2) echo "virsh: $(virsh --version)" ;; @@ -93,10 +143,9 @@ if ! type -P gsutil >/dev/null; then fi # Add the out/ directory to the PATH, for using new drivers. -PATH="$(pwd)/out/":$PATH -export PATH +export PATH="$(pwd)/out/":$PATH -echo "" +echo echo ">> Downloading test inputs from ${MINIKUBE_LOCATION} ..." gsutil -qm cp \ "gs://minikube-builds/${MINIKUBE_LOCATION}/minikube-${OS_ARCH}" \ @@ -126,10 +175,9 @@ fi mkdir -p "${TEST_ROOT}" # Cleanup stale test outputs. -echo "" +echo echo ">> Cleaning up after previous test runs ..." -for entry in $(ls ${TEST_ROOT}); do - test_path="${TEST_ROOT}/${entry}" +for test_path in ${TEST_ROOT}; do ls -lad "${test_path}" || continue echo "* Cleaning stale test path: ${test_path}" @@ -145,7 +193,7 @@ for entry in $(ls ${TEST_ROOT}); do for kconfig in $(find ${test_path} -name kubeconfig -type f); do sudo rm -f "${kconfig}" done - + ## ultimate shotgun clean up docker after we tried all docker rm -f -v $(docker ps -aq) >/dev/null 2>&1 || true @@ -157,105 +205,95 @@ for entry in $(ls ${TEST_ROOT}); do fi done -# sometimes tests left over zombie procs that won't exit -# for example: -# jenkins 20041 0.0 0.0 0 0 ? Z Aug19 0:00 [minikube-linux-] -zombie_defuncts=$(ps -A -ostat,ppid | awk '/[zZ]/ && !a[$2]++ {print $2}') -if [[ "${zombie_defuncts}" != "" ]]; then - echo "Found zombie defunct procs to kill..." - ps -f -p ${zombie_defuncts} || true - kill ${zombie_defuncts} || true -fi - -if type -P virsh; then - sudo virsh -c qemu:///system list --all --uuid \ - | xargs -I {} sh -c "sudo virsh -c qemu:///system destroy {}; sudo virsh -c qemu:///system undefine {}" \ - || true - echo ">> virsh VM list after clean up (should be empty):" - sudo virsh -c qemu:///system list --all || true - - for NET in $( sudo virsh -c qemu:///system net-list --all --name ); do - if [ "${NET}" != "default" ]; then - sudo virsh -c qemu:///system net-destroy "${NET}" || \ - sudo virsh -c qemu:///system net-undefine "${NET}" || true - fi - done - echo ">> virsh VM networks list after clean up (should have only 'default'):" - sudo virsh -c qemu:///system net-list --all || true - echo ">> host networks after KVM clean up:" - sudo ip link show || true - echo -fi - -if type -P vboxmanage; then - killall VBoxHeadless || true - sleep 1 - killall -9 VBoxHeadless || true - - for guid in $(vboxmanage list vms | grep -Eo '\{[a-zA-Z0-9-]+\}'); do - echo "- Removing stale VirtualBox VM: $guid" - vboxmanage startvm "${guid}" --type emergencystop || true - vboxmanage unregistervm "${guid}" || true - done - - ifaces=$(vboxmanage list hostonlyifs | grep -E "^Name:" | awk '{ print $2 }') - for if in $ifaces; do - vboxmanage hostonlyif remove "${if}" || true - done - - echo ">> VirtualBox VM list after clean up (should be empty):" - vboxmanage list vms || true - echo ">> VirtualBox interface list after clean up (should be empty):" - vboxmanage list hostonlyifs || true -fi - - -if type -P hdiutil; then - hdiutil info | grep -E "/dev/disk[1-9][^s]" || true - hdiutil info \ - | grep -E "/dev/disk[1-9][^s]" \ - | awk '{print $1}' \ - | xargs -I {} sh -c "hdiutil detach {}" \ - || true -fi - -# cleaning up stale hyperkits -if type -P hyperkit; then - for pid in $(pgrep hyperkit); do - echo "Killing stale hyperkit $pid" - ps -f -p $pid || true - kill $pid || true - kill -9 $pid || true - done -fi - -if [[ "${VM_DRIVER}" == "hyperkit" ]]; then - if [[ -e out/docker-machine-driver-hyperkit ]]; then - sudo chown root:wheel out/docker-machine-driver-hyperkit || true - sudo chmod u+s out/docker-machine-driver-hyperkit || true +function cleanup_procs() { + # sometimes tests left over zombie procs that won't exit + # for example: + # jenkins 20041 0.0 0.0 0 0 ? Z Aug19 0:00 [minikube-linux-] + pgrep docker > d.pids + zombie_defuncts=$(ps -A -ostat,ppid | grep -v -f d.pids | awk '/[zZ]/ && !a[$2]++ {print $2}') + if [[ "${zombie_defuncts}" != "" ]]; then + echo "Found zombie defunct procs to kill..." + ps -f -p ${zombie_defuncts} || true + kill ${zombie_defuncts} || true fi -fi -kprocs=$(pgrep kubectl || true) -if [[ "${kprocs}" != "" ]]; then - echo "error: killing hung kubectl processes ..." - ps -f -p ${kprocs} || true - sudo -E kill ${kprocs} || true -fi + if type -P virsh; then + virsh -c qemu:///system list --all --uuid \ + | xargs -I {} sh -c "virsh -c qemu:///system destroy {}; virsh -c qemu:///system undefine {}" \ + || true + echo ">> virsh VM list after clean up (should be empty):" + virsh -c qemu:///system list --all || true + fi + + if type -P vboxmanage; then + killall VBoxHeadless || true + sleep 1 + killall -9 VBoxHeadless || true + + for guid in $(vboxmanage list vms | grep -Eo '\{[a-zA-Z0-9-]+\}'); do + echo "- Removing stale VirtualBox VM: $guid" + vboxmanage startvm "${guid}" --type emergencystop || true + vboxmanage unregistervm "${guid}" || true + done + + ifaces=$(vboxmanage list hostonlyifs | grep -E "^Name:" | awk '{ print $2 }') + for if in $ifaces; do + vboxmanage hostonlyif remove "${if}" || true + done + + echo ">> VirtualBox VM list after clean up (should be empty):" + vboxmanage list vms || true + echo ">> VirtualBox interface list after clean up (should be empty):" + vboxmanage list hostonlyifs || true + fi + + if type -P hdiutil; then + hdiutil info | grep -E "/dev/disk[1-9][^s]" || true + hdiutil info \ + | grep -E "/dev/disk[1-9][^s]" \ + | awk '{print $1}' \ + | xargs -I {} sh -c "hdiutil detach {}" \ + || true + fi + + # cleaning up stale hyperkits + if type -P hyperkit; then + for pid in $(pgrep hyperkit); do + echo "Killing stale hyperkit $pid" + ps -f -p $pid || true + kill $pid || true + kill -9 $pid || true + done + fi + + if [[ "${DRIVER}" == "hyperkit" ]]; then + if [[ -e out/docker-machine-driver-hyperkit ]]; then + sudo chown root:wheel out/docker-machine-driver-hyperkit || true + sudo chmod u+s out/docker-machine-driver-hyperkit || true + fi + fi + + kprocs=$(pgrep kubectl || true) + if [[ "${kprocs}" != "" ]]; then + echo "error: killing hung kubectl processes ..." + ps -f -p ${kprocs} || true + sudo -E kill ${kprocs} || true + fi -# clean up none drivers binding on 8443 -none_procs=$(sudo lsof -i :8443 | tail -n +2 | awk '{print $2}' || true) -if [[ "${none_procs}" != "" ]]; then - echo "Found stale api servers listening on 8443 processes to kill: " - for p in $none_procs - do - echo "Kiling stale none driver: $p" - sudo -E ps -f -p $p || true - sudo -E kill $p || true - sudo -E kill -9 $p || true - done -fi + # clean up none drivers binding on 8443 + none_procs=$(sudo lsof -i :8443 | tail -n +2 | awk '{print $2}' || true) + if [[ "${none_procs}" != "" ]]; then + echo "Found stale api servers listening on 8443 processes to kill: " + for p in $none_procs + do + echo "Kiling stale none driver: $p" + sudo -E ps -f -p $p || true + sudo -E kill $p || true + sudo -E kill -9 $p || true + done + fi +} function cleanup_stale_routes() { local show="netstat -rn -f inet" @@ -273,6 +311,7 @@ function cleanup_stale_routes() { done } +cleanup_procs || true cleanup_stale_routes || true mkdir -p "${TEST_HOME}" @@ -324,11 +363,20 @@ then EXTRA_START_ARGS="${EXTRA_START_ARGS} --container-runtime=${CONTAINER_RUNTIME}" fi -${SUDO_PREFIX}${E2E_BIN} \ - -minikube-start-args="--driver=${VM_DRIVER} ${EXTRA_START_ARGS}" \ - -test.timeout=${TIMEOUT} -test.v \ - ${EXTRA_TEST_ARGS} \ - -binary="${MINIKUBE_BIN}" 2>&1 | tee "${TEST_OUT}" +if test -f "${JSON_OUT}"; then + rm "${JSON_OUT}" || true # clean up previous runs of same build +fi + +touch "${JSON_OUT}" + +gotestsum --jsonfile "${JSON_OUT}" -f standard-verbose --raw-command -- \ + go tool test2json -t \ + ${SUDO_PREFIX}${E2E_BIN} \ + -minikube-start-args="--driver=${DRIVER} ${EXTRA_START_ARGS}" \ + -test.timeout=${TIMEOUT} -test.v \ + ${EXTRA_TEST_ARGS} \ + -binary="${MINIKUBE_BIN}" 2>&1 \ + | tee "${TEST_OUT}" result=${PIPESTATUS[0]} # capture the exit code of the first cmd in pipe. set +x @@ -343,33 +391,16 @@ else echo "minikube: FAIL" fi -## caclucate the time took to finish running e2e binary test. +# calculate the time took to finish running e2e binary test. e2e_end_time="$(date -u +%s)" elapsed=$(($e2e_end_time-$e2e_start_time)) min=$(($elapsed/60)) sec=$(tail -c 3 <<< $((${elapsed}00/60))) elapsed=$min.$sec -SHORT_COMMIT=${COMMIT:0:7} -JOB_GCS_BUCKET="minikube-builds/logs/${MINIKUBE_LOCATION}/${SHORT_COMMIT}/${JOB_NAME}" -echo ">> Copying ${TEST_OUT} to gs://${JOB_GCS_BUCKET}out.txt" -gsutil -qm cp "${TEST_OUT}" "gs://${JOB_GCS_BUCKET}out.txt" - - -echo ">> Attmpting to convert test logs to json" -if test -f "${JSON_OUT}"; then - rm "${JSON_OUT}" || true # clean up previous runs of same build -fi - -touch "${JSON_OUT}" - -# Generate JSON output -echo ">> Running go test2json" -go tool test2json -t < "${TEST_OUT}" > "${JSON_OUT}" || true - if ! type "jq" > /dev/null; then echo ">> Installing jq" - if [ "$(uname)" != "Darwin" ]; then + if [ "${OS}" != "darwin" ]; then curl -LO https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && sudo install jq-linux64 /usr/local/bin/jq else curl -LO https://github.com/stedolan/jq/releases/download/jq-1.6/jq-osx-amd64 && sudo install jq-osx-amd64 /usr/local/bin/jq @@ -377,11 +408,9 @@ echo ">> Installing jq" fi echo ">> Installing gopogh" -if [ "$(uname)" != "Darwin" ]; then - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-linux-amd64 && sudo install gopogh-linux-amd64 /usr/local/bin/gopogh -else - curl -LO https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-darwin-amd64 && sudo install gopogh-darwin-amd64 /usr/local/bin/gopogh -fi +curl -LO "https://github.com/medyagh/gopogh/releases/download/v0.9.0/gopogh-${OS_ARCH}" +sudo install "gopogh-${OS_ARCH}" /usr/local/bin/gopogh + echo ">> Running gopogh" if test -f "${HTML_OUT}"; then @@ -390,7 +419,7 @@ fi touch "${HTML_OUT}" touch "${SUMMARY_OUT}" -gopogh_status=$(gopogh -in "${JSON_OUT}" -out_html "${HTML_OUT}" -out_summary "${SUMMARY_OUT}" -name "${JOB_NAME}" -pr "${MINIKUBE_LOCATION}" -repo github.com/kubernetes/minikube/ -details "${COMMIT}") || true +gopogh_status=$(gopogh -in "${JSON_OUT}" -out_html "${HTML_OUT}" -out_summary "${SUMMARY_OUT}" -name "${JOB_NAME}" -pr "${MINIKUBE_LOCATION}" -repo github.com/kubernetes/minikube/ -details "${COMMIT}:$(date +%Y-%m-%d):${ROOT_JOB_ID}") || true fail_num=$(echo $gopogh_status | jq '.NumberOfFail') test_num=$(echo $gopogh_status | jq '.NumberOfTests') pessimistic_status="${fail_num} / ${test_num} failures" @@ -398,20 +427,38 @@ description="completed with ${status} in ${elapsed} minute(s)." if [ "$status" = "failure" ]; then description="completed with ${pessimistic_status} in ${elapsed} minute(s)." fi -echo $description +echo "$description" -echo ">> uploading ${JSON_OUT}" -gsutil -qm cp "${JSON_OUT}" "gs://${JOB_GCS_BUCKET}.json" || true -echo ">> uploading ${HTML_OUT}" -gsutil -qm cp "${HTML_OUT}" "gs://${JOB_GCS_BUCKET}.html" || true -echo ">> uploading ${SUMMARY_OUT}" -gsutil -qm cp "${SUMMARY_OUT}" "gs://${JOB_GCS_BUCKET}_summary.json" || true +REPORT_URL_BASE="https://storage.googleapis.com" +if [ -z "${EXTERNAL}" ]; then + # If we're already in GCP, then upload results to GCS directly + SHORT_COMMIT=${COMMIT:0:7} + JOB_GCS_BUCKET="minikube-builds/logs/${MINIKUBE_LOCATION}/${ROOT_JOB_ID}/${JOB_NAME}" + echo ">> Copying ${TEST_OUT} to gs://${JOB_GCS_BUCKET}.out.txt" + echo ">> public URL: ${REPORT_URL_BASE}/${JOB_GCS_BUCKET}.out.txt" + gsutil -qm cp "${TEST_OUT}" "gs://${JOB_GCS_BUCKET}.out.txt" -public_log_url="https://storage.googleapis.com/${JOB_GCS_BUCKET}.txt" -if grep -q html "$HTML_OUT"; then - public_log_url="https://storage.googleapis.com/${JOB_GCS_BUCKET}.html" + echo ">> uploading ${JSON_OUT} to gs://${JOB_GCS_BUCKET}.json" + 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 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 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 + # Otherwise, put the results in a predictable spot so the upload job can find them + REPORTS_PATH=test_reports + mkdir -p "$REPORTS_PATH" + cp "${TEST_OUT}" "$REPORTS_PATH/out.txt" + cp "${JSON_OUT}" "$REPORTS_PATH/out.json" + cp "${HTML_OUT}" "$REPORTS_PATH/out.html" + cp "${SUMMARY_OUT}" "$REPORTS_PATH/summary.txt" fi echo ">> Cleaning up after ourselves ..." @@ -424,48 +471,14 @@ ${SUDO_PREFIX} rm -f "${KUBECONFIG}" || true ${SUDO_PREFIX} rm -f "${TEST_OUT}" || true ${SUDO_PREFIX} rm -f "${JSON_OUT}" || true ${SUDO_PREFIX} rm -f "${HTML_OUT}" || true + rmdir "${TEST_HOME}" || true echo ">> ${TEST_HOME} completed at $(date)" if [[ "${MINIKUBE_LOCATION}" == "master" ]]; then - exit $result + exit "$result" fi -# retry_github_status provides reliable github status updates -function retry_github_status() { - local commit=$1 - local context=$2 - local state=$3 - local token=$4 - local target=$5 - local desc=$6 - - # Retry in case we hit our GitHub API quota or fail other ways. - local attempt=0 - local timeout=2 - local code=-1 - - while [[ "${attempt}" -lt 8 ]]; do - local out=$(mktemp) - code=$(curl -o "${out}" -s --write-out "%{http_code}" -L -u minikube-bot:${token} \ - "https://api.github.com/repos/kubernetes/minikube/statuses/${commit}" \ - -H "Content-Type: application/json" \ - -X POST \ - -d "{\"state\": \"${state}\", \"description\": \"Jenkins: ${desc}\", \"target_url\": \"${target}\", \"context\": \"${context}\"}" || echo 999) - - # 2xx HTTP codes - if [[ "${code}" =~ ^2 ]]; then - break - fi - - cat "${out}" && rm -f "${out}" - echo "HTTP code ${code}! Retrying in ${timeout} .." - sleep "${timeout}" - attempt=$(( attempt + 1 )) - timeout=$(( timeout * 5 )) - done -} - - retry_github_status "${COMMIT}" "${JOB_NAME}" "${status}" "${access_token}" "${public_log_url}" "${description}" -exit $result + +exit "$result" diff --git a/hack/jenkins/installers/check_install_golang.sh b/hack/jenkins/installers/check_install_golang.sh index 3009d7aea5..4ee97d5b1c 100755 --- a/hack/jenkins/installers/check_install_golang.sh +++ b/hack/jenkins/installers/check_install_golang.sh @@ -25,7 +25,22 @@ fi VERSION_TO_INSTALL=${1} INSTALL_PATH=${2} -ARCH=${ARCH:=amd64} +function current_arch() { + case $(arch) in + "x86_64") + echo "amd64" + ;; + "aarch64") + echo "arm64" + ;; + *) + echo "unexpected arch: $(arch). use amd64" 1>&2 + echo "amd64" + ;; + esac +} + +ARCH=${ARCH:=$(current_arch)} # installs or updates golang if right version doesn't exists function check_and_install_golang() { @@ -52,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}-amd64.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 diff --git a/hack/jenkins/installers/check_install_gotestsum.sh b/hack/jenkins/installers/check_install_gotestsum.sh new file mode 100644 index 0000000000..9c7ee25872 --- /dev/null +++ b/hack/jenkins/installers/check_install_gotestsum.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eux -o pipefail + +function install_gotestsum() { + sudo rm -f $(which gotestsum) + sudo PATH="$PATH" GOBIN="$GOROOT/bin" go install gotest.tools/gotestsum@v1.6.4 +} + +which gotestsum || install_gotestsum \ No newline at end of file diff --git a/hack/jenkins/kicbase_auto_build.sh b/hack/jenkins/kicbase_auto_build.sh index 3b02b7cd46..2bbc2777bb 100755 --- a/hack/jenkins/kicbase_auto_build.sh +++ b/hack/jenkins/kicbase_auto_build.sh @@ -46,13 +46,13 @@ if [[ -z $KIC_VERSION ]]; then now=$(date +%s) KV=$(egrep "Version =" pkg/drivers/kic/types.go | cut -d \" -f 2 | cut -d "-" -f 1) GCR_REPO=gcr.io/k8s-minikube/kicbase-builds - DH_REPO=kicbase/build + DH_REPO=docker.io/kicbase/build export KIC_VERSION=$KV-$now-$ghprbPullId else # Actual kicbase release here release=true GCR_REPO=${GCR_REPO:-gcr.io/k8s-minikube/kicbase} - DH_REPO=${DH_REPO:-kicbase/stable} + DH_REPO=${DH_REPO:-docker.io/kicbase/stable} export KIC_VERSION fi GCR_IMG=${GCR_REPO}:${KIC_VERSION} @@ -67,16 +67,11 @@ CIBUILD=yes make push-kic-base-image | tee kic-logs.txt ec=$? if [ $ec -gt 0 ]; then if [ "$release" = false ]; then - err=$(tail -100 kic-logs.txt) - gh pr comment ${ghprbPullId} --body "Hi ${ghprbPullAuthorLoginMention}, building a new kicbase image failed, with the error below: - -
-
-		${err}
-		
-
- - Full logs are at https://storage.cloud.google.com/minikube-builds/logs/${ghprbPullId}/${ghprbActualCommit:0:7}/kic_image_build.txt + gh pr comment ${ghprbPullId} --body "Hi ${ghprbPullAuthorLoginMention}, building a new kicbase image failed. + See the logs at: + ``` + https://storage.cloud.google.com/minikube-builds/logs/${ghprbPullId}/kicbase-${BUILD_NUMBER}/kic_image_build.txt + ``` " fi exit $ec diff --git a/hack/jenkins/linux_integration_tests_docker.sh b/hack/jenkins/linux_integration_tests_docker.sh index faba877c8c..d769d969c5 100755 --- a/hack/jenkins/linux_integration_tests_docker.sh +++ b/hack/jenkins/linux_integration_tests_docker.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="docker" +OS="linux" +ARCH="amd64" +DRIVER="docker" JOB_NAME="Docker_Linux" CONTAINER_RUNTIME="docker" diff --git a/hack/jenkins/linux_integration_tests_docker_arm64.sh b/hack/jenkins/linux_integration_tests_docker_arm64.sh index 11a1c5f40c..cf10462fd8 100644 --- a/hack/jenkins/linux_integration_tests_docker_arm64.sh +++ b/hack/jenkins/linux_integration_tests_docker_arm64.sh @@ -32,7 +32,8 @@ docker rm -f -v "$(docker ps -aq)" >/dev/null 2>&1 || true ARCH="arm64" \ OS="linux" \ -VM_DRIVER="docker" \ +DRIVER="docker" \ JOB_NAME="$JOB_NAME" \ CONTAINER_RUNTIME="docker" \ -source ./run_tests.sh +EXTERNAL="yes" \ +source ./common.sh diff --git a/hack/jenkins/linux_integration_tests_docker_containerd.sh b/hack/jenkins/linux_integration_tests_docker_containerd.sh index 1549688b94..73165241c1 100755 --- a/hack/jenkins/linux_integration_tests_docker_containerd.sh +++ b/hack/jenkins/linux_integration_tests_docker_containerd.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="docker" +OS="linux" +ARCH="amd64" +DRIVER="docker" JOB_NAME="Docker_Linux_containerd" CONTAINER_RUNTIME="containerd" diff --git a/hack/jenkins/linux_integration_tests_docker_containerd_arm64.sh b/hack/jenkins/linux_integration_tests_docker_containerd_arm64.sh index 96685cb8c0..3ea2454c4f 100644 --- a/hack/jenkins/linux_integration_tests_docker_containerd_arm64.sh +++ b/hack/jenkins/linux_integration_tests_docker_containerd_arm64.sh @@ -32,7 +32,8 @@ docker rm -f -v "$(docker ps -aq)" >/dev/null 2>&1 || true ARCH="arm64" \ OS="linux" \ -VM_DRIVER="docker" \ +DRIVER="docker" \ JOB_NAME="$JOB_NAME" \ CONTAINER_RUNTIME="containerd" \ -source ./run_tests.sh +EXTERNAL="yes" \ +source ./common.sh diff --git a/hack/jenkins/linux_integration_tests_docker_crio.sh b/hack/jenkins/linux_integration_tests_docker_crio.sh index f7c2aad413..0f7327173c 100755 --- a/hack/jenkins/linux_integration_tests_docker_crio.sh +++ b/hack/jenkins/linux_integration_tests_docker_crio.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="docker" +OS="linux" +ARCH="amd64" +DRIVER="docker" JOB_NAME="Docker_Linux_crio" CONTAINER_RUNTIME="crio" diff --git a/hack/jenkins/linux_integration_tests_docker_crio_arm64.sh b/hack/jenkins/linux_integration_tests_docker_crio_arm64.sh index dd46df66f1..b573c28abb 100644 --- a/hack/jenkins/linux_integration_tests_docker_crio_arm64.sh +++ b/hack/jenkins/linux_integration_tests_docker_crio_arm64.sh @@ -32,7 +32,8 @@ docker rm -f -v "$(docker ps -aq)" >/dev/null 2>&1 || true ARCH="arm64" \ OS="linux" \ -VM_DRIVER="docker" \ +DRIVER="docker" \ JOB_NAME="$JOB_NAME" \ CONTAINER_RUNTIME="crio" \ -source ./run_tests.sh +EXTERNAL="yes" \ +source ./common.sh diff --git a/hack/jenkins/linux_integration_tests_kvm.sh b/hack/jenkins/linux_integration_tests_kvm.sh index cb16ebe3c2..7491153ea8 100755 --- a/hack/jenkins/linux_integration_tests_kvm.sh +++ b/hack/jenkins/linux_integration_tests_kvm.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="kvm2" +OS="linux" +ARCH="amd64" +DRIVER="kvm2" JOB_NAME="KVM_Linux" EXPECTED_DEFAULT_DRIVER="kvm2" diff --git a/hack/jenkins/linux_integration_tests_kvm_containerd.sh b/hack/jenkins/linux_integration_tests_kvm_containerd.sh index 61656887f4..116ab5a142 100755 --- a/hack/jenkins/linux_integration_tests_kvm_containerd.sh +++ b/hack/jenkins/linux_integration_tests_kvm_containerd.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="kvm2" +OS="linux" +ARCH="amd64" +DRIVER="kvm2" JOB_NAME="KVM_Linux_containerd" CONTAINER_RUNTIME="containerd" diff --git a/hack/jenkins/linux_integration_tests_kvm_crio.sh b/hack/jenkins/linux_integration_tests_kvm_crio.sh index 1a57de6f18..5b99712ad0 100755 --- a/hack/jenkins/linux_integration_tests_kvm_crio.sh +++ b/hack/jenkins/linux_integration_tests_kvm_crio.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="kvm2" +OS="linux" +ARCH="amd64" +DRIVER="kvm2" JOB_NAME="KVM_Linux_crio" CONTAINER_RUNTIME="crio" diff --git a/hack/jenkins/linux_integration_tests_none.sh b/hack/jenkins/linux_integration_tests_none.sh index 2a78e5308d..118fdd08e9 100755 --- a/hack/jenkins/linux_integration_tests_none.sh +++ b/hack/jenkins/linux_integration_tests_none.sh @@ -26,8 +26,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="none" +OS="linux" +ARCH="amd64" +DRIVER="none" JOB_NAME="none_Linux" EXTRA_START_ARGS="--bootstrapper=kubeadm" EXPECTED_DEFAULT_DRIVER="kvm2" diff --git a/hack/jenkins/linux_integration_tests_podman.sh b/hack/jenkins/linux_integration_tests_podman.sh index f712f38658..fcdd5072e6 100755 --- a/hack/jenkins/linux_integration_tests_podman.sh +++ b/hack/jenkins/linux_integration_tests_podman.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="podman" +OS="linux" +ARCH="amd64" +DRIVER="podman" JOB_NAME="Experimental_Podman_Linux" CONTAINER_RUNTIME="containerd" diff --git a/hack/jenkins/linux_integration_tests_virtualbox.sh b/hack/jenkins/linux_integration_tests_virtualbox.sh index 4af1895a87..9bf1ff7b26 100755 --- a/hack/jenkins/linux_integration_tests_virtualbox.sh +++ b/hack/jenkins/linux_integration_tests_virtualbox.sh @@ -25,8 +25,9 @@ set -e -OS_ARCH="linux-amd64" -VM_DRIVER="virtualbox" +OS="linux" +ARCH="amd64" +DRIVER="virtualbox" JOB_NAME="VirtualBox_Linux" EXTRA_TEST_ARGS="" EXPECTED_DEFAULT_DRIVER="kvm2" diff --git a/hack/jenkins/minikube_cross_build_and_upload.sh b/hack/jenkins/minikube_cross_build_and_upload.sh index ed5394133f..94750f6996 100755 --- a/hack/jenkins/minikube_cross_build_and_upload.sh +++ b/hack/jenkins/minikube_cross_build_and_upload.sh @@ -46,6 +46,8 @@ make -j 16 \ out/minikube_${DEB_VER}_amd64.deb \ out/minikube_${DEB_VER}_arm64.deb \ out/docker-machine-driver-kvm2_$(make deb_version_base).deb \ + out/docker-machine-driver-kvm2_${DEB_VER}_amd64.deb \ + out/docker-machine-driver-kvm2_${DEB_VER}_arm64.deb \ && failed=$? || failed=$? BUILT_VERSION=$("out/minikube-$(go env GOOS)-$(go env GOARCH)" version) @@ -70,7 +72,7 @@ fi cp -r test/integration/testdata out/ # Don't upload the buildroot artifacts if they exist -rm -r out/buildroot || true +rm -rf out/buildroot # At this point, the out directory contains the jenkins scripts (populated by jenkins), # testdata, and our build output. Push the changes to GCS so that worker nodes can re-use them. diff --git a/hack/jenkins/minikube_set_pending.sh b/hack/jenkins/minikube_set_pending.sh index 3f95a77d08..d6ce0a350b 100755 --- a/hack/jenkins/minikube_set_pending.sh +++ b/hack/jenkins/minikube_set_pending.sh @@ -26,17 +26,12 @@ 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' # 'VirtualBox_Linux' # 'VirtualBox_macOS' - 'VirtualBox_Windows' + # 'VirtualBox_Windows' # 'KVM-GPU_Linux' - Disabled 'KVM_Linux' 'KVM_Linux_containerd' @@ -54,6 +49,14 @@ jobs=( 'Docker_Cloud_Shell' ) +STARTED_LIST_REMOTE="gs://minikube-builds/logs/${ghprbPullId}/${BUILD_NUMBER}/started_environments.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,9 +91,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" + "https://storage.googleapis.com/minikube-builds/logs/${ghprbPullId}/${BUILD_NUMBER}/${j}.pending" done - diff --git a/hack/jenkins/osx_integration_tests_docker.sh b/hack/jenkins/osx_integration_tests_docker.sh index 0b8fc2dc54..3635553cb5 100755 --- a/hack/jenkins/osx_integration_tests_docker.sh +++ b/hack/jenkins/osx_integration_tests_docker.sh @@ -28,18 +28,11 @@ set -e ARCH="amd64" OS="darwin" -VM_DRIVER="docker" +DRIVER="docker" JOB_NAME="Docker_macOS" EXTRA_TEST_ARGS="" EXPECTED_DEFAULT_DRIVER="docker" - - -# fix mac os as a service on mac os -# https://github.com/docker/for-mac/issues/882#issuecomment-506372814 -#osascript -e 'quit app "Docker"' -#/Applications/Docker.app/Contents/MacOS/Docker --quit-after-install --unattended || true -#osascript -e 'quit app "Docker"' -#/Applications/Docker.app/Contents/MacOS/Docker --unattended & +EXTERNAL="yes" begin=$(date +%s) while [ -z "$(docker info 2> /dev/null )" ]; @@ -59,4 +52,4 @@ install cron/cleanup_and_reboot_Darwin.sh $HOME/cleanup_and_reboot.sh || echo "F echo "*/30 * * * * $HOME/cleanup_and_reboot.sh" | crontab crontab -l -source run_tests.sh +source common.sh diff --git a/hack/jenkins/osx_integration_tests_hyperkit.sh b/hack/jenkins/osx_integration_tests_hyperkit.sh index aafb37bc8d..f1acffbdef 100755 --- a/hack/jenkins/osx_integration_tests_hyperkit.sh +++ b/hack/jenkins/osx_integration_tests_hyperkit.sh @@ -28,15 +28,15 @@ set -ex ARCH="amd64" OS="darwin" -VM_DRIVER="hyperkit" +DRIVER="hyperkit" JOB_NAME="Hyperkit_macOS" EXTRA_TEST_ARGS="" EXPECTED_DEFAULT_DRIVER="hyperkit" - +EXTERNAL="yes" mkdir -p cron && gsutil -qm rsync "gs://minikube-builds/${MINIKUBE_LOCATION}/cron" cron || echo "FAILED TO GET CRON FILES" install cron/cleanup_and_reboot_Darwin.sh $HOME/cleanup_and_reboot.sh || echo "FAILED TO INSTALL CLEANUP" echo "*/30 * * * * $HOME/cleanup_and_reboot.sh" | crontab crontab -l -source run_tests.sh +source common.sh diff --git a/hack/jenkins/osx_integration_tests_virtualbox.sh b/hack/jenkins/osx_integration_tests_virtualbox.sh index 67505da506..b10f6a52f7 100755 --- a/hack/jenkins/osx_integration_tests_virtualbox.sh +++ b/hack/jenkins/osx_integration_tests_virtualbox.sh @@ -24,9 +24,9 @@ # access_token: The Github API access token. Injected by the Jenkins credential provider. -set -e -OS_ARCH="darwin-amd64" -VM_DRIVER="virtualbox" +OS="darwin" +ARCH="amd64" +DRIVER="virtualbox" JOB_NAME="VirtualBox_macOS" EXTRA_START_ARGS="--bootstrapper=kubeadm" # hyperkit behaves better, so it has higher precedence. diff --git a/hack/jenkins/release_build_and_upload.sh b/hack/jenkins/release_build_and_upload.sh index 19f55e0a6c..48cf78d198 100755 --- a/hack/jenkins/release_build_and_upload.sh +++ b/hack/jenkins/release_build_and_upload.sh @@ -48,7 +48,10 @@ make verify-iso env BUILD_IN_DOCKER=y \ make -j 16 \ all \ + out/minikube-linux-arm64 \ + out/minikube-linux-arm64.tar.gz \ out/minikube-darwin-arm64 \ + out/minikube-darwin-arm64.tar.gz \ out/minikube-installer.exe \ "out/minikube_${DEB_VERSION}-${DEB_REVISION}_amd64.deb" \ "out/minikube_${DEB_VERSION}-${DEB_REVISION}_arm64.deb" \ @@ -61,6 +64,7 @@ env BUILD_IN_DOCKER=y \ "out/minikube-${RPM_VERSION}-${RPM_REVISION}.ppc64le.rpm" \ "out/minikube-${RPM_VERSION}-${RPM_REVISION}.s390x.rpm" \ "out/docker-machine-driver-kvm2_${DEB_VERSION}-${DEB_REVISION}_amd64.deb" \ + "out/docker-machine-driver-kvm2_${DEB_VERSION}-${DEB_REVISION}_arm64.deb" \ "out/docker-machine-driver-kvm2-${RPM_VERSION}-${RPM_REVISION}.x86_64.rpm" # check if 'commit: ' line contains '-dirty' commit suffix @@ -75,6 +79,7 @@ fi # Don't upload temporary copies, avoid unused duplicate files in the release storage rm -f out/minikube-linux-x86_64 +rm -f out/minikube-linux-i686 rm -f out/minikube-linux-aarch64 rm -f out/minikube-linux-armhf rm -f out/minikube-linux-armv7hl 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=$? diff --git a/hack/jenkins/run_tests.sh b/hack/jenkins/run_tests.sh deleted file mode 100644 index 1a23686720..0000000000 --- a/hack/jenkins/run_tests.sh +++ /dev/null @@ -1,452 +0,0 @@ -#!/bin/bash - -# Copyright 2016 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. - - -# This script downloads the test files from the build bucket and makes some executable. - -# The script expects the following env variables: -# OS: The operating system -# ARCH: The architecture -# VM_DRIVER: the driver to use for the test -# CONTAINER_RUNTIME: the container runtime to use for the test -# EXTRA_START_ARGS: additional flags to pass into minikube start -# EXTRA_TEST_ARGS: additional flags to pass into go test -# JOB_NAME: the name of the logfile and check name to update on github - -readonly OS_ARCH="${OS}-${ARCH}" -readonly TEST_ROOT="${HOME}/minikube-integration" -readonly TEST_HOME="${TEST_ROOT}/${OS_ARCH}-${VM_DRIVER}-${CONTAINER_RUNTIME}-${MINIKUBE_LOCATION}-$$-${COMMIT}" - -export GOPATH="$HOME/go" -export KUBECONFIG="${TEST_HOME}/kubeconfig" -export PATH=$PATH:"/usr/local/bin/:/usr/local/go/bin/:$GOPATH/bin" - -readonly TIMEOUT=${1:-120m} - -# We need pstree for the restart cronjobs -if [ "$(uname)" != "Darwin" ]; then - sudo apt-get -y install lsof psmisc -else - brew install pstree coreutils pidof - ln -s /usr/local/bin/gtimeout /usr/local/bin/timeout || true -fi - -# installing golang so we could do go get for gopogh -sudo ARCH="$ARCH"./installers/check_install_golang.sh "1.16" "/usr/local" || true - -# install docker and kubectl if not present -sudo ARCH="$ARCH" ./installers/check_install_docker.sh - -# let's just clean all docker artifacts up -docker system prune --force --volumes || true -docker system df || true - -echo ">> Starting at $(date)" -echo "" -echo "arch: ${OS_ARCH}" -echo "build: ${MINIKUBE_LOCATION}" -echo "driver: ${VM_DRIVER}" -echo "runtime: ${CONTAINER_RUNTIME}" -echo "job: ${JOB_NAME}" -echo "test home: ${TEST_HOME}" -echo "sudo: ${SUDO_PREFIX}" -echo "kernel: $(uname -v)" -echo "uptime: $(uptime)" -# Setting KUBECONFIG prevents the version check from erroring out due to permission issues -echo "kubectl: $(env KUBECONFIG=${TEST_HOME} kubectl version --client --short=true)" -echo "docker: $(docker version --format '{{ .Client.Version }}')" -echo "podman: $(sudo podman version --format '{{.Version}}' || true)" -echo "go: $(go version || true)" - - -case "${VM_DRIVER}" in - kvm2) - echo "virsh: $(virsh --version)" - ;; - virtualbox) - echo "vbox: $(vboxmanage --version)" - ;; -esac - -echo "" -mkdir -p out/ testdata/ - -# Install gsutil if necessary. -if ! type -P gsutil >/dev/null; then - if [[ ! -x "out/gsutil/gsutil" ]]; then - echo "Installing gsutil to $(pwd)/out ..." - curl -s https://storage.googleapis.com/pub/gsutil.tar.gz | tar -C out/ -zxf - - fi - PATH="$(pwd)/out/gsutil:$PATH" -fi - -# Add the out/ directory to the PATH, for using new drivers. -export PATH="$(pwd)/out/":$PATH - -echo -echo ">> Downloading test inputs from ${MINIKUBE_LOCATION} ..." -gsutil -qm cp \ - "gs://minikube-builds/${MINIKUBE_LOCATION}/minikube-${OS_ARCH}" \ - "gs://minikube-builds/${MINIKUBE_LOCATION}/docker-machine-driver"-* \ - "gs://minikube-builds/${MINIKUBE_LOCATION}/e2e-${OS_ARCH}" out - -gsutil -qm cp -r "gs://minikube-builds/${MINIKUBE_LOCATION}/testdata"/* testdata/ - -gsutil -qm cp "gs://minikube-builds/${MINIKUBE_LOCATION}/gvisor-addon" testdata/ - - -# Set the executable bit on the e2e binary and out binary -export MINIKUBE_BIN="out/minikube-${OS_ARCH}" -export E2E_BIN="out/e2e-${OS_ARCH}" -chmod +x "${MINIKUBE_BIN}" "${E2E_BIN}" out/docker-machine-driver-* -"${MINIKUBE_BIN}" version - -procs=$(pgrep "minikube-${OS_ARCH}|e2e-${OS_ARCH}" || true) -if [[ "${procs}" != "" ]]; then - echo "Warning: found stale test processes to kill:" - ps -f -p ${procs} || true - kill ${procs} || true - kill -9 ${procs} || true -fi - -# Quickly notice misconfigured test roots -mkdir -p "${TEST_ROOT}" - -# Cleanup stale test outputs. -echo -echo ">> Cleaning up after previous test runs ..." -for test_path in ${TEST_ROOT}; do - ls -lad "${test_path}" || continue - - echo "* Cleaning stale test path: ${test_path}" - for tunnel in $(find ${test_path} -name tunnels.json -type f); do - env MINIKUBE_HOME="$(dirname ${tunnel})" ${MINIKUBE_BIN} tunnel --cleanup || true - done - - for home in $(find ${test_path} -name .minikube -type d); do - env MINIKUBE_HOME="$(dirname ${home})" ${MINIKUBE_BIN} delete --all || true - sudo rm -Rf "${home}" - done - - for kconfig in $(find ${test_path} -name kubeconfig -type f); do - sudo rm -f "${kconfig}" - done - - ## ultimate shotgun clean up docker after we tried all - docker rm -f -v $(docker ps -aq) >/dev/null 2>&1 || true - - # Be very specific to avoid accidentally deleting other items, like wildcards or devices - if [[ -d "${test_path}" ]]; then - rm -Rf "${test_path}" || true - elif [[ -f "${test_path}" ]]; then - rm -f "${test_path}" || true - fi -done - -function cleanup_procs() { - # sometimes tests left over zombie procs that won't exit - # for example: - # jenkins 20041 0.0 0.0 0 0 ? Z Aug19 0:00 [minikube-linux-] - pgrep docker > d.pids - zombie_defuncts=$(ps -A -ostat,ppid | grep -v -f d.pids | awk '/[zZ]/ && !a[$2]++ {print $2}') - if [[ "${zombie_defuncts}" != "" ]]; then - echo "Found zombie defunct procs to kill..." - ps -f -p ${zombie_defuncts} || true - kill ${zombie_defuncts} || true - fi - - if type -P virsh; then - virsh -c qemu:///system list --all --uuid \ - | xargs -I {} sh -c "virsh -c qemu:///system destroy {}; virsh -c qemu:///system undefine {}" \ - || true - echo ">> virsh VM list after clean up (should be empty):" - virsh -c qemu:///system list --all || true - fi - - if type -P vboxmanage; then - killall VBoxHeadless || true - sleep 1 - killall -9 VBoxHeadless || true - - for guid in $(vboxmanage list vms | grep -Eo '\{[a-zA-Z0-9-]+\}'); do - echo "- Removing stale VirtualBox VM: $guid" - vboxmanage startvm "${guid}" --type emergencystop || true - vboxmanage unregistervm "${guid}" || true - done - - ifaces=$(vboxmanage list hostonlyifs | grep -E "^Name:" | awk '{ print $2 }') - for if in $ifaces; do - vboxmanage hostonlyif remove "${if}" || true - done - - echo ">> VirtualBox VM list after clean up (should be empty):" - vboxmanage list vms || true - echo ">> VirtualBox interface list after clean up (should be empty):" - vboxmanage list hostonlyifs || true - fi - - if type -P hdiutil; then - hdiutil info | grep -E "/dev/disk[1-9][^s]" || true - hdiutil info \ - | grep -E "/dev/disk[1-9][^s]" \ - | awk '{print $1}' \ - | xargs -I {} sh -c "hdiutil detach {}" \ - || true - fi - - # cleaning up stale hyperkits - if type -P hyperkit; then - for pid in $(pgrep hyperkit); do - echo "Killing stale hyperkit $pid" - ps -f -p $pid || true - kill $pid || true - kill -9 $pid || true - done - fi - - if [[ "${VM_DRIVER}" == "hyperkit" ]]; then - if [[ -e out/docker-machine-driver-hyperkit ]]; then - sudo chown root:wheel out/docker-machine-driver-hyperkit || true - sudo chmod u+s out/docker-machine-driver-hyperkit || true - fi - fi - - kprocs=$(pgrep kubectl || true) - if [[ "${kprocs}" != "" ]]; then - echo "error: killing hung kubectl processes ..." - ps -f -p ${kprocs} || true - sudo -E kill ${kprocs} || true - fi - - - # clean up none drivers binding on 8443 - none_procs=$(sudo lsof -i :8443 | tail -n +2 | awk '{print $2}' || true) - if [[ "${none_procs}" != "" ]]; then - echo "Found stale api servers listening on 8443 processes to kill: " - for p in $none_procs - do - echo "Kiling stale none driver: $p" - sudo -E ps -f -p $p || true - sudo -E kill $p || true - sudo -E kill -9 $p || true - done - fi -} - -function cleanup_stale_routes() { - local show="netstat -rn -f inet" - local del="sudo route -n delete" - - if [[ "$(uname)" == "Linux" ]]; then - show="ip route show" - del="sudo ip route delete" - fi - - local troutes=$($show | awk '{ print $1 }' | grep 10.96.0.0 || true) - for route in ${troutes}; do - echo "WARNING: deleting stale tunnel route: ${route}" - $del "${route}" || true - done -} - -cleanup_procs || true -cleanup_stale_routes || true - -mkdir -p "${TEST_HOME}" -export MINIKUBE_HOME="${TEST_HOME}/.minikube" - - -# Build the gvisor image so that we can integration test changes to pkg/gvisor -chmod +x ./testdata/gvisor-addon -# skipping gvisor mac because ofg https://github.com/kubernetes/minikube/issues/5137 -if [ "$(uname)" != "Darwin" ]; then - # Should match GVISOR_IMAGE_VERSION in Makefile - docker build -t gcr.io/k8s-minikube/gvisor-addon:2 -f testdata/gvisor-addon-Dockerfile ./testdata -fi - -readonly LOAD=$(uptime | egrep -o "load average.*: [0-9]+" | cut -d" " -f3) -if [[ "${LOAD}" -gt 2 ]]; then - echo "" - echo "********************** LOAD WARNING ********************************" - echo "Load average is very high (${LOAD}), which may cause failures. Top:" - if [[ "$(uname)" == "Darwin" ]]; then - # Two samples, macOS does not calculate CPU usage on the first one - top -l 2 -o cpu -n 5 | tail -n 15 - else - top -b -n1 | head -n 15 - fi - echo "********************** LOAD WARNING ********************************" - echo "Sleeping 30s to see if load goes down ...." - sleep 30 - uptime -fi - -readonly TEST_OUT="${TEST_HOME}/testout.txt" -readonly JSON_OUT="${TEST_HOME}/test.json" -readonly HTML_OUT="${TEST_HOME}/test.html" -readonly SUMMARY_OUT="${TEST_HOME}/test_summary.json" - -e2e_start_time="$(date -u +%s)" -echo "" -echo ">> Starting ${E2E_BIN} at $(date)" -set -x - -if test -f "${TEST_OUT}"; then - rm "${TEST_OUT}" || true # clean up previous runs of same build -fi -touch "${TEST_OUT}" - -if [ ! -z "${CONTAINER_RUNTIME}" ] -then - EXTRA_START_ARGS="${EXTRA_START_ARGS} --container-runtime=${CONTAINER_RUNTIME}" -fi - -${SUDO_PREFIX}${E2E_BIN} \ - -minikube-start-args="--driver=${VM_DRIVER} ${EXTRA_START_ARGS}" \ - -test.timeout=${TIMEOUT} -test.v \ - ${EXTRA_TEST_ARGS} \ - -binary="${MINIKUBE_BIN}" 2>&1 | tee "${TEST_OUT}" - -result=${PIPESTATUS[0]} # capture the exit code of the first cmd in pipe. -set +x -echo ">> ${E2E_BIN} exited with ${result} at $(date)" -echo "" - -if [[ $result -eq 0 ]]; then - status="success" - echo "minikube: SUCCESS" -else - status="failure" - echo "minikube: FAIL" -fi - -## caclucate the time took to finish running e2e binary test. -e2e_end_time="$(date -u +%s)" -elapsed=$(($e2e_end_time-$e2e_start_time)) -min=$(($elapsed/60)) -sec=$(tail -c 3 <<< $((${elapsed}00/60))) -elapsed=$min.$sec - - - -echo ">> Attmpting to convert test logs to json" -if test -f "${JSON_OUT}"; then - rm "${JSON_OUT}" || true # clean up previous runs of same build -fi - -touch "${JSON_OUT}" - -# Generate JSON output -echo ">> Running go test2json" -go tool test2json -t < "${TEST_OUT}" > "${JSON_OUT}" || true - -if ! type "jq" > /dev/null; then -echo ">> Installing jq" - if [ "$(uname)" != "Darwin" ]; then - curl -LO https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && sudo install jq-linux64 /usr/local/bin/jq - else - curl -LO https://github.com/stedolan/jq/releases/download/jq-1.6/jq-osx-amd64 && sudo install jq-osx-amd64 /usr/local/bin/jq - fi -fi - -echo ">> Installing gopogh" -curl -LO "https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh-${OS_ARCH}" -sudo install "gopogh-${OS_ARCH}" /usr/local/bin/gopogh - - -echo ">> Running gopogh" -if test -f "${HTML_OUT}"; then - rm "${HTML_OUT}" || true # clean up previous runs of same build -fi - -touch "${HTML_OUT}" -touch "${SUMMARY_OUT}" -gopogh_status=$(gopogh -in "${JSON_OUT}" -out_html "${HTML_OUT}" -out_summary "${SUMMARY_OUT}" -name "${JOB_NAME}" -pr "${MINIKUBE_LOCATION}" -repo github.com/kubernetes/minikube/ -details "${COMMIT}") || true -fail_num=$(echo $gopogh_status | jq '.NumberOfFail') -test_num=$(echo $gopogh_status | jq '.NumberOfTests') -pessimistic_status="${fail_num} / ${test_num} failures" -description="completed with ${status} in ${elapsed} minute(s)." -if [ "$status" = "failure" ]; then - description="completed with ${pessimistic_status} in ${elapsed} minute(s)." -fi -echo "$description" - - -REPORTS_PATH=test_reports -mkdir -p "$REPORTS_PATH" -cp "${TEST_OUT}" "$REPORTS_PATH/out.txt" -cp "${JSON_OUT}" "$REPORTS_PATH/out.json" -cp "${HTML_OUT}" "$REPORTS_PATH/out.html" -cp "${SUMMARY_OUT}" "$REPORTS_PATH/summary.txt" - - -echo ">> Cleaning up after ourselves ..." -timeout 3m ${SUDO_PREFIX}${MINIKUBE_BIN} tunnel --cleanup || true -timeout 5m ${SUDO_PREFIX}${MINIKUBE_BIN} delete --all --purge >/dev/null 2>/dev/null || true -cleanup_stale_routes || true - -${SUDO_PREFIX} rm -Rf "${MINIKUBE_HOME}" || true -${SUDO_PREFIX} rm -f "${KUBECONFIG}" || true - -rmdir "${TEST_HOME}" || true -echo ">> ${TEST_HOME} completed at $(date)" - -if [[ "${MINIKUBE_LOCATION}" == "master" ]]; then - exit "$result" -fi - -public_log_url="https://storage.googleapis.com/minikube-builds/logs/${MINIKUBE_LOCATION}/${COMMIT:0:7}/${JOB_NAME}.html" - -# retry_github_status provides reliable github status updates -function retry_github_status() { - local commit=$1 - local context=$2 - local state=$3 - local token=$4 - local target=$5 - local desc=$6 - - # Retry in case we hit our GitHub API quota or fail other ways. - local attempt=0 - local timeout=2 - local code=-1 - - echo "set GitHub status $context to $desc" - - while [[ "${attempt}" -lt 8 ]]; do - local out=$(mktemp) - code=$(curl -o "${out}" -s --write-out "%{http_code}" -L -u minikube-bot:${token} \ - "https://api.github.com/repos/kubernetes/minikube/statuses/${commit}" \ - -H "Content-Type: application/json" \ - -X POST \ - -d "{\"state\": \"${state}\", \"description\": \"Jenkins: ${desc}\", \"target_url\": \"${target}\", \"context\": \"${context}\"}" || echo 999) - - # 2xx HTTP codes - if [[ "${code}" =~ ^2 ]]; then - break - fi - - cat "${out}" && rm -f "${out}" - echo "HTTP code ${code}! Retrying in ${timeout} .." - sleep "${timeout}" - attempt=$(( attempt + 1 )) - timeout=$(( timeout * 5 )) - done -} - -retry_github_status "${COMMIT}" "${JOB_NAME}" "${status}" "${access_token}" "${public_log_url}" "${description}" - -exit "$result" diff --git a/hack/jenkins/setup_docker_desktop_macos.sh b/hack/jenkins/setup_docker_desktop_macos.sh new file mode 100755 index 0000000000..ed090ddb5b --- /dev/null +++ b/hack/jenkins/setup_docker_desktop_macos.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -x + +if docker system info > /dev/null 2>&1; then + echo "Docker is already running, exiting" + exit 0 +fi + +# kill docker first +osascript -e 'quit app "Docker"' + +# wait 2 minutes for it to start back up +timeout=120 +elapsed=0 +echo "Starting Docker Desktop..." +open --background -a Docker +echo "Waiting at most two minutes..." +while ! docker system info > /dev/null 2>&1; +do + sleep 1 + elapsed=$((elapsed+1)) + if [ $elapsed -gt $timeout ]; then + echo "Start Docker Desktop failed" + exit 1 + fi +done + +echo "Docker Desktop started!" diff --git a/hack/jenkins/storage_provisioner.sh b/hack/jenkins/storage_provisioner.sh new file mode 100755 index 0000000000..afe877e9d8 --- /dev/null +++ b/hack/jenkins/storage_provisioner.sh @@ -0,0 +1,66 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set -x -o pipefail + +# Make sure docker is installed and configured +./hack/jenkins/installers/check_install_docker.sh || true +yes|gcloud auth configure-docker + +# Make sure gh is installed and configured +./hack/jenkins/installers/check_install_gh.sh + +if [[ $SP_VERSION != v* ]]; then + SP_VERSION=v$SP_VERSION +fi + +SED="sed -i" +if [ "$(uname)" = "Darwin" ]; then + SED="sed -i ''" +fi + +# Write the new version back into the Makefile +${SED} "s/STORAGE_PROVISIONER_TAG ?= .*/STORAGE_PROVISIONER_TAG ?= ${SP_VERSION}/" Makefile + +# Build the new image +CIBUILD=yes make push-storage-provisioner-manifest + +ec=$? +if [ $ec -gt 0 ]; then + exit $ec +fi + +# Bump the preload version +PLV=$(egrep "PreloadVersion =" pkg/minikube/download/preload.go | cut -d \" -f 2) +RAW=${PLV:1} +RAW=$((RAW+1)) +PLV=v${RAW} + +${SED} "s/PreloadVersion = .*/PreloadVersion = \"${PLV}\"/" pkg/minikube/download/preload.go + +# Open a PR with the changes +git config user.name "minikube-bot" +git config user.email "minikube-bot@google.com" + +branch=storage-provisioner-${SP_VERSION} +git checkout -b ${branch} + +git add Makefile pkg/minikube/download/preload.go +git commit -m "Update storage provisioner to ${SP_VERSION}" +git remote add minikube-bot git@github.com:minikube-bot/minikube.git +git push -f minikube-bot ${branch} + +gh pr create --fill --base master --head minikube-bot:${branch} diff --git a/hack/jenkins/test-flake-chart/collect_data_manual.sh b/hack/jenkins/test-flake-chart/collect_data_manual.sh new file mode 100755 index 0000000000..287a1a63d5 --- /dev/null +++ b/hack/jenkins/test-flake-chart/collect_data_manual.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Collects all test data manually, processes it, and uploads to GCS. This will +# overwrite any existing data. This should only be done for a dryrun, new data +# should be handled exclusively through upload_tests.sh. +# Example usage: ./collect_data_manual.sh + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +# 1) "cat" together all summary files. +# 2) Process all summary files. +# 3) Optimize the resulting data. +# 4) Store in GCS bucket. +gsutil cat gs://minikube-builds/logs/master/*/*_summary.json \ +| $DIR/process_data.sh \ +| $DIR/optimize_data.sh \ +| gsutil cp - gs://minikube-flake-rate/data.csv diff --git a/hack/jenkins/test-flake-chart/compute_flake_rate.go b/hack/jenkins/test-flake-chart/compute_flake_rate.go new file mode 100644 index 0000000000..94470af80a --- /dev/null +++ b/hack/jenkins/test-flake-chart/compute_flake_rate.go @@ -0,0 +1,264 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "bufio" + "flag" + "fmt" + "io" + "os" + "runtime/debug" + "sort" + "strconv" + "strings" + "time" +) + +var ( + dataCsv = flag.String("data-csv", "", "Source data to compute flake rates on") + dateRange = flag.Uint("date-range", 5, "Number of test dates to consider when computing flake rate") +) + +func main() { + flag.Parse() + + file, err := os.Open(*dataCsv) + if err != nil { + exit("Unable to read data CSV", err) + } + + testEntries := readData(file) + splitEntries := splitData(testEntries) + filteredEntries := filterRecentEntries(splitEntries, *dateRange) + flakeRates := computeFlakeRates(filteredEntries) + averageDurations := computeAverageDurations(filteredEntries) + fmt.Println("Environment,Test,Flake Rate,Duration") + for environment, environmentSplit := range flakeRates { + for test, flakeRate := range environmentSplit { + duration := averageDurations[environment][test] + fmt.Printf("%s,%s,%.2f,%.3f\n", environment, test, flakeRate*100, duration) + } + } +} + +// One entry of a test run. +// Example: TestEntry { +// name: "TestFunctional/parallel/LogsCmd", +// environment: "Docker_Linux", +// date: time.Now, +// status: "Passed", +// duration: 0.1, +// } +type testEntry struct { + name string + environment string + date time.Time + status string + duration float32 +} + +// A map with keys of (environment, test_name) to values of slcies of TestEntry. +type splitEntryMap map[string]map[string][]testEntry + +// Reads CSV `file` and consumes each line to be a single TestEntry. +func readData(file io.Reader) []testEntry { + testEntries := []testEntry{} + + fileReader := bufio.NewReaderSize(file, 256) + previousLine := []string{"", "", "", "", "", "", "", "", ""} + firstLine := true + for { + lineBytes, _, err := fileReader.ReadLine() + if err != nil { + if err == io.EOF { + break + } + exit("Error reading data CSV", err) + } + line := string(lineBytes) + fields := strings.Split(line, ",") + if firstLine { + if len(fields) != 9 { + exit(fmt.Sprintf("Data CSV in incorrect format. Expected 9 columns, but got %d", len(fields)), fmt.Errorf("bad CSV format")) + } + firstLine = false + } + for i, field := range fields { + if field == "" { + fields[i] = previousLine[i] + } + } + if len(fields) != 9 { + fmt.Printf("Found line with wrong number of columns. Expectd 9, but got %d - skipping\n", len(fields)) + continue + } + previousLine = fields + if fields[4] == "Passed" || fields[4] == "Failed" { + date, err := time.Parse("2006-01-02", fields[1]) + if err != nil { + fmt.Printf("Failed to parse date: %v\n", err) + continue + } + duration, err := strconv.ParseFloat(fields[5], 32) + if err != nil { + fmt.Printf("Failed to parse duration: %v\n", err) + continue + } + testEntries = append(testEntries, testEntry{ + name: fields[3], + environment: fields[2], + date: date, + status: fields[4], + duration: float32(duration), + }) + } + } + return testEntries +} + +// Splits `testEntries` up into maps indexed first by environment and then by test. +func splitData(testEntries []testEntry) splitEntryMap { + splitEntries := make(splitEntryMap) + + for _, entry := range testEntries { + appendEntry(splitEntries, entry.environment, entry.name, entry) + } + + return splitEntries +} + +// Appends `entry` to `splitEntries` at the `environment` and `test`. +func appendEntry(splitEntries splitEntryMap, environment, test string, entry testEntry) { + // Lookup the environment. + environmentSplit, ok := splitEntries[environment] + if !ok { + // If the environment map is missing, make a map for this environment and store it. + environmentSplit = make(map[string][]testEntry) + splitEntries[environment] = environmentSplit + } + + // Lookup the test. + testSplit, ok := environmentSplit[test] + if !ok { + // If the test is missing, make a slice for this test. + testSplit = make([]testEntry, 0) + // The slice is not inserted, since it will be replaced anyway. + } + environmentSplit[test] = append(testSplit, entry) +} + +// Filters `splitEntries` to include only the most recent `date_range` dates. +func filterRecentEntries(splitEntries splitEntryMap, dateRange uint) splitEntryMap { + filteredEntries := make(splitEntryMap) + + for environment, environmentSplit := range splitEntries { + for test, testSplit := range environmentSplit { + dates := make([]time.Time, len(testSplit)) + for _, entry := range testSplit { + dates = append(dates, entry.date) + } + // Sort dates from future to past. + sort.Slice(dates, func(i, j int) bool { + return dates[j].Before(dates[i]) + }) + datesInRange := make([]time.Time, 0, dateRange) + var lastDate time.Time + // Go through each date. + for _, date := range dates { + // If date is the same as last date, ignore it. + if date.Equal(lastDate) { + continue + } + + // Add the date. + datesInRange = append(datesInRange, date) + lastDate = date + // If the date_range has been hit, break out. + if uint(len(datesInRange)) == dateRange { + break + } + } + + for _, entry := range testSplit { + // Look for the first element <= entry.date + index := sort.Search(len(datesInRange), func(i int) bool { + return !datesInRange[i].After(entry.date) + }) + // If no date is <= entry.date, or the found date does not equal entry.date. + if index == len(datesInRange) || !datesInRange[index].Equal(entry.date) { + continue + } + appendEntry(filteredEntries, environment, test, entry) + } + } + } + return filteredEntries +} + +// Computes the flake rates over each entry in `splitEntries`. +func computeFlakeRates(splitEntries splitEntryMap) map[string]map[string]float32 { + flakeRates := make(map[string]map[string]float32) + for environment, environmentSplit := range splitEntries { + for test, testSplit := range environmentSplit { + failures := 0 + for _, entry := range testSplit { + if entry.status == "Failed" { + failures++ + } + } + setValue(flakeRates, environment, test, float32(failures)/float32(len(testSplit))) + } + } + return flakeRates +} + +// Computes the average durations over each entry in `splitEntries`. +func computeAverageDurations(splitEntries splitEntryMap) map[string]map[string]float32 { + averageDurations := make(map[string]map[string]float32) + for environment, environmentSplit := range splitEntries { + for test, testSplit := range environmentSplit { + durationSum := float32(0) + for _, entry := range testSplit { + durationSum += entry.duration + } + if len(testSplit) != 0 { + durationSum /= float32(len(testSplit)) + } + setValue(averageDurations, environment, test, durationSum) + } + } + return averageDurations +} + +// Sets the `value` of keys `environment` and `test` in `mapEntries`. +func setValue(mapEntries map[string]map[string]float32, environment, test string, value float32) { + // Lookup the environment. + environmentRates, ok := mapEntries[environment] + if !ok { + // If the environment map is missing, make a map for this environment and store it. + environmentRates = make(map[string]float32) + mapEntries[environment] = environmentRates + } + environmentRates[test] = value +} + +// exit will exit and clean up minikube +func exit(msg string, err error) { + fmt.Printf("WithError(%s)=%v called from:\n%s", msg, err, debug.Stack()) + os.Exit(60) +} diff --git a/hack/jenkins/test-flake-chart/compute_flake_rate_test.go b/hack/jenkins/test-flake-chart/compute_flake_rate_test.go new file mode 100644 index 0000000000..d4013c0885 --- /dev/null +++ b/hack/jenkins/test-flake-chart/compute_flake_rate_test.go @@ -0,0 +1,492 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package main + +import ( + "fmt" + "strings" + "testing" + "time" +) + +func simpleDate(year int, day int) time.Time { + return time.Date(year, time.January, day, 0, 0, 0, 0, time.UTC) +} + +func compareEntrySlices(t *testing.T, actualData, expectedData []testEntry, extra string) { + if extra != "" { + extra = fmt.Sprintf(" (%s)", extra) + } + for i, actual := range actualData { + if len(expectedData) <= i { + t.Errorf("Received unmatched actual element at index %d%s. Actual: %v", i, extra, actual) + continue + } + expected := expectedData[i] + if actual != expected { + t.Errorf("Elements differ at index %d%s. Expected: %v, Actual: %v", i, extra, expected, actual) + } + } + + if len(actualData) < len(expectedData) { + for i := len(actualData); i < len(expectedData); i++ { + t.Errorf("Missing unmatched expected element at index %d%s. Expected: %v", i, extra, expectedData[i]) + } + } +} + +func TestReadData(t *testing.T) { + actualData := readData(strings.NewReader( + `A,B,C,D,E,F + hash,2000-01-01,env1,test1,Passed,1 + hash,2001-01-01,env2,test2,Failed,0.5 + hash,,,test1,,0.6 + hash,2002-01-01,,,Passed,0.9 + hash,2003-01-01,env3,test3,Passed,2`, + )) + expectedData := []testEntry{ + { + name: "test1", + environment: "env1", + date: simpleDate(2000, 1), + status: "Passed", + duration: 1, + }, + { + name: "test2", + environment: "env2", + date: simpleDate(2001, 1), + status: "Failed", + duration: 0.5, + }, + { + name: "test1", + environment: "env2", + date: simpleDate(2001, 1), + status: "Failed", + duration: 0.6, + }, + { + name: "test1", + environment: "env2", + date: simpleDate(2002, 1), + status: "Passed", + duration: 0.9, + }, + { + name: "test3", + environment: "env3", + date: simpleDate(2003, 1), + status: "Passed", + duration: 2, + }, + } + + compareEntrySlices(t, actualData, expectedData, "") +} + +func compareSplitData(t *testing.T, actual, expected splitEntryMap) { + for environment, actualTests := range actual { + expectedTests, environmentOk := expected[environment] + if !environmentOk { + t.Errorf("Unexpected environment %s in actual", environment) + continue + } + + for test, actualEntries := range actualTests { + expectedEntries, testOk := expectedTests[test] + if !testOk { + t.Errorf("Unexpected test %s (in environment %s) in actual", test, environment) + continue + } + + compareEntrySlices(t, actualEntries, expectedEntries, fmt.Sprintf("environment %s, test %s", environment, test)) + } + + for test := range expectedTests { + _, testOk := actualTests[test] + if !testOk { + t.Errorf("Missing expected test %s (in environment %s) in actual", test, environment) + } + } + } + + for environment := range expected { + _, environmentOk := actual[environment] + if !environmentOk { + t.Errorf("Missing expected environment %s in actual", environment) + } + } +} + +func TestSplitData(t *testing.T) { + entryE1T1_1, entryE1T1_2 := testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 1), + status: "Passed", + }, testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 2), + status: "Passed", + } + entryE1T2 := testEntry{ + name: "test2", + environment: "env1", + date: simpleDate(2000, 1), + status: "Passed", + } + entryE2T1 := testEntry{ + name: "test1", + environment: "env2", + date: simpleDate(2000, 1), + status: "Passed", + } + entryE2T2 := testEntry{ + name: "test2", + environment: "env2", + date: simpleDate(2000, 1), + status: "Passed", + } + actual := splitData([]testEntry{entryE1T1_1, entryE1T1_2, entryE1T2, entryE2T1, entryE2T2}) + expected := splitEntryMap{ + "env1": { + "test1": {entryE1T1_1, entryE1T1_2}, + "test2": {entryE1T2}, + }, + "env2": { + "test1": {entryE2T1}, + "test2": {entryE2T2}, + }, + } + + compareSplitData(t, actual, expected) +} + +func TestFilterRecentEntries(t *testing.T) { + entryE1T1R1, entryE1T1R2, entryE1T1R3, entryE1T1O1, entryE1T1O2 := testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 4), + status: "Passed", + }, testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 3), + status: "Passed", + }, testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 3), + status: "Passed", + }, testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 2), + status: "Passed", + }, testEntry{ + name: "test1", + environment: "env1", + date: simpleDate(2000, 1), + status: "Passed", + } + entryE1T2R1, entryE1T2R2, entryE1T2O1 := testEntry{ + name: "test2", + environment: "env1", + date: simpleDate(2001, 3), + status: "Passed", + }, testEntry{ + name: "test2", + environment: "env1", + date: simpleDate(2001, 2), + status: "Passed", + }, testEntry{ + name: "test2", + environment: "env1", + date: simpleDate(2001, 1), + status: "Passed", + } + entryE2T2R1, entryE2T2R2, entryE2T2O1 := testEntry{ + name: "test2", + environment: "env2", + date: simpleDate(2003, 3), + status: "Passed", + }, testEntry{ + name: "test2", + environment: "env2", + date: simpleDate(2003, 2), + status: "Passed", + }, testEntry{ + name: "test2", + environment: "env2", + date: simpleDate(2003, 1), + status: "Passed", + } + + actualData := filterRecentEntries(splitEntryMap{ + "env1": { + "test1": { + entryE1T1R1, + entryE1T1R2, + entryE1T1R3, + entryE1T1O1, + entryE1T1O2, + }, + "test2": { + entryE1T2R1, + entryE1T2R2, + entryE1T2O1, + }, + }, + "env2": { + "test2": { + entryE2T2R1, + entryE2T2R2, + entryE2T2O1, + }, + }, + }, 2) + + expectedData := splitEntryMap{ + "env1": { + "test1": { + entryE1T1R1, + entryE1T1R2, + entryE1T1R3, + }, + "test2": { + entryE1T2R1, + entryE1T2R2, + }, + }, + "env2": { + "test2": { + entryE2T2R1, + entryE2T2R2, + }, + }, + } + + compareSplitData(t, actualData, expectedData) +} + +func compareValues(t *testing.T, actualValues, expectedValues map[string]map[string]float32) { + for environment, actualTests := range actualValues { + expectedTests, environmentOk := expectedValues[environment] + if !environmentOk { + t.Errorf("Unexpected environment %s in actual", environment) + continue + } + + for test, actualValue := range actualTests { + expectedValue, testOk := expectedTests[test] + if !testOk { + t.Errorf("Unexpected test %s (in environment %s) in actual", test, environment) + continue + } + + if actualValue != expectedValue { + t.Errorf("Wrong value at environment %s and test %s. Expected: %v, Actual: %v", environment, test, expectedValue, actualValue) + } + } + + for test := range expectedTests { + _, testOk := actualTests[test] + if !testOk { + t.Errorf("Missing expected test %s (in environment %s) in actual", test, environment) + } + } + } + + for environment := range expectedValues { + _, environmentOk := actualValues[environment] + if !environmentOk { + t.Errorf("Missing expected environment %s in actual", environment) + } + } +} + +func TestComputeFlakeRates(t *testing.T) { + actualData := computeFlakeRates(splitEntryMap{ + "env1": { + "test1": { + { + name: "test1", + environment: "env1", + date: simpleDate(2000, 4), + status: "Passed", + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 3), + status: "Passed", + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 3), + status: "Passed", + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 2), + status: "Passed", + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 1), + status: "Failed", + }, + }, + "test2": { + { + name: "test2", + environment: "env1", + date: simpleDate(2001, 3), + status: "Failed", + }, { + name: "test2", + environment: "env1", + date: simpleDate(2001, 2), + status: "Failed", + }, { + name: "test2", + environment: "env1", + date: simpleDate(2001, 1), + status: "Failed", + }, + }, + }, + "env2": { + "test2": { + { + name: "test2", + environment: "env2", + date: simpleDate(2003, 3), + status: "Passed", + }, testEntry{ + name: "test2", + environment: "env2", + date: simpleDate(2003, 2), + status: "Failed", + }, + }, + }, + }) + + expectedData := map[string]map[string]float32{ + "env1": { + "test1": 0.2, + "test2": 1, + }, + "env2": { + "test2": 0.5, + }, + } + + compareValues(t, actualData, expectedData) +} + +func TestComputeAverageDurations(t *testing.T) { + actualData := computeAverageDurations(splitEntryMap{ + "env1": { + "test1": { + { + name: "test1", + environment: "env1", + date: simpleDate(2000, 4), + status: "Passed", + duration: 1, + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 3), + status: "Passed", + duration: 2, + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 3), + status: "Passed", + duration: 3, + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 2), + status: "Passed", + duration: 3, + }, { + name: "test1", + environment: "env1", + date: simpleDate(2000, 1), + status: "Failed", + duration: 3, + }, + }, + "test2": { + { + name: "test2", + environment: "env1", + date: simpleDate(2001, 3), + status: "Failed", + duration: 1, + }, { + name: "test2", + environment: "env1", + date: simpleDate(2001, 2), + status: "Failed", + duration: 3, + }, { + name: "test2", + environment: "env1", + date: simpleDate(2001, 1), + status: "Failed", + duration: 3, + }, + }, + }, + "env2": { + "test2": { + { + name: "test2", + environment: "env2", + date: simpleDate(2003, 3), + status: "Passed", + duration: 0.5, + }, testEntry{ + name: "test2", + environment: "env2", + date: simpleDate(2003, 2), + status: "Failed", + duration: 1.5, + }, + }, + }, + }) + + expectedData := map[string]map[string]float32{ + "env1": { + "test1": float32(12) / float32(5), + "test2": float32(7) / float32(3), + }, + "env2": { + "test2": 1, + }, + } + + compareValues(t, actualData, expectedData) +} diff --git a/hack/jenkins/test-flake-chart/flake_chart.html b/hack/jenkins/test-flake-chart/flake_chart.html new file mode 100644 index 0000000000..55d1356300 --- /dev/null +++ b/hack/jenkins/test-flake-chart/flake_chart.html @@ -0,0 +1,25 @@ + + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/hack/jenkins/test-flake-chart/flake_chart.js b/hack/jenkins/test-flake-chart/flake_chart.js new file mode 100644 index 0000000000..ea7937d39d --- /dev/null +++ b/hack/jenkins/test-flake-chart/flake_chart.js @@ -0,0 +1,671 @@ + +// Displays an error message to the UI. Any previous message will be erased. +function displayError(message) { + // Clear the body of all children. + while (document.body.firstChild) { + document.body.removeChild(document.body.firstChild); + } + const element = document.createElement("p"); + element.innerText = "Error: " + message; + element.style.color = "red"; + element.style.fontFamily = "Arial"; + element.style.fontWeight = "bold"; + element.style.margin = "5rem"; + document.body.appendChild(element); +} + +// Creates a generator that reads the response body one line at a time. +async function* bodyByLinesIterator(response, updateProgress) { + const utf8Decoder = new TextDecoder('utf-8'); + const reader = response.body.getReader(); + + const re = /\n|\r|\r\n/gm; + let pendingText = ""; + + let readerDone = false; + while (!readerDone) { + // Read a chunk. + const { value: chunk, done } = await reader.read(); + readerDone = done; + if (!chunk) { + continue; + } + // Notify the listener of progress. + updateProgress(chunk.length); + const decodedChunk = utf8Decoder.decode(chunk); + + let startIndex = 0; + let result; + // Keep processing until there are no more new lines. + while ((result = re.exec(decodedChunk)) !== null) { + const text = decodedChunk.substring(startIndex, result.index); + startIndex = re.lastIndex; + + const line = pendingText + text; + pendingText = ""; + if (line !== "") { + yield line; + } + } + // Any text after the last new line is appended to any pending text. + pendingText += decodedChunk.substring(startIndex); + } + + // If there is any text remaining, return it. + if (pendingText !== "") { + yield pendingText; + } +} + +// Determines whether `str` matches at least one value in `enumObject`. +function isValidEnumValue(enumObject, str) { + for (const enumKey in enumObject) { + if (enumObject[enumKey] === str) { + return true; + } + } + return false; +} + +// Enum for test status. +const testStatus = { + PASSED: "Passed", + FAILED: "Failed", + SKIPPED: "Skipped" +} + +async function loadTestData() { + const response = await fetch("data.csv"); + if (!response.ok) { + const responseText = await response.text(); + throw `Failed to fetch data from GCS bucket. Error: ${responseText}`; + } + + const box = document.createElement("div"); + box.style.width = "100%"; + const innerBox = document.createElement("div"); + innerBox.style.margin = "5rem"; + box.appendChild(innerBox); + const progressBarPrompt = document.createElement("h1"); + progressBarPrompt.style.fontFamily = "Arial"; + progressBarPrompt.style.textAlign = "center"; + progressBarPrompt.innerText = "Downloading data..."; + innerBox.appendChild(progressBarPrompt); + const progressBar = document.createElement("progress"); + progressBar.setAttribute("max", Number(response.headers.get('Content-Length'))); + progressBar.style.width = "100%"; + innerBox.appendChild(progressBar); + document.body.appendChild(box); + + let readBytes = 0; + const lines = bodyByLinesIterator(response, value => { + readBytes += value; + progressBar.setAttribute("value", readBytes); + }); + // Consume the header to ensure the data has the right number of fields. + const header = (await lines.next()).value; + if (header.split(",").length != 9) { + document.body.removeChild(box); + throw `Fetched CSV data contains wrong number of fields. Expected: 9. Actual Header: "${header}"`; + } + + const testData = []; + let lineData = ["", "", "", "", "", "", "", "", ""]; + for await (const line of lines) { + let splitLine = line.split(","); + if (splitLine.length != 9) { + console.warn(`Found line with wrong number of fields. Actual: ${splitLine.length} Expected: 9. Line: "${line}"`); + continue; + } + splitLine = splitLine.map((value, index) => value === "" ? lineData[index] : value); + lineData = splitLine; + if (!isValidEnumValue(testStatus, splitLine[4])) { + console.warn(`Invalid test status provided. Actual: ${splitLine[4]} Expected: One of ${Object.values(testStatus).join(", ")}`); + continue; + } + // Skip unsafe dates. + if (splitLine[1] === "0001-01-01") { + continue; + } + testData.push({ + commit: splitLine[0], + date: new Date(splitLine[1]), + environment: splitLine[2], + name: splitLine[3], + status: splitLine[4], + duration: Number(splitLine[5]), + rootJob: splitLine[6], + testCount: Number(splitLine[7]), + totalDuration: Number(splitLine[8]), + }); + } + document.body.removeChild(box); + if (testData.length == 0) { + throw "Fetched CSV data is empty or poorly formatted."; + } + return testData; +} + +Array.prototype.sum = function() { + return this.reduce((sum, value) => sum + value, 0); +}; + +// Computes the average of an array of numbers. +Array.prototype.average = function () { + return this.length === 0 ? 0 : (this.sum() / this.length); +}; + +// Groups array elements by keys obtained through `keyGetter`. +Array.prototype.groupBy = function (keyGetter) { + return Array.from(this.reduce((mapCollection, element) => { + const key = keyGetter(element); + if (mapCollection.has(key)) { + mapCollection.get(key).push(element); + } else { + mapCollection.set(key, [element]); + } + return mapCollection; + }, new Map()).values()); +}; + +Array.prototype.oneOfEach = function (keyGetter) { + return Array.from(new Map(this.map(value => [ keyGetter(value), value ])).values()); +} + +// Parse URL search `query` into [{key, value}]. +function parseUrlQuery(query) { + if (query[0] === '?') { + query = query.substring(1); + } + return Object.fromEntries((query === "" ? [] : query.split("&")).map(element => { + const keyValue = element.split("="); + return [unescape(keyValue[0]), unescape(keyValue[1])]; + })); +} + +// Takes a set of test runs (all of the same test), and aggregates them into one element per date. +function aggregateRuns(testRuns) { + return testRuns + // Group runs by the date it ran. + .groupBy(run => run.date.getTime()) + // Sort by run date, past to future. + .sort((a, b) => a[0].date - b[0].date) + // Map each group to all variables need to format the rows. + .map(tests => ({ + date: tests[0].date, // Get one of the dates from the tests (which will all be the same). + flakeRate: tests.map(test => test.status === testStatus.FAILED ? 100 : 0).average(), // Compute average of runs where FAILED counts as 100%. + duration: tests.map(test => test.duration).average(), // Compute average duration of runs. + jobs: tests.map(test => ({ // Take all job ids, statuses, and durations of tests in this group. + id: test.rootJob, + status: test.status, + duration: test.duration + })) + })); +} + +// Takes a set of test runs (all of the same test), and aggregates them into one element per week. +function aggregateWeeklyRuns(testRuns, weekDates) { + return testRuns + // Group runs by the date it ran. + .groupBy(run => weekDates.findRounded(run.date).getTime()) + // Sort by run date, past to future. + .sort((a, b) => weekDates.findRounded(a[0].date) - weekDates.findRounded(b[0].date)) + // Map each group to all variables need to format the rows. + .map(tests => ({ + date: weekDates.findRounded(tests[0].date), // Get one of the dates from the tests, and use it to get the rounded time (which will all be the same). + flakeRate: tests.map(test => test.status === testStatus.FAILED ? 100 : 0).average(), // Compute average of runs where FAILED counts as 100%. + duration: tests.map(test => test.duration).average(), // Compute average duration of runs. + jobs: tests.map(test => ({ // Take all job ids, statuses, and durations of tests in this group. + id: test.rootJob, + status: test.status, + duration: test.duration + })) + })); +} + +const jobIdToLink = (jobId, environment) => `https://storage.googleapis.com/minikube-builds/logs/master/${jobId}/${environment}.html`; + +function displayTestAndEnvironmentChart(testData, testName, environmentName) { + const testRuns = testData + // Filter to only contain unskipped runs of the requested test and requested environment. + .filter(test => test.name === testName && test.environment === environmentName && test.status !== testStatus.SKIPPED); + const chartsContainer = document.getElementById('chart_div'); + { + const data = new google.visualization.DataTable(); + data.addColumn('date', 'Date'); + data.addColumn('number', 'Flake Percentage'); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + data.addColumn('number', 'Duration'); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + + data.addRows( + aggregateRuns(testRuns) + .map(groupData => [ + groupData.date, + groupData.flakeRate, + `
+ ${groupData.date.toString()}
+ Flake Percentage: ${groupData.flakeRate.toFixed(2)}%
+ Jobs:
+ ${groupData.jobs.map(({ id, status }) => ` - ${id} (${status})`).join("
")} +
`, + groupData.duration, + `
+ ${groupData.date.toString()}
+ Average Duration: ${groupData.duration.toFixed(2)}s
+ Jobs:
+ ${groupData.jobs.map(({ id, duration }) => ` - ${id} (${duration}s)`).join("
")} +
`, + ]) + ); + + const options = { + title: `Flake rate and duration by day of ${testName} on ${environmentName}`, + width: window.innerWidth, + height: window.innerHeight, + pointSize: 10, + pointShape: "circle", + series: { + 0: { targetAxisIndex: 0 }, + 1: { targetAxisIndex: 1 }, + }, + vAxes: { + 0: { title: "Flake rate", minValue: 0, maxValue: 100 }, + 1: { title: "Duration (seconds)" }, + }, + colors: ['#dc3912', '#3366cc'], + tooltip: { trigger: "selection", isHtml: true } + }; + const flakeRateContainer = document.createElement("div"); + flakeRateContainer.style.width = "100vw"; + flakeRateContainer.style.height = "100vh"; + chartsContainer.appendChild(flakeRateContainer); + const chart = new google.visualization.LineChart(flakeRateContainer); + chart.draw(data, options); + } + { + const dates = testRuns.map(run => run.date.getTime()); + const startDate = new Date(Math.min(...dates)); + const endDate = new Date(Math.max(...dates)); + + const weekDates = []; + let currentDate = startDate; + while (currentDate < endDate) { + weekDates.push(currentDate); + currentDate = new Date(currentDate); + currentDate.setDate(currentDate.getDate() + 7); + } + weekDates.push(currentDate); + weekDates.findRounded = function (value) { + let index = this.findIndex(v => value < v); + if (index == 0) { + return this[index]; + } + if (index < 0) { + index = this.length; + } + return this[index - 1]; + } + + const data = new google.visualization.DataTable(); + data.addColumn('date', 'Date'); + data.addColumn('number', 'Flake Percentage'); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + data.addColumn('number', 'Duration'); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + + data.addRows( + aggregateWeeklyRuns(testRuns, weekDates) + .map(groupData => [ + groupData.date, + groupData.flakeRate, + `
+ ${groupData.date.toString()}
+ Flake Percentage: ${groupData.flakeRate.toFixed(2)}%
+ Jobs:
+ ${groupData.jobs.map(({ id, status }) => ` - ${id} (${status})`).join("
")} +
`, + groupData.duration, + `
+ ${groupData.date.toString()}
+ Average Duration: ${groupData.duration.toFixed(2)}s
+ Jobs:
+ ${groupData.jobs.map(({ id, duration }) => ` - ${id} (${duration}s)`).join("
")} +
`, + ]) + ); + + const options = { + title: `Flake rate and duration by week of ${testName} on ${environmentName}`, + width: window.innerWidth, + height: window.innerHeight, + pointSize: 10, + pointShape: "circle", + series: { + 0: { targetAxisIndex: 0 }, + 1: { targetAxisIndex: 1 }, + }, + vAxes: { + 0: { title: "Flake rate", minValue: 0, maxValue: 100 }, + 1: { title: "Duration (seconds)" }, + }, + colors: ['#dc3912', '#3366cc'], + tooltip: { trigger: "selection", isHtml: true } + }; + const flakeRateContainer = document.createElement("div"); + flakeRateContainer.style.width = "100vw"; + flakeRateContainer.style.height = "100vh"; + chartsContainer.appendChild(flakeRateContainer); + const chart = new google.visualization.LineChart(flakeRateContainer); + chart.draw(data, options); + } +} + +function createRecentFlakePercentageTable(recentFlakePercentage, previousFlakePercentageMap, environmentName) { + const createCell = (elementType, text) => { + const element = document.createElement(elementType); + element.innerHTML = text; + return element; + } + + const table = document.createElement("table"); + const tableHeaderRow = document.createElement("tr"); + tableHeaderRow.appendChild(createCell("th", "Rank")); + tableHeaderRow.appendChild(createCell("th", "Test Name")).style.textAlign = "left"; + tableHeaderRow.appendChild(createCell("th", "Recent Flake Percentage")); + tableHeaderRow.appendChild(createCell("th", "Growth (since last 15 days)")); + table.appendChild(tableHeaderRow); + const tableBody = document.createElement("tbody"); + for (let i = 0; i < recentFlakePercentage.length; i++) { + const {testName, flakeRate} = recentFlakePercentage[i]; + const row = document.createElement("tr"); + row.appendChild(createCell("td", "" + (i + 1))).style.textAlign = "center"; + row.appendChild(createCell("td", `${testName}`)); + row.appendChild(createCell("td", `${flakeRate.toFixed(2)}%`)).style.textAlign = "right"; + const growth = previousFlakePercentageMap.has(testName) ? + flakeRate - previousFlakePercentageMap.get(testName) : 0; + row.appendChild(createCell("td", ` 0 ? "red" : "green")}">${growth > 0 ? '+' + growth.toFixed(2) : growth.toFixed(2)}%`)); + tableBody.appendChild(row); + } + table.appendChild(tableBody); + new Tablesort(table); + return table; +} + +function displayEnvironmentChart(testData, environmentName) { + // Number of days to use to look for "flaky-est" tests. + const dateRange = 15; + // Number of tests to display in chart. + const topFlakes = 10; + + testData = testData + // Filter to only contain unskipped runs of the requested environment. + .filter(test => test.environment === environmentName && test.status !== testStatus.SKIPPED); + + const testRuns = testData + .groupBy(test => test.name); + + const aggregatedRuns = new Map(testRuns.map(test => [ + test[0].name, + new Map(aggregateRuns(test) + .map(runDate => [ runDate.date.getTime(), runDate ]))])); + const uniqueDates = new Set(); + for (const [_, runDateMap] of aggregatedRuns) { + for (const [dateTime, _] of runDateMap) { + uniqueDates.add(dateTime); + } + } + const orderedDates = Array.from(uniqueDates).sort(); + const recentDates = orderedDates.slice(-dateRange); + const previousDates = orderedDates.slice(-2 * dateRange, -dateRange); + + const computeFlakePercentage = (runs, dates) => Array.from(runs).map(([testName, data]) => { + const {flakeCount, totalCount} = dates.map(date => { + const dateInfo = data.get(date); + return dateInfo === undefined ? null : { + flakeRate: dateInfo.flakeRate, + runs: dateInfo.jobs.length + }; + }).filter(dateInfo => dateInfo != null) + .reduce(({flakeCount, totalCount}, {flakeRate, runs}) => ({ + flakeCount: flakeRate * runs + flakeCount, + totalCount: runs + totalCount + }), {flakeCount: 0, totalCount: 0}); + return { + testName, + flakeRate: totalCount === 0 ? 0 : flakeCount / totalCount, + }; + }); + + const recentFlakePercentage = computeFlakePercentage(aggregatedRuns, recentDates) + .sort((a, b) => b.flakeRate - a.flakeRate); + const previousFlakePercentageMap = new Map( + computeFlakePercentage(aggregatedRuns, previousDates) + .map(({testName, flakeRate}) => [testName, flakeRate])); + + const recentTopFlakes = recentFlakePercentage + .slice(0, topFlakes) + .map(({testName}) => testName); + + const chartsContainer = document.getElementById('chart_div'); + { + const data = new google.visualization.DataTable(); + data.addColumn('date', 'Date'); + for (const name of recentTopFlakes) { + data.addColumn('number', `Flake Percentage - ${name}`); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + } + data.addRows( + orderedDates.map(dateTime => [new Date(dateTime)].concat(recentTopFlakes.map(name => { + const data = aggregatedRuns.get(name).get(dateTime); + return data !== undefined ? [ + data.flakeRate, + `
+ ${name}
+ ${data.date.toString()}
+ Flake Percentage: ${data.flakeRate.toFixed(2)}%
+ Jobs:
+ ${data.jobs.map(({ id, status }) => ` - ${id} (${status})`).join("
")} +
` + ] : [null, null]; + })).flat()) + ); + const options = { + title: `Flake rate by day of top ${topFlakes} of recent test flakiness (past ${dateRange} days) on ${environmentName}`, + width: window.innerWidth, + height: window.innerHeight, + pointSize: 10, + pointShape: "circle", + vAxes: { + 0: { title: "Flake rate", minValue: 0, maxValue: 100 }, + }, + tooltip: { trigger: "selection", isHtml: true } + }; + const flakeRateContainer = document.createElement("div"); + flakeRateContainer.style.width = "100vw"; + flakeRateContainer.style.height = "100vh"; + chartsContainer.appendChild(flakeRateContainer); + const chart = new google.visualization.LineChart(flakeRateContainer); + chart.draw(data, options); + } + { + const dates = testData.map(run => run.date.getTime()); + const startDate = new Date(Math.min(...dates)); + const endDate = new Date(Math.max(...dates)); + + const weekDates = []; + let currentDate = startDate; + while (currentDate < endDate) { + weekDates.push(currentDate); + currentDate = new Date(currentDate); + currentDate.setDate(currentDate.getDate() + 7); + } + weekDates.push(currentDate); + weekDates.findRounded = function (value) { + let index = this.findIndex(v => value < v); + if (index == 0) { + return this[index]; + } + if (index < 0) { + index = this.length; + } + return this[index - 1]; + } + const aggregatedWeeklyRuns = new Map(testRuns.map(test => [ + test[0].name, + new Map(aggregateWeeklyRuns(test, weekDates) + .map(runDate => [ weekDates.findRounded(runDate.date).getTime(), runDate ]))])); + const uniqueWeekDates = new Set(); + for (const [_, runDateMap] of aggregatedWeeklyRuns) { + for (const [dateTime, _] of runDateMap) { + uniqueWeekDates.add(dateTime); + } + } + const orderedWeekDates = Array.from(uniqueWeekDates).sort(); + const recentWeeklyTopFlakes = computeFlakePercentage(aggregatedWeeklyRuns, [orderedWeekDates[orderedWeekDates.length - 1]]) + .sort((a, b) => b.flakeRate - a.flakeRate) + .slice(0, topFlakes) + .map(({testName}) => testName); + const data = new google.visualization.DataTable(); + data.addColumn('date', 'Date'); + for (const name of recentWeeklyTopFlakes) { + data.addColumn('number', `Flake Percentage - ${name}`); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + } + data.addRows( + orderedWeekDates.map(dateTime => [new Date(dateTime)].concat(recentTopFlakes.map(name => { + const data = aggregatedWeeklyRuns.get(name).get(dateTime); + return data !== undefined ? [ + data.flakeRate, + `
+ ${name}
+ ${data.date.toString()}
+ Flake Percentage: ${data.flakeRate.toFixed(2)}%
+ Jobs:
+ ${data.jobs.map(({ id, status }) => ` - ${id} (${status})`).join("
")} +
` + ] : [null, null]; + })).flat()) + ); + const options = { + title: `Flake rate by week of top ${topFlakes} of recent test flakiness (past week) on ${environmentName}`, + width: window.innerWidth, + height: window.innerHeight, + pointSize: 10, + pointShape: "circle", + vAxes: { + 0: { title: "Flake rate", minValue: 0, maxValue: 100 }, + }, + tooltip: { trigger: "selection", isHtml: true } + }; + const flakeRateContainer = document.createElement("div"); + flakeRateContainer.style.width = "100vw"; + flakeRateContainer.style.height = "100vh"; + chartsContainer.appendChild(flakeRateContainer); + const chart = new google.visualization.LineChart(flakeRateContainer); + chart.draw(data, options); + } + { + const jobData = + testData + .groupBy(run => run.date.getTime()) + .map(runDate => ({ + date: runDate[0].date, + runInfo: runDate + .oneOfEach(run => run.rootJob) + .map(run => ({ + commit: run.commit, + rootJob: run.rootJob, + testCount: run.testCount, + totalDuration: run.totalDuration + })) + })) + .sort((a, b) => a.date - b.date) + .map(({date, runInfo}) => ({ + date, + runInfo, + testCount: runInfo.map(job => job.testCount).average(), + totalDuration: runInfo.map(job => job.totalDuration).average(), + })); + + const data = new google.visualization.DataTable(); + data.addColumn('date', 'Date'); + data.addColumn('number', 'Test Count'); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + data.addColumn('number', 'Duration'); + data.addColumn({ type: 'string', role: 'tooltip', 'p': { 'html': true } }); + data.addRows( + jobData.map(dateInfo => [ + dateInfo.date, + dateInfo.testCount, + `
+ ${dateInfo.date.toString()}
+ Test Count (averaged): ${+dateInfo.testCount.toFixed(2)}
+ Jobs:
+ ${dateInfo.runInfo.map(job => ` - ${job.rootJob} Test count: ${job.testCount}`).join("
")} +
`, + dateInfo.totalDuration, + `
+ ${dateInfo.date.toString()}
+ Total Duration (averaged): ${+dateInfo.totalDuration.toFixed(2)}
+ Jobs:
+ ${dateInfo.runInfo.map(job => ` - ${job.rootJob} Total Duration: ${+job.totalDuration.toFixed(2)}s`).join("
")} +
`, + ])); + const options = { + title: `Test count and total duration by day on ${environmentName}`, + width: window.innerWidth, + height: window.innerHeight, + pointSize: 10, + pointShape: "circle", + series: { + 0: { targetAxisIndex: 0 }, + 1: { targetAxisIndex: 1 }, + }, + vAxes: { + 0: { title: "Test Count", minValue: 0 }, + 1: { title: "Duration (seconds)", minValue: 0 }, + }, + tooltip: { trigger: "selection", isHtml: true } + }; + const testCountContainer = document.createElement("div"); + testCountContainer.style.width = "100vw"; + testCountContainer.style.height = "100vh"; + chartsContainer.appendChild(testCountContainer); + const chart = new google.visualization.LineChart(testCountContainer); + chart.draw(data, options); + } + + document.body.appendChild( + createRecentFlakePercentageTable( + recentFlakePercentage, + previousFlakePercentageMap, + environmentName)); +} + +async function init() { + google.charts.load('current', { 'packages': ['corechart'] }); + let testData; + try { + // Wait for Google Charts to load, and for test data to load. + // Only store the test data (at index 1) into `testData`. + testData = (await Promise.all([ + new Promise(resolve => google.charts.setOnLoadCallback(resolve)), + loadTestData() + ]))[1]; + } catch (err) { + displayError(err); + return; + } + + const query = parseUrlQuery(window.location.search); + const desiredTest = query.test, desiredEnvironment = query.env || ""; + + if (desiredTest === undefined) { + displayEnvironmentChart(testData, desiredEnvironment); + } else { + displayTestAndEnvironmentChart(testData, desiredTest, desiredEnvironment); + } +} + +init(); diff --git a/hack/jenkins/test-flake-chart/optimize_data.sh b/hack/jenkins/test-flake-chart/optimize_data.sh new file mode 100755 index 0000000000..641dd6905b --- /dev/null +++ b/hack/jenkins/test-flake-chart/optimize_data.sh @@ -0,0 +1,31 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Takes a CSV file through stdin, compresses it and writes it to stdout. +# Example usage: < data.csv ./optimize_data.sh > data_optimized.csv + +set -eu -o pipefail + +# Take input CSV. For each field, if it is the same as the previous row, replace it with an empty string. +# This is to compress the input CSV. Example: +# Input: +# hash,2021-06-10,Docker_Linux,TestFunctional,Passed,0.5 +# hash,2021-06-10,Docker_Linux_containerd,TestFunctional,Failed,0.6 +# +# Output: +# hash,2021-06-10,Docker_Linux,TestFunctional,Passed,0.5 +# ,,DockerLinux_containerd,,Failed,0.6 +awk -F, 'BEGIN {OFS = FS} { for(i=1; i<=NF; i++) { if($i == j[i]) { $i = ""; } else { j[i] = $i; } } printf "%s\n",$0 }' diff --git a/hack/jenkins/test-flake-chart/process_data.sh b/hack/jenkins/test-flake-chart/process_data.sh new file mode 100755 index 0000000000..926c392d19 --- /dev/null +++ b/hack/jenkins/test-flake-chart/process_data.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Takes a series of gopogh summary jsons, and formats them into a CSV file with +# a row for each test. +# Example usage: cat gopogh_1.json gopogh_2.json gopogh_3.json | ./process_data.sh + +set -eu -o pipefail + +# Print header. +printf "Commit Hash,Test Date,Environment,Test,Status,Duration,Root Job,Total Tests Ran,Total Duration\n" + +# Turn each test in each summary file to a CSV line containing its commit hash, +# date, environment, test, status, duration, root job id, total tests ran on this run, and total duration of this run. +# Example line: +# 247982745892,2021-06-10,Docker_Linux,TestFunctional,Passed,0.5,some_identifier,251,2303.48 +jq -r '((.PassedTests[]? as $name | { + commit: (.Detail.Details | split(":") | .[0]), + date: (.Detail.Details | split(":") | .[1] | if . then . else "0001-01-01" end), + environment: .Detail.Name, + test: $name, + duration: .Durations[$name], + status: "Passed", + rootJob: (.Detail.Details | split(":") | .[2] | if . then . else "0" end), + totalTestsRan: (.NumberOfPass + .NumberOfFail), + totalDuration: (.TotalDuration | if . then . else 0 end)}), + (.FailedTests[]? as $name | { + commit: (.Detail.Details | split(":") | .[0]), + date: (.Detail.Details | split(":") | .[1] | if . then . else "0001-01-01" end), + environment: .Detail.Name, + test: $name, + duration: .Durations[$name], + status: "Failed", + rootJob: (.Detail.Details | split(":") | .[2] | if . then . else "0" end), + totalTestsRan: (.NumberOfPass + .NumberOfFail), + totalDuration: (.TotalDuration | if . then . else 0 end)}), + (.SkippedTests[]? as $name | { + commit: (.Detail.Details | split(":") | .[0]), + date: (.Detail.Details | split(":") | .[1] | if . then . else "0001-01-01" end), + environment: .Detail.Name, + test: $name, + duration: 0, + status: "Skipped", + rootJob: (.Detail.Details | split(":") | .[2] | if . then . else "0" end), + totalTestsRan: (.NumberOfPass + .NumberOfFail), + totalDuration: (.TotalDuration | if . then . else 0 end)})) + | .commit + "," + + .date + "," + + .environment + "," + + .test + "," + + .status + "," + + (.duration | tostring) + "," + + .rootJob + "," + + (.totalTestsRan | tostring) + "," + + (.totalDuration | tostring)' diff --git a/hack/jenkins/test-flake-chart/report_flakes.sh b/hack/jenkins/test-flake-chart/report_flakes.sh new file mode 100755 index 0000000000..c901bf1f3e --- /dev/null +++ b/hack/jenkins/test-flake-chart/report_flakes.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Creates a comment on the provided PR number, using the provided gopogh summary +# to list out the flake rates of all failing tests. +# Example usage: ./report_flakes.sh 11602 gopogh.json Docker_Linux + +set -eu -o pipefail + +if [ "$#" -ne 3 ]; then + echo "Wrong number of arguments. Usage: report_flakes.sh " 1>&2 + exit 1 +fi + +PR_NUMBER=$1 +ROOT_JOB=$2 +ENVIRONMENT_LIST=$3 + +# To prevent having a super-long comment, add a maximum number of tests to report. +MAX_REPORTED_TESTS=30 + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +TMP_DATA=$(mktemp) +# 1) Process the ENVIRONMENT_LIST to turn them into valid GCS URLs. +# 2) Check to see if the files are present. Ignore any missing files. +# 3) Cat the gopogh summaries together. +# 4) Process the data in each gopogh summary. +# 5) Filter tests to only include failed tests (and only get their names and environment). +# 6) Sort by environment, then test name. +# 7) Store in file $TMP_DATA. +< "${ENVIRONMENT_LIST}" sed -r "s|^|gs://minikube-builds/logs/${PR_NUMBER}/${ROOT_JOB}/|; s|$|_summary.json|" \ + | (xargs gsutil ls || true) \ + | xargs gsutil cat \ + | "$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]*,[a-zA-Z/_0-9-]*,[0-9]*,[.0-9]*|\1:\2|p" \ + | sort \ + > "$TMP_DATA" + +# Download the precomputed flake rates from the GCS bucket into file $TMP_FLAKE_RATES. +TMP_FLAKE_RATES=$(mktemp) +gsutil cp gs://minikube-flake-rate/flake_rates.csv "$TMP_FLAKE_RATES" + +TMP_FAILED_RATES="$TMP_FLAKE_RATES\_filtered" +# 1) Parse the flake rates to only include the environment, test name, and flake rates. +# 2) Sort the flake rates based on environment+test name. +# 3) Join the flake rates with the failing tests to only get flake rates of failing tests. +# 4) Sort failed test flake rates based on the flakiness of that test - stable tests should be first on the list. +# 5) Store in file $TMP_FAILED_RATES. +< "$TMP_FLAKE_RATES" sed -n -r -e "s|([a-zA-Z0-9_-]*),([a-zA-Z/0-9_-]*),([.0-9]*),[.0-9]*|\1:\2,\3|p" \ + | sort -t, -k1,1 \ + | join -t , -j 1 "$TMP_DATA" - \ + | sort -g -t, -k2,2 \ + > "$TMP_FAILED_RATES" + +FAILED_RATES_LINES=$(wc -l < "$TMP_FAILED_RATES") +if [[ "$FAILED_RATES_LINES" -eq 0 ]]; then + echo "No failed tests! Aborting without commenting..." 1>&2 + exit 0 +fi + +# Create the comment template. +TMP_COMMENT=$(mktemp) +printf "These are the flake rates of all failed tests.\n|Environment|Failed Tests|Flake Rate (%%)|\n|---|---|---|\n" > "$TMP_COMMENT" + +# Create variables to use for sed command. +ENV_CHART_LINK_FORMAT="https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=\1" +TEST_CHART_LINK_FORMAT="${ENV_CHART_LINK_FORMAT}\&test=\2" +TEST_GOPOGH_LINK_FORMAT="https://storage.googleapis.com/minikube-builds/logs/${PR_NUMBER}/${ROOT_JOB}/\1.html#fail_\2" +# 1) Get the first $MAX_REPORTED_TESTS lines. +# 2) Print a row in the table with the environment, test name, flake rate, and a link to the flake chart for that test. +# 3) Append these rows to file $TMP_COMMENT. +< "$TMP_FAILED_RATES" head -n $MAX_REPORTED_TESTS \ + | sed -n -r -e "s|([a-zA-Z\/0-9_-]*):([a-zA-Z\/0-9_-]*),([.0-9]*)|\|[\1](${ENV_CHART_LINK_FORMAT})\|\2 ([gopogh](${TEST_GOPOGH_LINK_FORMAT}))\|\3 ([chart](${TEST_CHART_LINK_FORMAT}))\||p" \ + >> "$TMP_COMMENT" + +# If there are too many failing tests, add an extra row explaining this, and a message after the table. +if [[ "$FAILED_RATES_LINES" -gt 30 ]]; then + printf "|More tests...|Continued...|\n\nToo many tests failed - See test logs for more details." >> "$TMP_COMMENT" +fi + +printf "\n\nTo see the flake rates of all tests by environment, click [here](https://minikube.sigs.k8s.io/docs/contrib/test_flakes/)." >> "$TMP_COMMENT" + +# install gh if not present +"$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 new file mode 100644 index 0000000000..9460056506 --- /dev/null +++ b/hack/jenkins/test-flake-chart/sync_tests.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This script is called once per integration test. If all integration tests that +# have registered themselves in the started environment list have also +# registered themselves in the finished environment list, this script reports +# flakes or uploads flakes to flake data. +# +# This script expects the following env variables: +# MINIKUBE_LOCATION: The Github location being run on (e.g. master, 11000). +# COMMIT: Commit hash the tests ran on. +# ROOT_JOB_ID: Job ID to use for synchronization. + +set -o pipefail + +BUCKET_PATH="gs://minikube-builds/logs/${MINIKUBE_LOCATION}/${ROOT_JOB_ID}" +STARTED_LIST=$(gsutil cat "${BUCKET_PATH}/started_environments.txt" | sort | uniq) + +if [ $? -ne 0 ]; then + echo "Unable to read environment list. Likely being run before all tests are ready or after tests have already been uploaded." 1>&2 + exit 0 +fi + +set -eu -o pipefail + +FINISHED_LIST_REMOTE="${BUCKET_PATH}/finished_environments.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. 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}" +gsutil rm "${APPEND_TMP}" + +FINISHED_LIST=$(mktemp) +gsutil cat "${FINISHED_LIST_REMOTE}"\ + | sort\ + | uniq > "${FINISHED_LIST}" + +STARTED_COUNT=$(echo "${STARTED_LIST}" | wc -l) +FINISHED_LIST_JOINED=$(\ + echo "${STARTED_LIST}"\ + | join - "${FINISHED_LIST}") +FINISHED_COUNT=$(\ + echo "${FINISHED_LIST_JOINED}"\ + | wc -l) + +if [ ${STARTED_COUNT} -ne ${FINISHED_COUNT} ]; then + echo "Started environments are not all finished! Started: ${STARTED_LIST}, Finished: $(cat ${FINISHED_LIST}))" + exit 0 +fi + +# Prevent other invocations of this script from uploading the same thing multiple times. +gsutil rm "${BUCKET_PATH}/started_environments.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 ) + +# Ensure jq is installed on this machine. +sudo apt-get install jq -y + +if [[ "${MINIKUBE_LOCATION}" == "master" ]]; then + for ENVIRONMENT in ${STARTED_LIST}; do + SUMMARY="${BUCKET_PATH}/${ENVIRONMENT}_summary.json" + "${DIR}/upload_tests.sh" "${SUMMARY}" || true + done +else + "${DIR}/report_flakes.sh" "${MINIKUBE_LOCATION}" "${ROOT_JOB_ID}" "${FINISHED_LIST}" +fi + +gsutil rm "${BUCKET_PATH}/finished_environments.txt" +rm "${FINISHED_LIST}" diff --git a/hack/jenkins/test-flake-chart/upload_tests.sh b/hack/jenkins/test-flake-chart/upload_tests.sh new file mode 100755 index 0000000000..6fb79cf863 --- /dev/null +++ b/hack/jenkins/test-flake-chart/upload_tests.sh @@ -0,0 +1,44 @@ +#!/bin/bash + +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Takes a gopogh summary in a GCS bucket, extracts test data as a CSV and +# appends to the existing CSV data in the flake rate GCS bucket. +# Example usage: ./upload_tests.sh gs://some-bucket/gopogh_summary.json + +set -eu -o pipefail + +if [ "$#" -ne 1 ]; then + echo "Wrong number of arguments. Usage: upload_tests.sh " 1>&2 + exit 1 +fi + +TMP_DATA=$(mktemp) + +# Use the gopogh summary, process it, optimize the data, remove the header, and store. +gsutil cat "$1" \ + | ./test-flake-chart/process_data.sh \ + | ./test-flake-chart/optimize_data.sh \ + | sed "1d" > $TMP_DATA + +GCS_TMP="gs://minikube-flake-rate/$(basename "$TMP_DATA")" + +# Copy data to append to GCS +gsutil cp $TMP_DATA $GCS_TMP +# Append data to existing data. +gsutil compose gs://minikube-flake-rate/data.csv $GCS_TMP gs://minikube-flake-rate/data.csv +# Clear all the temp stuff. +rm $TMP_DATA +gsutil rm $GCS_TMP diff --git a/hack/jenkins/upload_integration_report.sh b/hack/jenkins/upload_integration_report.sh index ba676dff1a..a182078287 100644 --- a/hack/jenkins/upload_integration_report.sh +++ b/hack/jenkins/upload_integration_report.sh @@ -24,11 +24,9 @@ set -x # upload results to GCS -if [[ -z "${FILE_NAME}" ]]; then - FILE_NAME=${UPSTREAM_JOB} -fi +UPSTREAM_JOB=${UPSTREAM_JOB%"_integration"} -JOB_GCS_BUCKET="minikube-builds/logs/${MINIKUBE_LOCATION}/${COMMIT:0:7}/${FILE_NAME}" +JOB_GCS_BUCKET="minikube-builds/logs/${MINIKUBE_LOCATION}/${ROOT_JOB_ID}/${UPSTREAM_JOB}" ARTIFACTS=artifacts/test_reports diff --git a/hack/jenkins/windows_integration_setup.ps1 b/hack/jenkins/windows_integration_setup.ps1 new file mode 100644 index 0000000000..e1e2912de4 --- /dev/null +++ b/hack/jenkins/windows_integration_setup.ps1 @@ -0,0 +1,27 @@ +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$test_home="$env:HOMEDRIVE$env:HOMEPATH\minikube-integration" +$env:KUBECONFIG="$test_home\kubeconfig" +$env:MINIKUBE_HOME="$test_home\.minikube" + +if ($driver -eq "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 new file mode 100644 index 0000000000..eb1c0d953f --- /dev/null +++ b/hack/jenkins/windows_integration_teardown.ps1 @@ -0,0 +1,25 @@ +# Copyright 2021 The Kubernetes Authors All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +$test_home="$env:HOMEDRIVE$env:HOMEPATH\minikube-integration" + +if ($driver -eq "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 475a95bed7..40729fb7d5 100644 --- a/hack/jenkins/windows_integration_test_docker.ps1 +++ b/hack/jenkins/windows_integration_test_docker.ps1 @@ -14,16 +14,14 @@ mkdir -p out -(New-Object Net.WebClient).DownloadFile("https://github.com/medyagh/gopogh/releases/download/v0.6.0/gopogh.exe", "C:\Go\bin\gopogh.exe") +# Docker's kubectl breaks things, and comes earlier in the path than the regular kubectl. So download the expected kubectl and replace Docker's version. (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/common.ps1 out/ $env:SHORT_COMMIT=$env:COMMIT.substring(0, 7) -$gcs_bucket="minikube-builds/logs/$env:MINIKUBE_LOCATION/$env:SHORT_COMMIT" +$gcs_bucket="minikube-builds/logs/$env:MINIKUBE_LOCATION/$env:ROOT_JOB_ID" ./out/setup_docker_desktop_windows.ps1 If ($lastexitcode -gt 0) { @@ -37,63 +35,8 @@ If ($lastexitcode -gt 0) { Exit $lastexitcode } -# Remove unused images and containers -docker system prune --all --force +$driver="docker" +$timeout="180m" +$env:JOB_NAME="Docker_Windows" - -./out/minikube-windows-amd64.exe delete --all - -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 - -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 395d0524b0..41520a9f8f 100644 --- a/hack/jenkins/windows_integration_test_hyperv.ps1 +++ b/hack/jenkins/windows_integration_test_hyperv.ps1 @@ -12,25 +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.6.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 . +$driver="hyperv" +$timeout="65m" +$env:JOB_NAME="Hyper-V_Windows" -./out/minikube-windows-amd64.exe delete --all - -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 - -Exit $env:result \ No newline at end of file +. ./out/common.ps1 diff --git a/hack/jenkins/windows_integration_test_virtualbox.ps1 b/hack/jenkins/windows_integration_test_virtualbox.ps1 index a94a6e835b..fd3d58d541 100644 --- a/hack/jenkins/windows_integration_test_virtualbox.ps1 +++ b/hack/jenkins/windows_integration_test_virtualbox.ps1 @@ -12,26 +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.6.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 . - -./out/minikube-windows-amd64.exe delete - -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 - -Exit $env:result \ No newline at end of file +. ./out/common.ps1 diff --git a/hack/preload-images/kubernetes.go b/hack/preload-images/kubernetes.go index 898208bb6d..6d01cc3786 100644 --- a/hack/preload-images/kubernetes.go +++ b/hack/preload-images/kubernetes.go @@ -19,7 +19,7 @@ package main import ( "context" - "github.com/google/go-github/github" + "github.com/google/go-github/v36/github" "k8s.io/klog/v2" ) diff --git a/hack/preload-images/preload_images.go b/hack/preload-images/preload_images.go index 7a8607b477..57a0723d88 100644 --- a/hack/preload-images/preload_images.go +++ b/hack/preload-images/preload_images.go @@ -86,7 +86,8 @@ out: if *limit > 0 && i >= *limit { break out } - if !download.PreloadExists(kv, cr) { + // Since none/mock are the only exceptions, it does not matter what driver we choose. + if !download.PreloadExists(kv, cr, "docker") { toGenerate = append(toGenerate, preloadCfg{kv, cr}) i++ fmt.Printf("[%d] A preloaded tarball for k8s version %s - runtime %q does not exist.\n", i, kv, cr) diff --git a/hack/release_notes.sh b/hack/release_notes.sh index c85b64b951..ef316f8ed3 100755 --- a/hack/release_notes.sh +++ b/hack/release_notes.sh @@ -18,10 +18,15 @@ 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 +# Parse the token from `gh auth` +GH_TOKEN=$(mktemp) +gh auth status -t 2>&1 | sed -n -r 's/^.*Token: ([a-zA-Z0-9_]*)/\1/p' > "$GH_TOKEN" + +# Ensure the token is deleted when the script exits, so the token is not leaked. +function cleanup_token() { + rm -f "$GH_TOKEN" +} +trap cleanup_token EXIT install_release_notes_helper() { release_notes_workdir="$(mktemp -d)" @@ -40,7 +45,7 @@ if ! [[ -x "${DIR}/release-notes" ]] || ! [[ -x "${DIR}/pullsheet" ]]; then install_release_notes_helper fi -git pull git@github.com:kubernetes/minikube master --tags +git pull https://github.com/kubernetes/minikube.git master --tags recent=$(git describe --abbrev=0) recent_date=$(git log -1 --format=%as $recent) @@ -56,8 +61,19 @@ git log "$recent".. --format="%aN" --reverse | sort | uniq | awk '{printf "- %s\ echo "" echo "Thank you to our PR reviewers for this release!" echo "" -"${DIR}/pullsheet" reviews --since "$recent_date" --repos kubernetes/minikube --token-path $DIR/gh_token.txt | awk -F ',' 'function cmp_value_order(i1,v1,i2,v2){ return v1 < v2 } NR>1{arr[$4] += $6 + $7}END{PROCINFO["sorted_in"] = "cmp_value_order"; for (a in arr) printf "- %s (%d comments)\n", a, arr[a]}' +AWK_FORMAT_ITEM='{printf "- %s (%d comments)\n", $2, $1}' +AWK_REVIEW_COMMENTS='NR>1{arr[$4] += $6 + $7}END{for (a in arr) printf "%d %s\n", arr[a], a}' +"${DIR}/pullsheet" reviews --since "$recent_date" --repos kubernetes/minikube --token-path "$GH_TOKEN" --logtostderr=false --stderrthreshold=2 | awk -F ',' "$AWK_REVIEW_COMMENTS" | sort -k1nr -k2d | awk -F ' ' "$AWK_FORMAT_ITEM" echo "" echo "Thank you to our triage members for this release!" echo "" -"${DIR}/pullsheet" issue-comments --since "$recent_date" --repos kubernetes/minikube --token-path $DIR/gh_token.txt | awk -F ',' 'function cmp_value_order(i1,v1,i2,v2){ return v1 < v2 } NR>1{arr[$4] += $7}END{PROCINFO["sorted_in"] = "cmp_value_order"; for (a in arr) printf "- %s (%d comments)\n", a, arr[a]}' | head -n 5 +AWK_ISSUE_COMMENTS='NR>1{arr[$4] += $7}END{for (a in arr) printf "%d %s\n", arr[a], a}' +"${DIR}/pullsheet" issue-comments --since "$recent_date" --repos kubernetes/minikube --token-path "$GH_TOKEN" --logtostderr=false --stderrthreshold=2 | awk -F ',' "$AWK_ISSUE_COMMENTS" | sort -k1nr -k2d | awk -F ' ' "$AWK_FORMAT_ITEM" | head -n 5 + +if [[ "$recent" != *"beta"* ]]; then + echo "" + echo "Check out our [contributions leaderboard](https://minikube.sigs.k8s.io/docs/contrib/leaderboard/$recent/) for this release!" +fi + +echo "" +echo "Don't forget to run `make update-leaderboard` & `make time-to-k8s-benchmark`!" diff --git a/hack/update/github.go b/hack/update/github.go index 7de188f6df..97b55258d7 100644 --- a/hack/update/github.go +++ b/hack/update/github.go @@ -26,7 +26,7 @@ import ( "golang.org/x/mod/semver" "golang.org/x/oauth2" - "github.com/google/go-github/v32/github" + "github.com/google/go-github/v36/github" "k8s.io/klog/v2" ) diff --git a/hack/update/golang_version/update_golang_version.go b/hack/update/golang_version/update_golang_version.go index ca1096f203..62eeb23735 100644 --- a/hack/update/golang_version/update_golang_version.go +++ b/hack/update/golang_version/update_golang_version.go @@ -45,35 +45,59 @@ const ( var ( schema = map[string]update.Item{ - ".github/workflows/iso.yml": { - Replace: map[string]string{ - `go-version: '.*`: `go-version: '{{.StableVersion}}'`, - }, - }, - ".github/workflows/kic_image.yml": { - Replace: map[string]string{ - `go-version: '.*`: `go-version: '{{.StableVersion}}'`, - }, - }, ".github/workflows/build.yml": { Replace: map[string]string{ - `go-version: '.*`: `go-version: '{{.StableVersion}}'`, + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, }, }, ".github/workflows/master.yml": { Replace: map[string]string{ - `go-version: '.*`: `go-version: '{{.StableVersion}}'`, + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, }, }, ".github/workflows/pr.yml": { Replace: map[string]string{ - `go-version: '.*`: `go-version: '{{.StableVersion}}'`, + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, }, }, - ".travis.yml": { + ".github/workflows/docs.yml": { Replace: map[string]string{ - `go:\n - .*`: `go:{{printf "\n - %s" .StableVersion}}`, - `go: .*`: `go: {{.StableVersion}}`, + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/time-to-k8s.yml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/leaderboard.yml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/translations.yml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/update-k8s-versions.yml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/update-golang-version.yml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/time-to-k8s-public-chart.yml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, + }, + }, + ".github/workflows/pr_verified.yaml": { + Replace: map[string]string{ + `GO_VERSION: .*`: `GO_VERSION: '{{.StableVersion}}'`, }, }, "go.mod": { @@ -83,12 +107,13 @@ var ( }, "hack/jenkins/common.sh": { Replace: map[string]string{ - `sudo \.\/installers\/check_install_golang\.sh \".*\" \"\/usr\/local\"`: `sudo ./installers/check_install_golang.sh "{{.StableVersion}}" "/usr/local"`, + `\.\/installers\/check_install_golang\.sh \".*\" \"\/usr\/local\" .*`: `./installers/check_install_golang.sh "{{.StableVersion}}" "/usr/local" || true`, }, }, "Makefile": { Replace: map[string]string{ - `GO_VERSION \?= .*`: `GO_VERSION ?= {{.StableVersion}}`, + // searching for 1.* so it does NOT match "KVM_GO_VERSION ?= $(GO_VERSION:.0=)" in the Makefile + `GO_VERSION \?= 1.*`: `GO_VERSION ?= {{.StableVersion}}`, }, }, } @@ -123,7 +148,8 @@ func main() { // goVersion returns Golang stable version. func goVersions() (stable, stableMM string, err error) { - resp, err := http.Get("https://golang.org/VERSION?m=text") + // will update to the same image that kubernetes project uses + resp, err := http.Get("https://raw.githubusercontent.com/kubernetes/kubernetes/master/build/build-image/cross/VERSION") if err != nil { return "", "", err } @@ -131,7 +157,8 @@ func goVersions() (stable, stableMM string, err error) { if err != nil { return "", "", err } - stable = strings.TrimPrefix(string(body), "go") + stable = strings.TrimPrefix(string(body), "v") + stable = strings.Split(stable, "-")[0] mmp := strings.SplitN(stable, ".", 3) stableMM = strings.Join(mmp[0:2], ".") // . version return stable, stableMM, nil diff --git a/hack/update/gopogh_version/update_gopogh_version.go b/hack/update/gopogh_version/update_gopogh_version.go index 605fdff3b1..0edad7d242 100644 --- a/hack/update/gopogh_version/update_gopogh_version.go +++ b/hack/update/gopogh_version/update_gopogh_version.go @@ -43,16 +43,6 @@ const ( var ( schema = map[string]update.Item{ - ".github/workflows/iso.yml": { - Replace: map[string]string{ - `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, - }, - }, - ".github/workflows/kic_image.yml": { - Replace: map[string]string{ - `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, - }, - }, ".github/workflows/master.yml": { Replace: map[string]string{ `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, @@ -63,6 +53,26 @@ var ( `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, }, }, + ".github/workflows/pr_verified.yaml": { + Replace: map[string]string{ + `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, + }, + }, + "hack/jenkins/windows_integration_test_docker.ps1": { + Replace: map[string]string{ + `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, + }, + }, + "hack/jenkins/windows_integration_test_hyperv.ps1": { + Replace: map[string]string{ + `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, + }, + }, + "hack/jenkins/windows_integration_test_virtualbox.ps1": { + Replace: map[string]string{ + `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, + }, + }, "hack/jenkins/common.sh": { Replace: map[string]string{ `(?U)https://github.com/medyagh/gopogh/releases/download/.*/gopogh`: `https://github.com/medyagh/gopogh/releases/download/{{.StableVersion}}/gopogh`, diff --git a/hack/update/kubernetes_version/templates/v1beta2/containerd-api-port.yaml b/hack/update/kubernetes_version/templates/v1beta2/containerd-api-port.yaml index 6426376655..9037f63241 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/containerd-api-port.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/containerd-pod-network-cidr.yaml b/hack/update/kubernetes_version/templates/v1beta2/containerd-pod-network-cidr.yaml index e7534680ec..1d4c47557c 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/containerd-pod-network-cidr.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/containerd.yaml b/hack/update/kubernetes_version/templates/v1beta2/containerd.yaml index 1a4dd12f2d..371a01462a 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/containerd.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/crio-options-gates.yaml b/hack/update/kubernetes_version/templates/v1beta2/crio-options-gates.yaml index 2eb7aa8284..3663007278 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/crio-options-gates.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/hack/update/kubernetes_version/templates/v1beta2/crio.yaml b/hack/update/kubernetes_version/templates/v1beta2/crio.yaml index 29bf016151..1a28f99a7d 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/crio.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/default.yaml b/hack/update/kubernetes_version/templates/v1beta2/default.yaml index 167617a2c4..6fd15b0bf0 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/default.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/dns.yaml b/hack/update/kubernetes_version/templates/v1beta2/dns.yaml index a51cb773ec..f8536ad49a 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/dns.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/image-repository.yaml b/hack/update/kubernetes_version/templates/v1beta2/image-repository.yaml index 0dc5e9f100..f9114b72e0 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/image-repository.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s \ No newline at end of file diff --git a/hack/update/kubernetes_version/templates/v1beta2/options.yaml b/hack/update/kubernetes_version/templates/v1beta2/options.yaml index 76e0621bce..be5e8249eb 100644 --- a/hack/update/kubernetes_version/templates/v1beta2/options.yaml +++ b/hack/update/kubernetes_version/templates/v1beta2/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/hack/update_contributions.sh b/hack/update_contributions.sh new file mode 100755 index 0000000000..6cd89b908f --- /dev/null +++ b/hack/update_contributions.sh @@ -0,0 +1,86 @@ +#!/bin/bash + +# Copyright 2018 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. + +set -eu -o pipefail + +DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) + +install_pullsheet() { + pullsheet_workdir="$(mktemp -d)" + trap 'rm -rf -- ${pullsheet_workdir}' RETURN + + # See https://stackoverflow.com/questions/56842385/using-go-get-to-download-binaries-without-adding-them-to-go-mod for this workaround + cd "${pullsheet_workdir}" + go mod init ps + GOBIN="$DIR" go get github.com/google/pullsheet + cd - +} + +if ! [[ -x "${DIR}/pullsheet" ]]; then + echo >&2 'Installing pullsheet' + install_pullsheet +fi + +git pull https://github.com/kubernetes/minikube.git master --tags + +tags_to_generate=${1:-1} + +# 1) Get tags. +# 2) Filter out beta tags. +# 3) Parse tag name into its version numbers. +# 4) Sort by ascending version numbers. +# 5) Reform tag name from version numbers. +# 6) Pair up current and previous tags. Format: (previous tag, current tag) +# 7) Format command to get tag dates. +# 8) Execute command to get dates of previous and current tag. Format: (current tag, prev date, current date) +# 9) Add negative line numbers to each tag. Format: (negative index, current tag, prev date, current date) +# - Negative line numbers are used since entries are sorted in descending order. +# 10) Take most recent $tags_to_generate tags. +tags_with_range=$( + git --no-pager tag \ + | grep -v -e "beta" \ + | sed -r "s/v([0-9]*)\.([0-9]*)\.([0-9]*)/\1 \2 \3/" \ + | sort -k1n -k2n -k3n \ + | sed -r "s/([0-9]*) ([0-9]*) ([0-9]*)/v\1.\2.\3/" \ + | sed -n -r "x; G; s/\n/ /; p"\ + | sed -n -r "s/([v.0-9]+) ([v.0-9]+)/-c '{ echo -n \2; git log -1 --pretty=format:\" %as \" \1; git log -1 --pretty=format:\"%as\" \2; echo;}'/p" \ + | xargs -L 1 bash \ + | sed "=" | sed -r "N;s/\n/ /;s/^/-/" \ + | tail -n "$tags_to_generate") + +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 "$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" diff --git a/installers/linux/kvm/Dockerfile b/installers/linux/kvm/Dockerfile.amd64 similarity index 100% rename from installers/linux/kvm/Dockerfile rename to installers/linux/kvm/Dockerfile.amd64 diff --git a/installers/linux/kvm/Dockerfile.arm64 b/installers/linux/kvm/Dockerfile.arm64 new file mode 100644 index 0000000000..272c0a0d92 --- /dev/null +++ b/installers/linux/kvm/Dockerfile.arm64 @@ -0,0 +1,43 @@ +# 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. + +FROM ubuntu:20.04 + +ARG GO_VERSION + +RUN apt update + +RUN echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal main universe multiverse" >> /etc/apt/sources.list && \ + echo "deb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports focal-updates main universe restricted multiverse" >> /etc/apt/sources.list && \ + dpkg --add-architecture arm64 && \ + (apt update || true) + +RUN DEBIAN_FRONTEND=noninteractive \ + apt install \ + -o APT::Immediate-Configure=false -y \ + gcc-aarch64-linux-gnu \ + make \ + pkg-config \ + curl \ + libvirt-dev:arm64 && \ + dpkg --configure -a + +RUN curl -sSL https://golang.org/dl/go${GO_VERSION}.linux-amd64.tar.gz | tar -C /usr/local -xzf - + +ENV GOPATH /go + +ENV CC=aarch64-linux-gnu-gcc +ENV CGO_ENABLED=1 +ENV PKG_CONFIG_PATH=/usr/lib/aarch64-linux-gnu/pkgconfig +ENV PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/go/bin:/go/bin diff --git a/netlify.toml b/netlify.toml index bbf6fcf397..b88ee5dd77 100644 --- a/netlify.toml +++ b/netlify.toml @@ -4,7 +4,7 @@ publish = "site/public/" command = "pwd && cd themes/docsy && git submodule update -f --init && cd ../.. && hugo" [build.environment] -HUGO_VERSION = "0.68.3" +HUGO_VERSION = "0.83.1" [context.production.environment] HUGO_ENV = "production" diff --git a/pkg/addons/addons.go b/pkg/addons/addons.go index b1ce70bd31..a960a96553 100644 --- a/pkg/addons/addons.go +++ b/pkg/addons/addons.go @@ -50,6 +50,10 @@ import ( // Force is used to override checks for addons var Force bool = false +// Refresh is used to refresh pods in specific cases when an addon is enabled +// Currently only used for gcp-auth +var Refresh bool = false + // RunCallbacks runs all actions associated to an addon, but does not set it (thread-safe) func RunCallbacks(cc *config.ClusterConfig, name string, value string) error { klog.Infof("Setting %s=%s in profile %q", name, value, cc.Name) @@ -137,6 +141,9 @@ func EnableOrDisableAddon(cc *config.ClusterConfig, name string, val string) err // check addon status before enabling/disabling it if isAddonAlreadySet(cc, addon, enable) { + if addon.Name() == "gcp-auth" { + return nil + } klog.Warningf("addon %s should already be in state %v", name, val) if !enable { return nil @@ -185,6 +192,12 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri exit.Error(reason.GuestCpConfig, "Error getting primary control plane", err) } + // Persist images even if the machine is running so starting gets the correct images. + images, customRegistries, err := assets.SelectAndPersistImages(addon, cc) + if err != nil { + exit.Error(reason.HostSaveProfile, "Failed to persist images", err) + } + mName := config.MachineName(*cc, cp) host, err := machine.LoadHost(api, mName) if err != nil || !machine.IsRunning(api, mName) { @@ -219,11 +232,12 @@ https://github.com/kubernetes/minikube/issues/7332`, out.V{"driver_name": cc.Dri var networkInfo assets.NetworkInfo if len(cc.Nodes) >= 1 { networkInfo.ControlPlaneNodeIP = cc.Nodes[0].IP + networkInfo.ControlPlaneNodePort = cc.Nodes[0].Port } else { out.WarningT("At least needs control plane nodes to enable addon") } - data := assets.GenerateTemplateData(addon, cc.KubernetesConfig, networkInfo) + data := assets.GenerateTemplateData(addon, cc.KubernetesConfig, networkInfo, images, customRegistries) return enableOrDisableAddonInternal(cc, addon, runner, data, enable) } diff --git a/pkg/addons/addons_autopause.go b/pkg/addons/addons_autopause.go index 7891d46f1f..ec8836fa4f 100644 --- a/pkg/addons/addons_autopause.go +++ b/pkg/addons/addons_autopause.go @@ -17,7 +17,6 @@ limitations under the License. package addons import ( - "runtime" "strconv" "github.com/pkg/errors" @@ -26,11 +25,9 @@ import ( "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/driver" - "k8s.io/minikube/pkg/minikube/exit" "k8s.io/minikube/pkg/minikube/kubeconfig" "k8s.io/minikube/pkg/minikube/mustload" "k8s.io/minikube/pkg/minikube/out" - "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/minikube/sysinit" ) @@ -43,9 +40,6 @@ func enableOrDisableAutoPause(cc *config.ClusterConfig, name string, val string) out.Infof("auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.") out.Infof("https://github.com/kubernetes/minikube/labels/co/auto-pause") - if cc.KubernetesConfig.ContainerRuntime != "docker" || runtime.GOARCH != "amd64" { - exit.Message(reason.Usage, `auto-pause currently is only supported on docker runtime and amd64. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601`) - } co := mustload.Running(cc.Name) if enable { if err := sysinit.New(co.CP.Runner).EnableNow("auto-pause"); err != nil { diff --git a/pkg/addons/addons_gcpauth.go b/pkg/addons/addons_gcpauth.go index 79045a9482..4c363818e0 100644 --- a/pkg/addons/addons_gcpauth.go +++ b/pkg/addons/addons_gcpauth.go @@ -45,6 +45,7 @@ const ( credentialsPath = "/var/lib/minikube/google_application_credentials.json" projectPath = "/var/lib/minikube/google_cloud_project" secretName = "gcp-auth" + namespaceName = "gcp-auth" ) // enableOrDisableGCPAuth enables or disables the gcp-auth addon depending on the val parameter @@ -84,7 +85,45 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { } // Create a registry secret in every namespace we can find - client, err := service.K8s.GetCoreClient(cfg.Name) + err = createPullSecret(cfg, creds) + if err != nil { + return errors.Wrap(err, "pull secret") + } + + // First check if the project env var is explicitly set + projectEnv := os.Getenv("GOOGLE_CLOUD_PROJECT") + if projectEnv != "" { + f := assets.NewMemoryAssetTarget([]byte(projectEnv), projectPath, "0444") + return r.Copy(f) + } + + // We're currently assuming gcloud is installed and in the user's path + proj, err := exec.Command("gcloud", "config", "get-value", "project").Output() + if err == nil && len(proj) > 0 { + f := assets.NewMemoryAssetTarget(bytes.TrimSpace(proj), projectPath, "0444") + return r.Copy(f) + } + + out.WarningT("Could not determine a Google Cloud project, which might be ok.") + out.Styled(style.Tip, `To set your Google Cloud project, run: + + gcloud config set project + +or set the GOOGLE_CLOUD_PROJECT environment variable.`) + + // Copy an empty file in to avoid errors about missing files + emptyFile := assets.NewMemoryAssetTarget([]byte{}, projectPath, "0444") + return r.Copy(emptyFile) + +} + +func createPullSecret(cc *config.ClusterConfig, creds *google.Credentials) error { + client, err := service.K8s.GetCoreClient(cc.Name) + if err != nil { + return err + } + + namespaces, err := client.Namespaces().List(context.TODO(), metav1.ListOptions{}) if err != nil { return err } @@ -96,27 +135,24 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { ".dockercfg": []byte(fmt.Sprintf(`{"https://gcr.io":{"username":"oauth2accesstoken","password":"%s","email":"none"}, "https://us-docker.pkg.dev":{"username":"oauth2accesstoken","password":"%s","email":"none"}}`, token.AccessToken, token.AccessToken)), } - namespaces, err := client.Namespaces().List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - for _, n := range namespaces.Items { secrets := client.Secrets(n.Name) exists := false - secList, err := secrets.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - for _, s := range secList.Items { - if s.Name == secretName { - exists = true - break + if !Refresh { + secList, err := secrets.List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return err + } + for _, s := range secList.Items { + if s.Name == secretName { + exists = true + break + } } } - if !exists { + if !exists || Refresh { secretObj := &corev1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, @@ -125,9 +161,16 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { Type: "kubernetes.io/dockercfg", } - _, err = secrets.Create(context.TODO(), secretObj, metav1.CreateOptions{}) - if err != nil { - return err + if exists && Refresh { + _, err := secrets.Update(context.TODO(), secretObj, metav1.UpdateOptions{}) + if err != nil { + return err + } + } else { + _, err = secrets.Create(context.TODO(), secretObj, metav1.CreateOptions{}) + if err != nil { + return err + } } } @@ -147,42 +190,79 @@ func enableAddonGCPAuth(cfg *config.ClusterConfig) error { time.Sleep(1 * time.Second) } - ips := corev1.LocalObjectReference{Name: "gcp-auth"} + ips := corev1.LocalObjectReference{Name: secretName} for _, sa := range salist.Items { - sa.ImagePullSecrets = append(sa.ImagePullSecrets, ips) - _, err := serviceaccounts.Update(context.TODO(), &sa, metav1.UpdateOptions{}) - if err != nil { - return err + add := true + for _, ps := range sa.ImagePullSecrets { + if ps.Name == secretName { + add = false + break + } + } + if add { + sa.ImagePullSecrets = append(sa.ImagePullSecrets, ips) + _, err := serviceaccounts.Update(context.TODO(), &sa, metav1.UpdateOptions{}) + if err != nil { + return err + } } } } } + return nil +} - // First check if the project env var is explicitly set - projectEnv := os.Getenv("GOOGLE_CLOUD_PROJECT") - if projectEnv != "" { - f := assets.NewMemoryAssetTarget([]byte(projectEnv), projectPath, "0444") - return r.Copy(f) +func refreshExistingPods(cc *config.ClusterConfig) error { + client, err := service.K8s.GetCoreClient(cc.Name) + if err != nil { + return err } - // We're currently assuming gcloud is installed and in the user's path - project, err := exec.Command("gcloud", "config", "get-value", "project").Output() - if err == nil && len(project) > 0 { - f := assets.NewMemoryAssetTarget(bytes.TrimSpace(project), projectPath, "0444") - return r.Copy(f) + namespaces, err := client.Namespaces().List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return err } + for _, n := range namespaces.Items { + // Ignore kube-system and gcp-auth namespaces + if n.Name == metav1.NamespaceSystem || n.Name == namespaceName { + continue + } - out.WarningT("Could not determine a Google Cloud project, which might be ok.") - out.Styled(style.Tip, `To set your Google Cloud project, run: + pods := client.Pods(n.Name) + podList, err := pods.List(context.TODO(), metav1.ListOptions{}) + if err != nil { + return err + } - gcloud config set project + for _, p := range podList.Items { + // Skip pods we're explicitly told to skip + if _, ok := p.Labels["gcp-auth-skip-secret"]; ok { + continue + } -or set the GOOGLE_CLOUD_PROJECT environment variable.`) + // Recreating the pod should pickup the necessary changes + err := pods.Delete(context.TODO(), p.Name, metav1.DeleteOptions{}) + if err != nil { + return err + } - // Copy an empty file in to avoid errors about missing files - emptyFile := assets.NewMemoryAssetTarget([]byte{}, projectPath, "0444") - return r.Copy(emptyFile) + p.ResourceVersion = "" + + _, err = pods.Get(context.TODO(), p.Name, metav1.GetOptions{}) + + for err == nil { + time.Sleep(time.Second) + _, err = pods.Get(context.TODO(), p.Name, metav1.GetOptions{}) + } + + _, err = pods.Create(context.TODO(), &p, metav1.CreateOptions{}) + if err != nil { + return err + } + } + } + return nil } func disableAddonGCPAuth(cfg *config.ClusterConfig) error { @@ -231,10 +311,23 @@ func verifyGCPAuthAddon(cc *config.ClusterConfig, name string, val string) error return errors.Wrapf(err, "parsing bool: %s", name) } err = verifyAddonStatusInternal(cc, name, val, "gcp-auth") + if err != nil { + return err + } + + if Refresh { + err = refreshExistingPods(cc) + if err != nil { + return err + } + } if enable && err == nil { out.Styled(style.Notice, "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.", out.V{"name": cc.Name}) out.Styled(style.Notice, "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.") + if !Refresh { + out.Styled(style.Notice, "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.") + } } return err 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/addons/validations.go b/pkg/addons/validations.go index aad44e3cf0..9cefbe321f 100644 --- a/pkg/addons/validations.go +++ b/pkg/addons/validations.go @@ -20,6 +20,7 @@ import ( "fmt" "strconv" + "github.com/spf13/viper" "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/cruntime" @@ -63,7 +64,8 @@ func IsVolumesnapshotsEnabled(cc *config.ClusterConfig, _, value string) error { isCsiDriverEnabled, _ := strconv.ParseBool(value) // assets.Addons[].IsEnabled() returns the current status of the addon or default value. // config.AddonList contains list of addons to be enabled. - isVolumesnapshotsEnabled := assets.Addons[volumesnapshotsAddon].IsEnabled(cc) || contains(config.AddonList, volumesnapshotsAddon) + addonList := viper.GetStringSlice(config.AddonListFlag) + isVolumesnapshotsEnabled := assets.Addons[volumesnapshotsAddon].IsEnabled(cc) || contains(addonList, volumesnapshotsAddon) if isCsiDriverEnabled && !isVolumesnapshotsEnabled { // just print out a warning directly, we don't want to return any errors since // that would prevent the addon from being enabled (callbacks wouldn't be run) diff --git a/pkg/drivers/common.go b/pkg/drivers/common.go index 808367c204..a830cf897b 100644 --- a/pkg/drivers/common.go +++ b/pkg/drivers/common.go @@ -17,6 +17,7 @@ limitations under the License. package drivers import ( + "fmt" "io" "io/ioutil" "os" @@ -41,6 +42,12 @@ func GetDiskPath(d *drivers.BaseDriver) string { return filepath.Join(d.ResolveStorePath("."), d.GetMachineName()+".rawdisk") } +// ExtraDiskPath returns the path of an additional disk suffixed with an ID. +func ExtraDiskPath(d *drivers.BaseDriver, diskID int) string { + file := fmt.Sprintf("%s-%d.rawdisk", d.GetMachineName(), diskID) + return filepath.Join(d.ResolveStorePath("."), file) +} + // CommonDriver is the common driver base class type CommonDriver struct{} diff --git a/pkg/drivers/hyperkit/driver.go b/pkg/drivers/hyperkit/driver.go index a944ad3f14..027977bf38 100644 --- a/pkg/drivers/hyperkit/driver.go +++ b/pkg/drivers/hyperkit/driver.go @@ -64,6 +64,7 @@ type Driver struct { UUID string VpnKitSock string VSockPorts []string + ExtraDisks int } // NewDriver creates a new driver for a host @@ -229,6 +230,13 @@ func (d *Driver) createHost() (*hyperkit.HyperKit, error) { Trim: true, }, } + for i := 0; i < d.ExtraDisks; i++ { + h.Disks = append(h.Disks, &hyperkit.RawDisk{ + Path: pkgdrivers.ExtraDiskPath(d.BaseDriver, i), + Size: d.DiskSize, + Trim: true, + }) + } return h, nil } diff --git a/pkg/drivers/kic/kic.go b/pkg/drivers/kic/kic.go index db9d3f3ad7..1a4963203d 100644 --- a/pkg/drivers/kic/kic.go +++ b/pkg/drivers/kic/kic.go @@ -172,7 +172,7 @@ func (d *Driver) Create() error { go func() { defer waitForPreload.Done() // If preload doesn't exist, don't bother extracting tarball to volume - if !download.PreloadExists(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime) { + if !download.PreloadExists(d.NodeConfig.KubernetesVersion, d.NodeConfig.ContainerRuntime, d.DriverName()) { return } t := time.Now() @@ -217,6 +217,12 @@ func (d *Driver) prepareSSH() error { if err != nil { return errors.Wrap(err, "create pubkey assetfile ") } + defer func() { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + }() + if err := cmder.Copy(f); err != nil { return errors.Wrap(err, "copying pub key") } diff --git a/pkg/drivers/kic/oci/errors.go b/pkg/drivers/kic/oci/errors.go index c4d806fc06..832500b53e 100644 --- a/pkg/drivers/kic/oci/errors.go +++ b/pkg/drivers/kic/oci/errors.go @@ -69,6 +69,12 @@ var ErrNetworkGatewayTaken = errors.New("network gateway is taken") // ErrNetworkInUse is when trying to delete a network which is attached to another container var ErrNetworkInUse = errors.New("unable to delete a network that is attached to a running container") +// ErrGetSSHPortContainerNotRunning happens when you try to inspect a container (in order to get SSH port) that "exists" but is no longer running +var ErrGetSSHPortContainerNotRunning = errors.New("unable to inspect a not running container to get SSH port") + +// ErrGetPortContainerNotRunning happens when you try to inspect a container (in order to get Port) that "exists" but is no longer running +var ErrGetPortContainerNotRunning = errors.New("unable to inspect a not running container to get port") + // LogContainerDebug will print relevant docker/podman infos after a container fails func LogContainerDebug(ociBin string, name string) string { rr, err := containerInspect(ociBin, name) diff --git a/pkg/drivers/kic/oci/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) diff --git a/pkg/drivers/kic/oci/network.go b/pkg/drivers/kic/oci/network.go index de2b742adf..b8c3453340 100644 --- a/pkg/drivers/kic/oci/network.go +++ b/pkg/drivers/kic/oci/network.go @@ -24,10 +24,11 @@ import ( "strconv" "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" + "k8s.io/minikube/pkg/minikube/constants" ) // RoutableHostIPFromInside returns the ip/dns of the host that container lives on @@ -69,14 +70,54 @@ func digDNS(ociBin, containerName, dns string) (net.IP, error) { return ip, nil } +// gatewayIP inspects oci container to find a gateway IP string +func gatewayIP(ociBin, containerName string) (string, error) { + rr, err := runCmd(exec.Command(ociBin, "container", "inspect", "--format", "{{.NetworkSettings.Gateway}}", containerName)) + if err != nil { + return "", errors.Wrapf(err, "inspect gateway") + } + if gatewayIP := strings.TrimSpace(rr.Stdout.String()); gatewayIP != "" { + return gatewayIP, nil + } + + // https://github.com/kubernetes/minikube/issues/11293 + // need to check nested network + // check .NetworkSettings.Networks["cluster-name"].Gateway and then + // .NetworkSettings.Networks["bridge"|"podman"].Gateway + for _, network := range []string{containerName, defaultBridgeName(ociBin)} { + gatewayIP, err := networkGateway(ociBin, containerName, network) + // err == nil here doesn't mean we get a valid gateway IP, it still can be an empty string + if err != nil { + return "", err + } + if gatewayIP != "" { + return gatewayIP, nil + } + } + klog.Infof("Couldn't find gateway for container %s", containerName) + return "", nil +} + +func networkGateway(ociBin, container, network string) (string, error) { + format := fmt.Sprintf(` +{{ if index .NetworkSettings.Networks %q}} + {{(index .NetworkSettings.Networks %q).Gateway}} +{{ end }} +`, network, network) + rr, err := runCmd(exec.Command(ociBin, "container", "inspect", "--format", format, container)) + if err != nil { + return "", errors.Wrapf(err, "inspect gateway") + } + return strings.TrimSpace(rr.Stdout.String()), nil +} + // containerGatewayIP gets the default gateway ip for the container func containerGatewayIP(ociBin string, containerName string) (net.IP, error) { - rr, err := runCmd(exec.Command(ociBin, "container", "inspect", "--format", "{{.NetworkSettings.Gateway}}", containerName)) + gatewayIP, err := gatewayIP(ociBin, containerName) if err != nil { return nil, errors.Wrapf(err, "inspect gateway") } - ip := net.ParseIP(strings.TrimSpace(rr.Stdout.String())) - return ip, nil + return net.ParseIP(gatewayIP), nil } // ForwardedPort will return port mapping for a container using cli. @@ -110,6 +151,14 @@ func ForwardedPort(ociBin string, ociID string, contPort int) (int, error) { } else { rr, err = runCmd(exec.Command(ociBin, "container", "inspect", "-f", fmt.Sprintf("'{{(index (index .NetworkSettings.Ports \"%d/tcp\") 0).HostPort}}'", contPort), ociID)) if err != nil { + + // Error: "Template parsing error: template: :1:3: executing "" at : error calling index: index of untyped nil" + if strings.Contains(rr.Output(), `: error calling index: index of untyped nil`) && contPort == constants.SSHPort { + return 0, ErrGetSSHPortContainerNotRunning + } + if strings.Contains(rr.Output(), "error calling index: index of untyped nil") { + return 0, ErrGetPortContainerNotRunning + } return 0, errors.Wrapf(err, "get port %d for %q", contPort, ociID) } } @@ -142,7 +191,7 @@ func podmanContainerIP(ociBin string, name string) (string, string, error) { return "", "", errors.Wrapf(err, "podman inspect ip %s", name) } output := strings.TrimSpace(rr.Stdout.String()) - if err == nil && output == "" { // podman returns empty for 127.0.0.1 + if output == "" { // podman returns empty for 127.0.0.1 // check network, if the ip address is missing ipv4, ipv6, err := dockerContainerIP(ociBin, name) if err == nil { diff --git a/pkg/drivers/kic/oci/network_create.go b/pkg/drivers/kic/oci/network_create.go index af27e9b065..494f90f56d 100644 --- a/pkg/drivers/kic/oci/network_create.go +++ b/pkg/drivers/kic/oci/network_create.go @@ -41,15 +41,21 @@ const dockerDefaultBridge = "bridge" // name of the default bridge network const podmanDefaultBridge = "podman" +func defaultBridgeName(ociBin string) string { + switch ociBin { + case Docker: + return dockerDefaultBridge + case Podman: + return podmanDefaultBridge + default: + klog.Warningf("Unexpected oci: %v", ociBin) + return dockerDefaultBridge + } +} + // CreateNetwork creates a network returns gateway and error, minikube creates one network per cluster func CreateNetwork(ociBin string, networkName string) (net.IP, error) { - var defaultBridgeName string - if ociBin == Docker { - defaultBridgeName = dockerDefaultBridge - } - if ociBin == Podman { - defaultBridgeName = podmanDefaultBridge - } + defaultBridgeName := defaultBridgeName(ociBin) if networkName == defaultBridgeName { klog.Infof("skipping creating network since default network %s was specified", networkName) return nil, nil diff --git a/pkg/drivers/kic/types.go b/pkg/drivers/kic/types.go index 2153e8020e..f19a169ca8 100644 --- a/pkg/drivers/kic/types.go +++ b/pkg/drivers/kic/types.go @@ -24,13 +24,13 @@ import ( const ( // Version is the current version of kic - Version = "v0.0.22" + Version = "v0.0.25" // SHA of the kic base image - baseImageSHA = "7cc3a3cb6e51c628d8ede157ad9e1f797e8d22a1b3cedc12d3f1999cb52f962e" + baseImageSHA = "6f936e3443b95cd918d77623bf7b595653bb382766e280290a02b4a349e88b79" // The name of the GCR kicbase repository gcrRepo = "gcr.io/k8s-minikube/kicbase" // The name of the Dockerhub kicbase repository - dockerhubRepo = "kicbase/stable" + dockerhubRepo = "docker.io/kicbase/stable" ) var ( @@ -42,6 +42,9 @@ var ( // the fallback of BaseImage in case gcr.io is not available. stored in docker hub // same image is push to https://github.com/kicbase/stable fmt.Sprintf("%s:%s@sha256:%s", dockerhubRepo, Version, baseImageSHA), + // try without sha because #11068 + fmt.Sprintf("%s:%s", gcrRepo, Version), + fmt.Sprintf("%s:%s", dockerhubRepo, Version), } ) diff --git a/pkg/generate/docs.go b/pkg/generate/docs.go index 4cf9648ab8..6ba2170d7f 100644 --- a/pkg/generate/docs.go +++ b/pkg/generate/docs.go @@ -32,7 +32,7 @@ import ( ) // Docs generates docs for minikube command -func Docs(root *cobra.Command, path string, testPath string) error { +func Docs(root *cobra.Command, path string, testPath string, codePath string) error { cmds := root.Commands() for _, c := range cmds { if c.Hidden { @@ -47,7 +47,12 @@ func Docs(root *cobra.Command, path string, testPath string) error { return errors.Wrapf(err, "saving doc for %s", c.Name()) } } - return testDocs(testPath) + err := TestDocs(testPath, "test/integration") + if err != nil { + return errors.Wrap(err, "failed to generate test docs") + } + + return ErrorCodes(codePath, []string{"pkg/minikube/reason/exitcodes.go", "pkg/minikube/reason/reason.go"}) } // DocForCommand returns the specific doc for that command diff --git a/pkg/generate/errorcodes.go b/pkg/generate/errorcodes.go new file mode 100644 index 0000000000..c50d085e83 --- /dev/null +++ b/pkg/generate/errorcodes.go @@ -0,0 +1,126 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package generate + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/token" + "io/ioutil" + "strings" + "time" + + "github.com/pkg/errors" + "k8s.io/minikube/pkg/minikube/out" +) + +func ErrorCodes(docPath string, pathsToCheck []string) error { + buf := bytes.NewBuffer([]byte{}) + date := time.Now().Format("2006-01-02") + title := out.Fmt(title, out.V{"Command": "Error Codes", "Description": "minikube error codes and strings", "Date": date}) + _, err := buf.Write([]byte(title)) + if err != nil { + return err + } + + fset := token.NewFileSet() + for _, pathToCheck := range pathsToCheck { + r, err := ioutil.ReadFile(pathToCheck) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("error reading file %s", pathToCheck)) + } + file, err := parser.ParseFile(fset, "", r, parser.ParseComments) + if err != nil { + return errors.Wrap(err, fmt.Sprintf("error parsing file %s", pathToCheck)) + } + + if strings.Contains(pathToCheck, "exitcodes.go") { + buf.WriteString("## Error Codes\n\n") + currentGroup := "" + currentError := "" + ast.Inspect(file, func(x ast.Node) bool { + if c, ok := x.(*ast.Comment); ok { + // Start a new group of errors + comment := c.Text + if !strings.HasPrefix(comment, "// Error codes specific") { + return true + } + currentGroup = strings.Replace(comment, "//", "###", 1) + buf.WriteString("\n" + currentGroup + "\n") + } + if id, ok := x.(*ast.Ident); ok { + // This is the name of the error, e.g. ExGuestError + currentError = id.Name + } + if s, ok := x.(*ast.BasicLit); ok { + // Filter out random strings that aren't error codes + if currentError == "" { + return true + } + + // No specific group means generic errors + if currentGroup == "" { + currentGroup = "### Generic Errors" + buf.WriteString("\n" + currentGroup + "\n") + } + + // This is the numeric code of the error, e.g. 80 for ExGuest Error + code := s.Value + buf.WriteString(fmt.Sprintf("%s: %s \n", code, currentError)) + } + return true + }) + buf.WriteString("\n\n") + } + + if strings.Contains(pathToCheck, "reason.go") { + buf.WriteString("## Error Strings\n\n") + currentNode := "" + currentID := "" + currentComment := "" + ast.Inspect(file, func(x ast.Node) bool { + if id, ok := x.(*ast.Ident); ok { + currentNode = id.Name + if strings.HasPrefix(currentNode, "Ex") && currentNode != "ExitCode" { + // We have all the info we're going to get on this error, print it out + buf.WriteString(fmt.Sprintf("%s (Exit code %v) \n", currentID, currentNode)) + if currentComment != "" { + buf.WriteString(currentComment + " \n") + } + buf.WriteString("\n") + currentComment = "" + currentID = "" + currentNode = "" + } + } + if s, ok := x.(*ast.BasicLit); ok { + if currentNode == "ID" { + currentID = s.Value + } + } + if c, ok := x.(*ast.Comment); ok { + currentComment = c.Text[3:] + } + return true + }) + } + } + + return ioutil.WriteFile(docPath, buf.Bytes(), 0o644) +} diff --git a/pkg/generate/testdocs.go b/pkg/generate/testdocs.go index 021b2554d1..f496be95f1 100644 --- a/pkg/generate/testdocs.go +++ b/pkg/generate/testdocs.go @@ -32,7 +32,7 @@ import ( "k8s.io/minikube/pkg/minikube/out" ) -func testDocs(docPath string) error { +func TestDocs(docPath string, pathToCheck string) error { counter := 0 buf := bytes.NewBuffer([]byte{}) date := time.Now().Format("2006-01-02") @@ -42,7 +42,7 @@ func testDocs(docPath string) error { return err } - err = filepath.Walk("test/integration", func(path string, info os.FileInfo, err error) error { + err = filepath.Walk(pathToCheck, func(path string, info os.FileInfo, err error) error { if info.IsDir() || !strings.HasSuffix(path, ".go") { return nil } @@ -78,14 +78,14 @@ func testDocs(docPath string) error { counter++ comments := fd.Doc if comments == nil { - e := writeComment("NEEDS DOC\n", buf) + e := writeComment(fnName, "// NEEDS DOC\n", buf) return e == nil } for _, comment := range comments.List { if strings.Contains(comment.Text, "TODO") { continue } - e := writeComment(comment.Text, buf) + e := writeComment(fnName, comment.Text, buf) if e != nil { return false } @@ -103,11 +103,6 @@ func testDocs(docPath string) error { return err } - _, err = buf.WriteString(fmt.Sprintf("TEST COUNT: %d\n", counter)) - if err != nil { - return err - } - err = ioutil.WriteFile(docPath, buf.Bytes(), 0o644) return err } @@ -134,9 +129,10 @@ func writeSubTest(testName string, w *bytes.Buffer) error { return err } -func writeComment(comment string, w *bytes.Buffer) error { +func writeComment(testName string, comment string, w *bytes.Buffer) error { // Remove the leading // from the testdoc comments comment = comment[3:] + comment = strings.TrimPrefix(comment, testName+" ") _, err := w.WriteString(comment + "\n") return err } diff --git a/pkg/minikube/assets/addons.go b/pkg/minikube/assets/addons.go old mode 100644 new mode 100755 index af3ac66422..563be7271b --- a/pkg/minikube/assets/addons.go +++ b/pkg/minikube/assets/addons.go @@ -22,6 +22,7 @@ import ( "strings" "github.com/spf13/viper" + "k8s.io/minikube/deploy/addons" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/out" @@ -31,10 +32,11 @@ import ( // Addon is a named list of assets, that can be enabled type Addon struct { - Assets []*BinAsset - enabled bool - addonName string - Images map[string]string + Assets []*BinAsset + enabled bool + addonName string + Maintainer string + Images map[string]string // Registries currently only shows the default registry of images Registries map[string]string @@ -42,15 +44,17 @@ type Addon struct { // NetworkInfo contains control plane node IP address used for add on template type NetworkInfo struct { - ControlPlaneNodeIP string + ControlPlaneNodeIP string + ControlPlaneNodePort int } // NewAddon creates a new Addon -func NewAddon(assets []*BinAsset, enabled bool, addonName string, images map[string]string, registries map[string]string) *Addon { +func NewAddon(assets []*BinAsset, enabled bool, addonName string, maintainer string, images map[string]string, registries map[string]string) *Addon { a := &Addon{ Assets: assets, enabled: enabled, addonName: addonName, + Maintainer: maintainer, Images: images, Registries: registries, } @@ -78,100 +82,105 @@ func (a *Addon) IsEnabled(cc *config.ClusterConfig) bool { var Addons = map[string]*Addon{ "auto-pause": NewAddon([]*BinAsset{ MustBinAsset( - "deploy/addons/auto-pause/auto-pause.yaml.tmpl", + addons.AutoPauseAssets, + "auto-pause/auto-pause.yaml.tmpl", vmpath.GuestAddonsDir, "auto-pause.yaml", "0640"), MustBinAsset( - "deploy/addons/auto-pause/auto-pause-hook.yaml.tmpl", + addons.AutoPauseAssets, + "auto-pause/auto-pause-hook.yaml.tmpl", vmpath.GuestAddonsDir, "auto-pause-hook.yaml", "0640"), MustBinAsset( - "deploy/addons/auto-pause/haproxy.cfg", - "/var/lib/minikube/", + addons.AutoPauseAssets, + "auto-pause/haproxy.cfg.tmpl", + vmpath.GuestPersistentDir, "haproxy.cfg", "0640"), MustBinAsset( - "deploy/addons/auto-pause/unpause.lua", - "/var/lib/minikube/", + addons.AutoPauseAssets, + "auto-pause/unpause.lua", + vmpath.GuestPersistentDir, "unpause.lua", "0640"), MustBinAsset( - "deploy/addons/auto-pause/auto-pause.service", + addons.AutoPauseAssets, + "auto-pause/auto-pause.service.tmpl", "/etc/systemd/system/", "auto-pause.service", "0640"), // GuestPersistentDir - }, false, "auto-pause", map[string]string{ + }, false, "auto-pause", "google", map[string]string{ "AutoPauseHook": "k8s-minikube/auto-pause-hook:v0.0.2@sha256:c76be418df5ca9c66d0d11c2c68461acbf4072c1cdfc17e64729c5ef4d5a4128", }, map[string]string{ "AutoPauseHook": "gcr.io", }), "dashboard": NewAddon([]*BinAsset{ // We want to create the kubernetes-dashboard ns first so that every subsequent object can be created - MustBinAsset("deploy/addons/dashboard/dashboard-ns.yaml", vmpath.GuestAddonsDir, "dashboard-ns.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-clusterrole.yaml", vmpath.GuestAddonsDir, "dashboard-clusterrole.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-clusterrolebinding.yaml", vmpath.GuestAddonsDir, "dashboard-clusterrolebinding.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-configmap.yaml", vmpath.GuestAddonsDir, "dashboard-configmap.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-dp.yaml.tmpl", vmpath.GuestAddonsDir, "dashboard-dp.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-role.yaml", vmpath.GuestAddonsDir, "dashboard-role.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-rolebinding.yaml", vmpath.GuestAddonsDir, "dashboard-rolebinding.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-sa.yaml", vmpath.GuestAddonsDir, "dashboard-sa.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-secret.yaml", vmpath.GuestAddonsDir, "dashboard-secret.yaml", "0640"), - MustBinAsset("deploy/addons/dashboard/dashboard-svc.yaml", vmpath.GuestAddonsDir, "dashboard-svc.yaml", "0640"), - }, false, "dashboard", map[string]string{ + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-ns.yaml", vmpath.GuestAddonsDir, "dashboard-ns.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-clusterrole.yaml", vmpath.GuestAddonsDir, "dashboard-clusterrole.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-clusterrolebinding.yaml", vmpath.GuestAddonsDir, "dashboard-clusterrolebinding.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-configmap.yaml", vmpath.GuestAddonsDir, "dashboard-configmap.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-dp.yaml.tmpl", vmpath.GuestAddonsDir, "dashboard-dp.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-role.yaml", vmpath.GuestAddonsDir, "dashboard-role.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-rolebinding.yaml", vmpath.GuestAddonsDir, "dashboard-rolebinding.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-sa.yaml", vmpath.GuestAddonsDir, "dashboard-sa.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-secret.yaml", vmpath.GuestAddonsDir, "dashboard-secret.yaml", "0640"), + MustBinAsset(addons.DashboardAssets, "dashboard/dashboard-svc.yaml", vmpath.GuestAddonsDir, "dashboard-svc.yaml", "0640"), + }, false, "dashboard", "kubernetes", map[string]string{ "Dashboard": "kubernetesui/dashboard:v2.1.0@sha256:7f80b5ba141bead69c4fee8661464857af300d7d7ed0274cf7beecedc00322e6", "MetricsScraper": "kubernetesui/metrics-scraper:v1.0.4@sha256:555981a24f184420f3be0c79d4efb6c948a85cfce84034f85a563f4151a81cbf", }, nil), "default-storageclass": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/storageclass/storageclass.yaml.tmpl", + MustBinAsset(addons.DefaultStorageClassAssets, + "storageclass/storageclass.yaml.tmpl", vmpath.GuestAddonsDir, "storageclass.yaml", "0640"), - }, true, "default-storageclass", nil, nil), + }, true, "default-storageclass", "kubernetes", nil, nil), "pod-security-policy": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/pod-security-policy/pod-security-policy.yaml.tmpl", + MustBinAsset(addons.PodSecurityPolicyAssets, + "pod-security-policy/pod-security-policy.yaml.tmpl", vmpath.GuestAddonsDir, "pod-security-policy.yaml", "0640"), - }, false, "pod-security-policy", nil, nil), + }, false, "pod-security-policy", "", nil, nil), "storage-provisioner": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/storage-provisioner/storage-provisioner.yaml.tmpl", + MustBinAsset(addons.StorageProvisionerAssets, + "storage-provisioner/storage-provisioner.yaml.tmpl", vmpath.GuestAddonsDir, "storage-provisioner.yaml", "0640"), - }, true, "storage-provisioner", map[string]string{ + }, true, "storage-provisioner", "kubernetes", map[string]string{ "StorageProvisioner": fmt.Sprintf("k8s-minikube/storage-provisioner:%s", version.GetStorageProvisionerVersion()), }, map[string]string{ "StorageProvisioner": "gcr.io", }), "storage-provisioner-gluster": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/storage-provisioner-gluster/storage-gluster-ns.yaml.tmpl", + MustBinAsset(addons.StorageProvisionerGlusterAssets, + "storage-provisioner-gluster/storage-gluster-ns.yaml.tmpl", vmpath.GuestAddonsDir, "storage-gluster-ns.yaml", "0640"), - MustBinAsset( - "deploy/addons/storage-provisioner-gluster/glusterfs-daemonset.yaml.tmpl", + MustBinAsset(addons.StorageProvisionerGlusterAssets, + "storage-provisioner-gluster/glusterfs-daemonset.yaml.tmpl", vmpath.GuestAddonsDir, "glusterfs-daemonset.yaml", "0640"), - MustBinAsset( - "deploy/addons/storage-provisioner-gluster/heketi-deployment.yaml.tmpl", + MustBinAsset(addons.StorageProvisionerGlusterAssets, + "storage-provisioner-gluster/heketi-deployment.yaml.tmpl", vmpath.GuestAddonsDir, "heketi-deployment.yaml", "0640"), - MustBinAsset( - "deploy/addons/storage-provisioner-gluster/storage-provisioner-glusterfile.yaml.tmpl", + MustBinAsset(addons.StorageProvisionerGlusterAssets, + "storage-provisioner-gluster/storage-provisioner-glusterfile.yaml.tmpl", vmpath.GuestAddonsDir, "storage-privisioner-glusterfile.yaml", "0640"), - }, false, "storage-provisioner-gluster", map[string]string{ + }, false, "storage-provisioner-gluster", "", map[string]string{ "Heketi": "heketi/heketi:10@sha256:76d5a6a3b7cf083d1e99efa1c15abedbc5c8b73bef3ade299ce9a4c16c9660f8", "GlusterfileProvisioner": "gluster/glusterfile-provisioner:latest@sha256:9961a35cb3f06701958e202324141c30024b195579e5eb1704599659ddea5223", "GlusterfsServer": "nixpanic/glusterfs-server:pr_fake-disk@sha256:3c58ae9d4e2007758954879d3f4095533831eb757c64ca6a0e32d1fc53fb6034", @@ -179,37 +188,37 @@ var Addons = map[string]*Addon{ "GlusterfsServer": "quay.io", }), "efk": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/efk/elasticsearch-rc.yaml.tmpl", + MustBinAsset(addons.EfkAssets, + "efk/elasticsearch-rc.yaml.tmpl", vmpath.GuestAddonsDir, "elasticsearch-rc.yaml", "0640"), - MustBinAsset( - "deploy/addons/efk/elasticsearch-svc.yaml.tmpl", + MustBinAsset(addons.EfkAssets, + "efk/elasticsearch-svc.yaml.tmpl", vmpath.GuestAddonsDir, "elasticsearch-svc.yaml", "0640"), - MustBinAsset( - "deploy/addons/efk/fluentd-es-rc.yaml.tmpl", + MustBinAsset(addons.EfkAssets, + "efk/fluentd-es-rc.yaml.tmpl", vmpath.GuestAddonsDir, "fluentd-es-rc.yaml", "0640"), - MustBinAsset( - "deploy/addons/efk/fluentd-es-configmap.yaml.tmpl", + MustBinAsset(addons.EfkAssets, + "efk/fluentd-es-configmap.yaml.tmpl", vmpath.GuestAddonsDir, "fluentd-es-configmap.yaml", "0640"), - MustBinAsset( - "deploy/addons/efk/kibana-rc.yaml.tmpl", + MustBinAsset(addons.EfkAssets, + "efk/kibana-rc.yaml.tmpl", vmpath.GuestAddonsDir, "kibana-rc.yaml", "0640"), - MustBinAsset( - "deploy/addons/efk/kibana-svc.yaml.tmpl", + MustBinAsset(addons.EfkAssets, + "efk/kibana-svc.yaml.tmpl", vmpath.GuestAddonsDir, "kibana-svc.yaml", "0640"), - }, false, "efk", map[string]string{ + }, false, "efk", "", map[string]string{ "Elasticsearch": "elasticsearch:v5.6.2@sha256:7e95b32a7a2aad0c0db5c881e4a1ce8b7e53236144ae9d9cfb5fbe5608af4ab2", "FluentdElasticsearch": "fluentd-elasticsearch:v2.0.2@sha256:d0480bbf2d0de2344036fa3f7034cf7b4b98025a89c71d7f1f1845ac0e7d5a97", "Alpine": "alpine:3.6@sha256:66790a2b79e1ea3e1dabac43990c54aca5d1ddf268d9a5a0285e4167c8b24475", @@ -220,22 +229,22 @@ var Addons = map[string]*Addon{ "Kibana": "docker.elastic.co", }), "ingress": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/ingress/ingress-configmap.yaml.tmpl", + MustBinAsset(addons.IngressAssets, + "ingress/ingress-configmap.yaml.tmpl", vmpath.GuestAddonsDir, "ingress-configmap.yaml", "0640"), - MustBinAsset( - "deploy/addons/ingress/ingress-rbac.yaml.tmpl", + MustBinAsset(addons.IngressAssets, + "ingress/ingress-rbac.yaml.tmpl", vmpath.GuestAddonsDir, "ingress-rbac.yaml", "0640"), - MustBinAsset( - "deploy/addons/ingress/ingress-dp.yaml.tmpl", + MustBinAsset(addons.IngressAssets, + "ingress/ingress-dp.yaml.tmpl", vmpath.GuestAddonsDir, "ingress-dp.yaml", "0640"), - }, false, "ingress", map[string]string{ + }, false, "ingress", "", map[string]string{ "IngressController": "ingress-nginx/controller:v0.44.0@sha256:3dd0fac48073beaca2d67a78c746c7593f9c575168a17139a9955a82c63c4b9a", "KubeWebhookCertgenCreate": "docker.io/jettech/kube-webhook-certgen:v1.5.1@sha256:950833e19ade18cd389d647efb88992a7cc077abedef343fa59e012d376d79b7", "KubeWebhookCertgenPatch": "docker.io/jettech/kube-webhook-certgen:v1.5.1@sha256:950833e19ade18cd389d647efb88992a7cc077abedef343fa59e012d376d79b7", @@ -243,68 +252,68 @@ var Addons = map[string]*Addon{ "IngressController": "k8s.gcr.io", }), "istio-provisioner": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/istio-provisioner/istio-operator.yaml.tmpl", + MustBinAsset(addons.IstioProvisionerAssets, + "istio-provisioner/istio-operator.yaml.tmpl", vmpath.GuestAddonsDir, "istio-operator.yaml", "0640"), - }, false, "istio-provisioner", map[string]string{ + }, false, "istio-provisioner", "", map[string]string{ "IstioOperator": "istio/operator:1.5.0@sha256:25a6398ed4996a5313767ceb63768d503c266f63506ad3074b30eef6b5b5167e", }, nil), "istio": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/istio/istio-default-profile.yaml.tmpl", + MustBinAsset(addons.IstioAssets, + "istio/istio-default-profile.yaml.tmpl", vmpath.GuestAddonsDir, "istio-default-profile.yaml", "0640"), - }, false, "istio", nil, nil), + }, false, "istio", "", nil, nil), "kubevirt": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/kubevirt/pod.yaml.tmpl", + MustBinAsset(addons.KubevirtAssets, + "kubevirt/pod.yaml.tmpl", vmpath.GuestAddonsDir, "pod.yaml", "0640"), - }, false, "kubevirt", map[string]string{ + }, false, "kubevirt", "", map[string]string{ "Kubectl": "bitnami/kubectl:1.17@sha256:de642e973d3d0ef60e4d0a1f92286a9fdae245535c5990d4762bbe86fcf95887", }, nil), "metrics-server": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/metrics-server/metrics-apiservice.yaml.tmpl", + MustBinAsset(addons.MetricsServerAssets, + "metrics-server/metrics-apiservice.yaml.tmpl", vmpath.GuestAddonsDir, "metrics-apiservice.yaml", "0640"), - MustBinAsset( - "deploy/addons/metrics-server/metrics-server-deployment.yaml.tmpl", + MustBinAsset(addons.MetricsServerAssets, + "metrics-server/metrics-server-deployment.yaml.tmpl", vmpath.GuestAddonsDir, "metrics-server-deployment.yaml", "0640"), - MustBinAsset( - "deploy/addons/metrics-server/metrics-server-rbac.yaml.tmpl", + MustBinAsset(addons.MetricsServerAssets, + "metrics-server/metrics-server-rbac.yaml.tmpl", vmpath.GuestAddonsDir, "metrics-server-rbac.yaml", "0640"), - MustBinAsset( - "deploy/addons/metrics-server/metrics-server-service.yaml.tmpl", + MustBinAsset(addons.MetricsServerAssets, + "metrics-server/metrics-server-service.yaml.tmpl", vmpath.GuestAddonsDir, "metrics-server-service.yaml", "0640"), - }, false, "metrics-server", map[string]string{ + }, false, "metrics-server", "kubernetes", map[string]string{ "MetricsServer": "metrics-server/metrics-server:v0.4.2@sha256:dbc33d7d35d2a9cc5ab402005aa7a0d13be6192f3550c7d42cba8d2d5e3a5d62", }, map[string]string{ "MetricsServer": "k8s.gcr.io", }), "olm": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/olm/crds.yaml.tmpl", + MustBinAsset(addons.OlmAssets, + "olm/crds.yaml.tmpl", vmpath.GuestAddonsDir, "crds.yaml", "0640"), - MustBinAsset( - "deploy/addons/olm/olm.yaml.tmpl", + MustBinAsset(addons.OlmAssets, + "olm/olm.yaml.tmpl", vmpath.GuestAddonsDir, "olm.yaml", "0640"), - }, false, "olm", map[string]string{ + }, false, "olm", "", map[string]string{ "OLM": "operator-framework/olm:v0.17.0@sha256:de396b540b82219812061d0d753440d5655250c621c753ed1dc67d6154741607", "UpstreamCommunityOperators": "operator-framework/upstream-community-operators:07bbc13@sha256:cc7b3fdaa1ccdea5866fcd171669dc0ed88d3477779d8ed32e3712c827e38cc0", }, map[string]string{ @@ -312,63 +321,63 @@ var Addons = map[string]*Addon{ "UpstreamCommunityOperators": "quay.io", }), "registry": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/registry/registry-rc.yaml.tmpl", + MustBinAsset(addons.RegistryAssets, + "registry/registry-rc.yaml.tmpl", vmpath.GuestAddonsDir, "registry-rc.yaml", "0640"), - MustBinAsset( - "deploy/addons/registry/registry-svc.yaml.tmpl", + MustBinAsset(addons.RegistryAssets, + "registry/registry-svc.yaml.tmpl", vmpath.GuestAddonsDir, "registry-svc.yaml", "0640"), - MustBinAsset( - "deploy/addons/registry/registry-proxy.yaml.tmpl", + MustBinAsset(addons.RegistryAssets, + "registry/registry-proxy.yaml.tmpl", vmpath.GuestAddonsDir, "registry-proxy.yaml", "0640"), - }, false, "registry", map[string]string{ + }, false, "registry", "google", map[string]string{ "Registry": "registry:2.7.1@sha256:d5459fcb27aecc752520df4b492b08358a1912fcdfa454f7d2101d4b09991daa", "KubeRegistryProxy": "google_containers/kube-registry-proxy:0.4@sha256:1040f25a5273de0d72c54865a8efd47e3292de9fb8e5353e3fa76736b854f2da", }, map[string]string{ "KubeRegistryProxy": "gcr.io", }), "registry-creds": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/registry-creds/registry-creds-rc.yaml.tmpl", + MustBinAsset(addons.RegistryCredsAssets, + "registry-creds/registry-creds-rc.yaml.tmpl", vmpath.GuestAddonsDir, "registry-creds-rc.yaml", "0640"), - }, false, "registry-creds", map[string]string{ + }, false, "registry-creds", "", map[string]string{ "RegistryCreds": "upmcenterprises/registry-creds:1.10@sha256:93a633d4f2b76a1c66bf19c664dbddc56093a543de6d54320f19f585ccd7d605", }, nil), "registry-aliases": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/registry-aliases/registry-aliases-sa.tmpl", + MustBinAsset(addons.RegistryAliasesAssets, + "registry-aliases/registry-aliases-sa.tmpl", vmpath.GuestAddonsDir, "registry-aliases-sa.yaml", "0640"), - MustBinAsset( - "deploy/addons/registry-aliases/registry-aliases-sa-crb.tmpl", + MustBinAsset(addons.RegistryAliasesAssets, + "registry-aliases/registry-aliases-sa-crb.tmpl", vmpath.GuestAddonsDir, "registry-aliases-sa-crb.yaml", "0640"), - MustBinAsset( - "deploy/addons/registry-aliases/registry-aliases-config.tmpl", + MustBinAsset(addons.RegistryAliasesAssets, + "registry-aliases/registry-aliases-config.tmpl", vmpath.GuestAddonsDir, "registry-aliases-config.yaml", "0640"), - MustBinAsset( - "deploy/addons/registry-aliases/node-etc-hosts-update.tmpl", + MustBinAsset(addons.RegistryAliasesAssets, + "registry-aliases/node-etc-hosts-update.tmpl", vmpath.GuestAddonsDir, "node-etc-hosts-update.yaml", "0640"), - MustBinAsset( - "deploy/addons/registry-aliases/patch-coredns-job.tmpl", + MustBinAsset(addons.RegistryAliasesAssets, + "registry-aliases/patch-coredns-job.tmpl", vmpath.GuestAddonsDir, "patch-coredns-job.yaml", "0640"), - }, false, "registry-aliases", map[string]string{ + }, false, "registry-aliases", "", map[string]string{ "CoreDNSPatcher": "rhdevelopers/core-dns-patcher@sha256:9220ff32f690c3d889a52afb59ca6fcbbdbd99e5370550cc6fd249adea8ed0a9", "Alpine": "alpine:3.11@sha256:0bd0e9e03a022c3b0226667621da84fc9bf562a9056130424b5bfbd8bcb0397f", "Pause": "google_containers/pause:3.1@sha256:f78411e19d84a252e53bff71a4407a5686c46983a2c2eeed83929b888179acea", @@ -377,23 +386,23 @@ var Addons = map[string]*Addon{ "Pause": "gcr.io", }), "freshpod": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/freshpod/freshpod-rc.yaml.tmpl", + MustBinAsset(addons.FreshpodAssets, + "freshpod/freshpod-rc.yaml.tmpl", vmpath.GuestAddonsDir, "freshpod-rc.yaml", "0640"), - }, false, "freshpod", map[string]string{ + }, false, "freshpod", "google", map[string]string{ "FreshPod": "google-samples/freshpod:v0.0.1@sha256:b9efde5b509da3fd2959519c4147b653d0c5cefe8a00314e2888e35ecbcb46f9", }, map[string]string{ "FreshPod": "gcr.io", }), "nvidia-driver-installer": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/gpu/nvidia-driver-installer.yaml.tmpl", + MustBinAsset(addons.NvidiaDriverInstallerAssets, + "gpu/nvidia-driver-installer.yaml.tmpl", vmpath.GuestAddonsDir, "nvidia-driver-installer.yaml", "0640"), - }, false, "nvidia-driver-installer", map[string]string{ + }, false, "nvidia-driver-installer", "google", map[string]string{ "NvidiaDriverInstaller": "minikube-nvidia-driver-installer:e2d9b43228decf5d6f7dce3f0a85d390f138fa01", "Pause": "pause:2.0@sha256:9ce5316f9752b8347484ab0f6778573af15524124d52b93230b9a0dcc987e73e", }, map[string]string{ @@ -401,242 +410,242 @@ var Addons = map[string]*Addon{ "Pause": "k8s.gcr.io", }), "nvidia-gpu-device-plugin": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/gpu/nvidia-gpu-device-plugin.yaml.tmpl", + MustBinAsset(addons.NvidiaGpuDevicePluginAssets, + "gpu/nvidia-gpu-device-plugin.yaml.tmpl", vmpath.GuestAddonsDir, "nvidia-gpu-device-plugin.yaml", "0640"), - }, false, "nvidia-gpu-device-plugin", map[string]string{ + }, false, "nvidia-gpu-device-plugin", "", map[string]string{ "NvidiaDevicePlugin": "nvidia/k8s-device-plugin:1.0.0-beta4@sha256:94d46bf513cbc43c4d77a364e4bbd409d32d89c8e686e12551cc3eb27c259b90", }, nil), "logviewer": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/logviewer/logviewer-dp-and-svc.yaml.tmpl", + MustBinAsset(addons.LogviewerAssets, + "logviewer/logviewer-dp-and-svc.yaml.tmpl", vmpath.GuestAddonsDir, "logviewer-dp-and-svc.yaml", "0640"), - MustBinAsset( - "deploy/addons/logviewer/logviewer-rbac.yaml.tmpl", + MustBinAsset(addons.LogviewerAssets, + "logviewer/logviewer-rbac.yaml.tmpl", vmpath.GuestAddonsDir, "logviewer-rbac.yaml", "0640"), - }, false, "logviewer", map[string]string{ + }, false, "logviewer", "google", map[string]string{ "LogViewer": "ivans3/minikube-log-viewer:latest@sha256:75854f45305cc47d17b04c6c588fa60777391761f951e3a34161ddf1f1b06405", }, nil), "gvisor": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/gvisor/gvisor-pod.yaml.tmpl", + MustBinAsset(addons.GvisorAssets, + "gvisor/gvisor-pod.yaml.tmpl", vmpath.GuestAddonsDir, "gvisor-pod.yaml", "0640"), - MustBinAsset( - "deploy/addons/gvisor/gvisor-runtimeclass.yaml.tmpl", + MustBinAsset(addons.GvisorAssets, + "gvisor/gvisor-runtimeclass.yaml.tmpl", vmpath.GuestAddonsDir, "gvisor-runtimeclass.yaml", "0640"), - MustBinAsset( - "deploy/addons/gvisor/gvisor-config.toml", + MustBinAsset(addons.GvisorAssets, + "gvisor/gvisor-config.toml", vmpath.GuestGvisorDir, constants.GvisorConfigTomlTargetName, "0640"), - }, false, "gvisor", map[string]string{ + }, false, "gvisor", "google", map[string]string{ "GvisorAddon": "k8s-minikube/gvisor-addon:3@sha256:23eb17d48a66fc2b09c31454fb54ecae520c3e9c9197ef17fcb398b4f31d505a", }, map[string]string{ "GvisorAddon": "gcr.io", }), "helm-tiller": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/helm-tiller/helm-tiller-dp.tmpl", + MustBinAsset(addons.HelmTillerAssets, + "helm-tiller/helm-tiller-dp.tmpl", vmpath.GuestAddonsDir, "helm-tiller-dp.yaml", "0640"), - MustBinAsset( - "deploy/addons/helm-tiller/helm-tiller-rbac.tmpl", + MustBinAsset(addons.HelmTillerAssets, + "helm-tiller/helm-tiller-rbac.tmpl", vmpath.GuestAddonsDir, "helm-tiller-rbac.yaml", "0640"), - MustBinAsset( - "deploy/addons/helm-tiller/helm-tiller-svc.tmpl", + MustBinAsset(addons.HelmTillerAssets, + "helm-tiller/helm-tiller-svc.tmpl", vmpath.GuestAddonsDir, "helm-tiller-svc.yaml", "0640"), - }, false, "helm-tiller", map[string]string{ + }, false, "helm-tiller", "", map[string]string{ "Tiller": "kubernetes-helm/tiller:v2.16.12@sha256:6003775d503546087266eda39418d221f9afb5ccfe35f637c32a1161619a3f9c", }, map[string]string{ "Tiller": "gcr.io", }), "ingress-dns": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/ingress-dns/ingress-dns-pod.yaml.tmpl", + MustBinAsset(addons.IngressDNSAssets, + "ingress-dns/ingress-dns-pod.yaml.tmpl", vmpath.GuestAddonsDir, "ingress-dns-pod.yaml", "0640"), - }, false, "ingress-dns", map[string]string{ + }, false, "ingress-dns", "", map[string]string{ "IngressDNS": "cryptexlabs/minikube-ingress-dns:0.3.0@sha256:e252d2a4c704027342b303cc563e95d2e71d2a0f1404f55d676390e28d5093ab", }, nil), "metallb": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/metallb/metallb.yaml.tmpl", + MustBinAsset(addons.MetallbAssets, + "metallb/metallb.yaml.tmpl", vmpath.GuestAddonsDir, "metallb.yaml", "0640"), - MustBinAsset( - "deploy/addons/metallb/metallb-config.yaml.tmpl", + MustBinAsset(addons.MetallbAssets, + "metallb/metallb-config.yaml.tmpl", vmpath.GuestAddonsDir, "metallb-config.yaml", "0640"), - }, false, "metallb", map[string]string{ - "Speaker": "metallb/speaker:v0.8.2@sha256:f1941498a28cdb332429e25d18233683da6949ecfc4f6dacf12b1416d7d38263", - "Controller": "metallb/controller:v0.8.2@sha256:5c050e59074e152711737d2bb9ede96dff67016c80cf25cdf5fc46109718a583", + }, false, "metallb", "", map[string]string{ + "Speaker": "metallb/speaker:v0.9.6@sha256:c66585a805bed1a3b829d8fb4a4aab9d87233497244ebff96f1b88f1e7f8f991", + "Controller": "metallb/controller:v0.9.6@sha256:fbfdb9d3f55976b0ee38f3309d83a4ca703efcf15d6ca7889cd8189142286502", }, nil), "ambassador": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/ambassador/ambassador-operator-crds.yaml.tmpl", + MustBinAsset(addons.AmbassadorAssets, + "ambassador/ambassador-operator-crds.yaml.tmpl", vmpath.GuestAddonsDir, "ambassador-operator-crds.yaml", "0640"), - MustBinAsset( - "deploy/addons/ambassador/ambassador-operator.yaml.tmpl", + MustBinAsset(addons.AmbassadorAssets, + "ambassador/ambassador-operator.yaml.tmpl", vmpath.GuestAddonsDir, "ambassador-operator.yaml", "0640"), - MustBinAsset( - "deploy/addons/ambassador/ambassadorinstallation.yaml.tmpl", + MustBinAsset(addons.AmbassadorAssets, + "ambassador/ambassadorinstallation.yaml.tmpl", vmpath.GuestAddonsDir, "ambassadorinstallation.yaml", "0640"), - }, false, "ambassador", map[string]string{ + }, false, "ambassador", "", map[string]string{ "AmbassadorOperator": "datawire/ambassador-operator:v1.2.3@sha256:492f33e0828a371aa23331d75c11c251b21499e31287f026269e3f6ec6da34ed", }, map[string]string{ "AmbassadorOperator": "quay.io", }), "gcp-auth": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/gcp-auth/gcp-auth-ns.yaml.tmpl", + MustBinAsset(addons.GcpAuthAssets, + "gcp-auth/gcp-auth-ns.yaml.tmpl", vmpath.GuestAddonsDir, "gcp-auth-ns.yaml", "0640"), - MustBinAsset( - "deploy/addons/gcp-auth/gcp-auth-service.yaml.tmpl", + MustBinAsset(addons.GcpAuthAssets, + "gcp-auth/gcp-auth-service.yaml.tmpl", vmpath.GuestAddonsDir, "gcp-auth-service.yaml", "0640"), - MustBinAsset( - "deploy/addons/gcp-auth/gcp-auth-webhook.yaml.tmpl.tmpl", + MustBinAsset(addons.GcpAuthAssets, + "gcp-auth/gcp-auth-webhook.yaml.tmpl.tmpl", vmpath.GuestAddonsDir, "gcp-auth-webhook.yaml", "0640"), - }, false, "gcp-auth", map[string]string{ + }, false, "gcp-auth", "google", map[string]string{ "KubeWebhookCertgen": "jettech/kube-webhook-certgen:v1.3.0@sha256:ff01fba91131ed260df3f3793009efbf9686f5a5ce78a85f81c386a4403f7689", - "GCPAuthWebhook": "k8s-minikube/gcp-auth-webhook:v0.0.5@sha256:4da26a6937e876c80642c98fed9efb2269a5d2cb55029de9e2685c9fd6bc1add", + "GCPAuthWebhook": "k8s-minikube/gcp-auth-webhook:v0.0.6@sha256:c407ad6ee97d8a0e8a21c713e2d9af66aaf73315e4a123874c00b786f962f3cd", }, map[string]string{ "GCPAuthWebhook": "gcr.io", }), "volumesnapshots": NewAddon([]*BinAsset{ // make sure the order of apply. `csi-hostpath-snapshotclass` must be the first position, because it depends on `snapshot.storage.k8s.io_volumesnapshotclasses` // if user disable volumesnapshots addon and delete `csi-hostpath-snapshotclass` after `snapshot.storage.k8s.io_volumesnapshotclasses`, kubernetes will return the error - MustBinAsset( - "deploy/addons/volumesnapshots/csi-hostpath-snapshotclass.yaml.tmpl", + MustBinAsset(addons.VolumeSnapshotsAssets, + "volumesnapshots/csi-hostpath-snapshotclass.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-snapshotclass.yaml", "0640"), - MustBinAsset( - "deploy/addons/volumesnapshots/snapshot.storage.k8s.io_volumesnapshotclasses.yaml.tmpl", + MustBinAsset(addons.VolumeSnapshotsAssets, + "volumesnapshots/snapshot.storage.k8s.io_volumesnapshotclasses.yaml.tmpl", vmpath.GuestAddonsDir, "snapshot.storage.k8s.io_volumesnapshotclasses.yaml", "0640"), - MustBinAsset( - "deploy/addons/volumesnapshots/snapshot.storage.k8s.io_volumesnapshotcontents.yaml.tmpl", + MustBinAsset(addons.VolumeSnapshotsAssets, + "volumesnapshots/snapshot.storage.k8s.io_volumesnapshotcontents.yaml.tmpl", vmpath.GuestAddonsDir, "snapshot.storage.k8s.io_volumesnapshotcontents.yaml", "0640"), - MustBinAsset( - "deploy/addons/volumesnapshots/snapshot.storage.k8s.io_volumesnapshots.yaml.tmpl", + MustBinAsset(addons.VolumeSnapshotsAssets, + "volumesnapshots/snapshot.storage.k8s.io_volumesnapshots.yaml.tmpl", vmpath.GuestAddonsDir, "snapshot.storage.k8s.io_volumesnapshots.yaml", "0640"), - MustBinAsset( - "deploy/addons/volumesnapshots/rbac-volume-snapshot-controller.yaml.tmpl", + MustBinAsset(addons.VolumeSnapshotsAssets, + "volumesnapshots/rbac-volume-snapshot-controller.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-volume-snapshot-controller.yaml", "0640"), - MustBinAsset( - "deploy/addons/volumesnapshots/volume-snapshot-controller-deployment.yaml.tmpl", + MustBinAsset(addons.VolumeSnapshotsAssets, + "volumesnapshots/volume-snapshot-controller-deployment.yaml.tmpl", vmpath.GuestAddonsDir, "volume-snapshot-controller-deployment.yaml", "0640"), - }, false, "volumesnapshots", map[string]string{ + }, false, "volumesnapshots", "kubernetes", map[string]string{ "SnapshotController": "sig-storage/snapshot-controller:v4.0.0@sha256:00fcc441ea9f72899c25eed61d602272a2a58c5f0014332bdcb5ac24acef08e4", }, map[string]string{ "SnapshotController": "k8s.gcr.io", }), "csi-hostpath-driver": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/csi-hostpath-driver/rbac/rbac-external-attacher.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/rbac/rbac-external-attacher.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-external-attacher.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/rbac/rbac-external-health-monitor-agent.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/rbac/rbac-external-health-monitor-agent.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-external-health-monitor-agent.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/rbac/rbac-external-health-monitor-controller.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/rbac/rbac-external-health-monitor-controller.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-external-health-monitor-controller.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/rbac/rbac-external-provisioner.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/rbac/rbac-external-provisioner.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-external-provisioner.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/rbac/rbac-external-resizer.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/rbac/rbac-external-resizer.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-external-resizer.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/rbac/rbac-external-snapshotter.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/rbac/rbac-external-snapshotter.yaml.tmpl", vmpath.GuestAddonsDir, "rbac-external-snapshotter.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-attacher.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-attacher.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-attacher.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-driverinfo.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-driverinfo.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-driverinfo.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-plugin.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-plugin.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-plugin.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-provisioner.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-provisioner.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-provisioner.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-resizer.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-resizer.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-resizer.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-snapshotter.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-snapshotter.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-snapshotter.yaml", "0640"), - MustBinAsset( - "deploy/addons/csi-hostpath-driver/deploy/csi-hostpath-storageclass.yaml.tmpl", + MustBinAsset(addons.CsiHostpathDriverAssets, + "csi-hostpath-driver/deploy/csi-hostpath-storageclass.yaml.tmpl", vmpath.GuestAddonsDir, "csi-hostpath-storageclass.yaml", "0640"), - }, false, "csi-hostpath-driver", map[string]string{ + }, false, "csi-hostpath-driver", "kubernetes", map[string]string{ "Attacher": "sig-storage/csi-attacher:v3.1.0@sha256:50c3cfd458fc8e0bf3c8c521eac39172009382fc66dc5044a330d137c6ed0b09", "HostMonitorAgent": "sig-storage/csi-external-health-monitor-agent:v0.2.0@sha256:c20d4a4772599e68944452edfcecc944a1df28c19e94b942d526ca25a522ea02", "HostMonitorController": "sig-storage/csi-external-health-monitor-controller:v0.2.0@sha256:14988b598a180cc0282f3f4bc982371baf9a9c9b80878fb385f8ae8bd04ecf16", @@ -657,10 +666,119 @@ 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", "portainer.io", nil, nil), +} + +// parseMapString creates a map based on `str` which is encoded as =,=,... +func parseMapString(str string) map[string]string { + mapResult := make(map[string]string) + if str == "" { + return mapResult + } + for _, pairText := range strings.Split(str, ",") { + vals := strings.Split(pairText, "=") + if len(vals) != 2 { + out.WarningT("Ignoring invalid pair entry {{.pair}}", out.V{"pair": pairText}) + continue + } + mapResult[vals[0]] = vals[1] + } + return mapResult +} + +// mergeMaps creates a map with the union of `sourceMap` and `overrideMap` where collisions take the value of `overrideMap`. +func mergeMaps(sourceMap, overrideMap map[string]string) map[string]string { + result := make(map[string]string) + for name, value := range sourceMap { + result[name] = value + } + for name, value := range overrideMap { + result[name] = value + } + return result +} + +// filterKeySpace creates a map of the values in `targetMap` where the keys are also in `keySpace`. +func filterKeySpace(keySpace map[string]string, targetMap map[string]string) map[string]string { + result := make(map[string]string) + for name := range keySpace { + if value, ok := targetMap[name]; ok { + result[name] = value + } + } + return result +} + +// overrideDefaults creates a copy of `defaultMap` where `overrideMap` replaces any of its values that `overrideMap` contains. +func overrideDefaults(defaultMap, overrideMap map[string]string) map[string]string { + return mergeMaps(defaultMap, filterKeySpace(defaultMap, overrideMap)) +} + +// SelectAndPersistImages selects which images to use based on addon default images, previously persisted images, and newly requested images - which are then persisted for future enables. +func SelectAndPersistImages(addon *Addon, cc *config.ClusterConfig) (images, customRegistries map[string]string, err error) { + addonDefaultImages := addon.Images + if addonDefaultImages == nil { + addonDefaultImages = make(map[string]string) + } + + // Use previously configured custom images. + images = overrideDefaults(addonDefaultImages, cc.CustomAddonImages) + if viper.IsSet(config.AddonImages) { + // Parse the AddonImages flag if present. + newImages := parseMapString(viper.GetString(config.AddonImages)) + for name, image := range newImages { + if image == "" { + out.WarningT("Ignoring empty custom image {{.name}}", out.V{"name": name}) + delete(newImages, name) + continue + } + if _, ok := addonDefaultImages[name]; !ok { + out.WarningT("Ignoring unknown custom image {{.name}}", out.V{"name": name}) + } + } + // Use newly configured custom images. + images = overrideDefaults(addonDefaultImages, newImages) + // Store custom addon images to be written. + cc.CustomAddonImages = mergeMaps(cc.CustomAddonImages, images) + } + + // Use previously configured custom registries. + customRegistries = filterKeySpace(addonDefaultImages, cc.CustomAddonRegistries) // filter by images map because registry map may omit default registry. + if viper.IsSet(config.AddonRegistries) { + // Parse the AddonRegistries flag if present. + customRegistries = parseMapString(viper.GetString(config.AddonRegistries)) + for name := range customRegistries { + if _, ok := addonDefaultImages[name]; !ok { // check images map because registry map may omitted default registry + out.WarningT("Ignoring unknown custom registry {{.name}}", out.V{"name": name}) + delete(customRegistries, name) + } + } + // Since registry map may omit default registry, any previously set custom registries for these images must be cleared. + for name := range addonDefaultImages { + delete(cc.CustomAddonRegistries, name) + } + // Merge newly set registries into custom addon registries to be written. + cc.CustomAddonRegistries = mergeMaps(cc.CustomAddonRegistries, customRegistries) + } + + err = nil + // If images or registries were specified, save the config afterward. + if viper.IsSet(config.AddonImages) || viper.IsSet(config.AddonRegistries) { + // Since these values are only set when a user enables an addon, it is safe to refer to the profile name. + err = config.Write(viper.GetString(config.ProfileName), cc) + // Whether err is nil or not we still return here. + } + return images, customRegistries, err } // GenerateTemplateData generates template data for template assets -func GenerateTemplateData(addon *Addon, cfg config.KubernetesConfig, networkInfo NetworkInfo) interface{} { +func GenerateTemplateData(addon *Addon, cfg config.KubernetesConfig, netInfo NetworkInfo, images, customRegistries map[string]string) interface{} { a := runtime.GOARCH // Some legacy docker images still need the -arch suffix @@ -669,6 +787,7 @@ func GenerateTemplateData(addon *Addon, cfg config.KubernetesConfig, networkInfo if runtime.GOARCH != "amd64" { ea = "-" + runtime.GOARCH } + opts := struct { Arch string ExoticArch string @@ -676,6 +795,7 @@ func GenerateTemplateData(addon *Addon, cfg config.KubernetesConfig, networkInfo LoadBalancerStartIP string LoadBalancerEndIP string CustomIngressCert string + ContainerRuntime string Images map[string]string Registries map[string]string CustomRegistries map[string]string @@ -687,57 +807,22 @@ func GenerateTemplateData(addon *Addon, cfg config.KubernetesConfig, networkInfo LoadBalancerStartIP: cfg.LoadBalancerStartIP, LoadBalancerEndIP: cfg.LoadBalancerEndIP, CustomIngressCert: cfg.CustomIngressCert, - Images: addon.Images, + ContainerRuntime: cfg.ContainerRuntime, + Images: images, Registries: addon.Registries, - CustomRegistries: make(map[string]string), + CustomRegistries: customRegistries, NetworkInfo: make(map[string]string), } if opts.ImageRepository != "" && !strings.HasSuffix(opts.ImageRepository, "/") { opts.ImageRepository += "/" } - - // Network info for generating template - opts.NetworkInfo["ControlPlaneNodeIP"] = networkInfo.ControlPlaneNodeIP - - if opts.Images == nil { - opts.Images = make(map[string]string) // Avoid nil access when rendering - } - - images := viper.GetString(config.AddonImages) - if images != "" { - for _, image := range strings.Split(images, ",") { - vals := strings.Split(image, "=") - if len(vals) != 2 || vals[1] == "" { - out.WarningT("Ignoring invalid custom image {{.conf}}", out.V{"conf": image}) - continue - } - if _, ok := opts.Images[vals[0]]; ok { - opts.Images[vals[0]] = vals[1] - } else { - out.WarningT("Ignoring unknown custom image {{.name}}", out.V{"name": vals[0]}) - } - } - } - if opts.Registries == nil { opts.Registries = make(map[string]string) } - registries := viper.GetString(config.AddonRegistries) - if registries != "" { - for _, registry := range strings.Split(registries, ",") { - vals := strings.Split(registry, "=") - if len(vals) != 2 { - out.WarningT("Ignoring invalid custom registry {{.conf}}", out.V{"conf": registry}) - continue - } - if _, ok := opts.Images[vals[0]]; ok { // check images map because registry map may omitted default registry - opts.CustomRegistries[vals[0]] = vals[1] - } else { - out.WarningT("Ignoring unknown custom registry {{.name}}", out.V{"name": vals[0]}) - } - } - } + // Network info for generating template + opts.NetworkInfo["ControlPlaneNodeIP"] = netInfo.ControlPlaneNodeIP + opts.NetworkInfo["ControlPlaneNodePort"] = fmt.Sprint(netInfo.ControlPlaneNodePort) // Append postfix "/" to registries for k, v := range opts.Registries { diff --git a/pkg/minikube/assets/addons_test.go b/pkg/minikube/assets/addons_test.go new file mode 100644 index 0000000000..22530cff06 --- /dev/null +++ b/pkg/minikube/assets/addons_test.go @@ -0,0 +1,144 @@ +/* +Copyright 2016 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package assets + +import "testing" + +// mapsEqual returns true if and only if `a` contains all the same pairs as `b`. +func mapsEqual(a, b map[string]string) bool { + for aKey, aValue := range a { + if bValue, ok := b[aKey]; !ok || aValue != bValue { + return false + } + } + + for bKey := range b { + if _, ok := a[bKey]; !ok { + return false + } + } + return true +} + +func TestParseMapString(t *testing.T) { + cases := map[string]map[string]string{ + "Ardvark=1,B=2,Cantaloupe=3": {"Ardvark": "1", "B": "2", "Cantaloupe": "3"}, + "A=,B=2,C=": {"A": "", "B": "2", "C": ""}, + "": {}, + "malformed,good=howdy,manyequals==,": {"good": "howdy"}, + } + for actual, expected := range cases { + if parsedMap := parseMapString(actual); !mapsEqual(parsedMap, expected) { + t.Errorf("Parsed map from string \"%s\" differs from expected map: Actual: %v Expected: %v", actual, parsedMap, expected) + } + } +} + +func TestMergeMaps(t *testing.T) { + type TestCase struct { + sourceMap map[string]string + overrideMap map[string]string + expectedMap map[string]string + } + cases := []TestCase{ + { + sourceMap: map[string]string{"A": "1", "B": "2"}, + overrideMap: map[string]string{"B": "7", "C": "3"}, + expectedMap: map[string]string{"A": "1", "B": "7", "C": "3"}, + }, + { + sourceMap: map[string]string{"B": "7", "C": "3"}, + overrideMap: map[string]string{"A": "1", "B": "2"}, + expectedMap: map[string]string{"A": "1", "B": "2", "C": "3"}, + }, + { + sourceMap: map[string]string{"B": "7", "C": "3"}, + overrideMap: map[string]string{}, + expectedMap: map[string]string{"B": "7", "C": "3"}, + }, + { + sourceMap: map[string]string{}, + overrideMap: map[string]string{"B": "7", "C": "3"}, + expectedMap: map[string]string{"B": "7", "C": "3"}, + }, + } + for _, test := range cases { + if actualMap := mergeMaps(test.sourceMap, test.overrideMap); !mapsEqual(actualMap, test.expectedMap) { + t.Errorf("Merging maps (source=%v, override=%v) differs from expected map: Actual: %v Expected: %v", test.sourceMap, test.overrideMap, actualMap, test.expectedMap) + } + } +} + +func TestFilterKeySpace(t *testing.T) { + type TestCase struct { + keySpace map[string]string + targetMap map[string]string + expectedMap map[string]string + } + cases := []TestCase{ + { + keySpace: map[string]string{"A": "0", "B": ""}, + targetMap: map[string]string{"B": "1", "C": "2", "D": "3"}, + expectedMap: map[string]string{"B": "1"}, + }, + { + keySpace: map[string]string{}, + targetMap: map[string]string{"B": "1", "C": "2", "D": "3"}, + expectedMap: map[string]string{}, + }, + { + keySpace: map[string]string{"B": "1", "C": "2", "D": "3"}, + targetMap: map[string]string{}, + expectedMap: map[string]string{}, + }, + } + for _, test := range cases { + if actualMap := filterKeySpace(test.keySpace, test.targetMap); !mapsEqual(actualMap, test.expectedMap) { + t.Errorf("Filtering keyspace of map (keyspace=%v, target=%v) differs from expected map: Actual: %v Expected: %v", test.keySpace, test.targetMap, actualMap, test.expectedMap) + } + } +} + +func TestOverrideDefautls(t *testing.T) { + type TestCase struct { + defaultMap map[string]string + overrideMap map[string]string + expectedMap map[string]string + } + cases := []TestCase{ + { + defaultMap: map[string]string{"A": "1", "B": "2", "C": "3"}, + overrideMap: map[string]string{"B": "7", "C": "8"}, + expectedMap: map[string]string{"A": "1", "B": "7", "C": "8"}, + }, + { + defaultMap: map[string]string{"A": "1", "B": "2", "C": "3"}, + overrideMap: map[string]string{"B": "7", "D": "8", "E": "9"}, + expectedMap: map[string]string{"A": "1", "B": "7", "C": "3"}, + }, + { + defaultMap: map[string]string{"A": "1", "B": "2", "C": "3"}, + overrideMap: map[string]string{"B": "7", "D": "8", "E": "9"}, + expectedMap: map[string]string{"A": "1", "B": "7", "C": "3"}, + }, + } + for _, test := range cases { + if actualMap := overrideDefaults(test.defaultMap, test.overrideMap); !mapsEqual(actualMap, test.expectedMap) { + t.Errorf("Override defaults (defaults=%v, overrides=%v) differs from expected map: Actual: %v Expected: %v", test.defaultMap, test.overrideMap, actualMap, test.expectedMap) + } + } +} diff --git a/pkg/minikube/assets/vm_assets.go b/pkg/minikube/assets/vm_assets.go index d453bf78b2..b6ec89e9b8 100644 --- a/pkg/minikube/assets/vm_assets.go +++ b/pkg/minikube/assets/vm_assets.go @@ -18,6 +18,7 @@ package assets import ( "bytes" + "embed" "fmt" "html/template" "io" @@ -44,6 +45,7 @@ type CopyableFile interface { GetPermissions() string GetModTime() (time.Time, error) Seek(int64, int) (int64, error) + Close() error } // BaseAsset is the base asset class @@ -84,6 +86,7 @@ func (b *BaseAsset) GetModTime() (time.Time, error) { type FileAsset struct { BaseAsset reader io.ReadSeeker + file *os.File // Optional pointer to close file through FileAsset.Close() } // NewMemoryAssetTarget creates a new MemoryAsset, with target @@ -95,11 +98,6 @@ func NewMemoryAssetTarget(d []byte, targetPath, permissions string) *MemoryAsset func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, error) { klog.V(4).Infof("NewFileAsset: %s -> %s", src, path.Join(targetDir, targetName)) - f, err := os.Open(src) - if err != nil { - return nil, errors.Wrap(err, "open") - } - info, err := os.Stat(src) if err != nil { return nil, errors.Wrapf(err, "stat") @@ -109,6 +107,11 @@ func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, e klog.Warningf("NewFileAsset: %s is an empty file!", src) } + f, err := os.Open(src) + if err != nil { + return nil, errors.Wrap(err, "open") + } + return &FileAsset{ BaseAsset: BaseAsset{ SourcePath: src, @@ -117,6 +120,7 @@ func NewFileAsset(src, targetDir, targetName, permissions string) (*FileAsset, e Permissions: permissions, }, reader: io.NewSectionReader(f, 0, info.Size()), + file: f, }, nil } @@ -153,6 +157,14 @@ func (f *FileAsset) Seek(offset int64, whence int) (int64, error) { return f.reader.Seek(offset, whence) } +// Close closes the opend file. +func (f *FileAsset) Close() error { + if f.file == nil { + return nil + } + return f.file.Close() +} + // MemoryAsset is a memory-based asset type MemoryAsset struct { BaseAsset @@ -175,6 +187,11 @@ func (m *MemoryAsset) Seek(offset int64, whence int) (int64, error) { return m.reader.Seek(offset, whence) } +// Close implemented for CopyableFile interface. Always return nil. +func (m *MemoryAsset) Close() error { + return nil +} + // NewMemoryAsset creates a new MemoryAsset func NewMemoryAsset(d []byte, targetDir, targetName, permissions string) *MemoryAsset { return &MemoryAsset{ @@ -191,6 +208,7 @@ func NewMemoryAsset(d []byte, targetDir, targetName, permissions string) *Memory // BinAsset is a bindata (binary data) asset type BinAsset struct { + embed.FS BaseAsset reader io.ReadSeeker template *template.Template @@ -198,8 +216,8 @@ type BinAsset struct { } // MustBinAsset creates a new BinAsset, or panics if invalid -func MustBinAsset(name, targetDir, targetName, permissions string) *BinAsset { - asset, err := NewBinAsset(name, targetDir, targetName, permissions) +func MustBinAsset(fs embed.FS, name, targetDir, targetName, permissions string) *BinAsset { + asset, err := NewBinAsset(fs, name, targetDir, targetName, permissions) if err != nil { panic(fmt.Sprintf("Failed to define asset %s: %v", name, err)) } @@ -207,8 +225,9 @@ func MustBinAsset(name, targetDir, targetName, permissions string) *BinAsset { } // NewBinAsset creates a new BinAsset -func NewBinAsset(name, targetDir, targetName, permissions string) (*BinAsset, error) { +func NewBinAsset(fs embed.FS, name, targetDir, targetName, permissions string) (*BinAsset, error) { m := &BinAsset{ + FS: fs, BaseAsset: BaseAsset{ SourcePath: name, TargetDir: targetDir, @@ -233,7 +252,7 @@ func defaultValue(defValue string, val interface{}) string { } func (m *BinAsset) loadData() error { - contents, err := Asset(m.SourcePath) + contents, err := m.FS.ReadFile(m.SourcePath) if err != nil { return err } @@ -291,3 +310,8 @@ func (m *BinAsset) Read(p []byte) (int, error) { func (m *BinAsset) Seek(offset int64, whence int) (int64, error) { return m.reader.Seek(offset, whence) } + +// Close implemented for CopyableFile interface. Always return nil. +func (m *BinAsset) Close() error { + return nil +} diff --git a/pkg/minikube/bootstrapper/bsutil/extraconfig.go b/pkg/minikube/bootstrapper/bsutil/extraconfig.go index 7e8c04944a..6c5f132165 100644 --- a/pkg/minikube/bootstrapper/bsutil/extraconfig.go +++ b/pkg/minikube/bootstrapper/bsutil/extraconfig.go @@ -22,7 +22,7 @@ import ( "sort" "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/config" diff --git a/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta1.go b/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta1.go index 3fc9be1f6c..8161e47b7b 100644 --- a/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta1.go +++ b/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta1.go @@ -91,6 +91,12 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "{{.PodSubnet }}" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s {{- range $i, $val := printMapInOrder .KubeProxyOptions ": " }} {{$val}} {{- end}} diff --git a/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta2.go b/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta2.go index 8535773e01..ce6970ff28 100644 --- a/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta2.go +++ b/pkg/minikube/bootstrapper/bsutil/ktmpl/v1beta2.go @@ -94,6 +94,12 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "{{.PodSubnet }}" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s {{- range $i, $val := printMapInOrder .KubeProxyOptions ": " }} {{$val}} {{- end}} diff --git a/pkg/minikube/bootstrapper/bsutil/kubeadm.go b/pkg/minikube/bootstrapper/bsutil/kubeadm.go index 2a1f750cf4..746584b7d6 100644 --- a/pkg/minikube/bootstrapper/bsutil/kubeadm.go +++ b/pkg/minikube/bootstrapper/bsutil/kubeadm.go @@ -22,7 +22,7 @@ import ( "fmt" "path" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/bootstrapper/bsutil/ktmpl" diff --git a/pkg/minikube/bootstrapper/bsutil/kubeadm_test.go b/pkg/minikube/bootstrapper/bsutil/kubeadm_test.go index 1f2ea830e5..469a6ec0f9 100644 --- a/pkg/minikube/bootstrapper/bsutil/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/bsutil/kubeadm_test.go @@ -123,23 +123,14 @@ func recentReleases(n int) ([]string, error) { } /** -Need a separate test function to test the DNS server IP -as v1.11 yaml file is very different compared to v1.12+. This test case has only 1 thing to test and that is the networking/dnsDomain value */ func TestGenerateKubeadmYAMLDNS(t *testing.T) { - // test all testdata releases greater than v1.11 versions, err := recentReleases(0) if err != nil { t.Errorf("versions: %v", err) } - for i, v := range versions { - if semver.Compare(v, "v1.11") <= 0 { - versions = versions[0:i] - break - } - } fcr := command.NewFakeCommandRunner() fcr.SetCommandToOutput(map[string]string{ "docker info --format {{.CgroupDriver}}": "systemd\n", diff --git a/pkg/minikube/bootstrapper/bsutil/kverify/api_server.go b/pkg/minikube/bootstrapper/bsutil/kverify/api_server.go index 39c29a1640..d66dd2ca6e 100644 --- a/pkg/minikube/bootstrapper/bsutil/kverify/api_server.go +++ b/pkg/minikube/bootstrapper/bsutil/kverify/api_server.go @@ -143,6 +143,22 @@ func APIServerVersionMatch(client *kubernetes.Clientset, expected string) error return nil } +// WaitForAPIServerStatus waits for 'to' duration to get apiserver pod running or stopped +// this functions is intended to use in situations where apiserver process can be recreated +// by container runtime restart for example and there is a gap before it comes back +func WaitForAPIServerStatus(cr command.Runner, to time.Duration, hostname string, port int) (state.State, error) { + var st state.State + err := wait.PollImmediate(200*time.Millisecond, to, func() (bool, error) { + var err error + st, err = APIServerStatus(cr, hostname, port) + if st == state.Stopped { + return false, nil + } + return true, err + }) + return st, err +} + // APIServerStatus returns apiserver status in libmachine style state.State func APIServerStatus(cr command.Runner, hostname string, port int) (state.State, error) { klog.Infof("Checking apiserver status ...") @@ -207,7 +223,7 @@ func apiServerHealthz(hostname string, port int) (state.State, error) { return nil } - err = retry.Local(check, 5*time.Second) + err = retry.Local(check, 15*time.Second) // Don't propagate 'Stopped' upwards as an error message, as clients may interpret the err // as an inability to get status. We need it for retry.Local, however. @@ -232,7 +248,7 @@ func apiServerHealthzNow(hostname string, port int) (state.State, error) { Proxy: nil, // Avoid using a proxy to speak to a local host TLSClientConfig: &tls.Config{RootCAs: pool}, } - client := &http.Client{Transport: tr} + client := &http.Client{Transport: tr, Timeout: 5 * time.Second} resp, err := client.Get(url) // Connection refused, usually. if err != nil { diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd-api-port.yaml deleted file mode 100644 index ef597d9322..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd-api-port.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 12345 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -criSocket: /run/containerd/containerd.sock -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd-pod-network-cidr.yaml deleted file mode 100644 index 9e2af9ebc1..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd-pod-network-cidr.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -criSocket: /run/containerd/containerd.sock -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd.yaml deleted file mode 100644 index 9e2af9ebc1..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/containerd.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -criSocket: /run/containerd/containerd.sock -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/crio-options-gates.yaml deleted file mode 100644 index 46df78f0d5..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/crio-options-gates.yaml +++ /dev/null @@ -1,30 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -criSocket: /var/run/crio/crio.sock -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" - fail-no-swap: "true" - feature-gates: "a=b" -controllerManagerExtraArgs: - feature-gates: "a=b" - kube-api-burst: "32" -schedulerExtraArgs: - feature-gates: "a=b" - scheduler-name: "mini-scheduler" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/crio.yaml deleted file mode 100644 index a84953d18b..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/crio.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -criSocket: /var/run/crio/crio.sock -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/default.yaml deleted file mode 100644 index 99178a7056..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/default.yaml +++ /dev/null @@ -1,21 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/image-repository.yaml deleted file mode 100644 index e9ae90400d..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/image-repository.yaml +++ /dev/null @@ -1,22 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -imageRepository: test/repo -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/options.yaml deleted file mode 100644 index 802c33073b..0000000000 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.11/options.yaml +++ /dev/null @@ -1,26 +0,0 @@ -apiVersion: kubeadm.k8s.io/v1alpha1 -kind: MasterConfiguration -noTaintMaster: true -api: - advertiseAddress: 1.1.1.1 - bindPort: 8443 - controlPlaneEndpoint: control-plane.minikube.internal -kubernetesVersion: v1.11.0 -certificatesDir: /var/lib/minikube/certs -networking: - serviceSubnet: 10.96.0.0/12 -etcd: - dataDir: /var/lib/minikube/etcd -controllerManagerExtraArgs: - leader-elect: "false" -schedulerExtraArgs: - leader-elect: "false" -nodeName: "mk" -apiServerCertSANs: ["127.0.0.1", "localhost", "1.1.1.1"] -apiServerExtraArgs: - enable-admission-plugins: "Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota" - fail-no-swap: "true" -controllerManagerExtraArgs: - kube-api-burst: "32" -schedulerExtraArgs: - scheduler-name: "mini-scheduler" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-api-port.yaml index cc6eabe14e..544bcf6c25 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-pod-network-cidr.yaml index 7d08ca001d..83d0c86dd6 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd.yaml index ba8e56b695..803bef1520 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio-options-gates.yaml index e3949eb5ca..bd7b340f5e 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio.yaml index e0fdee2ae2..dab8997ec5 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/default.yaml index 763882bc82..da18cb53ec 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/dns.yaml index 4818b08fe6..60fdc1fdc7 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/image-repository.yaml index 492012d617..8a1fde3e0c 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/options.yaml index d67324b1ce..ea1d2c19f1 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.14/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-api-port.yaml index 74d15bdf94..f3d3e1ca4a 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-pod-network-cidr.yaml index ed7dcdd56e..19d1b4ae56 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd.yaml index 91c007712f..dafe342c44 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio-options-gates.yaml index ec2aea8e7b..b07642e09e 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio.yaml index 9e19fa1826..ea4f9c570e 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/default.yaml index bd87099a82..c6bc080549 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/dns.yaml index 23142f740b..94498e4087 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/image-repository.yaml index ebf4235e07..096242508b 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/options.yaml index 4fb2aa67a4..54cf1b35e1 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.15/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-api-port.yaml index 2e75d0181e..30b69454c7 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-pod-network-cidr.yaml index 511487778e..aa043da7a2 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd.yaml index d16e75689a..554f212dc1 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio-options-gates.yaml index 08798e70f9..51bcf86cf5 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio.yaml index d69f8de7a0..7800238a62 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/default.yaml index 1ed1b83f76..fdad0783c8 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/dns.yaml index 4756f415c7..347ee63fdf 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/image-repository.yaml index a03dfb1bf1..ba3b7039a4 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/options.yaml index 7e959d38a1..a0df672861 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.16/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-api-port.yaml index 59a2d0347d..2bb6e8fd29 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-pod-network-cidr.yaml index 9ac093bbae..a7d2c7ce18 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd.yaml index fb065726dd..d19bb9aefd 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio-options-gates.yaml index 91183e0025..9b5a1c9daf 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio.yaml index e98c6176a4..40ca51d3c8 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/default.yaml index 6bb876bc44..ba63480078 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/dns.yaml index a58fb67382..a0a510797c 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/image-repository.yaml index d2325f5dc3..a886c97cb8 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/options.yaml index 66a5858500..0b1064cd14 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.17/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-api-port.yaml index 1028591e33..d3ea29a37b 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-pod-network-cidr.yaml index 6486df30d4..4fb1e89320 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd.yaml index 5b0b5862e3..2257a3e7e9 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio-options-gates.yaml index 90e8d5f0c1..cd3c3ad08d 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio.yaml index 27c0c3c980..535a8d5863 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/default.yaml index 50041b611f..6bfcef4a1f 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/dns.yaml index 6664d7c3fb..3d1712a630 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/image-repository.yaml index b36fff5522..4c71d1d16e 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/options.yaml index e90f41311a..876e66fd86 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.18/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-api-port.yaml index 6426376655..c946a53272 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-pod-network-cidr.yaml index e7534680ec..e1f0f3f325 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd.yaml index 1a4dd12f2d..9e1fd6d74b 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio-options-gates.yaml index 2eb7aa8284..3663007278 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio.yaml index 29bf016151..bc7a440b6c 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/default.yaml index 167617a2c4..dc484b5891 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/dns.yaml index a51cb773ec..7891a251e1 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/image-repository.yaml index 0dc5e9f100..39d7d628f3 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/options.yaml index 76e0621bce..be5e8249eb 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.19/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-api-port.yaml index 65447c1b6a..7f270f6b7b 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-pod-network-cidr.yaml index 97618db1a3..2689cfe746 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd.yaml index 6c1a8a5c3e..3f4a81576a 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio-options-gates.yaml index 7e45be37dc..42f5ce1e6a 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio.yaml index 21bfeb222a..7e15a5b789 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/default.yaml index 4e2d1e7008..2ee50bb1c0 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/dns.yaml index deaf2bdfba..19bac3f2e7 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/image-repository.yaml index f006ba3570..d3b14db355 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/options.yaml index 69f2001dcb..41951675a9 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.20/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-api-port.yaml index ef470a591a..ca06be4676 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-api-port.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-pod-network-cidr.yaml index 49d82820e6..49d1d4c253 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd-pod-network-cidr.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd.yaml index f928db878e..20c133ade3 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/containerd.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio-options-gates.yaml index 1c7659811a..90cbcd5a64 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio-options-gates.yaml @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio.yaml index f5ca1e1705..3fb371631c 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/crio.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/default.yaml index 0c6ee404d5..63dda5e2d1 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/default.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/dns.yaml index 6dc1e19b5b..486cb139a3 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/dns.yaml @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/image-repository.yaml index 62ed084050..41171d19e3 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/image-repository.yaml @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/options.yaml index f1339aff55..0ae6233719 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.21/options.yaml @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-api-port.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-api-port.yaml index a25d8ffb91..9df5003de0 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-api-port.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-api-port.yaml @@ -40,7 +40,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-pod-network-cidr.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-pod-network-cidr.yaml index 352fb4a259..dbb3848b7a 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-pod-network-cidr.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd-pod-network-cidr.yaml @@ -40,7 +40,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "192.168.32.0/20" @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "192.168.32.0/20" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd.yaml index 94f52ad916..0b4338aa95 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/containerd.yaml @@ -40,7 +40,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio-options-gates.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio-options-gates.yaml index 1865c28030..7146db8f6a 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio-options-gates.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio-options-gates.yaml @@ -46,7 +46,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -72,4 +72,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio.yaml index 6d9a39a23c..0f98e04878 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/crio.yaml @@ -40,7 +40,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/default.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/default.yaml index 77db8b61aa..6a04619bf1 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/default.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/default.yaml @@ -40,7 +40,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/dns.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/dns.yaml index 38f67ab7d4..9bbacc2ff8 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/dns.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/dns.yaml @@ -40,7 +40,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: minikube.local podSubnet: "10.244.0.0/16" @@ -66,3 +66,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/image-repository.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/image-repository.yaml index 2d911e6016..169d8d4721 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/image-repository.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/image-repository.yaml @@ -41,7 +41,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -67,3 +67,9 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s diff --git a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/options.yaml b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/options.yaml index af5a54c90b..e663396bb6 100644 --- a/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/options.yaml +++ b/pkg/minikube/bootstrapper/bsutil/testdata/v1.22/options.yaml @@ -43,7 +43,7 @@ etcd: dataDir: /var/lib/minikube/etcd extraArgs: proxy-refresh-interval: "70000" -kubernetesVersion: v1.22.0-alpha.1 +kubernetesVersion: v1.22.0-rc.0 networking: dnsDomain: cluster.local podSubnet: "10.244.0.0/16" @@ -69,4 +69,10 @@ apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration clusterCIDR: "10.244.0.0/16" metricsBindAddress: 0.0.0.0:10249 +conntrack: + maxPerCore: 0 +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_established" + tcpEstablishedTimeout: 0s +# Skip setting "net.netfilter.nf_conntrack_tcp_timeout_close" + tcpCloseWaitTimeout: 0s mode: "iptables" diff --git a/pkg/minikube/bootstrapper/bsutil/versions.go b/pkg/minikube/bootstrapper/bsutil/versions.go index 5362fb5339..3f0a294953 100644 --- a/pkg/minikube/bootstrapper/bsutil/versions.go +++ b/pkg/minikube/bootstrapper/bsutil/versions.go @@ -20,7 +20,7 @@ import ( "path" "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/vmpath" "k8s.io/minikube/pkg/util" diff --git a/pkg/minikube/bootstrapper/bsutil/versions_test.go b/pkg/minikube/bootstrapper/bsutil/versions_test.go index a22efeeb35..87ef7256d1 100644 --- a/pkg/minikube/bootstrapper/bsutil/versions_test.go +++ b/pkg/minikube/bootstrapper/bsutil/versions_test.go @@ -19,7 +19,7 @@ package bsutil import ( "testing" - "github.com/blang/semver" + "github.com/blang/semver/v4" ) func TestVersionIsBetween(t *testing.T) { diff --git a/pkg/minikube/bootstrapper/certs.go b/pkg/minikube/bootstrapper/certs.go index 372a04add8..e666e8e23d 100644 --- a/pkg/minikube/bootstrapper/certs.go +++ b/pkg/minikube/bootstrapper/certs.go @@ -47,18 +47,18 @@ import ( ) // SetupCerts gets the generated credentials required to talk to the APIServer. -func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig, n config.Node) ([]assets.CopyableFile, error) { +func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig, n config.Node) error { localPath := localpath.Profile(k8s.ClusterName) klog.Infof("Setting up %s for IP: %s\n", localPath, n.IP) ccs, err := generateSharedCACerts() if err != nil { - return nil, errors.Wrap(err, "shared CA certs") + return errors.Wrap(err, "shared CA certs") } xfer, err := generateProfileCerts(k8s, n, ccs) if err != nil { - return nil, errors.Wrap(err, "profile certs") + return errors.Wrap(err, "profile certs") } xfer = append(xfer, ccs.caCert) @@ -67,6 +67,14 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig, n config.Node) xfer = append(xfer, ccs.proxyKey) copyableFiles := []assets.CopyableFile{} + defer func() { + for _, f := range copyableFiles { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + } + }() + for _, p := range xfer { cert := filepath.Base(p) perms := "0644" @@ -75,19 +83,19 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig, n config.Node) } certFile, err := assets.NewFileAsset(p, vmpath.GuestKubernetesCertsDir, cert, perms) if err != nil { - return nil, errors.Wrapf(err, "key asset %s", cert) + return errors.Wrapf(err, "key asset %s", cert) } copyableFiles = append(copyableFiles, certFile) } caCerts, err := collectCACerts() if err != nil { - return nil, err + return err } for src, dst := range caCerts { certFile, err := assets.NewFileAsset(src, path.Dir(dst), path.Base(dst), "0644") if err != nil { - return nil, errors.Wrapf(err, "ca asset %s", src) + return errors.Wrapf(err, "ca asset %s", src) } copyableFiles = append(copyableFiles, certFile) @@ -107,11 +115,11 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig, n config.Node) kubeCfg := api.NewConfig() err = kubeconfig.PopulateFromSettings(kcs, kubeCfg) if err != nil { - return nil, errors.Wrap(err, "populating kubeconfig") + return errors.Wrap(err, "populating kubeconfig") } data, err := runtime.Encode(latest.Codec, kubeCfg) if err != nil { - return nil, errors.Wrap(err, "encoding kubeconfig") + return errors.Wrap(err, "encoding kubeconfig") } if n.ControlPlane { @@ -121,14 +129,14 @@ func SetupCerts(cmd command.Runner, k8s config.KubernetesConfig, n config.Node) for _, f := range copyableFiles { if err := cmd.Copy(f); err != nil { - return nil, errors.Wrapf(err, "Copy %s", f.GetSourcePath()) + return errors.Wrapf(err, "Copy %s", f.GetSourcePath()) } } if err := installCertSymlinks(cmd, caCerts); err != nil { - return nil, errors.Wrapf(err, "certificate symlinks") + return errors.Wrapf(err, "certificate symlinks") } - return copyableFiles, nil + return nil } // CACerts has cert and key for CA (and Proxy) @@ -331,54 +339,60 @@ func isValidPEMCertificate(filePath string) (bool, error) { return false, nil } -// collectCACerts looks up all PEM certificates with .crt or .pem extension in ~/.minikube/certs to copy to the host. +// collectCACerts looks up all PEM certificates with .crt or .pem extension in ~/.minikube/certs or ~/.minikube/files/etc/ssl/certs to copy to the host. // minikube root CA is also included but libmachine certificates (ca.pem/cert.pem) are excluded. func collectCACerts() (map[string]string, error) { localPath := localpath.MiniPath() certFiles := map[string]string{} - certsDir := filepath.Join(localPath, "certs") - err := filepath.Walk(certsDir, func(hostpath string, info os.FileInfo, err error) error { - if err != nil { - return err - } - if info == nil { - return nil - } - if info.IsDir() { - return nil - } - - fullPath := filepath.Join(certsDir, hostpath) - ext := strings.ToLower(filepath.Ext(hostpath)) - - if ext == ".crt" || ext == ".pem" { - if info.Size() < 32 { - klog.Warningf("ignoring %s, impossibly tiny %d bytes", fullPath, info.Size()) + dirs := []string{filepath.Join(localPath, "certs"), filepath.Join(localPath, "files", "etc", "ssl", "certs")} + for _, certsDir := range dirs { + err := filepath.Walk(certsDir, func(hostpath string, info os.FileInfo, err error) error { + if err != nil { + if os.IsNotExist(err) { + return nil + } + return err + } + if info == nil { + return nil + } + if info.IsDir() { return nil } - klog.Infof("found cert: %s (%d bytes)", fullPath, info.Size()) + fullPath := filepath.Join(certsDir, hostpath) + ext := strings.ToLower(filepath.Ext(hostpath)) - validPem, err := isValidPEMCertificate(hostpath) - if err != nil { - return err - } + if ext == ".crt" || ext == ".pem" { + if info.Size() < 32 { + klog.Warningf("ignoring %s, impossibly tiny %d bytes", fullPath, info.Size()) + return nil + } - if validPem { - filename := filepath.Base(hostpath) - dst := fmt.Sprintf("%s.%s", strings.TrimSuffix(filename, ext), "pem") - certFiles[hostpath] = path.Join(vmpath.GuestCertAuthDir, dst) + klog.Infof("found cert: %s (%d bytes)", fullPath, info.Size()) + + validPem, err := isValidPEMCertificate(hostpath) + if err != nil { + return err + } + + if validPem { + filename := filepath.Base(hostpath) + dst := fmt.Sprintf("%s.%s", strings.TrimSuffix(filename, ext), "pem") + certFiles[hostpath] = path.Join(vmpath.GuestCertAuthDir, dst) + } } + return nil + }) + + if err != nil { + return nil, errors.Wrapf(err, "provisioning: traversal certificates dir %s", certsDir) } - return nil - }) - if err != nil { - return nil, errors.Wrapf(err, "provisioning: traversal certificates dir %s", certsDir) - } - for _, excluded := range []string{"ca.pem", "cert.pem"} { - certFiles[filepath.Join(certsDir, excluded)] = "" + for _, excluded := range []string{"ca.pem", "cert.pem"} { + certFiles[filepath.Join(certsDir, excluded)] = "" + } } // populates minikube CA diff --git a/pkg/minikube/bootstrapper/certs_test.go b/pkg/minikube/bootstrapper/certs_test.go index d4226283d9..4956284dc8 100644 --- a/pkg/minikube/bootstrapper/certs_test.go +++ b/pkg/minikube/bootstrapper/certs_test.go @@ -57,8 +57,7 @@ func TestSetupCerts(t *testing.T) { f := command.NewFakeCommandRunner() f.SetCommandToOutput(expected) - _, err := SetupCerts(f, k8s, config.Node{}) - if err != nil { + if err := SetupCerts(f, k8s, config.Node{}); err != nil { t.Fatalf("Error starting cluster: %v", err) } } diff --git a/pkg/minikube/bootstrapper/images/images.go b/pkg/minikube/bootstrapper/images/images.go index cefbe5ea12..f2b92b4153 100644 --- a/pkg/minikube/bootstrapper/images/images.go +++ b/pkg/minikube/bootstrapper/images/images.go @@ -30,18 +30,17 @@ import ( // Pause returns the image name to pull for a given Kubernetes version func Pause(v semver.Version, mirror string) string { + // Note: changing this logic requires bumping the preload version // Should match `PauseVersion` in: + // https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/constants/constants.go // https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/constants/constants_unix.go - pv := "3.2" + pv := "3.4.1" + majorMinorVersion := fmt.Sprintf("v%d.%d", v.Major, v.Minor) imageName := path.Join(kubernetesRepo(mirror), "pause") - if _, ok := constants.KubeadmImages[majorMinorVersion]; ok { - pv = constants.KubeadmImages[majorMinorVersion][imageName] - } - - if semver.MustParseRange("<1.18.0-alpha.0")(v) { - pv = "3.1" + if pVersion, ok := constants.KubeadmImages[majorMinorVersion][imageName]; ok { + pv = pVersion } return fmt.Sprintf("%s:%s", imageName, pv) @@ -50,13 +49,14 @@ func Pause(v semver.Version, mirror string) string { // essentials returns images needed too bootstrap a Kubernetes func essentials(mirror string, v semver.Version) []string { imgs := []string{ - componentImage("kube-proxy", v, mirror), - componentImage("kube-scheduler", v, mirror), - componentImage("kube-controller-manager", v, mirror), + // use the same order as: `kubeadm config images list` componentImage("kube-apiserver", v, mirror), - coreDNS(v, mirror), - etcd(v, mirror), + componentImage("kube-controller-manager", v, mirror), + componentImage("kube-scheduler", v, mirror), + componentImage("kube-proxy", v, mirror), Pause(v, mirror), + etcd(v, mirror), + coreDNS(v, mirror), } return imgs } @@ -68,78 +68,36 @@ func componentImage(name string, v semver.Version, mirror string) string { // coreDNS returns the images used for CoreDNS func coreDNS(v semver.Version, mirror string) string { - // Should match `CoreDNSVersion` in + // Note: changing this logic requires bumping the preload version + // Should match `CoreDNSImageName` and `CoreDNSVersion` in // https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/constants/constants.go - /*cv := "1.7.0" - //switch v.Minor { - //case 22: - // cv = "1.8.0" - //case 10, 20, 21: - // cv = "1.7.0" - //case 18: - // cv = "1.6.7" - //case 17: - // cv = "1.6.5" - //case 16: - // cv = "1.6.2" - //case 15, 14: - // cv = "1.3.1" - //case 13: - // cv = "1.2.6" - //case 12: - // cv = "1.2.2" - //case 11: - // cv = "1.1.3" - //} - */ - - cv := "1.7.0" + cv := "1.8.0" + in := "coredns/coredns" + if semver.MustParseRange("<1.21.0-alpha.1")(v) { + in = "coredns" + } majorMinorVersion := fmt.Sprintf("v%d.%d", v.Major, v.Minor) - imageName := path.Join(kubernetesRepo(mirror), "coredns") - - if v.Minor >= 21 { - imageName = path.Join(imageName, "coredns") + imageName := path.Join(kubernetesRepo(mirror), in) + if cVersion, ok := constants.KubeadmImages[majorMinorVersion][imageName]; ok { + cv = cVersion } - if _, ok := constants.KubeadmImages[majorMinorVersion]; ok { - cv = constants.KubeadmImages[majorMinorVersion][imageName] - } - - // return path.Join(kubernetesRepo(mirror), "coredns:"+cv) return fmt.Sprintf("%s:%s", imageName, cv) } // etcd returns the image used for etcd func etcd(v semver.Version, mirror string) string { + // Note: changing this logic requires bumping the preload version // Should match `DefaultEtcdVersion` in: // https://github.com/kubernetes/kubernetes/blob/master/cmd/kubeadm/app/constants/constants.go - ev := "3.4.13-0" - - /*switch v.Minor { - //case 17, 18: - // ev = "3.4.3-0" - //case 16: - // ev = "3.3.15-0" - //case 14, 15: - // ev = "3.3.10" - //case 12, 13: - // ev = "3.2.24" - //case 11: - // ev = "3.2.18" - //} - */ + ev := "3.4.13-3" majorMinorVersion := fmt.Sprintf("v%d.%d", v.Major, v.Minor) imageName := path.Join(kubernetesRepo(mirror), "etcd") - if _, ok := constants.KubeadmImages[majorMinorVersion]; ok { - ev = constants.KubeadmImages[majorMinorVersion][imageName] - } - - // An awkward special case for v1.19.0 - do not imitate unless necessary - if v.Equals(semver.MustParse("1.19.0")) { - ev = "3.4.9-1" + if eVersion, ok := constants.KubeadmImages[majorMinorVersion][imageName]; ok { + ev = eVersion } return fmt.Sprintf("%s:%s", imageName, ev) @@ -147,6 +105,7 @@ func etcd(v semver.Version, mirror string) string { // auxiliary returns images that are helpful for running minikube func auxiliary(mirror string) []string { + // Note: changing this list requires bumping the preload version return []string{ storageProvisioner(mirror), dashboardFrontend(mirror), @@ -163,19 +122,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/images_test.go b/pkg/minikube/bootstrapper/images/images_test.go index 84871fa650..8075e45d44 100644 --- a/pkg/minikube/bootstrapper/images/images_test.go +++ b/pkg/minikube/bootstrapper/images/images_test.go @@ -17,12 +17,71 @@ limitations under the License. package images import ( + "strings" "testing" + "github.com/blang/semver/v4" "github.com/google/go-cmp/cmp" "k8s.io/minikube/pkg/version" ) +func TestEssentials(t *testing.T) { + var testCases = []struct { + version string + images []string + }{ + {"v1.18.0", strings.Split(strings.Trim(` +k8s.gcr.io/kube-apiserver:v1.18.0 +k8s.gcr.io/kube-controller-manager:v1.18.0 +k8s.gcr.io/kube-scheduler:v1.18.0 +k8s.gcr.io/kube-proxy:v1.18.0 +k8s.gcr.io/pause:3.2 +k8s.gcr.io/etcd:3.4.3-0 +k8s.gcr.io/coredns:1.6.7 +`, "\n"), "\n")}, + {"v1.19.0", strings.Split(strings.Trim(` +k8s.gcr.io/kube-apiserver:v1.19.0 +k8s.gcr.io/kube-controller-manager:v1.19.0 +k8s.gcr.io/kube-scheduler:v1.19.0 +k8s.gcr.io/kube-proxy:v1.19.0 +k8s.gcr.io/pause:3.2 +k8s.gcr.io/etcd:3.4.9-1 +k8s.gcr.io/coredns:1.7.0 +`, "\n"), "\n")}, + {"v1.20.0", strings.Split(strings.Trim(` +k8s.gcr.io/kube-apiserver:v1.20.0 +k8s.gcr.io/kube-controller-manager:v1.20.0 +k8s.gcr.io/kube-scheduler:v1.20.0 +k8s.gcr.io/kube-proxy:v1.20.0 +k8s.gcr.io/pause:3.2 +k8s.gcr.io/etcd:3.4.13-0 +k8s.gcr.io/coredns:1.7.0 +`, "\n"), "\n")}, + {"v1.21.0", strings.Split(strings.Trim(` +k8s.gcr.io/kube-apiserver:v1.21.0 +k8s.gcr.io/kube-controller-manager:v1.21.0 +k8s.gcr.io/kube-scheduler:v1.21.0 +k8s.gcr.io/kube-proxy:v1.21.0 +k8s.gcr.io/pause:3.4.1 +k8s.gcr.io/etcd:3.4.13-0 +k8s.gcr.io/coredns/coredns:v1.8.0 +`, "\n"), "\n")}, + } + for _, tc := range testCases { + t.Run(tc.version, func(t *testing.T) { + v, err := semver.Make(strings.TrimPrefix(tc.version, "v")) + if err != nil { + t.Fatal(err) + } + want := tc.images + got := essentials("k8s.gcr.io", v) + if diff := cmp.Diff(want, got); diff != "" { + t.Errorf("images mismatch (-want +got):\n%s", diff) + } + }) + } +} + func TestAuxiliary(t *testing.T) { want := []string{ "gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), @@ -37,12 +96,32 @@ 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 != "" { t.Errorf("images mismatch (-want +got):\n%s", diff) } } + +func TestCNI(t *testing.T) { + // images used by k8s.io/minikube/pkg/minikube/cni + var testCases = []struct { + name string + function func(string) string + }{ + {"kindnet", KindNet}, + {"calico-deployment", CalicoDeployment}, + {"calico-daemonset", CalicoDaemonSet}, + } + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + img := tc.function("") + if img == "" { + t.Errorf("no image") + } + }) + } +} diff --git a/pkg/minikube/bootstrapper/images/kubeadm.go b/pkg/minikube/bootstrapper/images/kubeadm.go index 2c3ea23b62..31dca93a8b 100644 --- a/pkg/minikube/bootstrapper/images/kubeadm.go +++ b/pkg/minikube/bootstrapper/images/kubeadm.go @@ -17,9 +17,10 @@ limitations under the License. package images import ( + "fmt" "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" ) @@ -29,6 +30,12 @@ func Kubeadm(mirror string, version string) ([]string, error) { if err != nil { return nil, errors.Wrap(err, "semver") } + if v.Major > 1 { + return nil, fmt.Errorf("version too new: %v", v) + } + if semver.MustParseRange("<1.12.0-alpha.0")(v) { + return nil, fmt.Errorf("version too old: %v", v) + } imgs := essentials(mirror, v) imgs = append(imgs, auxiliary(mirror)...) return imgs, nil diff --git a/pkg/minikube/bootstrapper/images/kubeadm_test.go b/pkg/minikube/bootstrapper/images/kubeadm_test.go index 66f1d95ed0..4a71d80964 100644 --- a/pkg/minikube/bootstrapper/images/kubeadm_test.go +++ b/pkg/minikube/bootstrapper/images/kubeadm_test.go @@ -29,9 +29,13 @@ func TestKubeadmImages(t *testing.T) { tests := []struct { version string mirror string + invalid bool want []string }{ - {"v1.17.0", "", []string{ + {"invalid", "", true, nil}, + {"v0.0.1", "", true, nil}, // too old + {"v2.0.0", "", true, nil}, // too new + {"v1.17.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.17.0", "k8s.gcr.io/kube-scheduler:v1.17.0", "k8s.gcr.io/kube-controller-manager:v1.17.0", @@ -43,19 +47,19 @@ func TestKubeadmImages(t *testing.T) { "docker.io/kubernetesui/dashboard:v2.1.0", "docker.io/kubernetesui/metrics-scraper:v1.0.4", }}, - {"v1.16.0", "k8s.gcr.io", []string{ - "k8s.gcr.io/kube-proxy:v1.16.0", - "k8s.gcr.io/kube-scheduler:v1.16.0", - "k8s.gcr.io/kube-controller-manager:v1.16.0", - "k8s.gcr.io/kube-apiserver:v1.16.0", + {"v1.16.1", "k8s.gcr.io", false, []string{ + "k8s.gcr.io/kube-proxy:v1.16.1", + "k8s.gcr.io/kube-scheduler:v1.16.1", + "k8s.gcr.io/kube-controller-manager:v1.16.1", + "k8s.gcr.io/kube-apiserver:v1.16.1", "k8s.gcr.io/coredns:1.6.2", "k8s.gcr.io/etcd:3.3.15-0", "k8s.gcr.io/pause:3.1", - "k8s.gcr.io/storage-provisioner:" + version.GetStorageProvisionerVersion(), - "k8s.gcr.io/dashboard:v2.1.0", - "k8s.gcr.io/metrics-scraper:v1.0.4", + "k8s.gcr.io/k8s-minikube/storage-provisioner:" + version.GetStorageProvisionerVersion(), + "k8s.gcr.io/kubernetesui/dashboard:v2.1.0", + "k8s.gcr.io/kubernetesui/metrics-scraper:v1.0.4", }}, - {"v1.15.0", "", []string{ + {"v1.15.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.15.0", "k8s.gcr.io/kube-scheduler:v1.15.0", "k8s.gcr.io/kube-controller-manager:v1.15.0", @@ -67,7 +71,7 @@ func TestKubeadmImages(t *testing.T) { "docker.io/kubernetesui/dashboard:v2.1.0", "docker.io/kubernetesui/metrics-scraper:v1.0.4", }}, - {"v1.14.0", "", []string{ + {"v1.14.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.14.0", "k8s.gcr.io/kube-scheduler:v1.14.0", "k8s.gcr.io/kube-controller-manager:v1.14.0", @@ -79,7 +83,7 @@ func TestKubeadmImages(t *testing.T) { "docker.io/kubernetesui/dashboard:v2.1.0", "docker.io/kubernetesui/metrics-scraper:v1.0.4", }}, - {"v1.13.0", "", []string{ + {"v1.13.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.13.0", "k8s.gcr.io/kube-scheduler:v1.13.0", "k8s.gcr.io/kube-controller-manager:v1.13.0", @@ -91,7 +95,7 @@ func TestKubeadmImages(t *testing.T) { "docker.io/kubernetesui/dashboard:v2.1.0", "docker.io/kubernetesui/metrics-scraper:v1.0.4", }}, - {"v1.12.0", "", []string{ + {"v1.12.0", "", false, []string{ "k8s.gcr.io/kube-proxy:v1.12.0", "k8s.gcr.io/kube-scheduler:v1.12.0", "k8s.gcr.io/kube-controller-manager:v1.12.0", @@ -103,11 +107,16 @@ func TestKubeadmImages(t *testing.T) { "docker.io/kubernetesui/dashboard:v2.1.0", "docker.io/kubernetesui/metrics-scraper:v1.0.4", }}, + {"v1.11.0", "", true, nil}, + {"v1.10.0", "", true, nil}, } for _, tc := range tests { got, err := Kubeadm(tc.mirror, tc.version) - if err != nil { - t.Fatalf("unexpected err: %v", err) + if err == nil && tc.invalid { + t.Fatalf("expected err (%s): %v", tc.version, got) + } + if err != nil && !tc.invalid { + t.Fatalf("unexpected err (%s): %v", tc.version, err) } sort.Strings(got) sort.Strings(tc.want) diff --git a/pkg/minikube/bootstrapper/images/repo.go b/pkg/minikube/bootstrapper/images/repo.go index 437f520f11..d06f0db9a8 100644 --- a/pkg/minikube/bootstrapper/images/repo.go +++ b/pkg/minikube/bootstrapper/images/repo.go @@ -16,12 +16,11 @@ limitations under the License. package images +import "path" + // DefaultKubernetesRepo is the default Kubernetes repository const DefaultKubernetesRepo = "k8s.gcr.io" -// DefaultMinikubeRepo is the default Minikube repository -const DefaultMinikubeRepo = "gcr.io/k8s-minikube" - // kubernetesRepo returns the official Kubernetes repository, or an alternate func kubernetesRepo(mirror string) string { if mirror != "" { @@ -32,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 DefaultMinikubeRepo + return path.Join(mirror, "k8s-minikube") } diff --git a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go index 42f9f80417..e2990381a1 100644 --- a/pkg/minikube/bootstrapper/kubeadm/kubeadm.go +++ b/pkg/minikube/bootstrapper/kubeadm/kubeadm.go @@ -32,7 +32,7 @@ import ( // WARNING: Do not use path/filepath in this package unless you want bizarre Windows paths - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/docker/machine/libmachine" "github.com/docker/machine/libmachine/state" "github.com/pkg/errors" @@ -297,13 +297,12 @@ func outputKubeadmInitSteps(logs io.Reader, wg *sync.WaitGroup) { type step struct { logTag string registerStep register.RegStep - stepMessage string } steps := []step{ - {logTag: "certs", registerStep: register.PreparingKubernetesCerts, stepMessage: "Generating certificates and keys ..."}, - {logTag: "control-plane", registerStep: register.PreparingKubernetesControlPlane, stepMessage: "Booting up control plane ..."}, - {logTag: "bootstrap-token", registerStep: register.PreparingKubernetesBootstrapToken, stepMessage: "Configuring RBAC rules ..."}, + {logTag: "certs", registerStep: register.PreparingKubernetesCerts}, + {logTag: "control-plane", registerStep: register.PreparingKubernetesControlPlane}, + {logTag: "bootstrap-token", registerStep: register.PreparingKubernetesBootstrapToken}, } nextStepIndex := 0 @@ -318,7 +317,17 @@ func outputKubeadmInitSteps(logs io.Reader, wg *sync.WaitGroup) { continue } register.Reg.SetStep(nextStep.registerStep) - out.Step(style.SubStep, nextStep.stepMessage) + // because the translation extract (make extract) needs simple strings to be included in translations we have to pass simple strings + if nextStepIndex == 0 { + out.Step(style.SubStep, "Generating certificates and keys ...") + } + if nextStepIndex == 1 { + out.Step(style.SubStep, "Booting up control plane ...") + } + if nextStepIndex == 2 { + out.Step(style.SubStep, "Configuring RBAC rules ...") + } + nextStepIndex++ } wg.Done() @@ -559,13 +568,13 @@ func (k *Bootstrapper) needsReconfigure(conf string, hostname string, port int, klog.Infof("needs reconfigure: configs differ:\n%s", rr.Output()) return true } - - st, err := kverify.APIServerStatus(k.c, hostname, port) + // cruntime.Enable() may restart kube-apiserver but does not wait for it to return back + apiStatusTimeout := 3000 * time.Millisecond + st, err := kverify.WaitForAPIServerStatus(k.c, apiStatusTimeout, hostname, port) if err != nil { klog.Infof("needs reconfigure: apiserver error: %v", err) return true } - if st != state.Running { klog.Infof("needs reconfigure: apiserver in state %s", st) return true @@ -839,8 +848,7 @@ func (k *Bootstrapper) DeleteCluster(k8s config.KubernetesConfig) error { // SetupCerts sets up certificates within the cluster. func (k *Bootstrapper) SetupCerts(k8s config.KubernetesConfig, n config.Node) error { - _, err := bootstrapper.SetupCerts(k.c, k8s, n) - return err + return bootstrapper.SetupCerts(k.c, k8s, n) } // UpdateCluster updates the control plane with cluster-level info. @@ -858,12 +866,12 @@ func (k *Bootstrapper) UpdateCluster(cfg config.ClusterConfig) error { return errors.Wrap(err, "runtime") } - if err := r.Preload(cfg.KubernetesConfig); err != nil { + if err := r.Preload(cfg); err != nil { klog.Infof("preload failed, will try to load cached images: %v", err) } if cfg.KubernetesConfig.ShouldLoadCachedImages { - if err := machine.LoadCachedImages(&cfg, k.c, images, constants.ImageCacheDir); err != nil { + if err := machine.LoadCachedImages(&cfg, k.c, images, constants.ImageCacheDir, false); err != nil { out.FailureT("Unable to load cached images: {{.error}}", out.V{"error": err}) } } diff --git a/pkg/minikube/cluster/mount.go b/pkg/minikube/cluster/mount.go index 3cd0d48c7a..0533ed13b2 100644 --- a/pkg/minikube/cluster/mount.go +++ b/pkg/minikube/cluster/mount.go @@ -54,19 +54,41 @@ type mountRunner interface { RunCmd(*exec.Cmd) (*command.RunResult, error) } +const ( + // MountErrorUnknown failed with unknown error + MountErrorUnknown = iota + // MountErrorConnect + MountErrorConnect +) + +// MountError wrapper around errors in the `Mount` function +type MountError struct { + // ErrorType enum for more info about the error + ErrorType int + // UnderlyingError the error being wrapped + UnderlyingError error +} + +func (m *MountError) Error() string { + return m.UnderlyingError.Error() +} + // Mount runs the mount command from the 9p client on the VM to the 9p server on the host func Mount(r mountRunner, source string, target string, c *MountConfig) error { if err := Unmount(r, target); err != nil { - return errors.Wrap(err, "umount") + return &MountError{ErrorType: MountErrorUnknown, UnderlyingError: errors.Wrap(err, "umount")} } if _, err := r.RunCmd(exec.Command("/bin/bash", "-c", fmt.Sprintf("sudo mkdir -m %o -p %s", c.Mode, target))); err != nil { - return errors.Wrap(err, "create folder pre-mount") + return &MountError{ErrorType: MountErrorUnknown, UnderlyingError: errors.Wrap(err, "create folder pre-mount")} } rr, err := r.RunCmd(exec.Command("/bin/bash", "-c", mntCmd(source, target, c))) if err != nil { - return errors.Wrapf(err, "mount with cmd %s ", rr.Command()) + if strings.Contains(rr.Stderr.String(), "Connection timed out") { + return &MountError{ErrorType: MountErrorConnect, UnderlyingError: err} + } + return &MountError{ErrorType: MountErrorUnknown, UnderlyingError: errors.Wrapf(err, "mount with cmd %s ", rr.Command())} } klog.Infof("mount successful: %q", rr.Output()) diff --git a/pkg/minikube/cluster/pause.go b/pkg/minikube/cluster/pause.go index 02ca442962..799e9fa99f 100644 --- a/pkg/minikube/cluster/pause.go +++ b/pkg/minikube/cluster/pause.go @@ -47,12 +47,10 @@ func pause(cr cruntime.Manager, r command.Runner, namespaces []string) ([]string // Disable the kubelet so it does not attempt to restart paused pods sm := sysinit.New(r) - if err := sm.Disable("kubelet"); err != nil { - return ids, errors.Wrap(err, "kubelet disable") - } + klog.Info("kubelet running: ", sm.Active("kubelet")) - if err := sm.Stop("kubelet"); err != nil { - return ids, errors.Wrap(err, "kubelet stop") + if err := sm.DisableNow("kubelet"); err != nil { + return ids, errors.Wrap(err, "kubelet disable --now") } ids, err := cr.ListContainers(cruntime.ListContainersOptions{State: cruntime.Running, Namespaces: namespaces}) diff --git a/pkg/minikube/cni/custom.go b/pkg/minikube/cni/custom.go index e68eb4f49e..b70dfbf9e6 100644 --- a/pkg/minikube/cni/custom.go +++ b/pkg/minikube/cni/custom.go @@ -21,6 +21,7 @@ import ( "path" "github.com/pkg/errors" + "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/config" ) @@ -55,6 +56,11 @@ func (c Custom) Apply(r Runner) error { if err != nil { return errors.Wrap(err, "manifest") } + defer func() { + if err := m.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", m.GetSourcePath(), err) + } + }() return applyManifest(c.cc, r, m) } diff --git a/pkg/minikube/config/config.go b/pkg/minikube/config/config.go index c359087740..a1129fcb72 100644 --- a/pkg/minikube/config/config.go +++ b/pkg/minikube/config/config.go @@ -36,26 +36,22 @@ const ( WantBetaUpdateNotification = "WantBetaUpdateNotification" // ReminderWaitPeriodInHours is the key for ReminderWaitPeriodInHours ReminderWaitPeriodInHours = "ReminderWaitPeriodInHours" - // WantReportError is the key for WantReportError - WantReportError = "WantReportError" - // WantReportErrorPrompt is the key for WantReportErrorPrompt - WantReportErrorPrompt = "WantReportErrorPrompt" - // WantKubectlDownloadMsg is the key for WantKubectlDownloadMsg - WantKubectlDownloadMsg = "WantKubectlDownloadMsg" // WantNoneDriverWarning is the key for WantNoneDriverWarning WantNoneDriverWarning = "WantNoneDriverWarning" + // WantVirtualBoxDriverWarning is the key for WantVirtualBoxDriverWarning + WantVirtualBoxDriverWarning = "WantVirtualBoxDriverWarning" // ProfileName represents the key for the global profile parameter ProfileName = "profile" - // ShowDriverDeprecationNotification is the key for ShowDriverDeprecationNotification - ShowDriverDeprecationNotification = "ShowDriverDeprecationNotification" - // ShowBootstrapperDeprecationNotification is the key for ShowBootstrapperDeprecationNotification - ShowBootstrapperDeprecationNotification = "ShowBootstrapperDeprecationNotification" // UserFlag is the key for the global user flag (ex. --user=user1) UserFlag = "user" // AddonImages stores custom addon images config AddonImages = "addon-images" // AddonRegistries stores custom addon images config AddonRegistries = "addon-registries" + // AddonListFlag represents the key for addons parameter + AddonListFlag = "addons" + // EmbedCerts represents the config for embedding certificates in kubeconfig + EmbedCerts = "EmbedCerts" ) var ( @@ -67,8 +63,6 @@ var ( DockerOpt []string // ExtraOptions contains extra options (if any) ExtraOptions ExtraOptionSlice - // AddonList contains the list of addons - AddonList []string ) // ErrNotExist is the error returned when a config does not exist diff --git a/pkg/minikube/config/types.go b/pkg/minikube/config/types.go index 672d32bd12..e9a858a6c2 100644 --- a/pkg/minikube/config/types.go +++ b/pkg/minikube/config/types.go @@ -20,7 +20,7 @@ import ( "net" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" ) // Profile represents a minikube profile @@ -74,13 +74,16 @@ type ClusterConfig struct { KubernetesConfig KubernetesConfig Nodes []Node Addons map[string]bool - VerifyComponents map[string]bool // map of components to verify and wait for after start. + CustomAddonImages map[string]string // Maps image names to the image to use for addons. e.g. Dashboard -> k8s.gcr.io/echoserver:1.4 makes dashboard addon use echoserver for its Dashboard deployment. + CustomAddonRegistries map[string]string // Maps image names to the registry to use for addons. See CustomAddonImages for example. + VerifyComponents map[string]bool // map of components to verify and wait for after start. StartHostTimeout time.Duration ScheduledStop *ScheduledStopConfig ExposedPorts []string // Only used by the docker and podman driver ListenAddress string // Only used by the docker and podman driver Network string // only used by docker driver MultiNodeRequested bool + ExtraDisks int // currently only implemented for hyperkit } // KubernetesConfig contains the parameters used to configure the VM Kubernetes. diff --git a/pkg/minikube/constants/constants.go b/pkg/minikube/constants/constants.go index 8e8b184949..b0d425d958 100644 --- a/pkg/minikube/constants/constants.go +++ b/pkg/minikube/constants/constants.go @@ -26,13 +26,18 @@ import ( "k8s.io/minikube/pkg/minikube/localpath" ) +var ( + // SupportedArchitectures is the list of supported architectures + SupportedArchitectures = [5]string{"amd64", "arm", "arm64", "ppc64le", "s390x"} +) + const ( // DefaultKubernetesVersion is the default Kubernetes version // dont update till #10545 is solved - DefaultKubernetesVersion = "v1.20.2" + DefaultKubernetesVersion = "v1.21.3" // 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-alpha.1" + NewestKubernetesVersion = "v1.22.0-rc.0" // OldestKubernetesVersion is the oldest Kubernetes version to test against OldestKubernetesVersion = "v1.14.0" // DefaultClusterName is the default nane for the k8s cluster @@ -109,6 +114,8 @@ const ( // TimeFormat is the format that should be used when outputting time TimeFormat = time.RFC1123 + // MaxResources is the value that can be passed into the memory and cpus flags to specify to use maximum resources + MaxResources = "max" ) var ( diff --git a/pkg/minikube/cruntime/containerd.go b/pkg/minikube/cruntime/containerd.go index 70ebd3f95e..24e872bc66 100644 --- a/pkg/minikube/cruntime/containerd.go +++ b/pkg/minikube/cruntime/containerd.go @@ -29,7 +29,7 @@ import ( "text/template" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" @@ -49,7 +49,6 @@ const ( containerdConfigTemplate = `root = "/var/lib/containerd" state = "/run/containerd" oom_score = 0 - [grpc] address = "/run/containerd/containerd.sock" uid = 0 @@ -79,16 +78,21 @@ oom_score = 0 enable_selinux = false sandbox_image = "{{ .PodInfraContainerImage }}" stats_collect_period = 10 - systemd_cgroup = {{ .SystemdCgroup }} enable_tls_streaming = false max_container_log_line_size = 16384 + + [plugins."io.containerd.grpc.v1.cri"] + [plugins."io.containerd.grpc.v1.cri".containerd] + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes] + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] + runtime_type = "io.containerd.runc.v2" + [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] + SystemdCgroup = {{ .SystemdCgroup }} + [plugins.cri.containerd] snapshotter = "overlayfs" - no_pivot = true [plugins.cri.containerd.default_runtime] - runtime_type = "io.containerd.runtime.v1.linux" - runtime_engine = "" - runtime_root = "" + runtime_type = "io.containerd.runc.v2" [plugins.cri.containerd.untrusted_workload_runtime] runtime_type = "" runtime_engine = "" @@ -107,12 +111,6 @@ oom_score = 0 {{ end -}} [plugins.diff-service] default = ["walking"] - [plugins.linux] - shim = "containerd-shim" - runtime = "runc" - runtime_root = "" - no_shim = false - shim_debug = false [plugins.scheduler] pause_threshold = 0.02 deletion_threshold = 0 @@ -464,16 +462,16 @@ func (r *Containerd) SystemLogCmd(len int) string { } // Preload preloads the container runtime with k8s images -func (r *Containerd) Preload(cfg config.KubernetesConfig) error { - if !download.PreloadExists(cfg.KubernetesVersion, cfg.ContainerRuntime) { +func (r *Containerd) Preload(cc config.ClusterConfig) error { + if !download.PreloadExists(cc.KubernetesConfig.KubernetesVersion, cc.KubernetesConfig.ContainerRuntime, cc.Driver) { return nil } - k8sVersion := cfg.KubernetesVersion - cRuntime := cfg.ContainerRuntime + k8sVersion := cc.KubernetesConfig.KubernetesVersion + cRuntime := cc.KubernetesConfig.ContainerRuntime // If images already exist, return - images, err := images.Kubeadm(cfg.ImageRepository, k8sVersion) + images, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) if err != nil { return errors.Wrap(err, "getting images") } @@ -497,6 +495,12 @@ func (r *Containerd) Preload(cfg config.KubernetesConfig) error { if err != nil { return errors.Wrap(err, "getting file asset") } + defer func() { + if err := fa.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", fa.GetSourcePath(), err) + } + }() + t := time.Now() if err := r.Runner.Copy(fa); err != nil { return errors.Wrap(err, "copying file") diff --git a/pkg/minikube/cruntime/crio.go b/pkg/minikube/cruntime/crio.go index 60c9749bce..82d30647f6 100644 --- a/pkg/minikube/cruntime/crio.go +++ b/pkg/minikube/cruntime/crio.go @@ -25,7 +25,7 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" @@ -316,16 +316,16 @@ func (r *CRIO) SystemLogCmd(len int) string { } // Preload preloads the container runtime with k8s images -func (r *CRIO) Preload(cfg config.KubernetesConfig) error { - if !download.PreloadExists(cfg.KubernetesVersion, cfg.ContainerRuntime) { +func (r *CRIO) Preload(cc config.ClusterConfig) error { + if !download.PreloadExists(cc.KubernetesConfig.KubernetesVersion, cc.KubernetesConfig.ContainerRuntime, cc.Driver) { return nil } - k8sVersion := cfg.KubernetesVersion - cRuntime := cfg.ContainerRuntime + k8sVersion := cc.KubernetesConfig.KubernetesVersion + cRuntime := cc.KubernetesConfig.ContainerRuntime // If images already exist, return - images, err := images.Kubeadm(cfg.ImageRepository, k8sVersion) + images, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) if err != nil { return errors.Wrap(err, "getting images") } @@ -349,6 +349,12 @@ func (r *CRIO) Preload(cfg config.KubernetesConfig) error { if err != nil { return errors.Wrap(err, "getting file asset") } + defer func() { + if err := fa.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", fa.GetSourcePath(), err) + } + }() + t := time.Now() if err := r.Runner.Copy(fa); err != nil { return errors.Wrap(err, "copying file") diff --git a/pkg/minikube/cruntime/cruntime.go b/pkg/minikube/cruntime/cruntime.go index d0bff65f06..95d9084839 100644 --- a/pkg/minikube/cruntime/cruntime.go +++ b/pkg/minikube/cruntime/cruntime.go @@ -21,7 +21,7 @@ import ( "fmt" "os/exec" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" @@ -125,7 +125,7 @@ type Manager interface { // SystemLogCmd returns the command to return the system logs SystemLogCmd(int) string // Preload preloads the container runtime with k8s images - Preload(config.KubernetesConfig) error + Preload(config.ClusterConfig) error // ImagesPreloaded returns true if all images have been preloaded ImagesPreloaded([]string) bool } @@ -163,6 +163,30 @@ type ListImagesOptions struct { // ErrContainerRuntimeNotRunning is thrown when container runtime is not running var ErrContainerRuntimeNotRunning = errors.New("container runtime is not running") +// ErrServiceVersion is the error returned when disk image has incompatible version of service +type ErrServiceVersion struct { + // Service is the name of the incompatible service + Service string + // Installed is the installed version of Service + Installed string + // Required is the minimum required version of Service + Required string +} + +// NewErrServiceVersion creates a new ErrServiceVersion +func NewErrServiceVersion(svc, required, installed string) *ErrServiceVersion { + return &ErrServiceVersion{ + Service: svc, + Installed: installed, + Required: required, + } +} + +func (e ErrServiceVersion) Error() string { + return fmt.Sprintf("service %q version is %v. Required: %v", + e.Service, e.Installed, e.Required) +} + // New returns an appropriately configured runtime func New(c Config) (Manager, error) { sm := sysinit.New(c.Runner) @@ -225,9 +249,10 @@ func disableOthers(me Manager, cr CommandRunner) error { klog.Infof("skipping containerd shutdown because we are bound to it") continue } - - // runtime is already disabled, nothing to do. - if !r.Active() { + // in case of docker, if other runtime are already not active we are sure it is disabled, nothing to do. + // because #11515 for non-docker runtimes, we gotta ensure Docker is disabled and can not just check if it is not active + // since it is enabled by default in the current base image and it keeps coming back to life + if me.Name() == "Docker" && !r.Active() { continue } @@ -242,3 +267,29 @@ func disableOthers(me Manager, cr CommandRunner) error { } return nil } + +var requiredContainerdVersion = semver.MustParse("1.4.0") + +// compatibleWithVersion checks if current version of "runtime" is compatible with version "v" +func compatibleWithVersion(runtime, v string) error { + if runtime == "containerd" { + vv, err := semver.Make(v) + if err != nil { + return err + } + if requiredContainerdVersion.GT(vv) { + return NewErrServiceVersion(runtime, requiredContainerdVersion.String(), vv.String()) + } + } + return nil +} + +// CheckCompatibility checks if the container runtime managed by "cr" is compatible with current minikube code +// returns: NewErrServiceVersion if not +func CheckCompatibility(cr Manager) error { + v, err := cr.Version() + if err != nil { + return errors.Wrap(err, "Failed to check container runtime version") + } + return compatibleWithVersion(cr.Name(), v) +} diff --git a/pkg/minikube/cruntime/docker.go b/pkg/minikube/cruntime/docker.go index 580f466c9e..c25c6cc930 100644 --- a/pkg/minikube/cruntime/docker.go +++ b/pkg/minikube/cruntime/docker.go @@ -24,7 +24,7 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" @@ -150,6 +150,7 @@ func (r *Docker) Restart() error { // Disable idempotently disables Docker on a host func (r *Docker) Disable() error { + klog.Info("disabling docker service ...") // because #10373 if err := r.Init.ForceStop("docker.socket"); err != nil { klog.ErrorS(err, "Failed to stop", "service", "docker.socket") @@ -449,15 +450,15 @@ func (r *Docker) forceSystemd() error { // 1. Copy over the preloaded tarball into the VM // 2. Extract the preloaded tarball to the correct directory // 3. Remove the tarball within the VM -func (r *Docker) Preload(cfg config.KubernetesConfig) error { - if !download.PreloadExists(cfg.KubernetesVersion, cfg.ContainerRuntime) { +func (r *Docker) Preload(cc config.ClusterConfig) error { + if !download.PreloadExists(cc.KubernetesConfig.KubernetesVersion, cc.KubernetesConfig.ContainerRuntime, cc.Driver) { return nil } - k8sVersion := cfg.KubernetesVersion - cRuntime := cfg.ContainerRuntime + k8sVersion := cc.KubernetesConfig.KubernetesVersion + cRuntime := cc.KubernetesConfig.ContainerRuntime // If images already exist, return - images, err := images.Kubeadm(cfg.ImageRepository, k8sVersion) + images, err := images.Kubeadm(cc.KubernetesConfig.ImageRepository, k8sVersion) if err != nil { return errors.Wrap(err, "getting images") } @@ -486,6 +487,12 @@ func (r *Docker) Preload(cfg config.KubernetesConfig) error { if err != nil { return errors.Wrap(err, "getting file asset") } + defer func() { + if err := fa.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", fa.GetSourcePath(), err) + } + }() + t := time.Now() if err := r.Runner.Copy(fa); err != nil { return errors.Wrap(err, "copying file") diff --git a/pkg/minikube/detect/detect.go b/pkg/minikube/detect/detect.go index dba9f91070..7407f20202 100644 --- a/pkg/minikube/detect/detect.go +++ b/pkg/minikube/detect/detect.go @@ -25,8 +25,30 @@ import ( "strings" "github.com/klauspost/cpuid" + "golang.org/x/sys/cpu" ) +// RuntimeOS returns the runtime operating system +func RuntimeOS() string { + return runtime.GOOS +} + +// RuntimeArch returns the runtime architecture +func RuntimeArch() string { + arch := runtime.GOARCH + if arch == "arm" { + // runtime.GOARM + if !cpu.ARM.HasVFP { + return "arm/v5" + } + if !cpu.ARM.HasVFPv3 { + return "arm/v6" + } + // "arm" (== "arm/v7") + } + return arch +} + // IsMicrosoftWSL will return true if process is running in WSL in windows // checking for WSL env var based on this https://github.com/microsoft/WSL/issues/423#issuecomment-608237689 // also based on https://github.com/microsoft/vscode/blob/90a39ba0d49d75e9a4d7e62a6121ad946ecebc58/resources/win32/bin/code.sh#L24 @@ -55,6 +77,15 @@ func IsAmd64M1Emulation() bool { return runtime.GOARCH == "amd64" && strings.HasPrefix(cpuid.CPU.BrandName, "VirtualApple") } +// EffectiveArch return architecture to use in minikube VM/container +// may differ from host arch +func EffectiveArch() string { + if IsAmd64M1Emulation() { + return "arm64" + } + return runtime.GOARCH +} + // MinikubeInstalledViaSnap returns true if the minikube binary path includes "snap". func MinikubeInstalledViaSnap() bool { ex, err := os.Executable() diff --git a/pkg/minikube/download/binary.go b/pkg/minikube/download/binary.go index 00bcb97021..dc9de3a14e 100644 --- a/pkg/minikube/download/binary.go +++ b/pkg/minikube/download/binary.go @@ -22,7 +22,9 @@ import ( "path" "runtime" - "github.com/blang/semver" + "k8s.io/minikube/pkg/minikube/detect" + + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/localpath" @@ -46,13 +48,22 @@ func binaryWithChecksumURL(binaryName, version, osName, archName string) (string func Binary(binary, version, osName, archName string) (string, error) { targetDir := localpath.MakeMiniPath("cache", osName, version) targetFilepath := path.Join(targetDir, binary) + targetLock := targetFilepath + ".lock" url, err := binaryWithChecksumURL(binary, version, osName, archName) if err != nil { return "", err } - if _, err := os.Stat(targetFilepath); err == nil { + releaser, err := lockDownload(targetLock) + if releaser != nil { + defer releaser.Release() + } + if err != nil { + return "", err + } + + if _, err := checkCache(targetFilepath); err == nil { klog.Infof("Not caching binary, using %s", url) return targetFilepath, nil } @@ -61,7 +72,7 @@ func Binary(binary, version, osName, archName string) (string, error) { return "", errors.Wrapf(err, "download failed: %s", url) } - if osName == runtime.GOOS && archName == runtime.GOARCH { + if osName == runtime.GOOS && archName == detect.EffectiveArch() { if err = os.Chmod(targetFilepath, 0755); err != nil { return "", errors.Wrapf(err, "chmod +x %s", targetFilepath) } diff --git a/pkg/minikube/download/download.go b/pkg/minikube/download/download.go index 6d0de97e54..d65590775e 100644 --- a/pkg/minikube/download/download.go +++ b/pkg/minikube/download/download.go @@ -22,27 +22,44 @@ import ( "os" "path/filepath" "strings" + "time" "github.com/hashicorp/go-getter" + "github.com/juju/mutex" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/out" + "k8s.io/minikube/pkg/minikube/style" + "k8s.io/minikube/pkg/util/lock" ) var ( - mockMode = false + // DownloadMock is called instead of the download implementation if not nil. + DownloadMock func(src, dst string) error = nil + checkCache = os.Stat ) -// EnableMock allows tests to selectively enable if downloads are mocked -func EnableMock(b bool) { - mockMode = b +// CreateDstDownloadMock is the default mock implementation of download. +func CreateDstDownloadMock(src, dst string) error { + if err := os.MkdirAll(filepath.Dir(dst), 0755); err != nil { + return errors.Wrap(err, "mkdir") + } + + _, err := os.Create(dst) + return err } // download is a well-configured atomic download function func download(src string, dst string) error { - progress := getter.WithProgress(DefaultProgressBar) - if out.JSON { - progress = getter.WithProgress(DefaultJSONOutput) + var clientOptions []getter.ClientOption + if out.IsTerminal(os.Stdout) { + progress := getter.WithProgress(DefaultProgressBar) + if out.JSON { + progress = getter.WithProgress(DefaultJSONOutput) + } + clientOptions = []getter.ClientOption{progress} + } else { + clientOptions = []getter.ClientOption{} } tmpDst := dst + ".download" client := &getter.Client{ @@ -50,7 +67,7 @@ func download(src string, dst string) error { Dst: tmpDst, Dir: false, Mode: getter.ClientModeFile, - Options: []getter.ClientOption{progress}, + Options: clientOptions, Getters: map[string]getter.Getter{ "file": &getter.FileGetter{Copy: false}, "http": &getter.HttpGetter{Netrc: false}, @@ -62,12 +79,9 @@ func download(src string, dst string) error { return errors.Wrap(err, "mkdir") } - // Don't bother with getter.MockGetter, as we don't provide a way to inspect the outcome - if mockMode { + if DownloadMock != nil { klog.Infof("Mock download: %s -> %s", src, dst) - // Callers expect the file to exist - _, err := os.Create(dst) - return err + return DownloadMock(src, dst) } // Politely prevent tests from shooting themselves in the foot @@ -91,3 +105,34 @@ func withinUnitTest() bool { return flag.Lookup("test.v") != nil || strings.HasSuffix(os.Args[0], "test") } + +// lockDownload locks `file` if possible and returns a releaser that must be called to release the lock. +func lockDownload(file string) (mutex.Releaser, error) { + type retPair struct { + mutex.Releaser + error + } + lockChannel := make(chan retPair) + + go func() { + spec := lock.PathMutexSpec(file) + releaser, err := mutex.Acquire(spec) + if err != nil { + lockChannel <- retPair{nil, errors.Wrapf(err, "failed to acquire lock \"%s\": %+v", file, spec)} + return + } + lockChannel <- retPair{releaser, err} + }() + + select { + case r := <-lockChannel: + return r.Releaser, r.error + case <-time.After(time.Millisecond * 100): + out.Step(style.WaitingWithSpinner, "Another minikube instance is downloading dependencies... ") + } + + // lock.PathMutexSpec returns a spec including a 60s timeout. Therefore, this + // will not block indefinitely. + r := <-lockChannel + return r.Releaser, r.error +} diff --git a/pkg/minikube/download/download_test.go b/pkg/minikube/download/download_test.go new file mode 100644 index 0000000000..03099dce7d --- /dev/null +++ b/pkg/minikube/download/download_test.go @@ -0,0 +1,238 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package download + +import ( + "fmt" + "io/fs" + "sync" + "testing" + "time" + + "k8s.io/minikube/pkg/minikube/constants" +) + +// Force download tests to run in serial. +func TestDownload(t *testing.T) { + t.Run("BinaryDownloadPreventsMultipleDownload", testBinaryDownloadPreventsMultipleDownload) + t.Run("PreloadDownloadPreventsMultipleDownload", testPreloadDownloadPreventsMultipleDownload) + t.Run("ImageToCache", testImageToCache) + t.Run("ImageToDaemon", testImageToDaemon) + t.Run("PreloadNotExists", testPreloadNotExists) + t.Run("PreloadChecksumMismatch", testPreloadChecksumMismatch) + t.Run("PreloadExistsCaching", testPreloadExistsCaching) +} + +// Returns a mock function that sleeps before incrementing `downloadsCounter` and creates the requested file. +func mockSleepDownload(downloadsCounter *int) func(src, dst string) error { + return func(src, dst string) error { + // Sleep for 200ms to assure locking must have occurred. + time.Sleep(time.Millisecond * 200) + *downloadsCounter++ + return CreateDstDownloadMock(src, dst) + } +} + +func testBinaryDownloadPreventsMultipleDownload(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkCache = func(file string) (fs.FileInfo, error) { + if downloadNum == 0 { + return nil, fmt.Errorf("some error") + } + return nil, nil + } + + var group sync.WaitGroup + group.Add(2) + dlCall := func() { + if _, err := Binary("kubectl", "v1.20.2", "linux", "amd64"); err != nil { + t.Errorf("Failed to download binary: %+v", err) + } + group.Done() + } + + go dlCall() + go dlCall() + + group.Wait() + + if downloadNum != 1 { + t.Errorf("Expected only 1 download attempt but got %v!", downloadNum) + } +} + +func testPreloadDownloadPreventsMultipleDownload(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkCache = func(file string) (fs.FileInfo, error) { + if downloadNum == 0 { + return nil, fmt.Errorf("some error") + } + return nil, nil + } + checkPreloadExists = func(k8sVersion, containerRuntime, driverName string, forcePreload ...bool) bool { return true } + getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { return []byte("check"), nil } + ensureChecksumValid = func(k8sVersion, containerRuntime, path string, checksum []byte) error { return nil } + + var group sync.WaitGroup + group.Add(2) + dlCall := func() { + if err := Preload(constants.DefaultKubernetesVersion, constants.DefaultContainerRuntime, "docker"); err != nil { + t.Logf("Failed to download preload: %+v (may be ok)", err) + } + group.Done() + } + + go dlCall() + go dlCall() + + group.Wait() + + if downloadNum != 1 { + t.Errorf("Expected only 1 download attempt but got %v!", downloadNum) + } +} + +func testPreloadNotExists(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkCache = func(file string) (fs.FileInfo, error) { return nil, fmt.Errorf("cache not found") } + checkPreloadExists = func(k8sVersion, containerRuntime, driverName string, forcePreload ...bool) bool { return false } + getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { return []byte("check"), nil } + ensureChecksumValid = func(k8sVersion, containerRuntime, path string, checksum []byte) error { return nil } + + err := Preload(constants.DefaultKubernetesVersion, constants.DefaultContainerRuntime, "docker") + if err != nil { + t.Errorf("Expected no error when preload exists") + } + + if downloadNum != 0 { + t.Errorf("Expected no download attempt but got %v!", downloadNum) + } +} + +func testPreloadChecksumMismatch(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkCache = func(file string) (fs.FileInfo, error) { return nil, fmt.Errorf("cache not found") } + checkPreloadExists = func(k8sVersion, containerRuntime, driverName string, forcePreload ...bool) bool { return true } + getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { return []byte("check"), nil } + ensureChecksumValid = func(k8sVersion, containerRuntime, path string, checksum []byte) error { + return fmt.Errorf("checksum mismatch") + } + + err := Preload(constants.DefaultKubernetesVersion, constants.DefaultContainerRuntime, "docker") + expectedErrMsg := "checksum mismatch" + if err == nil { + t.Errorf("Expected error when checksum mismatches") + } else if err.Error() != expectedErrMsg { + t.Errorf("Expected error to be %s, got %s", expectedErrMsg, err.Error()) + } +} + +func testImageToCache(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkImageExistsInCache = func(img string) bool { return downloadNum > 0 } + + var group sync.WaitGroup + group.Add(2) + dlCall := func() { + if err := ImageToCache("testimg"); err != nil { + t.Errorf("Failed to download preload: %+v", err) + } + group.Done() + } + + go dlCall() + go dlCall() + + group.Wait() + + if downloadNum != 1 { + t.Errorf("Expected only 1 download attempt but got %v!", downloadNum) + } +} + +func testImageToDaemon(t *testing.T) { + downloadNum := 0 + DownloadMock = mockSleepDownload(&downloadNum) + + checkImageExistsInCache = func(img string) bool { return downloadNum > 0 } + + var group sync.WaitGroup + group.Add(2) + dlCall := func() { + if err := ImageToCache("testimg"); err != nil { + t.Errorf("Failed to download preload: %+v", err) + } + group.Done() + } + + go dlCall() + go dlCall() + + group.Wait() + + if downloadNum != 1 { + t.Errorf("Expected only 1 download attempt but got %v!", downloadNum) + } +} + +// Validates that preload existence checks correctly caches values retrieved by remote checks. +func testPreloadExistsCaching(t *testing.T) { + checkCache = func(file string) (fs.FileInfo, error) { + return nil, fmt.Errorf("cache not found") + } + doesPreloadExist := false + checkCalled := false + checkRemotePreloadExists = func(k8sVersion, containerRuntime string) bool { + checkCalled = true + return doesPreloadExist + } + existence := PreloadExists("v1", "c1", "docker", true) + if existence || !checkCalled { + t.Errorf("Expected preload not to exist and a check to be performed. Existence: %v, Check: %v", existence, checkCalled) + } + checkCalled = false + existence = PreloadExists("v1", "c1", "docker", true) + if existence || checkCalled { + t.Errorf("Expected preload not to exist and no check to be performed. Existence: %v, Check: %v", existence, checkCalled) + } + doesPreloadExist = true + checkCalled = false + existence = PreloadExists("v2", "c1", "docker", true) + if !existence || !checkCalled { + t.Errorf("Expected preload to exist and a check to be performed. Existence: %v, Check: %v", existence, checkCalled) + } + checkCalled = false + existence = PreloadExists("v2", "c2", "docker", true) + if !existence || !checkCalled { + t.Errorf("Expected preload to exist and a check to be performed. Existence: %v, Check: %v", existence, checkCalled) + } + checkCalled = false + existence = PreloadExists("v2", "c2", "docker", true) + if !existence || checkCalled { + t.Errorf("Expected preload to exist and no check to be performed. Existence: %v, Check: %v", existence, checkCalled) + } +} diff --git a/pkg/minikube/download/driver.go b/pkg/minikube/download/driver.go index 2a3f121949..93ce6e105b 100644 --- a/pkg/minikube/download/driver.go +++ b/pkg/minikube/download/driver.go @@ -20,7 +20,7 @@ import ( "fmt" "os" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "k8s.io/minikube/pkg/minikube/out" "k8s.io/minikube/pkg/minikube/style" diff --git a/pkg/minikube/download/image.go b/pkg/minikube/download/image.go new file mode 100644 index 0000000000..bf69d3671c --- /dev/null +++ b/pkg/minikube/download/image.go @@ -0,0 +1,296 @@ +/* +Copyright 2020 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package download + +import ( + "fmt" + "os" + "os/exec" + "path" + "path/filepath" + "runtime" + "strings" + + "github.com/cheggaaa/pb/v3" + "github.com/google/go-containerregistry/pkg/name" + v1 "github.com/google/go-containerregistry/pkg/v1" + "github.com/google/go-containerregistry/pkg/v1/daemon" + "github.com/google/go-containerregistry/pkg/v1/remote" + "github.com/google/go-containerregistry/pkg/v1/tarball" + "github.com/pkg/errors" + "k8s.io/klog/v2" + "k8s.io/minikube/pkg/minikube/constants" + "k8s.io/minikube/pkg/minikube/localpath" +) + +var ( + defaultPlatform = v1.Platform{ + Architecture: runtime.GOARCH, + OS: "linux", + } +) + +// imagePathInCache returns path in local cache directory +func imagePathInCache(img string) string { + f := filepath.Join(constants.KICCacheDir, path.Base(img)+".tar") + f = localpath.SanitizeCacheDir(f) + return f +} + +// ImageExistsInCache if img exist in local cache directory +func ImageExistsInCache(img string) bool { + f := imagePathInCache(img) + + // Check if image exists locally + klog.Infof("Checking for %s in local cache directory", img) + if st, err := os.Stat(f); err == nil { + if st.Size() > 0 { + klog.Infof("Found %s in local cache directory, skipping pull", img) + return true + } + } + // Else, pull it + return false +} + +var checkImageExistsInCache = ImageExistsInCache + +// ImageExistsInDaemon if img exist in local docker daemon +func ImageExistsInDaemon(img string) bool { + // Check if image exists locally + klog.Infof("Checking for %s in local docker daemon", img) + cmd := exec.Command("docker", "images", "--format", "{{.Repository}}:{{.Tag}}@{{.Digest}}") + if output, err := cmd.Output(); err == nil { + if strings.Contains(string(output), img) { + klog.Infof("Found %s in local docker daemon, skipping pull", img) + return true + } + } + // Else, pull it + return false +} + +var checkImageExistsInDaemon = ImageExistsInDaemon + +// ImageToCache downloads img (if not present in cache) and writes it to the local cache directory +func ImageToCache(img string) error { + f := imagePathInCache(img) + fileLock := f + ".lock" + + releaser, err := lockDownload(fileLock) + if releaser != nil { + defer releaser.Release() + } + if err != nil { + return err + } + + if checkImageExistsInCache(img) { + klog.Infof("%s exists in cache, skipping pull", img) + return nil + } + + if err := os.MkdirAll(filepath.Dir(f), 0777); err != nil { + return errors.Wrapf(err, "making cache image directory: %s", f) + } + + if DownloadMock != nil { + klog.Infof("Mock download: %s -> %s", img, f) + return DownloadMock(img, f) + } + + // buffered channel + c := make(chan v1.Update, 200) + + klog.Infof("Writing %s to local cache", img) + ref, err := name.ParseReference(img) + if err != nil { + return errors.Wrap(err, "parsing reference") + } + klog.V(3).Infof("Getting image %v", ref) + i, err := remote.Image(ref, remote.WithPlatform(defaultPlatform)) + if err != nil { + if strings.Contains(err.Error(), "GitHub Docker Registry needs login") { + ErrGithubNeedsLogin := errors.New(err.Error()) + return ErrGithubNeedsLogin + } else if strings.Contains(err.Error(), "UNAUTHORIZED") { + ErrNeedsLogin := errors.New(err.Error()) + return ErrNeedsLogin + } + + return errors.Wrap(err, "getting remote image") + } + klog.V(3).Infof("Writing image %v", ref) + errchan := make(chan error) + p := pb.Full.Start64(0) + fn := strings.Split(ref.Name(), "@")[0] + // abbreviate filename for progress + maxwidth := 30 - len("...") + if len(fn) > maxwidth { + fn = fn[0:maxwidth] + "..." + } + p.Set("prefix", " > "+fn+": ") + p.Set(pb.Bytes, true) + + // Just a hair less than 80 (standard terminal width) for aesthetics & pasting into docs + p.SetWidth(79) + + go func() { + err = tarball.WriteToFile(f, ref, i, tarball.WithProgress(c)) + errchan <- err + }() + var update v1.Update + for { + select { + case update = <-c: + p.SetCurrent(update.Complete) + p.SetTotal(update.Total) + case err = <-errchan: + p.Finish() + if err != nil { + return errors.Wrap(err, "writing tarball image") + } + return nil + } + } +} + +func parseImage(img string) (*name.Tag, name.Reference, error) { + digest, err := name.NewDigest(img) + if err == nil { + tag := digest.Tag() + return &tag, digest, nil + } + + _, ok := err.(*name.ErrBadName) + if !ok { + return nil, nil, errors.Wrap(err, "new ref") + } + // ErrBadName means img contains no digest + // It happens if its value is name:tag for example. + // In this case we want to give it a second chance and try to parse it one more time using name.NewTag(img) + tag, err := name.NewTag(img) + if err != nil { + return nil, nil, errors.Wrap(err, "failed to parse image reference") + } + return &tag, tag, nil +} + +// CacheToDaemon loads image from tarball in the local cache directory to the local docker daemon +func CacheToDaemon(img string) error { + p := imagePathInCache(img) + + tag, ref, err := parseImage(img) + if err != nil { + return err + } + // do not use cache if image is set in format :latest + if _, ok := ref.(name.Tag); ok { + if tag.Name() == "latest" { + return fmt.Errorf("can't cache 'latest' tag") + } + } + + i, err := tarball.ImageFromPath(p, tag) + if err != nil { + return errors.Wrap(err, "tarball") + } + + resp, err := daemon.Write(ref, i) + klog.V(2).Infof("response: %s", resp) + return err +} + +// ImageToDaemon downloads img (if not present in daemon) and writes it to the local docker daemon +func ImageToDaemon(img string) error { + fileLock := filepath.Join(constants.KICCacheDir, path.Base(img)+".d.lock") + fileLock = localpath.SanitizeCacheDir(fileLock) + + releaser, err := lockDownload(fileLock) + if releaser != nil { + defer releaser.Release() + } + if err != nil { + return err + } + + if checkImageExistsInDaemon(img) { + klog.Infof("%s exists in daemon, skipping pull", img) + return nil + } + // buffered channel + c := make(chan v1.Update, 200) + + klog.Infof("Writing %s to local daemon", img) + ref, err := name.ParseReference(img) + if err != nil { + return errors.Wrap(err, "parsing reference") + } + + if DownloadMock != nil { + klog.Infof("Mock download: %s -> daemon", img) + return DownloadMock(img, "daemon") + } + + klog.V(3).Infof("Getting image %v", ref) + i, err := remote.Image(ref, remote.WithPlatform(defaultPlatform)) + if err != nil { + if strings.Contains(err.Error(), "GitHub Docker Registry needs login") { + ErrGithubNeedsLogin := errors.New(err.Error()) + return ErrGithubNeedsLogin + } else if strings.Contains(err.Error(), "UNAUTHORIZED") { + ErrNeedsLogin := errors.New(err.Error()) + return ErrNeedsLogin + } + + return errors.Wrap(err, "getting remote image") + } + + klog.V(3).Infof("Writing image %v", ref) + errchan := make(chan error) + p := pb.Full.Start64(0) + fn := strings.Split(ref.Name(), "@")[0] + // abbreviate filename for progress + maxwidth := 30 - len("...") + if len(fn) > maxwidth { + fn = fn[0:maxwidth] + "..." + } + p.Set("prefix", " > "+fn+": ") + p.Set(pb.Bytes, true) + + // Just a hair less than 80 (standard terminal width) for aesthetics & pasting into docs + p.SetWidth(79) + + go func() { + _, err = daemon.Write(ref, i, tarball.WithProgress(c)) + errchan <- err + }() + var update v1.Update + for { + select { + case update = <-c: + p.SetCurrent(update.Complete) + p.SetTotal(update.Total) + case err = <-errchan: + p.Finish() + if err != nil { + return errors.Wrap(err, "writing daemon image") + } + return nil + } + } +} diff --git a/pkg/minikube/download/iso.go b/pkg/minikube/download/iso.go index 08f4042ba1..4bf837cddc 100644 --- a/pkg/minikube/download/iso.go +++ b/pkg/minikube/download/iso.go @@ -40,7 +40,7 @@ const fileScheme = "file" // DefaultISOURLs returns a list of ISO URL's to consult by default, in priority order func DefaultISOURLs() []string { v := version.GetISOVersion() - isoBucket := "minikube/iso" + isoBucket := "minikube-builds/iso/11483" return []string{ fmt.Sprintf("https://storage.googleapis.com/%s/minikube-%s.iso", isoBucket, v), fmt.Sprintf("https://github.com/kubernetes/minikube/releases/download/%s/minikube-%s.iso", v, v), diff --git a/pkg/minikube/download/preload.go b/pkg/minikube/download/preload.go index 4a6577fa38..b174b1aeca 100644 --- a/pkg/minikube/download/preload.go +++ b/pkg/minikube/download/preload.go @@ -25,14 +25,15 @@ import ( "net/http" "os" "path/filepath" - "runtime" "cloud.google.com/go/storage" "google.golang.org/api/option" + "k8s.io/minikube/pkg/minikube/detect" "github.com/pkg/errors" "github.com/spf13/viper" "k8s.io/klog/v2" + "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/localpath" "k8s.io/minikube/pkg/minikube/out" "k8s.io/minikube/pkg/minikube/style" @@ -42,11 +43,15 @@ const ( // PreloadVersion is the current version of the preloaded tarball // // NOTE: You may need to bump this version up when upgrading auxiliary docker images - PreloadVersion = "v10" + PreloadVersion = "v11" // PreloadBucket is the name of the GCS bucket where preloaded volume tarballs exist PreloadBucket = "minikube-preloaded-volume-tarballs" ) +var ( + preloadStates map[string]map[string]bool = make(map[string]map[string]bool) +) + // TarballName returns name of the tarball func TarballName(k8sVersion, containerRuntime string) string { if containerRuntime == "crio" { @@ -58,7 +63,8 @@ func TarballName(k8sVersion, containerRuntime string) string { } else { storageDriver = "overlay2" } - return fmt.Sprintf("preloaded-images-k8s-%s-%s-%s-%s-%s.tar.lz4", PreloadVersion, k8sVersion, containerRuntime, storageDriver, runtime.GOARCH) + arch := detect.EffectiveArch() + return fmt.Sprintf("preloaded-images-k8s-%s-%s-%s-%s-%s.tar.lz4", PreloadVersion, k8sVersion, containerRuntime, storageDriver, arch) } // returns the name of the checksum file @@ -86,27 +92,16 @@ func remoteTarballURL(k8sVersion, containerRuntime string) string { return fmt.Sprintf("https://storage.googleapis.com/%s/%s", PreloadBucket, TarballName(k8sVersion, containerRuntime)) } -// PreloadExists returns true if there is a preloaded tarball that can be used -func PreloadExists(k8sVersion, containerRuntime string, forcePreload ...bool) bool { - // TODO (#8166): Get rid of the need for this and viper at all - force := false - if len(forcePreload) > 0 { - force = forcePreload[0] - } - - // TODO: debug why this func is being called two times - klog.Infof("Checking if preload exists for k8s version %s and runtime %s", k8sVersion, containerRuntime) - if !viper.GetBool("preload") && !force { - return false - } - - // Omit remote check if tarball exists locally - targetPath := TarballPath(k8sVersion, containerRuntime) - if _, err := os.Stat(targetPath); err == nil { - klog.Infof("Found local preload: %s", targetPath) - return true +func setPreloadState(k8sVersion, containerRuntime string, value bool) { + cRuntimes, ok := preloadStates[k8sVersion] + if !ok { + cRuntimes = make(map[string]bool) + preloadStates[k8sVersion] = cRuntimes } + cRuntimes[containerRuntime] = value +} +var checkRemotePreloadExists = func(k8sVersion, containerRuntime string) bool { url := remoteTarballURL(k8sVersion, containerRuntime) resp, err := http.Head(url) if err != nil { @@ -115,7 +110,7 @@ func PreloadExists(k8sVersion, containerRuntime string, forcePreload ...bool) bo } // 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 } @@ -124,17 +119,63 @@ func PreloadExists(k8sVersion, containerRuntime string, forcePreload ...bool) bo return true } -// Preload caches the preloaded images tarball on the host machine -func Preload(k8sVersion, containerRuntime string) error { - targetPath := TarballPath(k8sVersion, containerRuntime) +// PreloadExists returns true if there is a preloaded tarball that can be used +func PreloadExists(k8sVersion, containerRuntime, driverName string, forcePreload ...bool) bool { + // TODO (#8166): Get rid of the need for this and viper at all + force := false + if len(forcePreload) > 0 { + force = forcePreload[0] + } - if _, err := os.Stat(targetPath); err == nil { + // TODO: debug why this func is being called two times + klog.Infof("Checking if preload exists for k8s version %s and runtime %s", k8sVersion, containerRuntime) + // If `driverName` is BareMetal, there is no preload. Note: some uses of + // `PreloadExists` assume that the driver is irrelevant unless BareMetal. + if !driver.AllowsPreload(driverName) || !viper.GetBool("preload") && !force { + return false + } + + // If the preload existence is cached, just return that value. + preloadState, ok := preloadStates[k8sVersion][containerRuntime] + if ok { + return preloadState + } + + // Omit remote check if tarball exists locally + targetPath := TarballPath(k8sVersion, containerRuntime) + if _, err := checkCache(targetPath); err == nil { + klog.Infof("Found local preload: %s", targetPath) + setPreloadState(k8sVersion, containerRuntime, true) + return true + } + + existence := checkRemotePreloadExists(k8sVersion, containerRuntime) + setPreloadState(k8sVersion, containerRuntime, existence) + return existence +} + +var checkPreloadExists = PreloadExists + +// Preload caches the preloaded images tarball on the host machine +func Preload(k8sVersion, containerRuntime, driverName string) error { + targetPath := TarballPath(k8sVersion, containerRuntime) + targetLock := targetPath + ".lock" + + releaser, err := lockDownload(targetLock) + if releaser != nil { + defer releaser.Release() + } + if err != nil { + return err + } + + if _, err := checkCache(targetPath); err == nil { klog.Infof("Found %s in cache, skipping download", targetPath) return nil } // Make sure we support this k8s version - if !PreloadExists(k8sVersion, containerRuntime) { + if !checkPreloadExists(k8sVersion, containerRuntime, driverName) { klog.Infof("Preloaded tarball for k8s version %s does not exist", k8sVersion) return nil } @@ -152,20 +193,17 @@ func Preload(k8sVersion, containerRuntime string) error { return errors.Wrap(err, "tempfile") } targetPath = tmp.Name() - } else if checksum != "" { - url += "?checksum=" + checksum + } else if checksum != nil { + // add URL parameter for go-getter to automatically verify the checksum + url += fmt.Sprintf("?checksum=md5:%s", hex.EncodeToString(checksum)) } if err := download(url, targetPath); err != nil { return errors.Wrapf(err, "download failed: %s", url) } - if err := saveChecksumFile(k8sVersion, containerRuntime); err != nil { - return errors.Wrap(err, "saving checksum file") - } - - if err := verifyChecksum(k8sVersion, containerRuntime, targetPath); err != nil { - return errors.Wrap(err, "verify") + if err := ensureChecksumValid(k8sVersion, containerRuntime, targetPath, checksum); err != nil { + return err } if realPath != "" { @@ -176,6 +214,8 @@ func Preload(k8sVersion, containerRuntime string) error { } } + // If the download was successful, mark off that the preload exists in the cache. + setPreloadState(k8sVersion, containerRuntime, true) return nil } @@ -192,23 +232,19 @@ func getStorageAttrs(name string) (*storage.ObjectAttrs, error) { return attrs, nil } -func getChecksum(k8sVersion, containerRuntime string) (string, error) { +// getChecksum returns the MD5 checksum of the preload tarball +var getChecksum = func(k8sVersion, containerRuntime string) ([]byte, error) { klog.Infof("getting checksum for %s ...", TarballName(k8sVersion, containerRuntime)) attrs, err := getStorageAttrs(TarballName(k8sVersion, containerRuntime)) if err != nil { - return "", err + return nil, err } - md5 := hex.EncodeToString(attrs.MD5) - return fmt.Sprintf("md5:%s", md5), nil + return attrs.MD5, nil } -func saveChecksumFile(k8sVersion, containerRuntime string) error { +// saveChecksumFile saves the checksum to a local file for later verification +func saveChecksumFile(k8sVersion, containerRuntime string, checksum []byte) error { klog.Infof("saving checksum for %s ...", TarballName(k8sVersion, containerRuntime)) - attrs, err := getStorageAttrs(TarballName(k8sVersion, containerRuntime)) - if err != nil { - return err - } - checksum := attrs.MD5 return ioutil.WriteFile(PreloadChecksumPath(k8sVersion, containerRuntime), checksum, 0o644) } @@ -234,3 +270,16 @@ func verifyChecksum(k8sVersion, containerRuntime, path string) error { } return nil } + +// ensureChecksumValid saves and verifies local binary checksum matches remote binary checksum +var ensureChecksumValid = func(k8sVersion, containerRuntime, targetPath string, checksum []byte) error { + if err := saveChecksumFile(k8sVersion, containerRuntime, checksum); err != nil { + return errors.Wrap(err, "saving checksum file") + } + + if err := verifyChecksum(k8sVersion, containerRuntime, targetPath); err != nil { + return errors.Wrap(err, "verify") + } + + return nil +} diff --git a/pkg/minikube/driver/install.go b/pkg/minikube/driver/auxdriver/install.go similarity index 96% rename from pkg/minikube/driver/install.go rename to pkg/minikube/driver/auxdriver/install.go index 4ef71b5753..76d1192155 100644 --- a/pkg/minikube/driver/install.go +++ b/pkg/minikube/driver/auxdriver/install.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package driver +package auxdriver import ( "fmt" @@ -25,13 +25,14 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/juju/mutex" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/download" + "k8s.io/minikube/pkg/minikube/driver" "k8s.io/minikube/pkg/minikube/out" "k8s.io/minikube/pkg/minikube/style" "k8s.io/minikube/pkg/util/lock" @@ -39,7 +40,7 @@ import ( // InstallOrUpdate downloads driver if it is not present, or updates it if there's a newer version func InstallOrUpdate(name string, directory string, v semver.Version, interactive bool, autoUpdate bool) error { - if name != KVM2 && name != HyperKit { + if name != driver.KVM2 && name != driver.HyperKit { return nil } @@ -69,7 +70,7 @@ func InstallOrUpdate(name string, directory string, v semver.Version, interactiv // fixDriverPermissions fixes the permissions on a driver func fixDriverPermissions(name string, path string, interactive bool) error { - if name != HyperKit { + if name != driver.HyperKit { return nil } diff --git a/pkg/minikube/driver/install_test.go b/pkg/minikube/driver/auxdriver/install_test.go similarity index 98% rename from pkg/minikube/driver/install_test.go rename to pkg/minikube/driver/auxdriver/install_test.go index 6cd8cd010d..95bc5a1b19 100644 --- a/pkg/minikube/driver/install_test.go +++ b/pkg/minikube/driver/auxdriver/install_test.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package driver +package auxdriver import ( "testing" diff --git a/pkg/minikube/driver/version.go b/pkg/minikube/driver/auxdriver/version.go similarity index 80% rename from pkg/minikube/driver/version.go rename to pkg/minikube/driver/auxdriver/version.go index 7ccf96dd46..8fcc971c50 100644 --- a/pkg/minikube/driver/version.go +++ b/pkg/minikube/driver/auxdriver/version.go @@ -14,11 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -package driver +package auxdriver import ( - "github.com/blang/semver" + "github.com/blang/semver/v4" "k8s.io/klog/v2" + "k8s.io/minikube/pkg/minikube/driver" ) // minHyperkitVersion is the minimum version of the minikube hyperkit driver compatible with the current minikube code @@ -36,17 +37,17 @@ func init() { } // minAcceptableDriverVersion is the minimum version of driver supported by current version of minikube -func minAcceptableDriverVersion(driver string, mkVer semver.Version) semver.Version { - switch driver { - case HyperKit: +func minAcceptableDriverVersion(driverName string, mkVer semver.Version) semver.Version { + switch driverName { + case driver.HyperKit: if minHyperkitVersion != nil { return *minHyperkitVersion } return mkVer - case KVM2: + case driver.KVM2: return mkVer default: - klog.Warningf("Unexpected driver: %v", driver) + klog.Warningf("Unexpected driver: %v", driverName) return mkVer } } diff --git a/pkg/minikube/driver/version_test.go b/pkg/minikube/driver/auxdriver/version_test.go similarity index 85% rename from pkg/minikube/driver/version_test.go rename to pkg/minikube/driver/auxdriver/version_test.go index bcd19bb8c2..6cc652a805 100644 --- a/pkg/minikube/driver/version_test.go +++ b/pkg/minikube/driver/auxdriver/version_test.go @@ -14,12 +14,13 @@ See the License for the specific language governing permissions and limitations under the License. */ -package driver +package auxdriver import ( "testing" - "github.com/blang/semver" + "github.com/blang/semver/v4" + "k8s.io/minikube/pkg/minikube/driver" ) func Test_minDriverVersion(t *testing.T) { @@ -30,9 +31,9 @@ func Test_minDriverVersion(t *testing.T) { mkV string want semver.Version }{ - {"Hyperkit", HyperKit, "1.1.1", *minHyperkitVersion}, + {"Hyperkit", driver.HyperKit, "1.1.1", *minHyperkitVersion}, {"Invalid", "_invalid_", "1.1.1", v("1.1.1")}, - {"KVM2", KVM2, "1.1.1", v("1.1.1")}, + {"KVM2", driver.KVM2, "1.1.1", v("1.1.1")}, } for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { diff --git a/pkg/minikube/driver/driver.go b/pkg/minikube/driver/driver.go index 47cb5885b6..6481ff632f 100644 --- a/pkg/minikube/driver/driver.go +++ b/pkg/minikube/driver/driver.go @@ -26,6 +26,7 @@ import ( "k8s.io/klog/v2" "k8s.io/minikube/pkg/drivers/kic/oci" + "k8s.io/minikube/pkg/minikube/constants" "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/registry" ) @@ -71,13 +72,20 @@ var ( // SupportedDrivers returns a list of supported drivers func SupportedDrivers() []string { - return supportedDrivers + arch := detect.RuntimeArch() + for _, a := range constants.SupportedArchitectures { + if arch == a { + return supportedDrivers + } + } + // remote cluster only + return []string{SSH} } // DisplaySupportedDrivers returns a string with a list of supported drivers func DisplaySupportedDrivers() string { var sd []string - for _, d := range supportedDrivers { + for _, d := range SupportedDrivers() { if registry.Driver(d).Priority == registry.Experimental { sd = append(sd, d+" (experimental)") continue @@ -89,7 +97,7 @@ func DisplaySupportedDrivers() string { // Supported returns if the driver is supported on this host. func Supported(name string) bool { - for _, d := range supportedDrivers { + for _, d := range SupportedDrivers() { if name == d { return true } @@ -164,6 +172,10 @@ func IsSSH(name string) bool { return name == SSH } +func AllowsPreload(driverName string) bool { + return !BareMetal(driverName) && !IsSSH(driverName) +} + // NeedsPortForward returns true if driver is unable provide direct IP connectivity func NeedsPortForward(name string) bool { if !IsKIC(name) { @@ -281,6 +293,7 @@ func Suggest(options []registry.DriverState) (registry.DriverState, []registry.D if !ds.State.Healthy { ds.Rejection = fmt.Sprintf("Not healthy: %v", ds.State.Error) + ds.Suggestion = fmt.Sprintf("%s <%s>", ds.State.Fix, ds.State.Doc) rejects = append(rejects, ds) continue } diff --git a/pkg/minikube/extract/extract.go b/pkg/minikube/extract/extract.go index f67cfb3a0c..425d7f1516 100644 --- a/pkg/minikube/extract/extract.go +++ b/pkg/minikube/extract/extract.go @@ -31,7 +31,6 @@ import ( "github.com/golang-collections/collections/stack" "github.com/pkg/errors" - "k8s.io/minikube/pkg/util/lock" ) // exclude is a list of strings to explicitly omit from translation files. @@ -48,6 +47,8 @@ var exclude = []string{ "==\u003e {{.name}} \u003c==", "- {{.profile}}", " - {{.profile}}", + "test/integration", + "pkg/minikube/reason/exitcodes.go", } // ErrMapFile is a constant to refer to the err_map file, which contains the Advice strings. @@ -91,7 +92,7 @@ func newExtractor(functionsToCheck []string) (*state, error) { // Functions must be of the form "package.function" t2 := strings.Split(t, ".") if len(t2) < 2 { - return nil, errors.Wrap(nil, fmt.Sprintf("Invalid function string %s. Needs package name as well.", t)) + return nil, errors.Errorf("invalid function string %s. Needs package name as well", t) } f := funcType{ pack: t2[0], @@ -298,7 +299,6 @@ func checkIdentForStringValue(i *ast.Ident) string { if rhs, ok := as.Rhs[0].(*ast.BasicLit); ok { s = rhs.Value } - } // This Identifier is part of the const or var declaration @@ -491,7 +491,7 @@ func writeStringsToFiles(e *state, output string) error { if err != nil { return errors.Wrap(err, "marshalling translations") } - err = lock.WriteFile(path, c, info.Mode()) + err = ioutil.WriteFile(path, c, info.Mode()) if err != nil { return errors.Wrap(err, "writing translation file") } @@ -509,7 +509,7 @@ func writeStringsToFiles(e *state, output string) error { return errors.Wrap(err, "marshalling translations") } path := filepath.Join(output, "strings.txt") - err = lock.WriteFile(path, c, 0644) + err = ioutil.WriteFile(path, c, 0644) if err != nil { return errors.Wrap(err, "writing translation file") } diff --git a/pkg/minikube/extract/extract_test.go b/pkg/minikube/extract/extract_test.go index 762d8c14b3..0d0e96c4c6 100644 --- a/pkg/minikube/extract/extract_test.go +++ b/pkg/minikube/extract/extract_test.go @@ -18,6 +18,7 @@ package extract import ( "encoding/json" + "errors" "io/ioutil" "os" "path/filepath" @@ -84,3 +85,12 @@ func TestExtract(t *testing.T) { } } + +func TestExtractShouldReturnErrorOnFunctionWithoutPackage(t *testing.T) { + expected := errors.New("Initializing: invalid function string missing_package. Needs package name as well") + funcs := []string{"missing_package"} + err := TranslatableStrings([]string{}, funcs, "") + if err == nil || err.Error() != expected.Error() { + t.Fatalf("expected %v, got %v", expected, err) + } +} diff --git a/pkg/minikube/image/cache.go b/pkg/minikube/image/cache.go index e992e3eed7..03bd1dcdc0 100644 --- a/pkg/minikube/image/cache.go +++ b/pkg/minikube/image/cache.go @@ -64,19 +64,19 @@ func DeleteFromCacheDir(images []string) error { // The cache directory currently caches images using the imagename_tag // For example, k8s.gcr.io/kube-addon-manager:v6.5 would be // stored at $CACHE_DIR/k8s.gcr.io/kube-addon-manager_v6.5 -func SaveToDir(images []string, cacheDir string) error { +func SaveToDir(images []string, cacheDir string, overwrite bool) error { var g errgroup.Group for _, image := range images { image := image g.Go(func() error { dst := filepath.Join(cacheDir, image) dst = localpath.SanitizeCacheDir(dst) - if err := saveToTarFile(image, dst); err != nil { + if err := saveToTarFile(image, dst, overwrite); err != nil { if err == errCacheImageDoesntExist { - out.WarningT("The image you are trying to add {{.imageName}} doesn't exist!", out.V{"imageName": image}) - } else { - return errors.Wrapf(err, "caching image %q", dst) + out.WarningT("The image '{{.imageName}}' was not found; unable to add it to cache.", out.V{"imageName": image}) + return nil } + return errors.Wrapf(err, "caching image %q", dst) } klog.Infof("save to tar file %s -> %s succeeded", image, dst) return nil @@ -90,7 +90,7 @@ func SaveToDir(images []string, cacheDir string) error { } // saveToTarFile caches an image -func saveToTarFile(iname, rawDest string) error { +func saveToTarFile(iname, rawDest string, overwrite bool) error { iname = normalizeTagName(iname) start := time.Now() defer func() { @@ -112,7 +112,7 @@ func saveToTarFile(iname, rawDest string) error { } defer releaser.Release() - if _, err := os.Stat(dst); err == nil { + if _, err := os.Stat(dst); !overwrite && err == nil { klog.Infof("%s exists", dst) return nil } diff --git a/pkg/minikube/image/image.go b/pkg/minikube/image/image.go index 7fc4f98373..7814ce9abd 100644 --- a/pkg/minikube/image/image.go +++ b/pkg/minikube/image/image.go @@ -21,14 +21,11 @@ import ( "fmt" "io/ioutil" "os" - "os/exec" - "path" "path/filepath" "runtime" "strings" "time" - "github.com/cheggaaa/pb/v3" "github.com/docker/docker/client" "github.com/google/go-containerregistry/pkg/authn" "github.com/google/go-containerregistry/pkg/name" @@ -36,13 +33,10 @@ import ( "github.com/google/go-containerregistry/pkg/v1/daemon" "github.com/google/go-containerregistry/pkg/v1/mutate" "github.com/google/go-containerregistry/pkg/v1/remote" - "github.com/google/go-containerregistry/pkg/v1/tarball" "github.com/pkg/errors" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/constants" - "k8s.io/minikube/pkg/minikube/driver" - "k8s.io/minikube/pkg/minikube/localpath" ) const ( @@ -107,64 +101,6 @@ func DigestByGoLib(imgName string) string { return cf.Hex } -// ExistsImageInCache if img exist in local cache directory -func ExistsImageInCache(img string) bool { - f := filepath.Join(constants.KICCacheDir, path.Base(img)+".tar") - f = localpath.SanitizeCacheDir(f) - - // Check if image exists locally - klog.Infof("Checking for %s in local cache directory", img) - if st, err := os.Stat(f); err == nil { - if st.Size() > 0 { - klog.Infof("Found %s in local cache directory, skipping pull", img) - return true - } - } - // Else, pull it - return false -} - -// ExistsImageInDaemon if img exist in local docker daemon -func ExistsImageInDaemon(img string) bool { - // Check if image exists locally - klog.Infof("Checking for %s in local docker daemon", img) - cmd := exec.Command("docker", "images", "--format", "{{.Repository}}:{{.Tag}}@{{.Digest}}") - if output, err := cmd.Output(); err == nil { - if strings.Contains(string(output), img) { - klog.Infof("Found %s in local docker daemon, skipping pull", img) - return true - } - } - // Else, pull it - return false -} - -// LoadFromTarball checks if the image exists as a tarball and tries to load it to the local daemon -// TODO: Pass in if we are loading to docker or podman so this function can also be used for podman -func LoadFromTarball(binary, img string) error { - p := filepath.Join(constants.ImageCacheDir, img) - p = localpath.SanitizeCacheDir(p) - - switch binary { - case driver.Podman: - return fmt.Errorf("not yet implemented, see issue #8426") - default: - tag, err := name.NewTag(Tag(img)) - if err != nil { - return errors.Wrap(err, "new tag") - } - - i, err := tarball.ImageFromPath(p, &tag) - if err != nil { - return errors.Wrap(err, "tarball") - } - - _, err = daemon.Write(tag, i) - return err - } - -} - // Tag returns just the image with the tag // eg image:tag@sha256:digest -> image:tag if there is an associated tag // if not possible, just return the initial img @@ -177,129 +113,6 @@ func Tag(img string) string { return img } -// WriteImageToCache write img to the local cache directory -func WriteImageToCache(img string) error { - f := filepath.Join(constants.KICCacheDir, path.Base(img)+".tar") - f = localpath.SanitizeCacheDir(f) - - if err := os.MkdirAll(filepath.Dir(f), 0777); err != nil { - return errors.Wrapf(err, "making cache image directory: %s", f) - } - - // buffered channel - c := make(chan v1.Update, 200) - - klog.Infof("Writing %s to local cache", img) - ref, err := name.ParseReference(img) - if err != nil { - return errors.Wrap(err, "parsing reference") - } - klog.V(3).Infof("Getting image %v", ref) - i, err := remote.Image(ref, remote.WithPlatform(defaultPlatform)) - if err != nil { - if strings.Contains(err.Error(), "GitHub Docker Registry needs login") { - ErrGithubNeedsLogin = errors.New(err.Error()) - return ErrGithubNeedsLogin - } else if strings.Contains(err.Error(), "UNAUTHORIZED") { - ErrNeedsLogin = errors.New(err.Error()) - return ErrNeedsLogin - } - - return errors.Wrap(err, "getting remote image") - } - klog.V(3).Infof("Writing image %v", ref) - errchan := make(chan error) - p := pb.Full.Start64(0) - fn := strings.Split(ref.Name(), "@")[0] - // abbreviate filename for progress - maxwidth := 30 - len("...") - if len(fn) > maxwidth { - fn = fn[0:maxwidth] + "..." - } - p.Set("prefix", " > "+fn+": ") - p.Set(pb.Bytes, true) - - // Just a hair less than 80 (standard terminal width) for aesthetics & pasting into docs - p.SetWidth(79) - - go func() { - err = tarball.WriteToFile(f, ref, i, tarball.WithProgress(c)) - errchan <- err - }() - var update v1.Update - for { - select { - case update = <-c: - p.SetCurrent(update.Complete) - p.SetTotal(update.Total) - case err = <-errchan: - p.Finish() - if err != nil { - return errors.Wrap(err, "writing tarball image") - } - return nil - } - } -} - -// WriteImageToDaemon write img to the local docker daemon -func WriteImageToDaemon(img string) error { - // buffered channel - c := make(chan v1.Update, 200) - - klog.Infof("Writing %s to local daemon", img) - ref, err := name.ParseReference(img) - if err != nil { - return errors.Wrap(err, "parsing reference") - } - klog.V(3).Infof("Getting image %v", ref) - i, err := remote.Image(ref, remote.WithPlatform(defaultPlatform)) - if err != nil { - if strings.Contains(err.Error(), "GitHub Docker Registry needs login") { - ErrGithubNeedsLogin = errors.New(err.Error()) - return ErrGithubNeedsLogin - } else if strings.Contains(err.Error(), "UNAUTHORIZED") { - ErrNeedsLogin = errors.New(err.Error()) - return ErrNeedsLogin - } - - return errors.Wrap(err, "getting remote image") - } - klog.V(3).Infof("Writing image %v", ref) - errchan := make(chan error) - p := pb.Full.Start64(0) - fn := strings.Split(ref.Name(), "@")[0] - // abbreviate filename for progress - maxwidth := 30 - len("...") - if len(fn) > maxwidth { - fn = fn[0:maxwidth] + "..." - } - p.Set("prefix", " > "+fn+": ") - p.Set(pb.Bytes, true) - - // Just a hair less than 80 (standard terminal width) for aesthetics & pasting into docs - p.SetWidth(79) - - go func() { - _, err = daemon.Write(ref, i, tarball.WithProgress(c)) - errchan <- err - }() - var update v1.Update - for { - select { - case update = <-c: - p.SetCurrent(update.Complete) - p.SetTotal(update.Total) - case err = <-errchan: - p.Finish() - if err != nil { - return errors.Wrap(err, "writing daemon image") - } - return nil - } - } -} - func canonicalName(ref name.Reference) string { cname := ref.Name() // go-containerregistry always uses the legacy index.docker.io registry diff --git a/pkg/minikube/machine/build_images.go b/pkg/minikube/machine/build_images.go index ed39b21779..3b7e4e82bb 100644 --- a/pkg/minikube/machine/build_images.go +++ b/pkg/minikube/machine/build_images.go @@ -153,6 +153,12 @@ func transferAndBuildImage(cr command.Runner, k8s config.KubernetesConfig, src s if err != nil { return errors.Wrapf(err, "creating copyable file asset: %s", filename) } + defer func() { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + }() + if err := cr.Copy(f); err != nil { return errors.Wrap(err, "transferring cached image") } diff --git a/pkg/minikube/machine/cache_binaries.go b/pkg/minikube/machine/cache_binaries.go index 3bb9d4d998..4356577e84 100644 --- a/pkg/minikube/machine/cache_binaries.go +++ b/pkg/minikube/machine/cache_binaries.go @@ -18,25 +18,42 @@ package machine import ( "path" - "runtime" "github.com/pkg/errors" "golang.org/x/sync/errgroup" + "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/assets" "k8s.io/minikube/pkg/minikube/bootstrapper" "k8s.io/minikube/pkg/minikube/command" + "k8s.io/minikube/pkg/minikube/detect" "k8s.io/minikube/pkg/minikube/download" ) +// isExcluded returns whether `binary` is expected to be excluded, based on `excludedBinaries`. +func isExcluded(binary string, excludedBinaries []string) bool { + if excludedBinaries == nil { + return false + } + for _, excludedBinary := range excludedBinaries { + if binary == excludedBinary { + return true + } + } + return false +} + // CacheBinariesForBootstrapper will cache binaries for a bootstrapper -func CacheBinariesForBootstrapper(version string, clusterBootstrapper string) error { +func CacheBinariesForBootstrapper(version string, clusterBootstrapper string, excludeBinaries []string) error { binaries := bootstrapper.GetCachedBinaryList(clusterBootstrapper) var g errgroup.Group for _, bin := range binaries { + if isExcluded(bin, excludeBinaries) { + continue + } bin := bin // https://golang.org/doc/faq#closures_and_goroutines g.Go(func() error { - if _, err := download.Binary(bin, version, "linux", runtime.GOARCH); err != nil { + if _, err := download.Binary(bin, version, "linux", detect.EffectiveArch()); err != nil { return errors.Wrapf(err, "caching binary %s", bin) } return nil @@ -51,6 +68,12 @@ func CopyBinary(cr command.Runner, src string, dest string) error { if err != nil { return errors.Wrap(err, "new file asset") } + defer func() { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + }() + if err := cr.Copy(f); err != nil { return errors.Wrapf(err, "copy") } diff --git a/pkg/minikube/machine/cache_binaries_test.go b/pkg/minikube/machine/cache_binaries_test.go index 6dcb091a65..994a2a868f 100644 --- a/pkg/minikube/machine/cache_binaries_test.go +++ b/pkg/minikube/machine/cache_binaries_test.go @@ -20,6 +20,7 @@ import ( "fmt" "io/ioutil" "os" + "strings" "testing" "k8s.io/minikube/pkg/minikube/assets" @@ -83,7 +84,7 @@ func TestCopyBinary(t *testing.T) { } func TestCacheBinariesForBootstrapper(t *testing.T) { - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock oldMinikubeHome := os.Getenv("MINIKUBE_HOME") defer os.Setenv("MINIKUBE_HOME", oldMinikubeHome) @@ -121,7 +122,7 @@ func TestCacheBinariesForBootstrapper(t *testing.T) { for _, test := range tc { t.Run(test.version, func(t *testing.T) { os.Setenv("MINIKUBE_HOME", test.minikubeHome) - err := CacheBinariesForBootstrapper(test.version, test.clusterBootstrapper) + err := CacheBinariesForBootstrapper(test.version, test.clusterBootstrapper, nil) if err != nil && !test.err { t.Fatalf("Got unexpected error %v", err) } @@ -131,3 +132,36 @@ func TestCacheBinariesForBootstrapper(t *testing.T) { }) } } + +func TestExcludedBinariesNotDownloaded(t *testing.T) { + clusterBootstrapper := bootstrapper.Kubeadm + binaryList := bootstrapper.GetCachedBinaryList(clusterBootstrapper) + binaryToExclude := binaryList[0] + + download.DownloadMock = func(src, dst string) error { + if strings.Contains(src, binaryToExclude) { + t.Errorf("Excluded binary was downloaded! Binary to exclude: %s", binaryToExclude) + } + return download.CreateDstDownloadMock(src, dst) + } + + oldMinikubeHome := os.Getenv("MINIKUBE_HOME") + defer os.Setenv("MINIKUBE_HOME", oldMinikubeHome) + + minikubeHome, err := ioutil.TempDir("/tmp", "") + if err != nil { + t.Fatalf("error during creating tmp dir: %v", err) + } + os.Setenv("MINIKUBE_HOME", minikubeHome) + + defer func() { // clean up tempdir + err := os.RemoveAll(minikubeHome) + if err != nil { + t.Errorf("failed to clean up temp folder %q", minikubeHome) + } + }() + + if err := CacheBinariesForBootstrapper("v1.16.0", clusterBootstrapper, []string{binaryToExclude}); err != nil { + t.Errorf("Failed to cache binaries: %v", err) + } +} diff --git a/pkg/minikube/machine/cache_images.go b/pkg/minikube/machine/cache_images.go index 9412dca1a6..36c2fe2ad4 100644 --- a/pkg/minikube/machine/cache_images.go +++ b/pkg/minikube/machine/cache_images.go @@ -55,7 +55,7 @@ func CacheImagesForBootstrapper(imageRepository string, version string, clusterB return errors.Wrap(err, "cached images list") } - if err := image.SaveToDir(images, constants.ImageCacheDir); err != nil { + if err := image.SaveToDir(images, constants.ImageCacheDir, false); err != nil { return errors.Wrapf(err, "Caching images for %s", clusterBootstrapper) } @@ -63,14 +63,14 @@ func CacheImagesForBootstrapper(imageRepository string, version string, clusterB } // LoadCachedImages loads previously cached images into the container runtime -func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, images []string, cacheDir string) error { +func LoadCachedImages(cc *config.ClusterConfig, runner command.Runner, images []string, cacheDir string, overwrite bool) error { cr, err := cruntime.New(cruntime.Config{Type: cc.KubernetesConfig.ContainerRuntime, Runner: runner}) if err != nil { return errors.Wrap(err, "runtime") } // Skip loading images if images already exist - if cr.ImagesPreloaded(images) { + if !overwrite && cr.ImagesPreloaded(images) { klog.Infof("Images are preloaded, skipping loading") return nil } @@ -165,7 +165,7 @@ func LoadLocalImages(cc *config.ClusterConfig, runner command.Runner, images []s for _, image := range images { image := image g.Go(func() error { - return transferAndLoadImage(runner, cc.KubernetesConfig, image) + return transferAndLoadImage(runner, cc.KubernetesConfig, image, image) }) } if err := g.Wait(); err != nil { @@ -176,21 +176,21 @@ func LoadLocalImages(cc *config.ClusterConfig, runner command.Runner, images []s } // CacheAndLoadImages caches and loads images to all profiles -func CacheAndLoadImages(images []string, profiles []*config.Profile) error { +func CacheAndLoadImages(images []string, profiles []*config.Profile, overwrite bool) error { if len(images) == 0 { return nil } // This is the most important thing - if err := image.SaveToDir(images, constants.ImageCacheDir); err != nil { + if err := image.SaveToDir(images, constants.ImageCacheDir, overwrite); err != nil { return errors.Wrap(err, "save to dir") } - return DoLoadImages(images, profiles, constants.ImageCacheDir) + return DoLoadImages(images, profiles, constants.ImageCacheDir, overwrite) } // DoLoadImages loads images to all profiles -func DoLoadImages(images []string, profiles []*config.Profile, cacheDir string) error { +func DoLoadImages(images []string, profiles []*config.Profile, cacheDir string, overwrite bool) error { api, err := NewAPIClient() if err != nil { return errors.Wrap(err, "api") @@ -234,7 +234,7 @@ func DoLoadImages(images []string, profiles []*config.Profile, cacheDir string) } if cacheDir != "" { // loading image names, from cache - err = LoadCachedImages(c, cr, images, cacheDir) + err = LoadCachedImages(c, cr, images, cacheDir, overwrite) } else { // loading image files err = LoadLocalImages(c, cr, images) @@ -259,25 +259,40 @@ func DoLoadImages(images []string, profiles []*config.Profile, cacheDir string) func transferAndLoadCachedImage(cr command.Runner, k8s config.KubernetesConfig, imgName string, cacheDir string) error { src := filepath.Join(cacheDir, imgName) src = localpath.SanitizeCacheDir(src) - return transferAndLoadImage(cr, k8s, src) + return transferAndLoadImage(cr, k8s, src, imgName) } // transferAndLoadImage transfers and loads a single image -func transferAndLoadImage(cr command.Runner, k8s config.KubernetesConfig, src string) error { +func transferAndLoadImage(cr command.Runner, k8s config.KubernetesConfig, src string, imgName string) error { r, err := cruntime.New(cruntime.Config{Type: k8s.ContainerRuntime, Runner: cr}) if err != nil { return errors.Wrap(err, "runtime") } + + if err := r.RemoveImage(imgName); err != nil { + errStr := strings.ToLower(err.Error()) + if !strings.Contains(errStr, "no such image") { + return errors.Wrap(err, "removing image") + } + } + klog.Infof("Loading image from: %s", src) filename := filepath.Base(src) if _, err := os.Stat(src); err != nil { return err } + dst := path.Join(loadRoot, filename) f, err := assets.NewFileAsset(src, loadRoot, filename, "0644") if err != nil { return errors.Wrapf(err, "creating copyable file asset: %s", filename) } + defer func() { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + }() + if err := cr.Copy(f); err != nil { return errors.Wrap(err, "transferring cached image") } diff --git a/pkg/minikube/machine/cluster_test.go b/pkg/minikube/machine/cluster_test.go index b33f8e65ff..c68f905821 100644 --- a/pkg/minikube/machine/cluster_test.go +++ b/pkg/minikube/machine/cluster_test.go @@ -75,7 +75,7 @@ func TestCreateHost(t *testing.T) { tempDir := tests.MakeTempDir() defer tests.RemoveTempDir(tempDir) - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock RegisterMockDriver(t) api := tests.NewMockAPI(t) @@ -123,7 +123,7 @@ func TestStartHostExists(t *testing.T) { tempDir := tests.MakeTempDir() defer tests.RemoveTempDir(tempDir) - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock RegisterMockDriver(t) api := tests.NewMockAPI(t) @@ -163,7 +163,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) { tempDir := tests.MakeTempDir() defer tests.RemoveTempDir(tempDir) - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock RegisterMockDriver(t) api := tests.NewMockAPI(t) @@ -213,7 +213,7 @@ func TestStartStoppedHost(t *testing.T) { tempDir := tests.MakeTempDir() defer tests.RemoveTempDir(tempDir) - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock RegisterMockDriver(t) api := tests.NewMockAPI(t) @@ -253,7 +253,7 @@ func TestStartHost(t *testing.T) { tempDir := tests.MakeTempDir() defer tests.RemoveTempDir(tempDir) - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock RegisterMockDriver(t) api := tests.NewMockAPI(t) @@ -286,7 +286,7 @@ func TestStartHostConfig(t *testing.T) { tempDir := tests.MakeTempDir() defer tests.RemoveTempDir(tempDir) - download.EnableMock(true) + download.DownloadMock = download.CreateDstDownloadMock RegisterMockDriver(t) api := tests.NewMockAPI(t) diff --git a/pkg/minikube/machine/filesync.go b/pkg/minikube/machine/filesync.go index dbc29a7780..cd4bfdaf26 100644 --- a/pkg/minikube/machine/filesync.go +++ b/pkg/minikube/machine/filesync.go @@ -43,6 +43,14 @@ var guaranteed = map[string]bool{ // syncLocalAssets syncs files from MINIKUBE_HOME into the cluster func syncLocalAssets(cr command.Runner) error { fs, err := localAssets() + defer func() { + for _, f := range fs { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + } + }() + if err != nil { return err } diff --git a/pkg/minikube/machine/ssh.go b/pkg/minikube/machine/ssh.go index f6b0534015..4f37487bbe 100644 --- a/pkg/minikube/machine/ssh.go +++ b/pkg/minikube/machine/ssh.go @@ -28,7 +28,8 @@ import ( "k8s.io/minikube/pkg/minikube/config" ) -func getHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host.Host, error) { +// GetHost find node's host information by name in the given cluster. +func GetHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host.Host, error) { machineName := config.MachineName(cc, n) host, err := LoadHost(api, machineName) if err != nil { @@ -49,7 +50,7 @@ func getHost(api libmachine.API, cc config.ClusterConfig, n config.Node) (*host. // CreateSSHShell creates a new SSH shell / client func CreateSSHShell(api libmachine.API, cc config.ClusterConfig, n config.Node, args []string, native bool) error { - host, err := getHost(api, cc, n) + host, err := GetHost(api, cc, n) if err != nil { return err } @@ -70,7 +71,7 @@ func CreateSSHShell(api libmachine.API, cc config.ClusterConfig, n config.Node, // GetSSHHostAddrPort returns the host address and port for ssh func GetSSHHostAddrPort(api libmachine.API, cc config.ClusterConfig, n config.Node) (string, int, error) { - host, err := getHost(api, cc, n) + host, err := GetHost(api, cc, n) if err != nil { return "", 0, err } diff --git a/pkg/minikube/node/advice.go b/pkg/minikube/node/advice.go index 79bae78c4f..2cf5b4ee4f 100644 --- a/pkg/minikube/node/advice.go +++ b/pkg/minikube/node/advice.go @@ -17,11 +17,13 @@ limitations under the License. package node import ( + "fmt" "runtime" "github.com/pkg/errors" "k8s.io/minikube/pkg/drivers/kic/oci" "k8s.io/minikube/pkg/minikube/bootstrapper/kubeadm" + "k8s.io/minikube/pkg/minikube/cruntime" "k8s.io/minikube/pkg/minikube/exit" "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/minikube/style" @@ -62,4 +64,14 @@ func ExitIfFatal(err error) { Advice: "Ensure that your Docker mountpoints do not have the 'noexec' flag set", }, "The kubeadm binary within the Docker container is not executable") } + + if rtErr, ok := err.(*cruntime.ErrServiceVersion); ok { + exit.Message(reason.Kind{ + ID: "PROVIDER_INVALID_VERSION", + ExitCode: reason.ExGuestConfig, + Style: style.Unsupported, + Advice: "Try to start minikube with '--delete-on-failure=true' option", + }, fmt.Sprintf("Your existing minikube instance has version %s of service %v which is too old. "+ + "Please try to start minikube with --delete-on-failure=true option", rtErr.Installed, rtErr.Service)) + } } diff --git a/pkg/minikube/node/cache.go b/pkg/minikube/node/cache.go index 3ab2f7a966..f68df47142 100644 --- a/pkg/minikube/node/cache.go +++ b/pkg/minikube/node/cache.go @@ -22,6 +22,8 @@ import ( "runtime" "strings" + "k8s.io/minikube/pkg/minikube/detect" + "github.com/pkg/errors" "github.com/spf13/viper" "golang.org/x/sync/errgroup" @@ -48,11 +50,11 @@ const ( ) // BeginCacheKubernetesImages caches images required for Kubernetes version in the background -func beginCacheKubernetesImages(g *errgroup.Group, imageRepository string, k8sVersion string, cRuntime string) { +func beginCacheKubernetesImages(g *errgroup.Group, imageRepository string, k8sVersion string, cRuntime string, driverName string) { // TODO: remove imageRepository check once #7695 is fixed - if imageRepository == "" && download.PreloadExists(k8sVersion, cRuntime) { + if imageRepository == "" && download.PreloadExists(k8sVersion, cRuntime, driverName) { klog.Info("Caching tarball of preloaded images") - err := download.Preload(k8sVersion, cRuntime) + err := download.Preload(k8sVersion, cRuntime, driverName) if err == nil { klog.Infof("Finished verifying existence of preloaded tar for %s on %s", k8sVersion, cRuntime) return // don't cache individual images if preload is successful. @@ -69,13 +71,13 @@ func beginCacheKubernetesImages(g *errgroup.Group, imageRepository string, k8sVe }) } -// HandleDownloadOnly caches appropariate binaries and images -func handleDownloadOnly(cacheGroup, kicGroup *errgroup.Group, k8sVersion string) { +// handleDownloadOnly caches appropariate binaries and images +func handleDownloadOnly(cacheGroup, kicGroup *errgroup.Group, k8sVersion, containerRuntime, driverName string) { // If --download-only, complete the remaining downloads and exit. if !viper.GetBool("download-only") { return } - if err := doCacheBinaries(k8sVersion); err != nil { + if err := doCacheBinaries(k8sVersion, containerRuntime, driverName); err != nil { exit.Error(reason.InetCacheBinaries, "Failed to cache binaries", err) } if _, err := CacheKubectlBinary(k8sVersion); err != nil { @@ -97,12 +99,16 @@ func CacheKubectlBinary(k8sVersion string) (string, error) { binary = "kubectl.exe" } - return download.Binary(binary, k8sVersion, runtime.GOOS, runtime.GOARCH) + return download.Binary(binary, k8sVersion, runtime.GOOS, detect.EffectiveArch()) } // doCacheBinaries caches Kubernetes binaries in the foreground -func doCacheBinaries(k8sVersion string) error { - return machine.CacheBinariesForBootstrapper(k8sVersion, viper.GetString(cmdcfg.Bootstrapper)) +func doCacheBinaries(k8sVersion, containerRuntime, driverName string) error { + existingBinaries := constants.KubernetesReleaseBinaries + if !download.PreloadExists(k8sVersion, containerRuntime, driverName) { + existingBinaries = nil + } + return machine.CacheBinariesForBootstrapper(k8sVersion, viper.GetString(cmdcfg.Bootstrapper), existingBinaries) } // beginDownloadKicBaseImage downloads the kic image @@ -114,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 @@ -127,38 +133,43 @@ func beginDownloadKicBaseImage(g *errgroup.Group, cc *config.ClusterConfig, down }() for _, img := range append([]string{baseImg}, kic.FallbackImages...) { var err error - if image.ExistsImageInCache(img) { - klog.Infof("%s exists in cache, skipping pull", img) - finalImg = img - } else { - klog.Infof("Downloading %s to local cache", img) - err = image.WriteImageToCache(img) - if err == nil { - klog.Infof("successfully saved %s as a tarball", img) + + if driver.IsDocker(cc.Driver) { + if download.ImageExistsInDaemon(img) { + klog.Infof("%s exists in daemon, skipping load", img) finalImg = img + return nil } } + + klog.Infof("Downloading %s to local cache", img) + err = download.ImageToCache(img) + if err == nil { + klog.Infof("successfully saved %s as a tarball", img) + finalImg = img + } if downloadOnly { return err } - if err := image.LoadFromTarball(cc.Driver, img); err == nil { - klog.Infof("successfully loaded %s from cached tarball", img) - // strip the digest from the img before saving it in the config - // because loading an image from tarball to daemon doesn't load the digest - finalImg = img - return nil + if cc.Driver == driver.Podman { + return fmt.Errorf("not yet implemented, see issue #8426") } - if driver.IsDocker(cc.Driver) { - if image.ExistsImageInDaemon(img) { - klog.Infof("%s exists in daemon, skipping pull", img) + klog.Infof("Loading %s from local cache", img) + err = download.CacheToDaemon(img) + if err == nil { + klog.Infof("successfully loaded %s from cached tarball", img) finalImg = img return nil } + } + + if driver.IsDocker(cc.Driver) { + klog.Infof("failed to load %s, will try remote image if available: %v", img, err) klog.Infof("Downloading %s to local daemon", img) - err = image.WriteImageToDaemon(img) + err = download.ImageToDaemon(img) if err == nil { klog.Infof("successfully downloaded %s", img) finalImg = img @@ -194,7 +205,7 @@ func waitDownloadKicBaseImage(g *errgroup.Group) { klog.Info("Successfully downloaded all kic artifacts") } -// WaitCacheRequiredImages blocks until the required images are all cached. +// waitCacheRequiredImages blocks until the required images are all cached. func waitCacheRequiredImages(g *errgroup.Group) { if !viper.GetBool(cacheImages) { return @@ -214,7 +225,7 @@ func saveImagesToTarFromConfig() error { if len(images) == 0 { return nil } - return image.SaveToDir(images, constants.ImageCacheDir) + return image.SaveToDir(images, constants.ImageCacheDir, false) } // CacheAndLoadImagesInConfig loads the images currently in the config file @@ -227,7 +238,7 @@ func CacheAndLoadImagesInConfig(profiles []*config.Profile) error { if len(images) == 0 { return nil } - return machine.CacheAndLoadImages(images, profiles) + return machine.CacheAndLoadImages(images, profiles, false) } func imagesInConfigFile() ([]string, error) { diff --git a/pkg/minikube/node/node.go b/pkg/minikube/node/node.go index 0a12a845e4..1e43133cf0 100644 --- a/pkg/minikube/node/node.go +++ b/pkg/minikube/node/node.go @@ -82,7 +82,7 @@ func Add(cc *config.ClusterConfig, n config.Node, delOnFail bool) error { // drainNode drains then deletes (removes) node from cluster. func drainNode(cc config.ClusterConfig, name string) (*config.Node, error) { - n, index, err := Retrieve(cc, name) + n, _, err := Retrieve(cc, name) if err != nil { return n, errors.Wrap(err, "retrieve") } @@ -130,8 +130,7 @@ func drainNode(cc config.ClusterConfig, name string) (*config.Node, error) { } klog.Infof("successfully deleted node %q", name) - cc.Nodes = append(cc.Nodes[:index], cc.Nodes[index+1:]...) - return n, config.SaveProfile(viper.GetString(config.ProfileName), &cc) + return n, nil } // Delete calls drainNode to remove node from cluster and deletes the host. @@ -152,7 +151,13 @@ func Delete(cc config.ClusterConfig, name string) (*config.Node, error) { return n, err } - return n, nil + _, index, err := Retrieve(cc, name) + if err != nil { + return n, errors.Wrap(err, "retrieve") + } + + cc.Nodes = append(cc.Nodes[:index], cc.Nodes[index+1:]...) + return n, config.SaveProfile(viper.GetString(config.ProfileName), &cc) } // Retrieve finds the node by name in the given cluster diff --git a/pkg/minikube/node/start.go b/pkg/minikube/node/start.go index e5ae1f56ff..6e1e435714 100644 --- a/pkg/minikube/node/start.go +++ b/pkg/minikube/node/start.go @@ -21,12 +21,14 @@ import ( "net" "os" "os/exec" + "path" + "regexp" "strconv" "strings" "sync" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/docker/machine/libmachine" "github.com/docker/machine/libmachine/host" "github.com/pkg/errors" @@ -59,7 +61,9 @@ import ( "k8s.io/minikube/pkg/minikube/out/register" "k8s.io/minikube/pkg/minikube/proxy" "k8s.io/minikube/pkg/minikube/reason" + "k8s.io/minikube/pkg/minikube/registry" "k8s.io/minikube/pkg/minikube/style" + "k8s.io/minikube/pkg/minikube/vmpath" "k8s.io/minikube/pkg/util" "k8s.io/minikube/pkg/util/retry" ) @@ -94,6 +98,12 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { // configure the runtime (docker, containerd, crio) cr := configureRuntimes(starter.Runner, *starter.Cfg, sv) + + // check if installed runtime is compatible with current minikube code + if err = cruntime.CheckCompatibility(cr); err != nil { + return nil, err + } + showVersionInfo(starter.Node.KubernetesVersion, cr) // Add "host.minikube.internal" DNS alias (intentionally non-fatal) @@ -131,6 +141,15 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { if err := kapi.ScaleDeployment(starter.Cfg.Name, meta.NamespaceSystem, kconst.CoreDNSDeploymentName, 1); err != nil { klog.Errorf("Unable to scale down deployment %q in namespace %q to 1 replica: %v", kconst.CoreDNSDeploymentName, meta.NamespaceSystem, err) } + + // not running this in a Go func can result in DNS answering taking up to 38 seconds, with the Go func it takes 6-10 seconds + go func() { + // inject {"host.minikube.internal": hostIP} record into CoreDNS + if err := addCoreDNSEntry(starter.Runner, "host.minikube.internal", hostIP.String(), *starter.Cfg); err != nil { + klog.Warningf("Unable to inject {%q: %s} record into CoreDNS: %v", "host.minikube.internal", hostIP.String(), err) + out.Err("Failed to inject host.minikube.internal into CoreDNS, this will limit the pods access to the host IP") + } + }() } else { bs, err = cluster.Bootstrapper(starter.MachineAPI, viper.GetString(cmdcfg.Bootstrapper), *starter.Cfg, starter.Runner) if err != nil { @@ -164,12 +183,18 @@ func Start(starter Starter, apiServer bool) (*kubeconfig.Settings, error) { }() // enable addons, both old and new! + addonList := viper.GetStringSlice(config.AddonListFlag) if starter.ExistingAddons != nil { if viper.GetBool("force") { addons.Force = true } wg.Add(1) - go addons.Start(&wg, starter.Cfg, starter.ExistingAddons, config.AddonList) + go addons.Start(&wg, starter.Cfg, starter.ExistingAddons, addonList) + } + + // discourage use of the virtualbox driver + if starter.Cfg.Driver == driver.VirtualBox && viper.GetBool(config.WantVirtualBoxDriverWarning) { + warnVirtualBox() } if apiServer { @@ -272,7 +297,7 @@ func Provision(cc *config.ClusterConfig, n *config.Node, apiServer bool, delOnFa } if !driver.BareMetal(cc.Driver) { - beginCacheKubernetesImages(&cacheGroup, cc.KubernetesConfig.ImageRepository, n.KubernetesVersion, cc.KubernetesConfig.ContainerRuntime) + beginCacheKubernetesImages(&cacheGroup, cc.KubernetesConfig.ImageRepository, n.KubernetesVersion, cc.KubernetesConfig.ContainerRuntime, cc.Driver) } // Abstraction leakage alert: startHost requires the config to be saved, to satistfy pkg/provision/buildroot. @@ -281,7 +306,7 @@ func Provision(cc *config.ClusterConfig, n *config.Node, apiServer bool, delOnFa return nil, false, nil, nil, errors.Wrap(err, "Failed to save config") } - handleDownloadOnly(&cacheGroup, &kicGroup, n.KubernetesVersion) + handleDownloadOnly(&cacheGroup, &kicGroup, n.KubernetesVersion, cc.KubernetesConfig.ContainerRuntime, cc.Driver) waitDownloadKicBaseImage(&kicGroup) return startMachine(cc, n, delOnFail) @@ -310,7 +335,7 @@ func configureRuntimes(runner cruntime.CommandRunner, cc config.ClusterConfig, k // Preload is overly invasive for bare metal, and caching is not meaningful. // KIC handles preload elsewhere. if driver.IsVM(cc.Driver) { - if err := cr.Preload(cc.KubernetesConfig); err != nil { + if err := cr.Preload(cc); err != nil { switch err.(type) { case *cruntime.ErrISOFeature: out.ErrT(style.Tip, "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'", out.V{"error": err}) @@ -340,7 +365,6 @@ func configureRuntimes(runner cruntime.CommandRunner, cc config.ClusterConfig, k if err != nil { exit.Error(reason.RuntimeEnable, "Failed to start container runtime", err) } - return cr } @@ -473,7 +497,7 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) if err != nil { return runner, preExists, m, host, errors.Wrap(err, "Failed to get machine client") } - host, preExists, err = startHost(m, cfg, node, delOnFail) + host, preExists, err = startHostInternal(m, cfg, node, delOnFail) if err != nil { return runner, preExists, m, host, errors.Wrap(err, "Failed to start host") } @@ -496,8 +520,8 @@ func startMachine(cfg *config.ClusterConfig, node *config.Node, delOnFail bool) return runner, preExists, m, host, err } -// startHost starts a new minikube host using a VM or None -func startHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node, delOnFail bool) (*host.Host, bool, error) { +// startHostInternal starts a new minikube host using a VM or None +func startHostInternal(api libmachine.API, cc *config.ClusterConfig, n *config.Node, delOnFail bool) (*host.Host, bool, error) { host, exists, err := machine.StartHost(api, cc, n) if err == nil { return host, exists, nil @@ -669,3 +693,72 @@ func prepareNone() { exit.Message(reason.HostHomeChown, "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}", out.V{"minikube_dir_path": localpath.MiniPath(), "error": err}) } } + +// addCoreDNSEntry adds host name and IP record to the DNS by updating CoreDNS's ConfigMap. +// ref: https://coredns.io/plugins/hosts/ +// note: there can be only one 'hosts' block in CoreDNS's ConfigMap (avoid "plugin/hosts: this plugin can only be used once per Server Block" error) +func addCoreDNSEntry(runner command.Runner, name, ip string, cc config.ClusterConfig) error { + kubectl := kapi.KubectlBinaryPath(cc.KubernetesConfig.KubernetesVersion) + kubecfg := path.Join(vmpath.GuestPersistentDir, "kubeconfig") + + // get current coredns configmap via kubectl + get := fmt.Sprintf("sudo %s --kubeconfig=%s -n kube-system get configmap coredns -o yaml", kubectl, kubecfg) + out, err := runner.RunCmd(exec.Command("/bin/bash", "-c", get)) + if err != nil { + klog.Errorf("failed to get current CoreDNS ConfigMap: %v", err) + return err + } + cm := strings.TrimSpace(out.Stdout.String()) + + // check if this specific host entry already exists in coredns configmap, so not to duplicate/override it + host := regexp.MustCompile(fmt.Sprintf(`(?smU)^ *hosts {.*%s.*}`, name)) + if host.MatchString(cm) { + klog.Infof("CoreDNS already contains %q host record, skipping...", name) + return nil + } + + // inject hosts block with host record into coredns configmap + sed := fmt.Sprintf("sed '/^ forward . \\/etc\\/resolv.conf.*/i \\ hosts {\\n %s %s\\n fallthrough\\n }'", ip, name) + // check if hosts block already exists in coredns configmap + hosts := regexp.MustCompile(`(?smU)^ *hosts {.*}`) + if hosts.MatchString(cm) { + // inject host record into existing coredns configmap hosts block instead + klog.Info("CoreDNS already contains hosts block, will inject host record there...") + sed = fmt.Sprintf("sed '/^ hosts {.*/a \\ %s %s'", ip, name) + } + + // replace coredns configmap via kubectl + replace := fmt.Sprintf("sudo %s --kubeconfig=%s replace -f -", kubectl, kubecfg) + if _, err := runner.RunCmd(exec.Command("/bin/bash", "-c", fmt.Sprintf("%s | %s | %s", get, sed, replace))); err != nil { + klog.Errorf("failed to inject {%q: %s} host record into CoreDNS", name, ip) + return err + } + klog.Infof("{%q: %s} host record injected into CoreDNS", name, ip) + + return nil +} + +// prints a warning to the console against the use of the 'virtualbox' driver, if alternatives are available and healthy +func warnVirtualBox() { + var altDriverList strings.Builder + for _, choice := range driver.Choices(true) { + if choice.Name != "virtualbox" && choice.Priority != registry.Discouraged && choice.State.Installed && choice.State.Healthy { + altDriverList.WriteString(fmt.Sprintf("\n\t- %s", choice.Name)) + } + } + + if altDriverList.Len() != 0 { + out.Boxed(`You have selected "virtualbox" driver, but there are better options ! +For better performance and support consider using a different driver: {{.drivers}} + +To turn off this warning run: + + $ minikube config set WantVirtualBoxDriverWarning false + + +To learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/ +To see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/ + +`, out.V{"drivers": altDriverList.String()}) + } +} diff --git a/pkg/minikube/notify/notify.go b/pkg/minikube/notify/notify.go index 7bb7de76d6..c993714814 100644 --- a/pkg/minikube/notify/notify.go +++ b/pkg/minikube/notify/notify.go @@ -25,7 +25,7 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/pkg/errors" "github.com/spf13/viper" "k8s.io/klog/v2" diff --git a/pkg/minikube/notify/notify_test.go b/pkg/minikube/notify/notify_test.go index 6c6363c57e..839e559a78 100644 --- a/pkg/minikube/notify/notify_test.go +++ b/pkg/minikube/notify/notify_test.go @@ -28,7 +28,7 @@ import ( "testing" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/spf13/viper" "k8s.io/minikube/pkg/minikube/config" "k8s.io/minikube/pkg/minikube/out" diff --git a/pkg/minikube/out/out.go b/pkg/minikube/out/out.go index 178c0e7d69..738864c068 100644 --- a/pkg/minikube/out/out.go +++ b/pkg/minikube/out/out.go @@ -32,7 +32,7 @@ import ( "github.com/Delta456/box-cli-maker/v2" "github.com/briandowns/spinner" - isatty "github.com/mattn/go-isatty" + "github.com/mattn/go-isatty" "k8s.io/klog/v2" "k8s.io/minikube/pkg/minikube/localpath" @@ -68,6 +68,8 @@ var ( JSON = false // spin is spinner showed at starting minikube spin = spinner.New(spinner.CharSets[style.SpinnerCharacter], 100*time.Millisecond) + // defaultBoxCfg is the default style config for cli box output + defaultBoxCfg = box.Config{Py: 1, Px: 4, Type: "Round", Color: "Red"} ) // MaxLogEntries controls the number of log entries to show for each source @@ -113,28 +115,33 @@ func Styled(st style.Enum, format string, a ...V) { } } -func boxedCommon(printFunc func(format string, a ...interface{}), format string, a ...V) { +func boxedCommon(printFunc func(format string, a ...interface{}), cfg box.Config, title string, format string, a ...V) { + box := box.New(cfg) + if !useColor { + box.Config.Color = "" + } str := Sprintf(style.None, format, a...) - str = strings.TrimSpace(str) - box := box.New(box.Config{Py: 1, Px: 4, Type: "Round"}) - if useColor { - box.Config.Color = "Red" - } - str = box.String("", str) - lines := strings.Split(str, "\n") - for _, line := range lines { - printFunc(line + "\n") - } + printFunc(box.String(title, strings.TrimSpace(str))) } -// Boxed writes a stylized and templated message in a box to stdout +// Boxed writes a stylized and templated message in a box to stdout using the default style config func Boxed(format string, a ...V) { - boxedCommon(String, format, a...) + boxedCommon(String, defaultBoxCfg, "", format, a...) } -// BoxedErr writes a stylized and templated message in a box to stderr +// BoxedErr writes a stylized and templated message in a box to stderr using the default style config func BoxedErr(format string, a ...V) { - boxedCommon(Err, format, a...) + boxedCommon(Err, defaultBoxCfg, "", format, a...) +} + +// BoxedWithConfig writes a templated message in a box with customized style config to stdout +func BoxedWithConfig(cfg box.Config, st style.Enum, title string, format string, a ...V) { + if st != style.None { + title = Sprintf(st, title) + } + // need to make sure no newlines are in the title otherwise box-cli-maker panics + title = strings.ReplaceAll(title, "\n", "") + boxedCommon(String, cfg, title, format, a...) } // Sprintf is used for returning the string (doesn't write anything) @@ -452,5 +459,8 @@ func applyTmpl(format string, a ...V) string { // Fmt applies formatting and translation func Fmt(format string, a ...V) string { format = translate.T(format) + if len(a) == 0 { + return format + } return applyTmpl(format, a...) } diff --git a/pkg/minikube/out/out_test.go b/pkg/minikube/out/out_test.go index 593222350a..ea0f729c8a 100644 --- a/pkg/minikube/out/out_test.go +++ b/pkg/minikube/out/out_test.go @@ -23,6 +23,8 @@ import ( "strconv" "testing" + "github.com/Delta456/box-cli-maker/v2" + "k8s.io/minikube/pkg/minikube/localpath" "k8s.io/minikube/pkg/minikube/style" "k8s.io/minikube/pkg/minikube/tests" @@ -162,3 +164,142 @@ func TestLatestLogPath(t *testing.T) { } } } + +func TestBoxed(t *testing.T) { + f := tests.NewFakeFile() + SetOutFile(f) + Boxed(`Running with {{.driver}} driver and port {{.port}}`, V{"driver": "docker", "port": 8000}) + got := f.String() + want := + `╭────────────────────────────────────────────────╮ +│ │ +│ Running with docker driver and port 8000 │ +│ │ +╰────────────────────────────────────────────────╯ +` + if got != want { + t.Errorf("Boxed() = %q, want %q", got, want) + } +} + +func TestBoxedErr(t *testing.T) { + f := tests.NewFakeFile() + SetErrFile(f) + BoxedErr(`Running with {{.driver}} driver and port {{.port}}`, V{"driver": "docker", "port": 8000}) + got := f.String() + want := + `╭────────────────────────────────────────────────╮ +│ │ +│ Running with docker driver and port 8000 │ +│ │ +╰────────────────────────────────────────────────╯ +` + if got != want { + t.Errorf("Boxed() = %q, want %q", got, want) + } +} + +func TestBoxedWithConfig(t *testing.T) { + testCases := []struct { + config box.Config + st style.Enum + title string + format string + args []V + want string + }{ + { + box.Config{Px: 2, Py: 2}, + style.None, + "", + "Boxed content", + nil, + `┌─────────────────┐ +│ │ +│ │ +│ Boxed content │ +│ │ +│ │ +└─────────────────┘ +`, + }, + { + box.Config{Px: 0, Py: 0}, + style.None, + "", + "Boxed content with 0 padding", + nil, + `┌────────────────────────────┐ +│Boxed content with 0 padding│ +└────────────────────────────┘ +`, + }, + { + box.Config{Px: 1, Py: 1, TitlePos: "Inside"}, + style.None, + "Hello World", + "Boxed content with title inside", + nil, + `┌─────────────────────────────────┐ +│ │ +│ Hello World │ +│ │ +│ Boxed content with title inside │ +│ │ +└─────────────────────────────────┘ +`, + }, + { + box.Config{Px: 1, Py: 1, TitlePos: "Top"}, + style.None, + "Hello World", + "Boxed content with title inside", + nil, + `┌ Hello World ────────────────────┐ +│ │ +│ Boxed content with title inside │ +│ │ +└─────────────────────────────────┘ +`, + }, + { + box.Config{Px: 1, Py: 1, TitlePos: "Top"}, + style.Tip, + "Hello World", + "Boxed content with title inside", + nil, + `┌ * Hello World ──────────────────┐ +│ │ +│ Boxed content with title inside │ +│ │ +└─────────────────────────────────┘ +`, + }, + { + box.Config{Px: 1, Py: 1, TitlePos: "Top"}, + style.Tip, + // This case is to make sure newlines (\n) are removed before printing + // Otherwise box-cli-maker panices: + // https://github.com/Delta456/box-cli-maker/blob/7b5a1ad8a016ce181e7d8b05e24b54ff60b4b38a/box.go#L69-L71 + "Hello \nWorld", + "Boxed content with title inside", + nil, + `┌ * Hello World ──────────────────┐ +│ │ +│ Boxed content with title inside │ +│ │ +└─────────────────────────────────┘ +`, + }, + } + + for _, tc := range testCases { + f := tests.NewFakeFile() + SetOutFile(f) + BoxedWithConfig(tc.config, tc.st, tc.title, tc.format, tc.args...) + got := f.String() + if tc.want != got { + t.Errorf("Expecting BoxedWithConfig(%v, %v, %s, %s, %s) = \n%s, want \n%s", tc.config, tc.st, tc.title, tc.format, tc.args, got, tc.want) + } + } +} diff --git a/pkg/minikube/reason/exitcodes.go b/pkg/minikube/reason/exitcodes.go index 2b5e807191..d776d76082 100644 --- a/pkg/minikube/reason/exitcodes.go +++ b/pkg/minikube/reason/exitcodes.go @@ -56,7 +56,6 @@ const ( // navailableOff = 9 // (~EX_UNAVAILABLE) // Error codes specific to the minikube program - ExProgramError = 10 // generic error ExProgramUsage = 14 // bad command-line options ExProgramConflict = 11 // can't do what you want because of existing data @@ -65,7 +64,6 @@ const ( ExProgramConfig = 18 // bad configuration specified // Error codes specific to resource limits (exit code layout follows no rules) - ExResourceError = 20 ExInsufficientMemory = 23 ExInsufficientStorage = 26 @@ -73,7 +71,6 @@ const ( ExInsufficientCores = 29 // Error codes specific to the host - ExHostError = 30 ExHostConflict = 31 ExHostTimeout = 32 @@ -84,7 +81,6 @@ const ( ExHostConfig = 38 // Error codes specific to remote networking - ExInternetError = 40 ExInternetConflict = 41 ExInternetTimeout = 42 @@ -93,7 +89,6 @@ const ( ExInternetUnavailable = 49 // Error codes specific to the libmachine driver - ExDriverError = 50 ExDriverConflict = 51 ExDriverTimeout = 52 @@ -105,7 +100,6 @@ const ( ExDriverUnavailable = 59 // Error codes specific to the driver provider - ExProviderError = 60 ExProviderConflict = 61 ExProviderTimeout = 62 @@ -120,7 +114,6 @@ const ( ExProviderUnavailable = 69 // In common use // Error codes specific to local networking - ExLocalNetworkError = 70 ExLocalNetworkConflict = 71 ExLocalNetworkTimeout = 72 @@ -130,7 +123,6 @@ const ( ExLocalNetworkUnavailable = 79 // Error codes specific to the guest host - ExGuestError = 80 ExGuestConflict = 81 ExGuestTimeout = 82 @@ -142,14 +134,12 @@ const ( ExGuestUnavailable = 89 // Error codes specific to the container runtime - ExRuntimeError = 90 ExRuntimeNotRunning = 93 ExRuntimeNotFound = 95 ExRuntimeUnavailable = 99 // Error codes specific to the Kubernetes control plane - ExControlPlaneError = 100 ExControlPlaneConflict = 101 ExControlPlaneTimeout = 102 @@ -160,7 +150,6 @@ const ( ExControlPlaneUnavailable = 109 // Error codes specific to a Kubernetes service - ExSvcError = 110 ExSvcConflict = 111 ExSvcTimeout = 112 diff --git a/pkg/minikube/reason/k8s.go b/pkg/minikube/reason/k8s.go index 8d6ff4ea9f..840403656f 100644 --- a/pkg/minikube/reason/k8s.go +++ b/pkg/minikube/reason/k8s.go @@ -16,7 +16,7 @@ limitations under the License. package reason -import "github.com/blang/semver" +import "github.com/blang/semver/v4" // K8sIssue represents a known issue with a particular version of Kubernetes type K8sIssue struct { @@ -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", @@ -41,9 +42,7 @@ var k8sIssues = []K8sIssue{ "1.20.4", "1.20.5", "1.20.6", - "1.20.7", "1.21.0", - "1.21.1", }, 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", diff --git a/pkg/minikube/reason/known_issues.go b/pkg/minikube/reason/known_issues.go index c053b72138..41bfe18d98 100644 --- a/pkg/minikube/reason/known_issues.go +++ b/pkg/minikube/reason/known_issues.go @@ -267,6 +267,15 @@ var providerIssues = []match{ GOOS: []string{"windows"}, Regexp: re(`docker:.*Mounts denied: EOF`), }, + { + Kind: Kind{ + ID: "PR_DOCKER_VER_UNSUPPORTED", + ExitCode: ExProviderError, + Advice: "Update Docker to the latest minor version, this version is unsupported", + Issues: []int{10362}, + }, + Regexp: re(`unexpected "=" in operand`), + }, // Hyperkit hypervisor { @@ -997,6 +1006,23 @@ var guestIssues = []match{ }, Regexp: re(`'/var/lib/dpkg': No such file or directory`), }, + { + Kind: Kind{ + ID: "GUEST_INCORRECT_ARCH", + ExitCode: ExGuestUnsupported, + Advice: "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead", + Issues: []int{10243}, + }, + Regexp: re(`qemu: uncaught target signal 11 (Segmentation fault) - core dumped`), + }, + { + Kind: Kind{ + ID: "GUEST_CNI_INCOMPATIBLE", + ExitCode: ExGuestUnsupported, + Advice: "Bridge CNI is incompatible with multi-node clusters, use a different CNI", + }, + Regexp: re(`bridge CNI is incompatible with multi-node clusters`), + }, { Kind: Kind{ ID: "GUEST_PROVISION_ACQUIRE_LOCK", @@ -1136,6 +1162,16 @@ var controlPlaneIssues = []match{ }, Regexp: re(`apiServer.certSANs: Invalid value`), }, + { + Kind: Kind{ + ID: "K8S_UNHEALTHY_CONTROL_PLANE", + ExitCode: ExControlPlaneTimeout, + Advice: "Control Plane could not update, try minikube delete --all --purge", + NewIssueLink: true, + Issues: []int{11417}, + }, + Regexp: re(`controlPlane never updated to`), + }, } // serviceIssues are issues with services running on top of Kubernetes diff --git a/pkg/minikube/reason/reason.go b/pkg/minikube/reason/reason.go index 6b02eb92f6..9b044e45b8 100644 --- a/pkg/minikube/reason/reason.go +++ b/pkg/minikube/reason/reason.go @@ -56,60 +56,96 @@ func (k *Kind) IssueURLs() []string { // Sections are ordered roughly by stack dependencies var ( - Usage = Kind{ID: "MK_USAGE", ExitCode: ExProgramUsage} + // minikube has been passed an incorrect parameter + Usage = Kind{ID: "MK_USAGE", ExitCode: ExProgramUsage} + // minikube has no current cluster running UsageNoProfileRunning = Kind{ID: "MK_USAGE_NO_PROFILE", ExitCode: ExProgramUsage, Advice: `You can create one using 'minikube start'. `, Style: style.Caching, } + // minikube was interrupted by an OS signal Interrupted = Kind{ID: "MK_INTERRUPTED", ExitCode: ExProgramConflict} + // 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} - WrongBinaryM1 = Kind{ID: "MK_WRONG_BINARY_M1", ExitCode: ExProgramUnsupported} - NewAPIClient = Kind{ID: "MK_NEW_APICLIENT", ExitCode: ExProgramError} - InternalAddonEnable = Kind{ID: "MK_ADDON_ENABLE", ExitCode: ExProgramError} - InternalAddConfig = Kind{ID: "MK_ADD_CONFIG", ExitCode: ExProgramError} - InternalBindFlags = Kind{ID: "MK_BIND_FLAGS", ExitCode: ExProgramError} - InternalBootstrapper = Kind{ID: "MK_BOOTSTRAPPER", ExitCode: ExProgramError} - InternalCacheList = Kind{ID: "MK_CACHE_LIST", ExitCode: ExProgramError} - InternalCacheLoad = Kind{ID: "MK_CACHE_LOAD", ExitCode: ExProgramError} - InternalCommandRunner = Kind{ID: "MK_COMMAND_RUNNER", ExitCode: ExProgramError} - InternalCompletion = Kind{ID: "MK_COMPLETION", ExitCode: ExProgramError} - InternalConfigSet = Kind{ID: "MK_CONFIG_SET", ExitCode: ExProgramError} - InternalConfigUnset = Kind{ID: "MK_CONFIG_UNSET", ExitCode: ExProgramError} - InternalConfigView = Kind{ID: "MK_CONFIG_VIEW", ExitCode: ExProgramError} - InternalDelConfig = Kind{ID: "MK_DEL_CONFIG", ExitCode: ExProgramError} - InternalDisable = Kind{ID: "MK_DISABLE", ExitCode: ExProgramError} - InternalDockerScript = Kind{ID: "MK_DOCKER_SCRIPT", ExitCode: ExProgramError} - InternalEnable = Kind{ID: "MK_ENABLE", ExitCode: ExProgramError} - InternalFlagsBind = Kind{ID: "MK_FLAGS_BIND", ExitCode: ExProgramError} - InternalFlagSet = Kind{ID: "MK_FLAGS_SET", ExitCode: ExProgramError} - InternalFormatUsage = Kind{ID: "MK_FORMAT_USAGE", ExitCode: ExProgramError} - InternalGenerateDocs = Kind{ID: "MK_GENERATE_DOCS", ExitCode: ExProgramError} - InternalJSONMarshal = Kind{ID: "MK_JSON_MARSHAL", ExitCode: ExProgramError} + // minikube failed to create a new Docker Machine api client + NewAPIClient = Kind{ID: "MK_NEW_APICLIENT", ExitCode: ExProgramError} + // 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} + // minikube failed to create a cluster bootstrapper + InternalBootstrapper = Kind{ID: "MK_BOOTSTRAPPER", ExitCode: ExProgramError} + // minikube failed to list cached images + InternalCacheList = Kind{ID: "MK_CACHE_LIST", ExitCode: ExProgramError} + // minkube failed to cache and load cached images + InternalCacheLoad = Kind{ID: "MK_CACHE_LOAD", ExitCode: ExProgramError} + // minikube failed to load a Docker Machine CommandRunner + InternalCommandRunner = Kind{ID: "MK_COMMAND_RUNNER", ExitCode: ExProgramError} + // minikube failed to generate shell command completion for a supported shell + InternalCompletion = Kind{ID: "MK_COMPLETION", ExitCode: ExProgramError} + // minikube failed to set an internal config value + InternalConfigSet = Kind{ID: "MK_CONFIG_SET", ExitCode: ExProgramError} + // minikube failed to unset an internal config value + InternalConfigUnset = Kind{ID: "MK_CONFIG_UNSET", ExitCode: ExProgramError} + // minikube failed to view current config values + 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 generate script to activate minikube docker-env + 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} + // 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 + InternalGenerateDocs = Kind{ID: "MK_GENERATE_DOCS", ExitCode: ExProgramError} + // minikube failed to marshal a JSON object + InternalJSONMarshal = Kind{ID: "MK_JSON_MARSHAL", ExitCode: ExProgramError} + // minikube failed to create a Kubernetes client set which is necessary for querying the Kubernetes API InternalKubernetesClient = Kind{ID: "MK_K8S_CLIENT", ExitCode: ExControlPlaneUnavailable} - InternalListConfig = Kind{ID: "MK_LIST_CONFIG", ExitCode: ExProgramError} - InternalLogtostderrFlag = Kind{ID: "MK_LOGTOSTDERR_FLAG", ExitCode: ExProgramError} - InternalLogFollow = Kind{ID: "MK_LOG_FOLLOW", ExitCode: ExProgramError} - InternalNewRuntime = Kind{ID: "MK_NEW_RUNTIME", ExitCode: ExProgramError} - InternalOutputUsage = Kind{ID: "MK_OUTPUT_USAGE", ExitCode: ExProgramError} - InternalRuntime = Kind{ID: "MK_RUNTIME", ExitCode: ExProgramError} - InternalReservedProfile = Kind{ID: "MK_RESERVED_PROFILE", ExitCode: ExProgramConflict} - InternalEnvScript = Kind{ID: "MK_ENV_SCRIPT", ExitCode: ExProgramError} - InternalShellDetect = Kind{ID: "MK_SHELL_DETECT", ExitCode: ExProgramError} - InternalStatusJSON = Kind{ID: "MK_STATUS_JSON", ExitCode: ExProgramError} - InternalStatusText = Kind{ID: "MK_STATUS_TEXT", ExitCode: ExProgramError} - InternalUnsetScript = Kind{ID: "MK_UNSET_SCRIPT", ExitCode: ExProgramError} - InternalViewExec = Kind{ID: "MK_VIEW_EXEC", ExitCode: ExProgramError} - InternalViewTmpl = Kind{ID: "MK_VIEW_TMPL", ExitCode: ExProgramError} - InternalYamlMarshal = Kind{ID: "MK_YAML_MARSHAL", ExitCode: ExProgramError} - InternalCredsNotFound = Kind{ID: "MK_CREDENTIALS_NOT_FOUND", ExitCode: ExProgramNotFound, Style: style.Shrug} - InternalCredsNotNeeded = Kind{ID: "MK_CREDENTIALS_NOT_NEEDED", ExitCode: ExProgramNotFound, Style: style.Shrug} - InternalSemverParse = Kind{ID: "MK_SEMVER_PARSE", ExitCode: ExProgramError} - DaemonizeError = Kind{ID: "MK_DAEMONIZE", ExitCode: ExProgramError} + // minikube failed to list some configuration data + InternalListConfig = Kind{ID: "MK_LIST_CONFIG", 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 + InternalNewRuntime = Kind{ID: "MK_NEW_RUNTIME", ExitCode: ExProgramError} + // minikube was passed an invalid value for the --output command line flag + InternalOutputUsage = Kind{ID: "MK_OUTPUT_USAGE", ExitCode: ExProgramError} + // minikube could not configure the runtime in use, or the runtime failed + InternalRuntime = Kind{ID: "MK_RUNTIME", ExitCode: ExProgramError} + // minikube was passed a reserved keyword as a profile name, which is not allowed + InternalReservedProfile = Kind{ID: "MK_RESERVED_PROFILE", ExitCode: ExProgramConflict} + // minkube failed to generate script to set or unset minikube-env + InternalEnvScript = Kind{ID: "MK_ENV_SCRIPT", ExitCode: ExProgramError} + // minikube failed to detect the shell in use + InternalShellDetect = Kind{ID: "MK_SHELL_DETECT", ExitCode: ExProgramError} + // minikube failed to output JSON-formatted minikube status + 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 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 + InternalViewTmpl = Kind{ID: "MK_VIEW_TMPL", ExitCode: ExProgramError} + // minikube failed to marshal a YAML object + InternalYamlMarshal = Kind{ID: "MK_YAML_MARSHAL", ExitCode: ExProgramError} + // minikube could not locate credentials needed to utilize an appropriate service, e.g. GCP + InternalCredsNotFound = Kind{ID: "MK_CREDENTIALS_NOT_FOUND", ExitCode: ExProgramNotFound, Style: style.Shrug} + // minikube was passed service credentials when they were not needed, such as when using the GCP Auth addon when running in GCE + InternalCredsNotNeeded = Kind{ID: "MK_CREDENTIALS_NOT_NEEDED", ExitCode: ExProgramNotFound, Style: style.Shrug} + // minikube found an invalid semver string for kubernetes in the minikube constants + InternalSemverParse = Kind{ID: "MK_SEMVER_PARSE", ExitCode: ExProgramError} + // minikube was unable to daemonize the minikube process + DaemonizeError = Kind{ID: "MK_DAEMONIZE", ExitCode: ExProgramError} - RsrcInsufficientCores = Kind{ID: "RSRC_INSUFFICIENT_CORES", ExitCode: ExInsufficientCores, Style: style.UnmetRequirement} + // insufficient cores available for use by minikube and kubernetes + RsrcInsufficientCores = Kind{ID: "RSRC_INSUFFICIENT_CORES", ExitCode: ExInsufficientCores, Style: style.UnmetRequirement} + // insufficient cores available for use by Docker Desktop on Mac RsrcInsufficientDarwinDockerCores = Kind{ ID: "RSRC_DOCKER_CORES", ExitCode: ExInsufficientCores, @@ -122,6 +158,7 @@ var ( URL: "https://docs.docker.com/docker-for-mac/#resources", } + // insufficient cores available for use by Docker Desktop on Windows RsrcInsufficientWindowsDockerCores = Kind{ ID: "RSRC_DOCKER_CORES", ExitCode: ExInsufficientCores, @@ -134,9 +171,13 @@ var ( Style: style.UnmetRequirement, } - RsrcInsufficientReqMemory = Kind{ID: "RSRC_INSUFFICIENT_REQ_MEMORY", ExitCode: ExInsufficientMemory, Style: style.UnmetRequirement} - RsrcInsufficientSysMemory = Kind{ID: "RSRC_INSUFFICIENT_SYS_MEMORY", ExitCode: ExInsufficientMemory, Style: style.UnmetRequirement} - RsrcInsufficientContainerMemory = Kind{ID: "RSRC_INSUFFICIENT_CONTAINER_MEMORY", ExitCode: ExInsufficientMemory, Style: style.UnmetRequirement} + // insufficient memory (less than the recommended minimum) allocated to minikube + RsrcInsufficientReqMemory = Kind{ID: "RSRC_INSUFFICIENT_REQ_MEMORY", ExitCode: ExInsufficientMemory, Style: style.UnmetRequirement} + // insufficient memory (less than the recommended minimum) available on the system running minikube + RsrcInsufficientSysMemory = Kind{ID: "RSRC_INSUFFICIENT_SYS_MEMORY", ExitCode: ExInsufficientMemory, Style: style.UnmetRequirement} + // insufficient memory available for the driver in use by minikube + RsrcInsufficientContainerMemory = Kind{ID: "RSRC_INSUFFICIENT_CONTAINER_MEMORY", ExitCode: ExInsufficientMemory, Style: style.UnmetRequirement} + // insufficient memory available to Docker Desktop on Windows RsrcInsufficientWindowsDockerMemory = Kind{ ID: "RSRC_DOCKER_MEMORY", ExitCode: ExInsufficientMemory, @@ -148,6 +189,7 @@ var ( URL: "https://docs.docker.com/docker-for-windows/#resources", Style: style.UnmetRequirement, } + // insufficient memory available to Docker Desktop on Mac RsrcInsufficientDarwinDockerMemory = Kind{ ID: "RSRC_DOCKER_MEMORY", ExitCode: ExInsufficientMemory, @@ -160,6 +202,7 @@ var ( URL: "https://docs.docker.com/docker-for-mac/#resources", } + // insufficient disk storage available to the docker driver RsrcInsufficientDockerStorage = Kind{ ID: "RSRC_DOCKER_STORAGE", ExitCode: ExInsufficientStorage, @@ -171,6 +214,7 @@ var ( 3. Run "minikube ssh -- docker system prune" if using the Docker container runtime`, Issues: []int{9024}, } + // insufficient disk storage available to the podman driver RsrcInsufficientPodmanStorage = Kind{ ID: "RSRC_PODMAN_STORAGE", ExitCode: ExInsufficientStorage, @@ -181,12 +225,18 @@ var ( Issues: []int{9024}, } + // insufficient disk storage available for running minikube and kubernetes RsrcInsufficientStorage = Kind{ID: "RSRC_INSUFFICIENT_STORAGE", ExitCode: ExInsufficientStorage, Style: style.UnmetRequirement} - HostHomeMkdir = Kind{ID: "HOST_HOME_MKDIR", ExitCode: ExHostPermission} - HostHomeChown = Kind{ID: "HOST_HOME_CHOWN", ExitCode: ExHostPermission} - HostBrowser = Kind{ID: "HOST_BROWSER", ExitCode: ExHostError} - HostConfigLoad = Kind{ID: "HOST_CONFIG_LOAD", ExitCode: ExHostConfig} + // minikube could not create the minikube directory + HostHomeMkdir = Kind{ID: "HOST_HOME_MKDIR", ExitCode: ExHostPermission} + // minikube could not change permissions for the minikube directory + HostHomeChown = Kind{ID: "HOST_HOME_CHOWN", ExitCode: ExHostPermission} + // minikube failed to open the host browser, such as when running minikube dashboard + HostBrowser = Kind{ID: "HOST_BROWSER", ExitCode: ExHostError} + // minikube failed to load cluster config from the host for the profile in use + HostConfigLoad = Kind{ID: "HOST_CONFIG_LOAD", ExitCode: ExHostConfig} + // the current user has insufficient permissions to create the minikube profile directory HostHomePermission = Kind{ ID: "HOST_HOME_PERMISSION", ExitCode: ExHostPermission, @@ -194,22 +244,35 @@ var ( Issues: []int{9165}, } - HostCurrentUser = Kind{ID: "HOST_CURRENT_USER", ExitCode: ExHostConfig} - HostDelCache = Kind{ID: "HOST_DEL_CACHE", ExitCode: ExHostError} - HostKillMountProc = Kind{ID: "HOST_KILL_MOUNT_PROC", ExitCode: ExHostError} - HostKubeconfigUnset = Kind{ID: "HOST_KUBECNOFIG_UNSET", ExitCode: ExHostConfig} - HostKubeconfigUpdate = Kind{ID: "HOST_KUBECONFIG_UPDATE", ExitCode: ExHostConfig} + // minikube failed to determine current user + HostCurrentUser = Kind{ID: "HOST_CURRENT_USER", ExitCode: ExHostConfig} + // minikube failed to delete cached images from host + 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 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 HostKubeconfigDeleteCtx = Kind{ID: "HOST_KUBECONFIG_DELETE_CTX", ExitCode: ExHostConfig} - HostKubectlProxy = Kind{ID: "HOST_KUBECTL_PROXY", ExitCode: ExHostError} - HostMountPid = Kind{ID: "HOST_MOUNT_PID", ExitCode: ExHostError} - HostPathMissing = Kind{ID: "HOST_PATH_MISSING", ExitCode: ExHostNotFound} - HostPathStat = Kind{ID: "HOST_PATH_STAT", ExitCode: ExHostError} - HostPurge = Kind{ID: "HOST_PURGE", ExitCode: ExHostError} - HostSaveProfile = Kind{ID: "HOST_SAVE_PROFILE", ExitCode: ExHostConfig} + // minikube failed to launch a kubectl proxy + HostKubectlProxy = Kind{ID: "HOST_KUBECTL_PROXY", ExitCode: ExHostError} + // minikube failed to write mount pid + HostMountPid = Kind{ID: "HOST_MOUNT_PID", ExitCode: ExHostError} + // minikube was passed a path to a host directory that does not exist + HostPathMissing = Kind{ID: "HOST_PATH_MISSING", ExitCode: ExHostNotFound} + // minikube failed to access info for a directory path + HostPathStat = Kind{ID: "HOST_PATH_STAT", ExitCode: ExHostError} + // minikube failed to purge minikube config directories + HostPurge = Kind{ID: "HOST_PURGE", ExitCode: ExHostError} + // minikube failed to persist profile config + HostSaveProfile = Kind{ID: "HOST_SAVE_PROFILE", ExitCode: ExHostConfig} - ProviderNotFound = Kind{ID: "PROVIDER_NOT_FOUND", ExitCode: ExProviderNotFound} + // minikube could not find a provider for the selected driver + ProviderNotFound = Kind{ID: "PROVIDER_NOT_FOUND", ExitCode: ExProviderNotFound} + // the host does not support or is improperly configured to support a provider for the selected driver ProviderUnavailable = Kind{ID: "PROVIDER_UNAVAILABLE", ExitCode: ExProviderNotFound, Style: style.Shrug} + // minikube failed to access the driver control plane or API endpoint DrvCPEndpoint = Kind{ID: "DRV_CP_ENDPOINT", Advice: `Recreate the cluster by running: minikube delete {{.profileArg}} @@ -217,81 +280,155 @@ var ( ExitCode: ExDriverError, Style: style.Failure, } - DrvPortForward = Kind{ID: "DRV_PORT_FORWARD", ExitCode: ExDriverError} - DrvUnsupportedMulti = Kind{ID: "DRV_UNSUPPORTED_MULTINODE", ExitCode: ExDriverConflict} - DrvUnsupportedOS = Kind{ID: "DRV_UNSUPPORTED_OS", ExitCode: ExDriverUnsupported} + // minikube failed to bind container ports to host ports + DrvPortForward = Kind{ID: "DRV_PORT_FORWARD", ExitCode: ExDriverError} + // the driver in use does not support multi-node clusters + DrvUnsupportedMulti = Kind{ID: "DRV_UNSUPPORTED_MULTINODE", ExitCode: ExDriverConflict} + // the specified driver is not supported on the host OS + DrvUnsupportedOS = Kind{ID: "DRV_UNSUPPORTED_OS", ExitCode: ExDriverUnsupported} + // the driver in use does not support the selected profile or multiple profiles DrvUnsupportedProfile = Kind{ID: "DRV_UNSUPPORTED_PROFILE", ExitCode: ExDriverUnsupported} - DrvNotFound = Kind{ID: "DRV_NOT_FOUND", ExitCode: ExDriverNotFound} - DrvNotDetected = Kind{ID: "DRV_NOT_DETECTED", ExitCode: ExDriverNotFound} - DrvAsRoot = Kind{ID: "DRV_AS_ROOT", ExitCode: ExDriverPermission} - DrvNeedsRoot = Kind{ID: "DRV_NEEDS_ROOT", ExitCode: ExDriverPermission} - DrvNeedsAdministrator = Kind{ID: "DRV_NEEDS_ADMINISTRATOR", ExitCode: ExDriverPermission} + // minikube failed to locate specified driver + DrvNotFound = Kind{ID: "DRV_NOT_FOUND", ExitCode: ExDriverNotFound} + // minikube could not find a valid driver + DrvNotDetected = Kind{ID: "DRV_NOT_DETECTED", ExitCode: ExDriverNotFound} + // minikube found drivers but none were ready to use + DrvNotHealthy = Kind{ID: "DRV_NOT_HEALTHY", ExitCode: ExDriverNotFound} + // minikube found the docker driver but the docker service was not running + DrvDockerNotRunning = Kind{ID: "DRV_DOCKER_NOT_RUNNING", ExitCode: ExDriverNotFound} + // the driver in use is being run as root + 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} - GuestCacheLoad = Kind{ID: "GUEST_CACHE_LOAD", ExitCode: ExGuestError} - GuestCert = Kind{ID: "GUEST_CERT", ExitCode: ExGuestError} - GuestCpConfig = Kind{ID: "GUEST_CP_CONFIG", ExitCode: ExGuestConfig} - GuestDeletion = Kind{ID: "GUEST_DELETION", ExitCode: ExGuestError} - GuestImageList = Kind{ID: "GUEST_IMAGE_LIST", ExitCode: ExGuestError} - GuestImageLoad = Kind{ID: "GUEST_IMAGE_LOAD", ExitCode: ExGuestError} - GuestImageRemove = Kind{ID: "GUEST_IMAGE_REMOVE", ExitCode: ExGuestError} - GuestImageBuild = Kind{ID: "GUEST_IMAGE_BUILD", ExitCode: ExGuestError} - GuestLoadHost = Kind{ID: "GUEST_LOAD_HOST", ExitCode: ExGuestError} - GuestMount = Kind{ID: "GUEST_MOUNT", ExitCode: ExGuestError} - GuestMountConflict = Kind{ID: "GUEST_MOUNT_CONFLICT", ExitCode: ExGuestConflict} - GuestNodeAdd = Kind{ID: "GUEST_NODE_ADD", ExitCode: ExGuestError} - GuestNodeDelete = Kind{ID: "GUEST_NODE_DELETE", ExitCode: ExGuestError} - GuestNodeProvision = Kind{ID: "GUEST_NODE_PROVISION", ExitCode: ExGuestError} - GuestNodeRetrieve = Kind{ID: "GUEST_NODE_RETRIEVE", ExitCode: ExGuestNotFound} - GuestNodeStart = Kind{ID: "GUEST_NODE_START", ExitCode: ExGuestError} - GuestPause = Kind{ID: "GUEST_PAUSE", ExitCode: ExGuestError} - GuestProfileDeletion = Kind{ID: "GUEST_PROFILE_DELETION", ExitCode: ExGuestError} - GuestProvision = Kind{ID: "GUEST_PROVISION", ExitCode: ExGuestError} - GuestStart = Kind{ID: "GUEST_START", ExitCode: ExGuestError} - GuestStatus = Kind{ID: "GUEST_STATUS", ExitCode: ExGuestError} - GuestStopTimeout = Kind{ID: "GUEST_STOP_TIMEOUT", ExitCode: ExGuestTimeout} - GuestUnpause = Kind{ID: "GUEST_UNPAUSE", ExitCode: ExGuestError} - GuestCheckPaused = Kind{ID: "GUEST_CHECK_PAUSED", ExitCode: ExGuestError} - GuestDrvMismatch = Kind{ID: "GUEST_DRIVER_MISMATCH", ExitCode: ExGuestConflict, Style: style.Conflict} + // minikube failed to load cached images + GuestCacheLoad = Kind{ID: "GUEST_CACHE_LOAD", ExitCode: ExGuestError} + // minikube failed to setup certificates + GuestCert = Kind{ID: "GUEST_CERT", ExitCode: ExGuestError} + // minikube failed to access the control plane + GuestCpConfig = Kind{ID: "GUEST_CP_CONFIG", ExitCode: ExGuestConfig} + // minikube failed to properly delete a resource, such as a profile + GuestDeletion = Kind{ID: "GUEST_DELETION", ExitCode: ExGuestError} + // minikube failed to list images on the machine + GuestImageList = Kind{ID: "GUEST_IMAGE_LIST", ExitCode: ExGuestError} + // minikube failed to pull or load an image + GuestImageLoad = Kind{ID: "GUEST_IMAGE_LOAD", ExitCode: ExGuestError} + // minikube failed to remove an image + GuestImageRemove = Kind{ID: "GUEST_IMAGE_REMOVE", ExitCode: ExGuestError} + // minikube failed to build an image + GuestImageBuild = Kind{ID: "GUEST_IMAGE_BUILD", ExitCode: ExGuestError} + // minikube failed to load host + GuestLoadHost = Kind{ID: "GUEST_LOAD_HOST", ExitCode: ExGuestError} + // minkube failed to create a mount + GuestMount = Kind{ID: "GUEST_MOUNT", ExitCode: ExGuestError} + // mount on guest was unable to connect to host mount server + GuestMountCouldNotConnect = Kind{ + ID: "GUEST_MOUNT_COULD_NOT_CONNECT", + ExitCode: ExGuestError, + Advice: `If the host has a firewall: + + 1. Allow a port through the firewall + 2. Specify "--port=" for "minikube mount"`, + } + // minkube failed to update a mount + GuestMountConflict = Kind{ID: "GUEST_MOUNT_CONFLICT", ExitCode: ExGuestConflict} + // minikube failed to add a node to the cluster + GuestNodeAdd = Kind{ID: "GUEST_NODE_ADD", ExitCode: ExGuestError} + // minikube failed to remove a node from the cluster + GuestNodeDelete = Kind{ID: "GUEST_NODE_DELETE", ExitCode: ExGuestError} + // minikube failed to provision a node + GuestNodeProvision = Kind{ID: "GUEST_NODE_PROVISION", ExitCode: ExGuestError} + // minikube failed to retrieve information for a cluster node + GuestNodeRetrieve = Kind{ID: "GUEST_NODE_RETRIEVE", ExitCode: ExGuestNotFound} + // minikube failed to startup a cluster node + GuestNodeStart = Kind{ID: "GUEST_NODE_START", ExitCode: ExGuestError} + // minikube failed to pause the cluster process + GuestPause = Kind{ID: "GUEST_PAUSE", ExitCode: ExGuestError} + // minikube failed to delete a machine profile directory + GuestProfileDeletion = Kind{ID: "GUEST_PROFILE_DELETION", ExitCode: ExGuestError} + // minikube failed while attempting to provision the guest + GuestProvision = Kind{ID: "GUEST_PROVISION", ExitCode: ExGuestError} + // docker container exited prematurely during provisioning + GuestProvisionContainerExited = Kind{ID: "GUEST_PROVISION_CONTAINER_EXITED", ExitCode: ExGuestError} + // minikube failed to start a node with current driver + GuestStart = Kind{ID: "GUEST_START", ExitCode: ExGuestError} + // minikube failed to get docker machine status + GuestStatus = Kind{ID: "GUEST_STATUS", ExitCode: ExGuestError} + // stopping the cluster process timed out + GuestStopTimeout = Kind{ID: "GUEST_STOP_TIMEOUT", ExitCode: ExGuestTimeout} + // minikube failed to unpause the cluster process + GuestUnpause = Kind{ID: "GUEST_UNPAUSE", ExitCode: ExGuestError} + // minikube failed to check if Kubernetes containers are paused + GuestCheckPaused = Kind{ID: "GUEST_CHECK_PAUSED", ExitCode: ExGuestError} + // minikube cluster was created used a driver that is incompatible with the driver being requested + GuestDrvMismatch = Kind{ID: "GUEST_DRIVER_MISMATCH", ExitCode: ExGuestConflict, Style: style.Conflict} + // minikube could not find conntrack on the host, which is required from Kubernetes 1.18 onwards GuestMissingConntrack = Kind{ID: "GUEST_MISSING_CONNTRACK", ExitCode: ExGuestUnsupported} - IfHostIP = Kind{ID: "IF_HOST_IP", ExitCode: ExLocalNetworkError} - IfMountIP = Kind{ID: "IF_MOUNT_IP", ExitCode: ExLocalNetworkError} + // minikube failed to get the host IP to use from within the VM + IfHostIP = Kind{ID: "IF_HOST_IP", ExitCode: ExLocalNetworkError} + // minikube failed to parse the input IP address for mount + IfMountIP = Kind{ID: "IF_MOUNT_IP", ExitCode: ExLocalNetworkError} + // minikube failed to parse or find port for mount IfMountPort = Kind{ID: "IF_MOUNT_PORT", ExitCode: ExLocalNetworkError} + // minikube failed to access an ssh client on the host machine IfSSHClient = Kind{ID: "IF_SSH_CLIENT", ExitCode: ExLocalNetworkError} - InetCacheBinaries = Kind{ID: "INET_CACHE_BINARIES", ExitCode: ExInternetError} - InetCacheKubectl = Kind{ID: "INET_CACHE_KUBECTL", ExitCode: ExInternetError} - InetCacheTar = Kind{ID: "INET_CACHE_TAR", ExitCode: ExInternetError} - InetGetVersions = Kind{ID: "INET_GET_VERSIONS", ExitCode: ExInternetError} - InetRepo = Kind{ID: "INET_REPO", ExitCode: ExInternetError} - InetReposUnavailable = Kind{ID: "INET_REPOS_UNAVAILABLE", ExitCode: ExInternetError} + // minikube failed to cache kubernetes binaries for the current runtime + InetCacheBinaries = Kind{ID: "INET_CACHE_BINARIES", ExitCode: ExInternetError} + // minikube failed to cache the kubectl binary + 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 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 + InetReposUnavailable = Kind{ID: "INET_REPOS_UNAVAILABLE", ExitCode: ExInternetError} + // minikube was unable to fetch latest release/version info for minkikube InetVersionUnavailable = Kind{ID: "INET_VERSION_UNAVAILABLE", ExitCode: ExInternetUnavailable} - InetVersionEmpty = Kind{ID: "INET_VERSION_EMPTY", ExitCode: ExInternetConfig} + // minikube received invalid empty data for latest release/version info from the server + InetVersionEmpty = Kind{ID: "INET_VERSION_EMPTY", ExitCode: ExInternetConfig} - RuntimeEnable = Kind{ID: "RUNTIME_ENABLE", ExitCode: ExRuntimeError} - RuntimeCache = Kind{ID: "RUNTIME_CACHE", ExitCode: ExRuntimeError} - RuntimeRestart = Kind{ID: "RUNTIME_RESTART", ExitCode: ExRuntimeError} + // minikube failed to enable the current container runtime + RuntimeEnable = Kind{ID: "RUNTIME_ENABLE", ExitCode: ExRuntimeError} + // minikube failed to cache images for the current container runtime + RuntimeCache = Kind{ID: "RUNTIME_CACHE", ExitCode: ExRuntimeError} + // service check timed out while starting minikube dashboard SvcCheckTimeout = Kind{ID: "SVC_CHECK_TIMEOUT", ExitCode: ExSvcTimeout} - SvcTimeout = Kind{ID: "SVC_TIMEOUT", ExitCode: ExSvcTimeout} - SvcList = Kind{ID: "SVC_LIST", ExitCode: ExSvcError} - SvcTunnelStart = Kind{ID: "SVC_TUNNEL_START", ExitCode: ExSvcError} - SvcTunnelStop = Kind{ID: "SVC_TUNNEL_STOP", ExitCode: ExSvcError} - SvcURLTimeout = Kind{ID: "SVC_URL_TIMEOUT", ExitCode: ExSvcTimeout} - SvcNotFound = Kind{ID: "SVC_NOT_FOUND", ExitCode: ExSvcNotFound} + // minikube was unable to access a service + SvcTimeout = Kind{ID: "SVC_TIMEOUT", ExitCode: ExSvcTimeout} + // minikube failed to list services for the specified namespace + SvcList = Kind{ID: "SVC_LIST", ExitCode: ExSvcError} + // minikube failed to start a tunnel + SvcTunnelStart = Kind{ID: "SVC_TUNNEL_START", ExitCode: ExSvcError} + // minikube could not stop an active tunnel + SvcTunnelStop = Kind{ID: "SVC_TUNNEL_STOP", ExitCode: ExSvcError} + // minikube was unable to access the service url + SvcURLTimeout = Kind{ID: "SVC_URL_TIMEOUT", ExitCode: ExSvcTimeout} + // minikube couldn't find the specified service in the specified namespace + SvcNotFound = Kind{ID: "SVC_NOT_FOUND", ExitCode: ExSvcNotFound} - EnvDriverConflict = Kind{ID: "ENV_DRIVER_CONFLICT", ExitCode: ExDriverConflict} - EnvMultiConflict = Kind{ID: "ENV_MULTINODE_CONFLICT", ExitCode: ExGuestConflict} - EnvDockerUnavailable = Kind{ID: "ENV_DOCKER_UNAVAILABLE", ExitCode: ExRuntimeUnavailable} + // user attempted to use a command that is not supported by the driver currently in use + 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 podman service was unavailable to the cluster EnvPodmanUnavailable = Kind{ID: "ENV_PODMAN_UNAVAILABLE", ExitCode: ExRuntimeUnavailable} + // user attempted to use an addon that is not supported AddonUnsupported = Kind{ID: "SVC_ADDON_UNSUPPORTED", ExitCode: ExSvcUnsupported} - AddonNotEnabled = Kind{ID: "SVC_ADDON_NOT_ENABLED", ExitCode: ExProgramConflict} + // user attempted to use an addon that is currently not enabled + AddonNotEnabled = Kind{ID: "SVC_ADDON_NOT_ENABLED", ExitCode: ExProgramConflict} - KubernetesInstallFailed = Kind{ID: "K8S_INSTALL_FAILED", ExitCode: ExControlPlaneError} + // minikube failed to update the Kubernetes cluster + KubernetesInstallFailed = Kind{ID: "K8S_INSTALL_FAILED", ExitCode: ExControlPlaneError} + // minikube failed to update the Kubernetes cluster because the container runtime was unavailable KubernetesInstallFailedRuntimeNotRunning = Kind{ID: "K8S_INSTALL_FAILED_CONTAINER_RUNTIME_NOT_RUNNING", ExitCode: ExRuntimeNotRunning} - KubernetesTooOld = Kind{ID: "K8S_OLD_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported} - KubernetesDowngrade = Kind{ + // an outdated Kubernetes version was specified for minikube to use + KubernetesTooOld = Kind{ID: "K8S_OLD_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported} + // minikube was unable to safely downgrade installed Kubernetes version + KubernetesDowngrade = Kind{ ID: "K8S_DOWNGRADE_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported, Advice: `1) Recreate the cluster with Kubernetes {{.new}}, by running: diff --git a/pkg/minikube/registry/drvs/docker/docker.go b/pkg/minikube/registry/drvs/docker/docker.go index f94839fe15..a7aaea2ac8 100644 --- a/pkg/minikube/registry/drvs/docker/docker.go +++ b/pkg/minikube/registry/drvs/docker/docker.go @@ -87,7 +87,7 @@ func configure(cc config.ClusterConfig, n config.Node) (interface{}, error) { }), nil } -func status() registry.State { +func status() (retState registry.State) { _, err := exec.LookPath(oci.Docker) if err != nil { return registry.State{Error: err, Installed: false, Healthy: false, Fix: "Install Docker", Doc: docURL} @@ -116,10 +116,25 @@ func status() registry.State { return registry.State{Reason: reason, Error: err, Installed: true, Healthy: false, Fix: "Restart the Docker service", Doc: docURL} } + var improvement string + recordImprovement := func(s registry.State) { + if s.NeedsImprovement && s.Fix != "" { + improvement = s.Fix + } + } + defer func() { + if retState.Error == nil && retState.Fix == "" && improvement != "" { + retState.NeedsImprovement = true + retState.Fix = improvement + } + }() + klog.Infof("docker version: %s", o) - if s := checkDockerVersion(strings.TrimSpace(string(o))); s.Error != nil { // remove '\n' from o at the end + s := checkDockerVersion(strings.TrimSpace(string(o))) // remove '\n' from o at the end + if s.Error != nil { return s } + recordImprovement(s) si, err := oci.CachedDaemonInfo("docker") if err != nil { @@ -166,6 +181,9 @@ func checkDockerVersion(o string) registry.State { } } + hintInstallOfficial := fmt.Sprintf("Install the official release of %s (Minimum recommended version is %2d.%02d.%d, current version is %s)", + driver.FullName(driver.Docker), minDockerVersion[0], minDockerVersion[1], minDockerVersion[2], parts[1]) + p := strings.SplitN(parts[1], ".", 3) switch l := len(p); l { case 2: @@ -174,12 +192,13 @@ func checkDockerVersion(o string) registry.State { // remove postfix string for unstable(test/nightly) channel. https://docs.docker.com/engine/install/ p[2] = strings.SplitN(p[2], "-", 2)[0] default: + // When Docker (Moby) was installed from the source code, the version string is typically set to "dev", or "library-import". return registry.State{ - Reason: "PROVIDER_DOCKER_VERSION_PARSING_FAILED", - Error: errors.Errorf("expected version format is \"..{patch}\". but got %s", parts[1]), - Installed: true, - Healthy: false, - Doc: docURL, + Installed: true, + Healthy: true, + NeedsImprovement: true, + Fix: hintInstallOfficial, + Doc: docURL, } } @@ -187,11 +206,11 @@ func checkDockerVersion(o string) registry.State { k, err := strconv.Atoi(s) if err != nil { return registry.State{ - Reason: "PROVIDER_DOCKER_VERSION_PARSING_FAILED", - Error: errors.Wrap(err, "docker version"), - Installed: true, - Healthy: false, - Doc: docURL, + Installed: true, + Healthy: true, + NeedsImprovement: true, + Fix: hintInstallOfficial, + Doc: docURL, } } diff --git a/pkg/minikube/registry/drvs/docker/docker_test.go b/pkg/minikube/registry/drvs/docker/docker_test.go index f1e5d05ce7..8392f949a6 100644 --- a/pkg/minikube/registry/drvs/docker/docker_test.go +++ b/pkg/minikube/registry/drvs/docker/docker_test.go @@ -1,5 +1,3 @@ -// +build darwin - /* Copyright 2019 The Kubernetes Authors All rights reserved. @@ -20,11 +18,15 @@ package docker import ( "fmt" + "strings" "testing" + + "k8s.io/minikube/pkg/minikube/driver" ) type testCase struct { - version, expect string + version, expect string + expectFixContains string } func appendVersionVariations(tc []testCase, v []int, reason string) []testCase { @@ -83,6 +85,30 @@ func TestCheckDockerVersion(t *testing.T) { tc = appendVersionVariations(tc, v, "PROVIDER_DOCKER_VERSION_LOW") } + tc = append(tc, []testCase{ + { + // "dev" is set when Docker (Moby) was installed with `make binary && make install` + version: "linux-dev", + expect: "", + expectFixContains: fmt.Sprintf("Install the official release of %s (Minimum recommended version is %02d.%02d.%d, current version is dev)", + driver.FullName(driver.Docker), minDockerVersion[0], minDockerVersion[1], minDockerVersion[2]), + }, + { + // "library-import" is set when Docker (Moby) was installed with `go build github.com/docker/docker/cmd/dockerd` (unrecommended, but valid) + version: "linux-library-import", + expect: "", + expectFixContains: fmt.Sprintf("Install the official release of %s (Minimum recommended version is %02d.%02d.%d, current version is library-import)", + driver.FullName(driver.Docker), minDockerVersion[0], minDockerVersion[1], minDockerVersion[2]), + }, + { + // "foo.bar.baz" is a triplet that cannot be parsed as "%02d.%02d.%d" + version: "linux-foo.bar.baz", + expect: "", + expectFixContains: fmt.Sprintf("Install the official release of %s (Minimum recommended version is %02d.%02d.%d, current version is foo.bar.baz)", + driver.FullName(driver.Docker), minDockerVersion[0], minDockerVersion[1], minDockerVersion[2]), + }, + }...) + for _, c := range tc { t.Run("checkDockerVersion test", func(t *testing.T) { s := checkDockerVersion(c.version) @@ -91,6 +117,11 @@ func TestCheckDockerVersion(t *testing.T) { t.Errorf("Error %v expected. but got %q. (version string : %s)", c.expect, s.Reason, c.version) } } + if c.expectFixContains != "" { + if !strings.Contains(s.Fix, c.expectFixContains) { + t.Errorf("Error expected Fix to contain %q, but got %q", c.expectFixContains, s.Fix) + } + } }) } } diff --git a/pkg/minikube/registry/drvs/hyperkit/hyperkit.go b/pkg/minikube/registry/drvs/hyperkit/hyperkit.go index 4abde3a3d6..2f5fea101b 100644 --- a/pkg/minikube/registry/drvs/hyperkit/hyperkit.go +++ b/pkg/minikube/registry/drvs/hyperkit/hyperkit.go @@ -81,6 +81,7 @@ func configure(cfg config.ClusterConfig, n config.Node) (interface{}, error) { VpnKitSock: cfg.HyperkitVpnKitSock, VSockPorts: cfg.HyperkitVSockPorts, Cmdline: "loglevel=3 console=ttyS0 console=tty0 noembed nomodeset norestore waitusb=10 systemd.legacy_systemd_cgroup_controller=yes random.trust_cpu=on hw_rng_model=virtio base host=" + cfg.Name, + ExtraDisks: cfg.ExtraDisks, }, nil } diff --git a/pkg/minikube/registry/drvs/kvm2/kvm2.go b/pkg/minikube/registry/drvs/kvm2/kvm2.go index 0f76409b68..619873b4d0 100644 --- a/pkg/minikube/registry/drvs/kvm2/kvm2.go +++ b/pkg/minikube/registry/drvs/kvm2/kvm2.go @@ -122,34 +122,38 @@ func status() registry.State { return registry.State{Error: err, Fix: "Install libvirt", Doc: docURL} } - member, err := isCurrentUserLibvirtGroupMember() - if err != nil { - return registry.State{ - Installed: true, - Running: true, - // keep the error messsage in sync with reason.providerIssues(Kind.ID: "PR_KVM_USER_PERMISSION") regexp - Error: fmt.Errorf("libvirt group membership check failed:\n%v", err.Error()), - Reason: "PR_KVM_USER_PERMISSION", - Fix: "Check that libvirtd is properly installed and that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)", - Doc: docURL, - } - } - if !member { - return registry.State{ - Installed: true, - Running: true, - // keep the error messsage in sync with reason.providerIssues(Kind.ID: "PR_KVM_USER_PERMISSION") regexp - Error: fmt.Errorf("libvirt group membership check failed:\nuser is not a member of the appropriate libvirt group"), - Reason: "PR_KVM_USER_PERMISSION", - Fix: "Check that libvirtd is properly installed and that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)", - Doc: docURL, - } - } - // On Ubuntu 19.10 (libvirt 5.4), this fails if LIBVIRT_DEFAULT_URI is unset cmd := exec.CommandContext(ctx, path, "domcapabilities", "--virttype", "kvm") cmd.Env = append(os.Environ(), fmt.Sprintf("LIBVIRT_DEFAULT_URI=%s", defaultURI())) out, err := cmd.CombinedOutput() + + // If we fail to connect to libvirt, first check whether we're member of the libvirt group. + if err != nil { + member, err := isCurrentUserLibvirtGroupMember() + if err != nil { + return registry.State{ + Installed: true, + Running: true, + // keep the error messsage in sync with reason.providerIssues(Kind.ID: "PR_KVM_USER_PERMISSION") regexp + Error: fmt.Errorf("libvirt group membership check failed:\n%v", err.Error()), + Reason: "PR_KVM_USER_PERMISSION", + Fix: "Check that libvirtd is properly installed and that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)", + Doc: docURL, + } + } + if !member { + return registry.State{ + Installed: true, + Running: true, + // keep the error messsage in sync with reason.providerIssues(Kind.ID: "PR_KVM_USER_PERMISSION") regexp + Error: fmt.Errorf("libvirt group membership check failed:\nuser is not a member of the appropriate libvirt group"), + Reason: "PR_KVM_USER_PERMISSION", + Fix: "Check that libvirtd is properly installed and that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)", + Doc: docURL, + } + } + } + if ctx.Err() == context.DeadlineExceeded { return registry.State{ Installed: true, diff --git a/pkg/minikube/registry/drvs/podman/podman.go b/pkg/minikube/registry/drvs/podman/podman.go index a0d3f42062..f92220db87 100644 --- a/pkg/minikube/registry/drvs/podman/podman.go +++ b/pkg/minikube/registry/drvs/podman/podman.go @@ -26,7 +26,7 @@ import ( "strings" "time" - "github.com/blang/semver" + "github.com/blang/semver/v4" "github.com/docker/machine/libmachine/drivers" "k8s.io/klog/v2" "k8s.io/minikube/pkg/drivers/kic" diff --git a/pkg/minikube/registry/global.go b/pkg/minikube/registry/global.go index 8b942e99e2..d4ebdabf5f 100644 --- a/pkg/minikube/registry/global.go +++ b/pkg/minikube/registry/global.go @@ -66,12 +66,20 @@ var ( // DriverState is metadata relating to a driver and status type DriverState struct { - Name string - Default bool + // Name is the name of the driver used internally + Name string + // Default drivers are selected automatically + Default bool + // Preference is the original priority from driver + Preference Priority + // Priority is the effective priority with health Priority Priority - State State + // State is the state of driver and dependencies + State State // Rejection is why we chose not to use this driver Rejection string + // Suggestion is how the user could improve health + Suggestion string } func (d DriverState) String() string { @@ -110,6 +118,7 @@ func Available(vm bool) []DriverState { s := d.Status() klog.Infof("%s default: %v priority: %d, state: %+v", d.Name, d.Default, d.Priority, s) + preference := d.Priority priority := d.Priority if !s.Healthy { priority = Unhealthy @@ -117,10 +126,10 @@ func Available(vm bool) []DriverState { if vm { if IsVM(d.Name) { - sts = append(sts, DriverState{Name: d.Name, Default: d.Default, Priority: priority, State: s}) + sts = append(sts, DriverState{Name: d.Name, Default: d.Default, Preference: preference, Priority: priority, State: s}) } } else { - sts = append(sts, DriverState{Name: d.Name, Default: d.Default, Priority: priority, State: s}) + sts = append(sts, DriverState{Name: d.Name, Default: d.Default, Preference: preference, Priority: priority, State: s}) } } diff --git a/pkg/minikube/registry/global_test.go b/pkg/minikube/registry/global_test.go index f76e1adef0..88d8268c32 100644 --- a/pkg/minikube/registry/global_test.go +++ b/pkg/minikube/registry/global_test.go @@ -93,16 +93,18 @@ func TestGlobalAvailable(t *testing.T) { expected := []DriverState{ { - Name: "healthy-bar", - Default: true, - Priority: Default, - State: State{Healthy: true}, + Name: "healthy-bar", + Default: true, + Preference: Default, + Priority: Default, + State: State{Healthy: true}, }, { - Name: "unhealthy-foo", - Default: true, - Priority: Unhealthy, - State: State{Healthy: false}, + Name: "unhealthy-foo", + Default: true, + Preference: Default, + Priority: Unhealthy, + State: State{Healthy: false}, }, } diff --git a/pkg/minikube/style/style.go b/pkg/minikube/style/style.go index 907ff96428..597c402b82 100644 --- a/pkg/minikube/style/style.go +++ b/pkg/minikube/style/style.go @@ -53,39 +53,40 @@ const SpinnerCharacter = 9 // Config is a map of style name to style struct // For consistency, ensure that emojis added render with the same width across platforms. var Config = map[Enum]Options{ - Celebration: {Prefix: "🎉 "}, - Check: {Prefix: "✅ "}, - Command: {Prefix: " ▪ ", LowPrefix: LowIndentBullet}, - Confused: {Prefix: "😕 "}, - Deleted: {Prefix: "💀 "}, - Documentation: {Prefix: "📘 "}, - Empty: {Prefix: "", LowPrefix: ""}, - Happy: {Prefix: "😄 "}, - Issue: {Prefix: " ▪ ", LowPrefix: LowIndentBullet}, - Indent: {Prefix: " ", LowPrefix: LowIndent}, - Issues: {Prefix: "🍿 "}, - Launch: {Prefix: "🚀 "}, - LogEntry: {Prefix: " "}, // Indent - New: {Prefix: "🆕 "}, - Notice: {Prefix: "📌 "}, - Option: {Prefix: " ▪ ", LowPrefix: LowIndentBullet}, - Pause: {Prefix: "⏸️ "}, - Provisioning: {Prefix: "🌱 "}, - Ready: {Prefix: "🏄 "}, - Restarting: {Prefix: "🔄 "}, - Running: {Prefix: "🏃 "}, - Sparkle: {Prefix: "✨ "}, - Stopped: {Prefix: "🛑 "}, - Stopping: {Prefix: "✋ "}, - Success: {Prefix: "✅ "}, - ThumbsDown: {Prefix: "👎 "}, - ThumbsUp: {Prefix: "👍 "}, - Unpause: {Prefix: "⏯️ "}, - URL: {Prefix: "👉 ", LowPrefix: LowIndent}, - Usage: {Prefix: "💡 "}, - Waiting: {Prefix: "⌛ "}, - Unsupported: {Prefix: "🚡 "}, - Workaround: {Prefix: "👉 ", LowPrefix: LowIndent}, + Celebration: {Prefix: "🎉 "}, + Check: {Prefix: "✅ "}, + Command: {Prefix: " ▪ ", LowPrefix: LowIndentBullet}, + Confused: {Prefix: "😕 "}, + Deleted: {Prefix: "💀 "}, + Documentation: {Prefix: "📘 "}, + Empty: {Prefix: "", LowPrefix: ""}, + Happy: {Prefix: "😄 "}, + Issue: {Prefix: " ▪ ", LowPrefix: LowIndentBullet}, + Indent: {Prefix: " ", LowPrefix: LowIndent}, + Issues: {Prefix: "🍿 "}, + Launch: {Prefix: "🚀 "}, + LogEntry: {Prefix: " "}, // Indent + New: {Prefix: "🆕 "}, + Notice: {Prefix: "📌 "}, + Option: {Prefix: " ▪ ", LowPrefix: LowIndentBullet}, + Pause: {Prefix: "⏸️ "}, + Provisioning: {Prefix: "🌱 "}, + Ready: {Prefix: "🏄 "}, + Restarting: {Prefix: "🔄 "}, + Running: {Prefix: "🏃 "}, + Sparkle: {Prefix: "✨ "}, + Stopped: {Prefix: "🛑 "}, + Stopping: {Prefix: "✋ "}, + Success: {Prefix: "✅ "}, + ThumbsDown: {Prefix: "👎 "}, + ThumbsUp: {Prefix: "👍 "}, + Unpause: {Prefix: "⏯️ "}, + URL: {Prefix: "👉 ", LowPrefix: LowIndent}, + Usage: {Prefix: "💡 "}, + Waiting: {Prefix: "⌛ "}, + WaitingWithSpinner: {Prefix: "⌛ ", OmitNewline: true, Spinner: true}, + Unsupported: {Prefix: "🚡 "}, + Workaround: {Prefix: "👉 ", LowPrefix: LowIndent}, // Fail emoji's Conflict: {Prefix: "💢 ", LowPrefix: LowWarning}, diff --git a/pkg/minikube/style/style_enum.go b/pkg/minikube/style/style_enum.go index 10b12d8598..19dce3a060 100644 --- a/pkg/minikube/style/style_enum.go +++ b/pkg/minikube/style/style_enum.go @@ -100,6 +100,7 @@ const ( Verifying VerifyingNoLine Waiting + WaitingWithSpinner WaitingPods Warning Workaround diff --git a/pkg/minikube/sysinit/openrc.go b/pkg/minikube/sysinit/openrc.go index d0b8989f8a..6d1b68ed23 100644 --- a/pkg/minikube/sysinit/openrc.go +++ b/pkg/minikube/sysinit/openrc.go @@ -117,9 +117,11 @@ func (s *OpenRC) Disable(svc string) error { return nil } -// DisableNow not implemented for openRC +// DisableNow does Disable + Stop func (s *OpenRC) DisableNow(svc string) error { - return fmt.Errorf("disable now is not implemented for OpenRC! PRs to fix are welcomed") + // supposed to do disable + stop + // disable does nothing for OpenRC, so just Stop here + return s.Stop(svc) } // Mask does nothing @@ -132,9 +134,11 @@ func (s *OpenRC) Enable(svc string) error { return nil } -// EnableNow not implemented for openRC +// EnableNow does Enable + Start func (s *OpenRC) EnableNow(svc string) error { - return fmt.Errorf("enable now is not implemented for OpenRC! PRs to fix are welcomed") + // supposed to do enable + start + // enable does nothing for OpenRC, so just Start here + return s.Start(svc) } // Unmask does nothing diff --git a/pkg/minikube/sysinit/systemd.go b/pkg/minikube/sysinit/systemd.go index 51985d5571..54d4084d77 100644 --- a/pkg/minikube/sysinit/systemd.go +++ b/pkg/minikube/sysinit/systemd.go @@ -19,7 +19,9 @@ package sysinit import ( "errors" + "fmt" "os/exec" + "strings" "k8s.io/minikube/pkg/minikube/assets" ) @@ -48,13 +50,19 @@ func (s *Systemd) Active(svc string) bool { // Disable disables a service func (s *Systemd) Disable(svc string) error { - _, err := s.r.RunCmd(exec.Command("sudo", "systemctl", "disable", svc)) + cmd := exec.Command("sudo", "systemctl", "disable", svc) + // See https://github.com/kubernetes/minikube/issues/11615#issuecomment-861794258 + cmd.Env = append(cmd.Env, "SYSTEMCTL_SKIP_SYSV=1") + _, err := s.r.RunCmd(cmd) return err } // DisableNow disables a service and stops it too (not waiting for next restart) func (s *Systemd) DisableNow(svc string) error { - _, err := s.r.RunCmd(exec.Command("sudo", "systemctl", "disable", "--now", svc)) + cmd := exec.Command("sudo", "systemctl", "disable", "--now", svc) + // See https://github.com/kubernetes/minikube/issues/11615#issuecomment-861794258 + cmd.Env = append(cmd.Env, "SYSTEMCTL_SKIP_SYSV=1") + _, err := s.r.RunCmd(cmd) return err } @@ -123,7 +131,14 @@ func (s *Systemd) Stop(svc string) error { // ForceStop terminates a service with prejudice func (s *Systemd) ForceStop(svc string) error { - _, err := s.r.RunCmd(exec.Command("sudo", "systemctl", "stop", "-f", svc)) + rr, err := s.r.RunCmd(exec.Command("sudo", "systemctl", "stop", "-f", svc)) + if err == nil { + return nil + } + if strings.Contains(rr.Output(), fmt.Sprintf("Unit %s not loaded", svc)) { + // already stopped + return nil + } return err } diff --git a/pkg/minikube/translate/translate.go b/pkg/minikube/translate/translate.go index 892450e604..48e2ab9de3 100644 --- a/pkg/minikube/translate/translate.go +++ b/pkg/minikube/translate/translate.go @@ -19,13 +19,15 @@ package translate import ( "encoding/json" "fmt" - "path" + "os" + "runtime" "strings" "github.com/cloudfoundry-attic/jibber_jabber" "golang.org/x/text/language" "k8s.io/klog/v2" + "k8s.io/minikube/translations" ) var ( @@ -60,23 +62,29 @@ func T(s string) string { // DetermineLocale finds the system locale and sets the preferred language for output appropriately. func DetermineLocale() { - locale, err := jibber_jabber.DetectIETF() - if err != nil { - klog.V(1).Infof("Getting system locale failed: %v", err) - locale = "" + var locale string + // Allow windows users to overload the same env vars as unix users + if runtime.GOOS == "windows" { + locale = os.Getenv("LC_ALL") + } + if locale == "" { + var err error + locale, err = jibber_jabber.DetectIETF() + if err != nil { + klog.V(1).Infof("Getting system locale failed: %v", err) + locale = "" + } } SetPreferredLanguage(locale) // Load translations for preferred language into memory. p := preferredLanguage.String() - translationFile := path.Join("translations", fmt.Sprintf("%s.json", p)) - t, err := Asset(translationFile) + t, err := translations.Translations.ReadFile(fmt.Sprintf("%s.json", p)) if err != nil { // Attempt to find a more broad locale, e.g. fr instead of fr-FR. if strings.Contains(p, "-") { p = strings.Split(p, "-")[0] - translationFile := path.Join("translations", fmt.Sprintf("%s.json", p)) - t, err = Asset(translationFile) + t, err = translations.Translations.ReadFile(fmt.Sprintf("%s.json", p)) if err != nil { klog.V(1).Infof("Failed to load translation file for %s: %v", p, err) return diff --git a/pkg/minikube/translate/translate_test.go b/pkg/minikube/translate/translate_test.go index d045791093..dd5893ad87 100644 --- a/pkg/minikube/translate/translate_test.go +++ b/pkg/minikube/translate/translate_test.go @@ -17,6 +17,11 @@ limitations under the License. package translate import ( + "encoding/json" + "os" + "path/filepath" + "regexp" + "sort" "testing" "golang.org/x/text/language" @@ -97,3 +102,81 @@ func TestT(t *testing.T) { }) } } + +func TestTranslationFilesValid(t *testing.T) { + languageFiles, err := filepath.Glob("../../../translations/*.json") + if err != nil { + t.Fatalf("failed to get translation files: %v", err) + } + for _, filename := range languageFiles { + lang := filepath.Base(filename) + t.Run(lang, func(t *testing.T) { + contents, err := os.ReadFile(filename) + if err != nil { + t.Fatalf("unable to read file %s: %v", filename, err) + } + + // check if JSON is valid + if valid := json.Valid(contents); !valid { + t.Fatalf("%s does not contain valid json", filename) + } + + // convert file into map + var entries map[string]string + if err := json.Unmarshal(contents, &entries); err != nil { + t.Fatalf("could not unmarshal file %s: %v", filename, err) + } + + // for each line + for k, v := range entries { + // if no translation, skip + if v == "" { + continue + } + + // get all variables (ex. {{.name}}) + keyVariables := distinctVariables(k) + valueVariables := distinctVariables(v) + + // check if number of original string and translated variables match + if len(keyVariables) != len(valueVariables) { + t.Errorf("line %q: %q has mismatching number of variables\noriginal string variables: %s; translated variables: %s", k, v, keyVariables, valueVariables) + continue + } + + // for each variable in the original string + for i, keyVar := range keyVariables { + // check if translated string has same variable + if keyVar != valueVariables[i] { + t.Errorf("line %q: %q has mismatching variables\noriginal string variables: %s do not match translated variables: %s", k, v, keyVariables, valueVariables) + break + } + } + } + }) + } +} + +func distinctVariables(line string) []string { + re := regexp.MustCompile(`{{\..+?}}`) + + // get all the variables from the string (possiible duplicates) + variables := re.FindAllString(line, -1) + distinctMap := make(map[string]bool) + + // add them to a map to get distinct list of variables + for _, variable := range variables { + distinctMap[variable] = true + } + distinct := []string{} + + // convert map into slice + for k := range distinctMap { + distinct = append(distinct, k) + } + + // sort the slice to make the comparison easier + sort.Strings(distinct) + + return distinct +} diff --git a/pkg/network/network.go b/pkg/network/network.go index 13e34594f9..11ab78bf93 100644 --- a/pkg/network/network.go +++ b/pkg/network/network.go @@ -77,11 +77,52 @@ type Interface struct { IfaceMAC string } +// lookupInInterfaces iterates over all local network interfaces +// and tries to match "ip" with associated networks +// returns (network parameters, ip network, nil) if found +// (nil, nil, nil) it nof +// (nil, nil, error) if any error happened +func lookupInInterfaces(ip net.IP) (*Parameters, *net.IPNet, error) { + // check local network interfaces + ifaces, err := net.Interfaces() + if err != nil { + return nil, nil, fmt.Errorf("failed listing network interfaces: %w", err) + } + + for _, iface := range ifaces { + + ifAddrs, err := iface.Addrs() + if err != nil { + return nil, nil, fmt.Errorf("failed listing addresses of network interface %+v: %w", iface, err) + } + + for _, ifAddr := range ifAddrs { + ifip, lan, err := net.ParseCIDR(ifAddr.String()) + if err != nil { + return nil, nil, fmt.Errorf("failed parsing network interface address %+v: %w", ifAddr, err) + } + if lan.Contains(ip) { + ip4 := ifip.To4().String() + rt := Parameters{ + Interface: Interface{ + IfaceName: iface.Name, + IfaceIPv4: ip4, + IfaceMTU: iface.MTU, + IfaceMAC: iface.HardwareAddr.String(), + }, + Gateway: ip4, + } + return &rt, lan, nil + } + } + } + return nil, nil, nil +} + // inspect initialises IPv4 network parameters struct from given address addr. // addr can be single address (like "192.168.17.42"), network address (like "192.168.17.0") or in CIDR form (like "192.168.17.42/24 or "192.168.17.0/24"). // If addr belongs to network of local network interface, parameters will also contain info about that network interface. func inspect(addr string) (*Parameters, error) { - n := &Parameters{} // extract ip from addr ip, network, err := net.ParseCIDR(addr) @@ -92,31 +133,15 @@ func inspect(addr string) (*Parameters, error) { } } - // check local network interfaces - ifaces, err := net.Interfaces() + n := &Parameters{} + + ifParams, ifNet, err := lookupInInterfaces(ip) if err != nil { - return nil, fmt.Errorf("failed listing network interfaces: %w", err) + return nil, err } - for _, iface := range ifaces { - ifAddrs, err := iface.Addrs() - if err != nil { - return nil, fmt.Errorf("failed listing addresses of network interface %+v: %w", iface, err) - } - for _, ifAddr := range ifAddrs { - ifip, lan, err := net.ParseCIDR(ifAddr.String()) - if err != nil { - return nil, fmt.Errorf("failed parsing network interface address %+v: %w", ifAddr, err) - } - if lan.Contains(ip) { - n.IfaceName = iface.Name - n.IfaceIPv4 = ifip.To4().String() - n.IfaceMTU = iface.MTU - n.IfaceMAC = iface.HardwareAddr.String() - n.Gateway = n.IfaceIPv4 - network = lan - break - } - } + if ifNet != nil { + network = ifNet + n = ifParams } // couldn't determine network parameters from addr nor from network interfaces diff --git a/pkg/perf/monitor/github.go b/pkg/perf/monitor/github.go index eb3146136e..bded6c3a65 100644 --- a/pkg/perf/monitor/github.go +++ b/pkg/perf/monitor/github.go @@ -22,7 +22,7 @@ import ( "os" "time" - "github.com/google/go-github/github" + "github.com/google/go-github/v36/github" "github.com/pkg/errors" "golang.org/x/oauth2" ) diff --git a/pkg/provision/provision.go b/pkg/provision/provision.go index 20fa0ddb65..5fa693bb4f 100644 --- a/pkg/provision/provision.go +++ b/pkg/provision/provision.go @@ -153,6 +153,12 @@ func copyHostCerts(authOptions auth.Options) error { if err != nil { return errors.Wrapf(err, "open cert file: %s", src) } + defer func() { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + }() + if err := execRunner.Copy(f); err != nil { return errors.Wrapf(err, "transferring file: %+v", f) } @@ -187,6 +193,12 @@ func copyRemoteCerts(authOptions auth.Options, driver drivers.Driver) error { if err != nil { return errors.Wrapf(err, "error copying %s to %s", src, dst) } + defer func() { + if err := f.Close(); err != nil { + klog.Warningf("error closing the file %s: %v", f.GetSourcePath(), err) + } + }() + if err := sshRunner.Copy(f); err != nil { return errors.Wrapf(err, "transferring file to machine %v", f) } @@ -242,7 +254,7 @@ CRIO_MINIKUBE_OPTIONS='{{ range .EngineOptions.InsecureRegistry }}--insecure-reg return err } - if _, err = p.SSHCommand(fmt.Sprintf("sudo mkdir -p %s && printf %%s \"%s\" | sudo tee %s", path.Dir(crioOptsPath), crioOptsBuf.String(), crioOptsPath)); err != nil { + if _, err = p.SSHCommand(fmt.Sprintf("sudo mkdir -p %s && printf %%s \"%s\" | sudo tee %s && sudo systemctl restart crio", path.Dir(crioOptsPath), crioOptsBuf.String(), crioOptsPath)); err != nil { return err } diff --git a/pkg/util/retry/retry.go b/pkg/util/retry/retry.go index 3e40547f4e..09f1ae65cf 100644 --- a/pkg/util/retry/retry.go +++ b/pkg/util/retry/retry.go @@ -20,7 +20,7 @@ package retry import ( "time" - "github.com/cenkalti/backoff" + "github.com/cenkalti/backoff/v4" "k8s.io/klog/v2" ) diff --git a/pkg/util/utils.go b/pkg/util/utils.go index 227c8402bb..8ce9df808d 100644 --- a/pkg/util/utils.go +++ b/pkg/util/utils.go @@ -23,7 +23,7 @@ import ( "path/filepath" "strconv" - "github.com/blang/semver" + "github.com/blang/semver/v4" units "github.com/docker/go-units" "github.com/pkg/errors" ) diff --git a/pkg/util/utils_test.go b/pkg/util/utils_test.go index 4ad1ba2bf4..f0fc06cc6d 100644 --- a/pkg/util/utils_test.go +++ b/pkg/util/utils_test.go @@ -24,7 +24,7 @@ import ( "syscall" "testing" - "github.com/blang/semver" + "github.com/blang/semver/v4" ) func TestGetBinaryDownloadURL(t *testing.T) { diff --git a/pkg/version/version.go b/pkg/version/version.go index 0faeb4964f..dd348ff126 100644 --- a/pkg/version/version.go +++ b/pkg/version/version.go @@ -19,7 +19,7 @@ package version import ( "strings" - "github.com/blang/semver" + "github.com/blang/semver/v4" ) // VersionPrefix is the prefix of the git tag for a version diff --git a/site/assets/scss/_variables_project.scss b/site/assets/scss/_variables_project.scss index 536b3b4a01..dd9bed8014 100644 --- a/site/assets/scss/_variables_project.scss +++ b/site/assets/scss/_variables_project.scss @@ -23,7 +23,7 @@ $gray-800: #333 !default; $gray-900: #222 !default; $black: #000 !default; -$primary: #f2771a !default; +$primary: $mk-dark !default; $primary-light: $mk-light; $secondary: #403F4C; $success: #3772FF !default; @@ -228,3 +228,16 @@ div.td-content { div.code-toolbar > .toolbar { top: -.3em !important; } + +.option-button { + border-radius: 0.2rem !important; + margin-right: 0.2rem; +} + +.hide { + display: none !important; +} + +.card-body-blue { + background: #f3f9fa; +} diff --git a/site/config.toml b/site/config.toml index 3e6c1da9db..96d504946a 100644 --- a/site/config.toml +++ b/site/config.toml @@ -129,6 +129,13 @@ no = 'Sorry to hear that. Please + Chart to visualize the time-to-k8s benchmark daily against HEAD +weight: -99999999 +--- + +[Benchmarking Machine Specs](https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources) + +## Docker + +![Docker Benchmarks](https://storage.googleapis.com/minikube-time-to-k8s/docker-chart.png) + +## Containerd + +![Containerd Benchmarks](https://storage.googleapis.com/minikube-time-to-k8s/containerd-chart.png) diff --git a/site/content/en/docs/benchmarks/timeToK8s/v1.20.0.md b/site/content/en/docs/benchmarks/timeToK8s/v1.20.0.md new file mode 100644 index 0000000000..7ecc34605d --- /dev/null +++ b/site/content/en/docs/benchmarks/timeToK8s/v1.20.0.md @@ -0,0 +1,7 @@ +--- +title: "v1.20.0 Benchmark" +linkTitle: "v1.20.0 Benchmark" +weight: -20210506 +--- + +![time-to-k8s](/images/benchmarks/timeToK8s/v1.20.0.png) diff --git a/site/content/en/docs/benchmarks/timeToK8s/v1.21.0.md b/site/content/en/docs/benchmarks/timeToK8s/v1.21.0.md new file mode 100644 index 0000000000..39b68d2ac7 --- /dev/null +++ b/site/content/en/docs/benchmarks/timeToK8s/v1.21.0.md @@ -0,0 +1,7 @@ +--- +title: "v1.21.0 Benchmark" +linkTitle: "v1.21.0 Benchmark" +weight: -20210611 +--- + +![time-to-k8s](/images/benchmarks/timeToK8s/v1.21.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..a9409e79fd --- /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: -20210707 +--- + +![time-to-k8s](/images/benchmarks/timeToK8s/v1.22.0.png) diff --git a/site/content/en/docs/commands/addons.md b/site/content/en/docs/commands/addons.md index 51e84d2f3f..61fe05929e 100644 --- a/site/content/en/docs/commands/addons.md +++ b/site/content/en/docs/commands/addons.md @@ -130,6 +130,7 @@ minikube addons enable dashboard ``` --force If true, will perform potentially dangerous operations. Use with discretion. --images string Images used by this addon. Separated by commas. + --refresh If true, pods might get deleted and restarted on addon enable --registries string Registries used by this addon. Separated by commas. ``` diff --git a/site/content/en/docs/commands/completion.md b/site/content/en/docs/commands/completion.md index f8428da7de..eb4d6511eb 100644 --- a/site/content/en/docs/commands/completion.md +++ b/site/content/en/docs/commands/completion.md @@ -60,3 +60,140 @@ minikube completion SHELL [flags] --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging ``` +## minikube completion bash + +bash completion. + +### Synopsis + +Generate command completion for bash. + +```shell +minikube completion bash [flags] +``` + +### Options inherited from parent commands + +``` + --add_dir_header If true, adds the file directory to the header of the log messages + --alsologtostderr log to standard error as well as files + -b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm") + -h, --help + --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_dir string If non-empty, write log files in this directory + --log_file string If non-empty, use this log file + --log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800) + --logtostderr log to standard error instead of files + --one_output If true, only write logs to their native severity level (vs also writing to each lower severity level) + -p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube") + --skip_headers If true, avoid header prefixes in the log messages + --skip_log_headers If true, avoid headers when opening log files + --stderrthreshold severity logs at or above this threshold go to stderr (default 2) + --user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username. + -v, --v Level number for the log level verbosity + --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging +``` + +## minikube completion fish + +fish completion. + +### Synopsis + +Generate command completion for fish . + +```shell +minikube completion fish [flags] +``` + +### Options inherited from parent commands + +``` + --add_dir_header If true, adds the file directory to the header of the log messages + --alsologtostderr log to standard error as well as files + -b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm") + -h, --help + --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_dir string If non-empty, write log files in this directory + --log_file string If non-empty, use this log file + --log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800) + --logtostderr log to standard error instead of files + --one_output If true, only write logs to their native severity level (vs also writing to each lower severity level) + -p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube") + --skip_headers If true, avoid header prefixes in the log messages + --skip_log_headers If true, avoid headers when opening log files + --stderrthreshold severity logs at or above this threshold go to stderr (default 2) + --user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username. + -v, --v Level number for the log level verbosity + --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging +``` + +## minikube completion help + +Help about any command + +### Synopsis + +Help provides help for any command in the application. +Simply type completion help [path to command] for full details. + +```shell +minikube completion help [command] [flags] +``` + +### Options inherited from parent commands + +``` + --add_dir_header If true, adds the file directory to the header of the log messages + --alsologtostderr log to standard error as well as files + -b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm") + -h, --help + --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_dir string If non-empty, write log files in this directory + --log_file string If non-empty, use this log file + --log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800) + --logtostderr log to standard error instead of files + --one_output If true, only write logs to their native severity level (vs also writing to each lower severity level) + -p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube") + --skip_headers If true, avoid header prefixes in the log messages + --skip_log_headers If true, avoid headers when opening log files + --stderrthreshold severity logs at or above this threshold go to stderr (default 2) + --user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username. + -v, --v Level number for the log level verbosity + --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging +``` + +## minikube completion zsh + +zsh completion. + +### Synopsis + +Generate command completion for zsh. + +```shell +minikube completion zsh [flags] +``` + +### Options inherited from parent commands + +``` + --add_dir_header If true, adds the file directory to the header of the log messages + --alsologtostderr log to standard error as well as files + -b, --bootstrapper string The name of the cluster bootstrapper that will set up the Kubernetes cluster. (default "kubeadm") + -h, --help + --log_backtrace_at traceLocation when logging hits line file:N, emit a stack trace (default :0) + --log_dir string If non-empty, write log files in this directory + --log_file string If non-empty, use this log file + --log_file_max_size uint Defines the maximum size a log file can grow to. Unit is megabytes. If the value is 0, the maximum file size is unlimited. (default 1800) + --logtostderr log to standard error instead of files + --one_output If true, only write logs to their native severity level (vs also writing to each lower severity level) + -p, --profile string The name of the minikube VM being used. This can be set to allow having multiple instances of minikube independently. (default "minikube") + --skip_headers If true, avoid header prefixes in the log messages + --skip_log_headers If true, avoid headers when opening log files + --stderrthreshold severity logs at or above this threshold go to stderr (default 2) + --user string Specifies the user executing the operation. Useful for auditing operations executed by 3rd party tools. Defaults to the operating system username. + -v, --v Level number for the log level verbosity + --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging +``` + diff --git a/site/content/en/docs/commands/config.md b/site/content/en/docs/commands/config.md index 51ff431b20..75f99b44e3 100644 --- a/site/content/en/docs/commands/config.md +++ b/site/content/en/docs/commands/config.md @@ -29,19 +29,15 @@ Configurable fields: * WantUpdateNotification * WantBetaUpdateNotification * ReminderWaitPeriodInHours - * WantReportError - * WantReportErrorPrompt - * WantKubectlDownloadMsg * WantNoneDriverWarning + * WantVirtualBoxDriverWarning * profile * bootstrapper - * ShowDriverDeprecationNotification - * ShowBootstrapperDeprecationNotification * insecure-registry * hyperv-virtual-switch * disable-driver-mounts * cache - * embed-certs + * EmbedCerts * native-ssh ```shell diff --git a/site/content/en/docs/commands/cp.md b/site/content/en/docs/commands/cp.md index 1e636ba5af..bd74dd79cc 100644 --- a/site/content/en/docs/commands/cp.md +++ b/site/content/en/docs/commands/cp.md @@ -13,10 +13,11 @@ Copy the specified file into minikube Copy the specified file into minikube, it will be saved at path in your minikube. Example Command : "minikube cp a.txt /home/docker/b.txt" + "minikube cp a.txt minikube-m02:/home/docker/b.txt" ```shell -minikube cp [flags] +minikube cp : [flags] ``` ### Options inherited from parent commands 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/site/content/en/docs/commands/image.md b/site/content/en/docs/commands/image.md index 49a0317602..299e0c80ae 100644 --- a/site/content/en/docs/commands/image.md +++ b/site/content/en/docs/commands/image.md @@ -120,28 +120,32 @@ minikube image help [command] [flags] --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging ``` -## minikube image list +## minikube image load -List images +Load a image into minikube ### Synopsis -List images +Load a image into minikube ```shell -minikube image list [flags] +minikube image load IMAGE | ARCHIVE | - [flags] ``` -### Aliases - -[ls] - ### Examples +``` +minikube image load image +minikube image load image.tar ``` -$ minikube image list +### Options +``` + --daemon Cache image from docker daemon + --overwrite Overwrite image even if same image:tag name exists (default true) + --pull Pull the remote image (no caching) + --remote Cache image from remote registry ``` ### Options inherited from parent commands @@ -166,31 +170,28 @@ $ minikube image list --vmodule moduleSpec comma-separated list of pattern=N settings for file-filtered logging ``` -## minikube image load +## minikube image ls -Load a image into minikube +List images ### Synopsis -Load a image into minikube +List images ```shell -minikube image load IMAGE | ARCHIVE | - [flags] +minikube image ls [flags] ``` +### Aliases + +[list] + ### Examples -``` -minikube image load image -minikube image load image.tar ``` -### Options +$ minikube image ls -``` - --daemon Cache image from docker daemon - --pull Pull the remote image (no caching) - --remote Cache image from remote registry ``` ### Options inherited from parent commands @@ -229,7 +230,7 @@ minikube image rm IMAGE [IMAGE...] [flags] ### Aliases -[unload] +[remove unload] ### Examples diff --git a/site/content/en/docs/commands/mount.md b/site/content/en/docs/commands/mount.md index 15b6532993..a6e71e962e 100644 --- a/site/content/en/docs/commands/mount.md +++ b/site/content/en/docs/commands/mount.md @@ -27,6 +27,7 @@ minikube mount [flags] : --mode uint File permissions used for the mount (default 493) --msize int The number of bytes to use for 9p packet payload (default 262144) --options strings Additional mount options, such as cache=fscache + --port uint16 Specify the port that the mount should be setup on, where 0 means any free port. --type string Specify the mount filesystem type (supported types: 9p) (default "9p") --uid string Default user id used for the mount (default "docker") ``` diff --git a/site/content/en/docs/commands/pause.md b/site/content/en/docs/commands/pause.md index d77982cbb4..0c93e86655 100644 --- a/site/content/en/docs/commands/pause.md +++ b/site/content/en/docs/commands/pause.md @@ -20,9 +20,9 @@ minikube pause [flags] ### Options ``` - -n, ----namespaces strings namespaces to pause (default [kube-system,kubernetes-dashboard,storage-gluster,istio-operator]) - -A, --all-namespaces If set, pause all namespaces - -o, --output string Format to print stdout in. Options include: [text,json] (default "text") + -A, --all-namespaces If set, pause all namespaces + -n, --namespaces strings namespaces to pause (default [kube-system,kubernetes-dashboard,storage-gluster,istio-operator]) + -o, --output string Format to print stdout in. Options include: [text,json] (default "text") ``` ### Options inherited from parent commands diff --git a/site/content/en/docs/commands/start.md b/site/content/en/docs/commands/start.md index 0cccb17781..bc836458ed 100644 --- a/site/content/en/docs/commands/start.md +++ b/site/content/en/docs/commands/start.md @@ -26,11 +26,11 @@ minikube start [flags] --apiserver-names strings A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine --apiserver-port int The apiserver listening port (default 8443) --auto-update-drivers If set, automatically updates drivers to the latest version. Defaults to true. (default true) - --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.22@sha256:7cc3a3cb6e51c628d8ede157ad9e1f797e8d22a1b3cedc12d3f1999cb52f962e") + --base-image string The base image to use for docker/podman drivers. Intended for local development. (default "gcr.io/k8s-minikube/kicbase:v0.0.25@sha256:6f936e3443b95cd918d77623bf7b595653bb382766e280290a02b4a349e88b79") --cache-images If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none. (default true) --cni string CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto) --container-runtime string The container runtime to be used (docker, cri-o, containerd). (default "docker") - --cpus int Number of CPUs allocated to Kubernetes. (default 2) + --cpus string Number of CPUs allocated to Kubernetes. Use "max" to use the maximum number of CPUs. (default "2") --cri-socket string The cri socket path to be used. --delete-on-failure If set, delete the current cluster if start fails and try again. Defaults to false. --disable-driver-mounts Disables the filesystem mounts provided by the hypervisors @@ -48,9 +48,10 @@ minikube start [flags] The key should be '.' separated, and the first part before the dot is the component to apply the configuration to. Valid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler Valid kubeadm parameters: ignore-preflight-errors, dry-run, kubeconfig, kubeconfig-dir, node-name, cri-socket, experimental-upload-certs, certificate-key, rootfs, skip-phases, pod-network-cidr + --extra-disks int Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver) --feature-gates string A set of key=value pairs that describe feature gates for alpha/experimental features. --force Force minikube to perform possibly dangerous operations - --force-systemd If set, force the container runtime to use sytemd as cgroup manager. Defaults to false. + --force-systemd If set, force the container runtime to use systemd as cgroup manager. Defaults to false. --host-dns-resolver Enable host resolver for NAT DNS requests (virtualbox driver only) (default true) --host-only-cidr string The CIDR to be used for the minikube VM (virtualbox driver only) (default "192.168.99.1/24") --host-only-nic-type string NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only) (default "virtio") @@ -64,16 +65,16 @@ minikube start [flags] --insecure-registry strings Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added. --install-addons If set, install addons. Defaults to true. (default true) --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.20.0.iso,https://github.com/kubernetes/minikube/releases/download/v1.20.0/minikube-v1.20.0.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.20.0.iso]) + --iso-url strings Locations to fetch the minikube ISO from. (default [https://storage.googleapis.com/minikube-builds/iso/11483/minikube-v1.22.0-1627488369-11483.iso,https://github.com/kubernetes/minikube/releases/download/v1.22.0-1627488369-11483/minikube-v1.22.0-1627488369-11483.iso,https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.22.0-1627488369-11483.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.2, 'latest' for v1.22.0-alpha.1). Defaults to 'stable'. + --kubernetes-version string The Kubernetes version that the minikube VM will use (ex: v1.2.3, 'stable' for v1.21.3, 'latest' for v1.22.0-rc.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") --kvm-numa-count int Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only) (default 1) --kvm-qemu-uri string The KVM QEMU connection URI. (kvm2 driver only) (default "qemu:///system") --listen-address string IP Address to use to expose ports (docker and podman driver only) - --memory string Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). + --memory string Amount of RAM to allocate to Kubernetes (format: [], where unit = b, k, m or g). Use "max" to use the maximum amount of memory. --mount This will start the mount daemon and automatically mount files into minikube. --mount-string string The argument to pass the minikube mount command on start. --namespace string The named space to activate after start (default "default") diff --git a/site/content/en/docs/commands/unpause.md b/site/content/en/docs/commands/unpause.md index 88197773cb..8b500164ab 100644 --- a/site/content/en/docs/commands/unpause.md +++ b/site/content/en/docs/commands/unpause.md @@ -17,12 +17,16 @@ unpause Kubernetes minikube unpause [flags] ``` +### Aliases + +[resume] + ### Options ``` - -n, ----namespaces strings namespaces to unpause (default [kube-system,kubernetes-dashboard,storage-gluster,istio-operator]) - -A, --all-namespaces If set, unpause all namespaces - -o, --output string Format to print stdout in. Options include: [text,json] (default "text") + -A, --all-namespaces If set, unpause all namespaces + -n, --namespaces strings namespaces to unpause (default [kube-system,kubernetes-dashboard,storage-gluster,istio-operator]) + -o, --output string Format to print stdout in. Options include: [text,json] (default "text") ``` ### Options inherited from parent commands diff --git a/site/content/en/docs/commands/version.md b/site/content/en/docs/commands/version.md index c8251b9e4c..92a1872f3f 100644 --- a/site/content/en/docs/commands/version.md +++ b/site/content/en/docs/commands/version.md @@ -20,6 +20,7 @@ minikube version [flags] ### Options ``` + --components list versions of all components included with minikube. (the cluster must be running) -o, --output string One of 'yaml' or 'json'. --short Print just the version number. ``` diff --git a/site/content/en/docs/contrib/addons.en.md b/site/content/en/docs/contrib/addons.en.md index 0ffe726934..b16a2f9ad9 100644 --- a/site/content/en/docs/contrib/addons.en.md +++ b/site/content/en/docs/contrib/addons.en.md @@ -47,24 +47,32 @@ To make the addon appear in `minikube addons list`, add it to `pkg/addons/config }, ``` +Next, add all required files using `//go:embed` directives to a new embed.FS variable in `deploy/addons/assets.go`. Here is the entry used by the `csi-hostpath-driver` addon: + +```go + // CsiHostpathDriverAssets assets for csi-hostpath-driver addon + //go:embed csi-hostpath-driver/deploy/*.tmpl csi-hostpath-driver/rbac/*.tmpl + CsiHostpathDriverAssets embed.FS +``` + Then, add into `pkg/minikube/assets/addons.go` the list of files to copy into the cluster, including manifests. Here is the entry used by the `registry` addon: ```go "registry": NewAddon([]*BinAsset{ - MustBinAsset( - "deploy/addons/registry/registry-rc.yaml.tmpl", + MustBinAsset(addons.RegistryAssets, + "registry/registry-rc.yaml.tmpl", vmpath.GuestAddonsDir, "registry-rc.yaml", "0640", false), - MustBinAsset( - "deploy/addons/registry/registry-svc.yaml.tmpl", + MustBinAsset(addons.RegistryAssets, + "registry/registry-svc.yaml.tmpl", vmpath.GuestAddonsDir, "registry-svc.yaml", "0640", false), - MustBinAsset( - "deploy/addons/registry/registry-proxy.yaml.tmpl", + MustBinAsset(addons.RegistryAssets, + "registry/registry-proxy.yaml.tmpl", vmpath.GuestAddonsDir, "registry-proxy.yaml", "0640", @@ -74,6 +82,7 @@ Then, add into `pkg/minikube/assets/addons.go` the list of files to copy into th The `MustBinAsset` arguments are: +* asset variable (typically present in `deploy/addons/assets.go`) * source filename * destination directory (typically `vmpath.GuestAddonsDir`) * destination filename diff --git a/site/content/en/docs/contrib/building/binaries.md b/site/content/en/docs/contrib/building/binaries.md index ade5f54f99..6254844a10 100644 --- a/site/content/en/docs/contrib/building/binaries.md +++ b/site/content/en/docs/contrib/building/binaries.md @@ -7,7 +7,7 @@ weight: 2 ## Prerequisites -* A recent Go distribution (>=1.12) +* A recent Go distribution (>=1.16) * If you are on Windows, you'll need Docker to be installed. * 4GB of RAM diff --git a/site/content/en/docs/contrib/building/iso.md b/site/content/en/docs/contrib/building/iso.md index 8fd818bd38..f739aef819 100644 --- a/site/content/en/docs/contrib/building/iso.md +++ b/site/content/en/docs/contrib/building/iso.md @@ -10,7 +10,7 @@ The minikube ISO is booted by each hypervisor to provide a stable minimal Linux ## Prerequisites -* A recent Go distribution (>=1.12) +* A recent Go distribution (>=1.16) * If you are on Windows, you'll need Docker to be installed. * 4GB of RAM * Build tools: diff --git a/site/content/en/docs/contrib/errorcodes.en.md b/site/content/en/docs/contrib/errorcodes.en.md new file mode 100644 index 0000000000..d2589bf1e5 --- /dev/null +++ b/site/content/en/docs/contrib/errorcodes.en.md @@ -0,0 +1,530 @@ +--- +title: "Error Codes" +description: > + minikube error codes and strings +--- + + +## Error Codes + + +### Generic Errors +1: ExFailure +2: ExInterrupted + +### Error codes specific to the minikube program +10: ExProgramError +14: ExProgramUsage +11: ExProgramConflict +15: ExProgramNotFound +16: ExProgramUnsupported +18: ExProgramConfig + +### Error codes specific to resource limits (exit code layout follows no rules) +20: ExResourceError +23: ExInsufficientMemory +26: ExInsufficientStorage +27: ExInsufficientPermission +29: ExInsufficientCores + +### Error codes specific to the host +30: ExHostError +31: ExHostConflict +32: ExHostTimeout +34: ExHostUsage +35: ExHostNotFound +38: ExHostUnsupported +37: ExHostPermission +38: ExHostConfig + +### Error codes specific to remote networking +40: ExInternetError +41: ExInternetConflict +42: ExInternetTimeout +45: ExInternetNotFound +48: ExInternetConfig +49: ExInternetUnavailable + +### Error codes specific to the libmachine driver +50: ExDriverError +51: ExDriverConflict +52: ExDriverTimeout +54: ExDriverUsage +55: ExDriverNotFound +56: ExDriverUnsupported +57: ExDriverPermission +58: ExDriverConfig +59: ExDriverUnavailable + +### Error codes specific to the driver provider +60: ExProviderError +61: ExProviderConflict +62: ExProviderTimeout +63: ExProviderNotRunning +65: ExProviderNotFound +66: ExProviderUnsupported +67: ExProviderPermission +68: ExProviderConfig +69: ExProviderUnavailable + +### Error codes specific to local networking +70: ExLocalNetworkError +71: ExLocalNetworkConflict +72: ExLocalNetworkTimeout +75: ExLocalNetworkNotFound +77: ExLocalNetworkPermission +78: ExLocalNetworkConfig +79: ExLocalNetworkUnavailable + +### Error codes specific to the guest host +80: ExGuestError +81: ExGuestConflict +82: ExGuestTimeout +83: ExGuestNotRunning +85: ExGuestNotFound +86: ExGuestUnsupported +87: ExGuestPermission +88: ExGuestConfig +89: ExGuestUnavailable + +### Error codes specific to the container runtime +90: ExRuntimeError +93: ExRuntimeNotRunning +95: ExRuntimeNotFound +99: ExRuntimeUnavailable + +### Error codes specific to the Kubernetes control plane +100: ExControlPlaneError +101: ExControlPlaneConflict +102: ExControlPlaneTimeout +103: ExControlPlaneNotRunning +105: ExControlPlaneNotFound +106: ExControlPlaneUnsupported +108: ExControlPlaneConfig +109: ExControlPlaneUnavailable + +### Error codes specific to a Kubernetes service +110: ExSvcError +111: ExSvcConflict +112: ExSvcTimeout +113: ExSvcNotRunning +115: ExSvcNotFound +116: ExSvcUnsupported +117: ExSvcPermission +118: ExSvcConfig +119: ExSvcUnavailable + + +## Error Strings + +"MK_USAGE" (Exit code ExProgramUsage) +minikube has been passed an incorrect parameter + +"MK_USAGE_NO_PROFILE" (Exit code ExProgramUsage) +minikube has no current cluster running + +"MK_INTERRUPTED" (Exit code ExProgramConflict) +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_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 + +"MK_ADD_CONFIG" (Exit code ExProgramError) +minikube failed to update internal configuration, such as the cached images config map + +"MK_BOOTSTRAPPER" (Exit code ExProgramError) +minikube failed to create a cluster bootstrapper + +"MK_CACHE_LIST" (Exit code ExProgramError) +minikube failed to list cached images + +"MK_CACHE_LOAD" (Exit code ExProgramError) +minkube failed to cache and load cached images + +"MK_COMMAND_RUNNER" (Exit code ExProgramError) +minikube failed to load a Docker Machine CommandRunner + +"MK_COMPLETION" (Exit code ExProgramError) +minikube failed to generate shell command completion for a supported shell + +"MK_CONFIG_SET" (Exit code ExProgramError) +minikube failed to set an internal config value + +"MK_CONFIG_UNSET" (Exit code ExProgramError) +minikube failed to unset an internal config value + +"MK_CONFIG_VIEW" (Exit code ExProgramError) +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_DOCKER_SCRIPT" (Exit code ExProgramError) +minikube failed to generate script to activate minikube docker-env + +"MK_BIND_FLAGS" (Exit code ExProgramError) +an error occurred when viper attempted to bind flags to configuration + +"MK_FORMAT_USAGE" (Exit code ExProgramError) +minkube was passed an invalid format string in the --format flag + +"MK_GENERATE_DOCS" (Exit code ExProgramError) +minikube failed to auto-generate markdown-based documentation in the specified folder + +"MK_JSON_MARSHAL" (Exit code ExProgramError) +minikube failed to marshal a JSON object + +"MK_K8S_CLIENT" (Exit code ExControlPlaneUnavailable) +minikube failed to create a Kubernetes client set which is necessary for querying the Kubernetes API + +"MK_LIST_CONFIG" (Exit code ExProgramError) +minikube failed to list some configuration data + +"MK_LOG_FOLLOW" (Exit code ExProgramError) +minikube failed to follow or watch minikube logs + +"MK_NEW_RUNTIME" (Exit code ExProgramError) +minikube failed to create an appropriate new runtime based on the driver in use + +"MK_OUTPUT_USAGE" (Exit code ExProgramError) +minikube was passed an invalid value for the --output command line flag + +"MK_RUNTIME" (Exit code ExProgramError) +minikube could not configure the runtime in use, or the runtime failed + +"MK_RESERVED_PROFILE" (Exit code ExProgramConflict) +minikube was passed a reserved keyword as a profile name, which is not allowed + +"MK_ENV_SCRIPT" (Exit code ExProgramError) +minkube failed to generate script to set or unset minikube-env + +"MK_SHELL_DETECT" (Exit code ExProgramError) +minikube failed to detect the shell in use + +"MK_STATUS_JSON" (Exit code ExProgramError) +minikube failed to output JSON-formatted minikube status + +"MK_STATUS_TEXT" (Exit code ExProgramError) +minikube failed to output minikube status text + +"MK_VIEW_EXEC" (Exit code ExProgramError) +minikube failed to execute (i.e. fill in values for) a view template for displaying current config + +"MK_VIEW_TMPL" (Exit code ExProgramError) +minikube failed to create view template for displaying current config + +"MK_YAML_MARSHAL" (Exit code ExProgramError) +minikube failed to marshal a YAML object + +"MK_CREDENTIALS_NOT_FOUND" (Exit code ExProgramNotFound) +minikube could not locate credentials needed to utilize an appropriate service, e.g. GCP + +"MK_CREDENTIALS_NOT_NEEDED" (Exit code ExProgramNotFound) +minikube was passed service credentials when they were not needed, such as when using the GCP Auth addon when running in GCE + +"MK_SEMVER_PARSE" (Exit code ExProgramError) +minikube found an invalid semver string for kubernetes in the minikube constants + +"MK_DAEMONIZE" (Exit code ExProgramError) +minikube was unable to daemonize the minikube process + +"RSRC_INSUFFICIENT_CORES" (Exit code ExInsufficientCores) +insufficient cores available for use by minikube and kubernetes + +"RSRC_DOCKER_CORES" (Exit code ExInsufficientCores) +insufficient cores available for use by Docker Desktop on Mac + +"RSRC_DOCKER_CORES" (Exit code ExInsufficientCores) +insufficient cores available for use by Docker Desktop on Windows + +"RSRC_INSUFFICIENT_REQ_MEMORY" (Exit code ExInsufficientMemory) +insufficient memory (less than the recommended minimum) allocated to minikube + +"RSRC_INSUFFICIENT_SYS_MEMORY" (Exit code ExInsufficientMemory) +insufficient memory (less than the recommended minimum) available on the system running minikube + +"RSRC_INSUFFICIENT_CONTAINER_MEMORY" (Exit code ExInsufficientMemory) +insufficient memory available for the driver in use by minikube + +"RSRC_DOCKER_MEMORY" (Exit code ExInsufficientMemory) +insufficient memory available to Docker Desktop on Windows + +"RSRC_DOCKER_MEMORY" (Exit code ExInsufficientMemory) +insufficient memory available to Docker Desktop on Mac + +"RSRC_DOCKER_STORAGE" (Exit code ExInsufficientStorage) +insufficient disk storage available to the docker driver + +"RSRC_PODMAN_STORAGE" (Exit code ExInsufficientStorage) +insufficient disk storage available to the podman driver + +"RSRC_INSUFFICIENT_STORAGE" (Exit code ExInsufficientStorage) +insufficient disk storage available for running minikube and kubernetes + +"HOST_HOME_MKDIR" (Exit code ExHostPermission) +minikube could not create the minikube directory + +"HOST_HOME_CHOWN" (Exit code ExHostPermission) +minikube could not change permissions for the minikube directory + +"HOST_BROWSER" (Exit code ExHostError) +minikube failed to open the host browser, such as when running minikube dashboard + +"HOST_CONFIG_LOAD" (Exit code ExHostConfig) +minikube failed to load cluster config from the host for the profile in use + +"HOST_HOME_PERMISSION" (Exit code ExHostPermission) +the current user has insufficient permissions to create the minikube profile directory + +"HOST_CURRENT_USER" (Exit code ExHostConfig) +minikube failed to determine current user + +"HOST_DEL_CACHE" (Exit code ExHostError) +minikube failed to delete cached images from host + +"HOST_KILL_MOUNT_PROC" (Exit code ExHostError) +minikube failed to kill a mount process + +"HOST_KUBECONFIG_UPDATE" (Exit code ExHostConfig) +minikube failed to update host Kubernetes resources config + +"HOST_KUBECONFIG_DELETE_CTX" (Exit code ExHostConfig) +minikube failed to delete Kubernetes config from context for a given profile + +"HOST_KUBECTL_PROXY" (Exit code ExHostError) +minikube failed to launch a kubectl proxy + +"HOST_MOUNT_PID" (Exit code ExHostError) +minikube failed to write mount pid + +"HOST_PATH_MISSING" (Exit code ExHostNotFound) +minikube was passed a path to a host directory that does not exist + +"HOST_PATH_STAT" (Exit code ExHostError) +minikube failed to access info for a directory path + +"HOST_PURGE" (Exit code ExHostError) +minikube failed to purge minikube config directories + +"HOST_SAVE_PROFILE" (Exit code ExHostConfig) +minikube failed to persist profile config + +"PROVIDER_NOT_FOUND" (Exit code ExProviderNotFound) +minikube could not find a provider for the selected driver + +"PROVIDER_UNAVAILABLE" (Exit code ExProviderNotFound) +the host does not support or is improperly configured to support a provider for the selected driver + +"DRV_CP_ENDPOINT" (Exit code ExDriverError) +minikube failed to access the driver control plane or API endpoint + +"DRV_PORT_FORWARD" (Exit code ExDriverError) +minikube failed to bind container ports to host ports + +"DRV_UNSUPPORTED_MULTINODE" (Exit code ExDriverConflict) +the driver in use does not support multi-node clusters + +"DRV_UNSUPPORTED_OS" (Exit code ExDriverUnsupported) +the specified driver is not supported on the host OS + +"DRV_UNSUPPORTED_PROFILE" (Exit code ExDriverUnsupported) +the driver in use does not support the selected profile or multiple profiles + +"DRV_NOT_FOUND" (Exit code ExDriverNotFound) +minikube failed to locate specified driver + +"DRV_NOT_DETECTED" (Exit code ExDriverNotFound) +minikube could not find a valid driver + +"DRV_NOT_HEALTHY" (Exit code ExDriverNotFound) +minikube found drivers but none were ready to use + +"DRV_DOCKER_NOT_RUNNING" (Exit code ExDriverNotFound) +minikube found the docker driver but the docker service was not running + +"DRV_AS_ROOT" (Exit code ExDriverPermission) +the driver in use is being run as root + +"DRV_NEEDS_ROOT" (Exit code ExDriverPermission) +the specified driver needs to be run as root + +"GUEST_CACHE_LOAD" (Exit code ExGuestError) +minikube failed to load cached images + +"GUEST_CERT" (Exit code ExGuestError) +minikube failed to setup certificates + +"GUEST_CP_CONFIG" (Exit code ExGuestConfig) +minikube failed to access the control plane + +"GUEST_DELETION" (Exit code ExGuestError) +minikube failed to properly delete a resource, such as a profile + +"GUEST_IMAGE_LIST" (Exit code ExGuestError) +minikube failed to list images on the machine + +"GUEST_IMAGE_LOAD" (Exit code ExGuestError) +minikube failed to pull or load an image + +"GUEST_IMAGE_REMOVE" (Exit code ExGuestError) +minikube failed to remove an image + +"GUEST_IMAGE_BUILD" (Exit code ExGuestError) +minikube failed to build an image + +"GUEST_LOAD_HOST" (Exit code ExGuestError) +minikube failed to load host + +"GUEST_MOUNT" (Exit code ExGuestError) +minkube failed to create a mount + +"GUEST_MOUNT_COULD_NOT_CONNECT" (Exit code ExGuestError) +mount on guest was unable to connect to host mount server + +"GUEST_MOUNT_CONFLICT" (Exit code ExGuestConflict) +minkube failed to update a mount + +"GUEST_NODE_ADD" (Exit code ExGuestError) +minikube failed to add a node to the cluster + +"GUEST_NODE_DELETE" (Exit code ExGuestError) +minikube failed to remove a node from the cluster + +"GUEST_NODE_PROVISION" (Exit code ExGuestError) +minikube failed to provision a node + +"GUEST_NODE_RETRIEVE" (Exit code ExGuestNotFound) +minikube failed to retrieve information for a cluster node + +"GUEST_NODE_START" (Exit code ExGuestError) +minikube failed to startup a cluster node + +"GUEST_PAUSE" (Exit code ExGuestError) +minikube failed to pause the cluster process + +"GUEST_PROFILE_DELETION" (Exit code ExGuestError) +minikube failed to delete a machine profile directory + +"GUEST_PROVISION" (Exit code ExGuestError) +minikube failed while attempting to provision the guest + +"GUEST_PROVISION_CONTAINER_EXITED" (Exit code ExGuestError) +docker container exited prematurely during provisioning + +"GUEST_START" (Exit code ExGuestError) +minikube failed to start a node with current driver + +"GUEST_STATUS" (Exit code ExGuestError) +minikube failed to get docker machine status + +"GUEST_STOP_TIMEOUT" (Exit code ExGuestTimeout) +stopping the cluster process timed out + +"GUEST_UNPAUSE" (Exit code ExGuestError) +minikube failed to unpause the cluster process + +"GUEST_CHECK_PAUSED" (Exit code ExGuestError) +minikube failed to check if Kubernetes containers are paused + +"GUEST_DRIVER_MISMATCH" (Exit code ExGuestConflict) +minikube cluster was created used a driver that is incompatible with the driver being requested + +"GUEST_MISSING_CONNTRACK" (Exit code ExGuestUnsupported) +minikube could not find conntrack on the host, which is required from Kubernetes 1.18 onwards + +"IF_HOST_IP" (Exit code ExLocalNetworkError) +minikube failed to get the host IP to use from within the VM + +"IF_MOUNT_IP" (Exit code ExLocalNetworkError) +minikube failed to parse the input IP address for mount + +"IF_MOUNT_PORT" (Exit code ExLocalNetworkError) +minikube failed to parse or find port for mount + +"IF_SSH_CLIENT" (Exit code ExLocalNetworkError) +minikube failed to access an ssh client on the host machine + +"INET_CACHE_BINARIES" (Exit code ExInternetError) +minikube failed to cache kubernetes binaries for the current runtime + +"INET_CACHE_KUBECTL" (Exit code ExInternetError) +minikube failed to cache the kubectl binary + +"INET_CACHE_TAR" (Exit code ExInternetError) +minikube failed to cache required images to tar files + +"INET_REPO" (Exit code ExInternetError) +minikube was unable to access main repository and mirrors for images + +"INET_REPOS_UNAVAILABLE" (Exit code ExInternetError) +minikube was unable to access any known image repositories + +"INET_VERSION_UNAVAILABLE" (Exit code ExInternetUnavailable) +minikube was unable to fetch latest release/version info for minkikube + +"INET_VERSION_EMPTY" (Exit code ExInternetConfig) +minikube received invalid empty data for latest release/version info from the server + +"RUNTIME_ENABLE" (Exit code ExRuntimeError) +minikube failed to enable the current container runtime + +"RUNTIME_CACHE" (Exit code ExRuntimeError) +minikube failed to cache images for the current container runtime + +"SVC_CHECK_TIMEOUT" (Exit code ExSvcTimeout) +service check timed out while starting minikube dashboard + +"SVC_TIMEOUT" (Exit code ExSvcTimeout) +minikube was unable to access a service + +"SVC_LIST" (Exit code ExSvcError) +minikube failed to list services for the specified namespace + +"SVC_TUNNEL_START" (Exit code ExSvcError) +minikube failed to start a tunnel + +"SVC_TUNNEL_STOP" (Exit code ExSvcError) +minikube could not stop an active tunnel + +"SVC_URL_TIMEOUT" (Exit code ExSvcTimeout) +minikube was unable to access the service url + +"SVC_NOT_FOUND" (Exit code ExSvcNotFound) +minikube couldn't find the specified service in the specified namespace + +"ENV_DRIVER_CONFLICT" (Exit code ExDriverConflict) +user attempted to use a command that is not supported by the driver currently in use + +"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_PODMAN_UNAVAILABLE" (Exit code ExRuntimeUnavailable) +the podman service was unavailable to the cluster + +"SVC_ADDON_UNSUPPORTED" (Exit code ExSvcUnsupported) +user attempted to use an addon that is not supported + +"SVC_ADDON_NOT_ENABLED" (Exit code ExProgramConflict) +user attempted to use an addon that is currently not enabled + +"K8S_INSTALL_FAILED" (Exit code ExControlPlaneError) +minikube failed to update the Kubernetes cluster + +"K8S_INSTALL_FAILED_CONTAINER_RUNTIME_NOT_RUNNING" (Exit code ExRuntimeNotRunning) +minikube failed to update the Kubernetes cluster because the container runtime was unavailable + +"K8S_OLD_UNSUPPORTED" (Exit code ExControlPlaneUnsupported) +an outdated Kubernetes version was specified for minikube to use + +"K8S_DOWNGRADE_UNSUPPORTED" (Exit code ExControlPlaneUnsupported) +minikube was unable to safely downgrade installed Kubernetes version + diff --git a/site/content/en/docs/contrib/guide.en.md b/site/content/en/docs/contrib/guide.en.md index e53ea56008..b5784c2d89 100644 --- a/site/content/en/docs/contrib/guide.en.md +++ b/site/content/en/docs/contrib/guide.en.md @@ -19,7 +19,7 @@ We'd love to accept your patches! Before we can take them, [please fill out eith * ["good first issue"](https://github.com/kubernetes/minikube/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - issues where there is a clear path to resolution * ["help wanted"](https://github.com/kubernetes/minikube/issues?utf8=%E2%9C%93&q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22+) - issues where we've identified a need but not resources to work on them -"priority/important-soon" or "priority/important-longterm: - high impact issues that need to be addressed in the next couple of releases. +* ["priority/important-soon"](https://github.com/kubernetes/minikube/issues?q=is%3Aopen+is%3Aissue+label%3Apriority%2Fimportant-soon) or ["priority/important-longterm"](https://github.com/kubernetes/minikube/issues?q=is%3Aopen+is%3Aissue+label%3Apriority%2Fimportant-longterm) - high impact issues that need to be addressed in the next couple of releases. * Ask on the #minikube Slack if you aren't sure diff --git a/site/content/en/docs/contrib/leaderboard/_index.md b/site/content/en/docs/contrib/leaderboard/_index.md new file mode 100644 index 0000000000..f122356b13 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/_index.md @@ -0,0 +1,7 @@ +--- +title: "Triage & Contributions Leaderboard" +linkTitle: "Triage & Contributions Leaderboard" +weight: 10 +description: > + Contributions split by release +--- \ No newline at end of file diff --git a/site/content/en/docs/contrib/leaderboard/v0.10.0.html b/site/content/en/docs/contrib/leaderboard/v0.10.0.html new file mode 100644 index 0000000000..0a804a85f4 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.10.0.html @@ -0,0 +1,452 @@ +--- +title: "v0.10.0 - 2016-09-15" +linkTitle: "v0.10.0 - 2016-09-15" +weight: -10 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-09-01 — 2016-09-15
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.11.0.html b/site/content/en/docs/contrib/leaderboard/v0.11.0.html new file mode 100644 index 0000000000..6aec2261cf --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.11.0.html @@ -0,0 +1,443 @@ +--- +title: "v0.11.0 - 2016-10-06" +linkTitle: "v0.11.0 - 2016-10-06" +weight: -11 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-09-15 — 2016-10-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.12.0.html b/site/content/en/docs/contrib/leaderboard/v0.12.0.html new file mode 100644 index 0000000000..171f5993ac --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.12.0.html @@ -0,0 +1,446 @@ +--- +title: "v0.12.0 - 2016-10-21" +linkTitle: "v0.12.0 - 2016-10-21" +weight: -12 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-10-06 — 2016-10-21
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.12.1.html b/site/content/en/docs/contrib/leaderboard/v0.12.1.html new file mode 100644 index 0000000000..867d562116 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.12.1.html @@ -0,0 +1,430 @@ +--- +title: "v0.12.1 - 2016-10-28" +linkTitle: "v0.12.1 - 2016-10-28" +weight: -13 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-10-21 — 2016-10-28
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.12.2.html b/site/content/en/docs/contrib/leaderboard/v0.12.2.html new file mode 100644 index 0000000000..94d5cb977b --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.12.2.html @@ -0,0 +1,424 @@ +--- +title: "v0.12.2 - 2016-10-31" +linkTitle: "v0.12.2 - 2016-10-31" +weight: -14 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-10-28 — 2016-10-31
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.13.0.html b/site/content/en/docs/contrib/leaderboard/v0.13.0.html new file mode 100644 index 0000000000..2804751208 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.13.0.html @@ -0,0 +1,451 @@ +--- +title: "v0.13.0 - 2016-12-01" +linkTitle: "v0.13.0 - 2016-12-01" +weight: -15 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-10-31 — 2016-12-01
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.13.1.html b/site/content/en/docs/contrib/leaderboard/v0.13.1.html new file mode 100644 index 0000000000..693a761d7f --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.13.1.html @@ -0,0 +1,411 @@ +--- +title: "v0.13.1 - 2016-12-05" +linkTitle: "v0.13.1 - 2016-12-05" +weight: -16 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-12-01 — 2016-12-05
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.14.0.html b/site/content/en/docs/contrib/leaderboard/v0.14.0.html new file mode 100644 index 0000000000..aa5091853b --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.14.0.html @@ -0,0 +1,417 @@ +--- +title: "v0.14.0 - 2016-12-14" +linkTitle: "v0.14.0 - 2016-12-14" +weight: -17 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-12-05 — 2016-12-14
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.15.0.html b/site/content/en/docs/contrib/leaderboard/v0.15.0.html new file mode 100644 index 0000000000..99132e4488 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.15.0.html @@ -0,0 +1,436 @@ +--- +title: "v0.15.0 - 2017-01-10" +linkTitle: "v0.15.0 - 2017-01-10" +weight: -18 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-12-14 — 2017-01-10
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.16.0.html b/site/content/en/docs/contrib/leaderboard/v0.16.0.html new file mode 100644 index 0000000000..ee4bc3bad0 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.16.0.html @@ -0,0 +1,439 @@ +--- +title: "v0.16.0 - 2017-02-02" +linkTitle: "v0.16.0 - 2017-02-02" +weight: -19 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-01-10 — 2017-02-02
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.17.0.html b/site/content/en/docs/contrib/leaderboard/v0.17.0.html new file mode 100644 index 0000000000..763810aaaa --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.17.0.html @@ -0,0 +1,463 @@ +--- +title: "v0.17.0 - 2017-03-02" +linkTitle: "v0.17.0 - 2017-03-02" +weight: -20 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-02-02 — 2017-03-02
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.17.1.html b/site/content/en/docs/contrib/leaderboard/v0.17.1.html new file mode 100644 index 0000000000..8ec838c19b --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.17.1.html @@ -0,0 +1,394 @@ +--- +title: "v0.17.1 - 2017-03-02" +linkTitle: "v0.17.1 - 2017-03-02" +weight: -21 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-03-02 — 2017-03-02
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.18.0.html b/site/content/en/docs/contrib/leaderboard/v0.18.0.html new file mode 100644 index 0000000000..f524663a21 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.18.0.html @@ -0,0 +1,460 @@ +--- +title: "v0.18.0 - 2017-04-07" +linkTitle: "v0.18.0 - 2017-04-07" +weight: -22 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-03-02 — 2017-04-07
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.19.0.html b/site/content/en/docs/contrib/leaderboard/v0.19.0.html new file mode 100644 index 0000000000..5dd232b0af --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.19.0.html @@ -0,0 +1,454 @@ +--- +title: "v0.19.0 - 2017-05-09" +linkTitle: "v0.19.0 - 2017-05-09" +weight: -23 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-04-07 — 2017-05-09
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.19.1.html b/site/content/en/docs/contrib/leaderboard/v0.19.1.html new file mode 100644 index 0000000000..bbe6de75df --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.19.1.html @@ -0,0 +1,448 @@ +--- +title: "v0.19.1 - 2017-05-30" +linkTitle: "v0.19.1 - 2017-05-30" +weight: -24 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-05-09 — 2017-05-30
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.2.0.html b/site/content/en/docs/contrib/leaderboard/v0.2.0.html new file mode 100644 index 0000000000..c28c496100 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.2.0.html @@ -0,0 +1,413 @@ +--- +title: "v0.2.0 - 2016-06-03" +linkTitle: "v0.2.0 - 2016-06-03" +weight: -1 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-05-30 — 2016-06-03
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.20.0.html b/site/content/en/docs/contrib/leaderboard/v0.20.0.html new file mode 100644 index 0000000000..178dadc4a3 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.20.0.html @@ -0,0 +1,460 @@ +--- +title: "v0.20.0 - 2017-06-21" +linkTitle: "v0.20.0 - 2017-06-21" +weight: -25 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-05-30 — 2017-06-21
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.21.0.html b/site/content/en/docs/contrib/leaderboard/v0.21.0.html new file mode 100644 index 0000000000..81bcca6c18 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.21.0.html @@ -0,0 +1,472 @@ +--- +title: "v0.21.0 - 2017-07-25" +linkTitle: "v0.21.0 - 2017-07-25" +weight: -26 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-06-21 — 2017-07-25
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.22.0.html b/site/content/en/docs/contrib/leaderboard/v0.22.0.html new file mode 100644 index 0000000000..aa18d6ea78 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.22.0.html @@ -0,0 +1,484 @@ +--- +title: "v0.22.0 - 2017-09-07" +linkTitle: "v0.22.0 - 2017-09-07" +weight: -27 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-07-25 — 2017-09-07
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.22.1.html b/site/content/en/docs/contrib/leaderboard/v0.22.1.html new file mode 100644 index 0000000000..edb5a32176 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.22.1.html @@ -0,0 +1,410 @@ +--- +title: "v0.22.1 - 2017-09-11" +linkTitle: "v0.22.1 - 2017-09-11" +weight: -28 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-09-07 — 2017-09-11
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.22.2.html b/site/content/en/docs/contrib/leaderboard/v0.22.2.html new file mode 100644 index 0000000000..77e2b07d90 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.22.2.html @@ -0,0 +1,419 @@ +--- +title: "v0.22.2 - 2017-09-18" +linkTitle: "v0.22.2 - 2017-09-18" +weight: -29 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-09-11 — 2017-09-18
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.22.3.html b/site/content/en/docs/contrib/leaderboard/v0.22.3.html new file mode 100644 index 0000000000..2ead5396fa --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.22.3.html @@ -0,0 +1,448 @@ +--- +title: "v0.22.3 - 2017-10-06" +linkTitle: "v0.22.3 - 2017-10-06" +weight: -30 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-09-18 — 2017-10-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.23.0.html b/site/content/en/docs/contrib/leaderboard/v0.23.0.html new file mode 100644 index 0000000000..9339f8fd9d --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.23.0.html @@ -0,0 +1,472 @@ +--- +title: "v0.23.0 - 2017-10-26" +linkTitle: "v0.23.0 - 2017-10-26" +weight: -31 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-10-06 — 2017-10-26
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.24.0.html b/site/content/en/docs/contrib/leaderboard/v0.24.0.html new file mode 100644 index 0000000000..554a04ecb7 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.24.0.html @@ -0,0 +1,483 @@ +--- +title: "v0.24.0 - 2017-11-29" +linkTitle: "v0.24.0 - 2017-11-29" +weight: -32 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-10-26 — 2017-11-29
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.24.1.html b/site/content/en/docs/contrib/leaderboard/v0.24.1.html new file mode 100644 index 0000000000..c08abd0018 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.24.1.html @@ -0,0 +1,413 @@ +--- +title: "v0.24.1 - 2017-11-30" +linkTitle: "v0.24.1 - 2017-11-30" +weight: -33 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-11-29 — 2017-11-30
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.25.0.html b/site/content/en/docs/contrib/leaderboard/v0.25.0.html new file mode 100644 index 0000000000..eb32ab184b --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.25.0.html @@ -0,0 +1,492 @@ +--- +title: "v0.25.0 - 2018-01-26" +linkTitle: "v0.25.0 - 2018-01-26" +weight: -34 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2017-11-30 — 2018-01-26
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.25.1.html b/site/content/en/docs/contrib/leaderboard/v0.25.1.html new file mode 100644 index 0000000000..92e58d3e85 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.25.1.html @@ -0,0 +1,485 @@ +--- +title: "v0.25.1 - 2018-03-21" +linkTitle: "v0.25.1 - 2018-03-21" +weight: -35 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-01-26 — 2018-03-21
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.25.2.html b/site/content/en/docs/contrib/leaderboard/v0.25.2.html new file mode 100644 index 0000000000..a1c4da98fd --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.25.2.html @@ -0,0 +1,399 @@ +--- +title: "v0.25.2 - 2018-03-22" +linkTitle: "v0.25.2 - 2018-03-22" +weight: -36 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-03-21 — 2018-03-22
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.26.0.html b/site/content/en/docs/contrib/leaderboard/v0.26.0.html new file mode 100644 index 0000000000..0073db9aca --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.26.0.html @@ -0,0 +1,433 @@ +--- +title: "v0.26.0 - 2018-04-10" +linkTitle: "v0.26.0 - 2018-04-10" +weight: -37 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-03-22 — 2018-04-10
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.26.1.html b/site/content/en/docs/contrib/leaderboard/v0.26.1.html new file mode 100644 index 0000000000..b3f6ec89e8 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.26.1.html @@ -0,0 +1,439 @@ +--- +title: "v0.26.1 - 2018-04-17" +linkTitle: "v0.26.1 - 2018-04-17" +weight: -38 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-04-10 — 2018-04-17
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.27.0.html b/site/content/en/docs/contrib/leaderboard/v0.27.0.html new file mode 100644 index 0000000000..def99c4a4f --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.27.0.html @@ -0,0 +1,433 @@ +--- +title: "v0.27.0 - 2018-05-14" +linkTitle: "v0.27.0 - 2018-05-14" +weight: -39 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-04-17 — 2018-05-14
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.28.0.html b/site/content/en/docs/contrib/leaderboard/v0.28.0.html new file mode 100644 index 0000000000..29eba20c1f --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.28.0.html @@ -0,0 +1,467 @@ +--- +title: "v0.28.0 - 2018-06-13" +linkTitle: "v0.28.0 - 2018-06-13" +weight: -40 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-05-14 — 2018-06-13
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.28.1.html b/site/content/en/docs/contrib/leaderboard/v0.28.1.html new file mode 100644 index 0000000000..9aaebf9acf --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.28.1.html @@ -0,0 +1,458 @@ +--- +title: "v0.28.1 - 2018-07-16" +linkTitle: "v0.28.1 - 2018-07-16" +weight: -41 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-06-13 — 2018-07-16
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.28.2.html b/site/content/en/docs/contrib/leaderboard/v0.28.2.html new file mode 100644 index 0000000000..705b591330 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.28.2.html @@ -0,0 +1,423 @@ +--- +title: "v0.28.2 - 2018-07-23" +linkTitle: "v0.28.2 - 2018-07-23" +weight: -42 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-07-16 — 2018-07-23
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.29.0.html b/site/content/en/docs/contrib/leaderboard/v0.29.0.html new file mode 100644 index 0000000000..3b441ca847 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.29.0.html @@ -0,0 +1,498 @@ +--- +title: "v0.29.0 - 2018-09-27" +linkTitle: "v0.29.0 - 2018-09-27" +weight: -43 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-07-23 — 2018-09-27
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.3.0.html b/site/content/en/docs/contrib/leaderboard/v0.3.0.html new file mode 100644 index 0000000000..8d810bade8 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.3.0.html @@ -0,0 +1,420 @@ +--- +title: "v0.3.0 - 2016-06-10" +linkTitle: "v0.3.0 - 2016-06-10" +weight: -2 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-06-03 — 2016-06-10
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.30.0.html b/site/content/en/docs/contrib/leaderboard/v0.30.0.html new file mode 100644 index 0000000000..d1d03b43aa --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.30.0.html @@ -0,0 +1,450 @@ +--- +title: "v0.30.0 - 2018-10-05" +linkTitle: "v0.30.0 - 2018-10-05" +weight: -44 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-09-27 — 2018-10-05
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.31.0.html b/site/content/en/docs/contrib/leaderboard/v0.31.0.html new file mode 100644 index 0000000000..a94d429a42 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.31.0.html @@ -0,0 +1,508 @@ +--- +title: "v0.31.0 - 2018-12-10" +linkTitle: "v0.31.0 - 2018-12-10" +weight: -45 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-10-05 — 2018-12-10
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.32.0.html b/site/content/en/docs/contrib/leaderboard/v0.32.0.html new file mode 100644 index 0000000000..865aa4e7b3 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.32.0.html @@ -0,0 +1,439 @@ +--- +title: "v0.32.0 - 2018-12-21" +linkTitle: "v0.32.0 - 2018-12-21" +weight: -46 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-12-10 — 2018-12-21
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.33.0.html b/site/content/en/docs/contrib/leaderboard/v0.33.0.html new file mode 100644 index 0000000000..9d27e08727 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.33.0.html @@ -0,0 +1,456 @@ +--- +title: "v0.33.0 - 2019-01-17" +linkTitle: "v0.33.0 - 2019-01-17" +weight: -47 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2018-12-21 — 2019-01-17
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.33.1.html b/site/content/en/docs/contrib/leaderboard/v0.33.1.html new file mode 100644 index 0000000000..16d2911803 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.33.1.html @@ -0,0 +1,407 @@ +--- +title: "v0.33.1 - 2019-01-18" +linkTitle: "v0.33.1 - 2019-01-18" +weight: -48 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-01-17 — 2019-01-18
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.34.0.html b/site/content/en/docs/contrib/leaderboard/v0.34.0.html new file mode 100644 index 0000000000..66ebf25ac0 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.34.0.html @@ -0,0 +1,489 @@ +--- +title: "v0.34.0 - 2019-02-15" +linkTitle: "v0.34.0 - 2019-02-15" +weight: -49 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-01-18 — 2019-02-15
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.34.1.html b/site/content/en/docs/contrib/leaderboard/v0.34.1.html new file mode 100644 index 0000000000..8cb550fa49 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.34.1.html @@ -0,0 +1,419 @@ +--- +title: "v0.34.1 - 2019-02-16" +linkTitle: "v0.34.1 - 2019-02-16" +weight: -50 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-02-15 — 2019-02-16
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.35.0.html b/site/content/en/docs/contrib/leaderboard/v0.35.0.html new file mode 100644 index 0000000000..19687f9b0b --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.35.0.html @@ -0,0 +1,449 @@ +--- +title: "v0.35.0 - 2019-03-06" +linkTitle: "v0.35.0 - 2019-03-06" +weight: -51 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-02-16 — 2019-03-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.4.0.html b/site/content/en/docs/contrib/leaderboard/v0.4.0.html new file mode 100644 index 0000000000..fc530a7118 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.4.0.html @@ -0,0 +1,421 @@ +--- +title: "v0.4.0 - 2016-06-27" +linkTitle: "v0.4.0 - 2016-06-27" +weight: -3 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-06-10 — 2016-06-27
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.5.0.html b/site/content/en/docs/contrib/leaderboard/v0.5.0.html new file mode 100644 index 0000000000..8eeac3ff13 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.5.0.html @@ -0,0 +1,432 @@ +--- +title: "v0.5.0 - 2016-07-06" +linkTitle: "v0.5.0 - 2016-07-06" +weight: -4 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-06-27 — 2016-07-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.6.0.html b/site/content/en/docs/contrib/leaderboard/v0.6.0.html new file mode 100644 index 0000000000..e1f1a6c694 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.6.0.html @@ -0,0 +1,425 @@ +--- +title: "v0.6.0 - 2016-07-13" +linkTitle: "v0.6.0 - 2016-07-13" +weight: -5 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-07-06 — 2016-07-13
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.7.0.html b/site/content/en/docs/contrib/leaderboard/v0.7.0.html new file mode 100644 index 0000000000..da5807ed4e --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.7.0.html @@ -0,0 +1,427 @@ +--- +title: "v0.7.0 - 2016-07-26" +linkTitle: "v0.7.0 - 2016-07-26" +weight: -6 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-07-13 — 2016-07-26
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.7.1.html b/site/content/en/docs/contrib/leaderboard/v0.7.1.html new file mode 100644 index 0000000000..5b997cbf7b --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.7.1.html @@ -0,0 +1,420 @@ +--- +title: "v0.7.1 - 2016-07-28" +linkTitle: "v0.7.1 - 2016-07-28" +weight: -7 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-07-26 — 2016-07-28
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.8.0.html b/site/content/en/docs/contrib/leaderboard/v0.8.0.html new file mode 100644 index 0000000000..103d119a3a --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.8.0.html @@ -0,0 +1,445 @@ +--- +title: "v0.8.0 - 2016-08-17" +linkTitle: "v0.8.0 - 2016-08-17" +weight: -8 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-07-28 — 2016-08-17
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v0.9.0.html b/site/content/en/docs/contrib/leaderboard/v0.9.0.html new file mode 100644 index 0000000000..a7e4c0af62 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v0.9.0.html @@ -0,0 +1,429 @@ +--- +title: "v0.9.0 - 2016-09-01" +linkTitle: "v0.9.0 - 2016-09-01" +weight: -9 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2016-08-17 — 2016-09-01
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.0.0.html b/site/content/en/docs/contrib/leaderboard/v1.0.0.html new file mode 100644 index 0000000000..f28eeaccd6 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.0.0.html @@ -0,0 +1,466 @@ +--- +title: "v1.0.0 - 2019-03-27" +linkTitle: "v1.0.0 - 2019-03-27" +weight: -52 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-03-06 — 2019-03-27
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.0.1.html b/site/content/en/docs/contrib/leaderboard/v1.0.1.html new file mode 100644 index 0000000000..9206c2ba7c --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.0.1.html @@ -0,0 +1,460 @@ +--- +title: "v1.0.1 - 2019-04-27" +linkTitle: "v1.0.1 - 2019-04-27" +weight: -53 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-03-27 — 2019-04-27
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.1.0.html b/site/content/en/docs/contrib/leaderboard/v1.1.0.html new file mode 100644 index 0000000000..25f58fcd35 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.1.0.html @@ -0,0 +1,479 @@ +--- +title: "v1.1.0 - 2019-05-21" +linkTitle: "v1.1.0 - 2019-05-21" +weight: -54 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-04-27 — 2019-05-21
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.1.1.html b/site/content/en/docs/contrib/leaderboard/v1.1.1.html new file mode 100644 index 0000000000..d376e82ea5 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.1.1.html @@ -0,0 +1,481 @@ +--- +title: "v1.1.1 - 2019-06-07" +linkTitle: "v1.1.1 - 2019-06-07" +weight: -55 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-05-21 — 2019-06-07
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.10.0.html b/site/content/en/docs/contrib/leaderboard/v1.10.0.html new file mode 100644 index 0000000000..facf870532 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.10.0.html @@ -0,0 +1,496 @@ +--- +title: "v1.10.0 - 2020-05-12" +linkTitle: "v1.10.0 - 2020-05-12" +weight: -76 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-04-04 — 2020-05-12
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.10.1.html b/site/content/en/docs/contrib/leaderboard/v1.10.1.html new file mode 100644 index 0000000000..4adee12fef --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.10.1.html @@ -0,0 +1,411 @@ +--- +title: "v1.10.1 - 2020-05-13" +linkTitle: "v1.10.1 - 2020-05-13" +weight: -77 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-05-12 — 2020-05-13
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.11.0.html b/site/content/en/docs/contrib/leaderboard/v1.11.0.html new file mode 100644 index 0000000000..d7bff894a1 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.11.0.html @@ -0,0 +1,482 @@ +--- +title: "v1.11.0 - 2020-05-29" +linkTitle: "v1.11.0 - 2020-05-29" +weight: -78 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-05-13 — 2020-05-29
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.12.0.html b/site/content/en/docs/contrib/leaderboard/v1.12.0.html new file mode 100644 index 0000000000..caf57f663c --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.12.0.html @@ -0,0 +1,515 @@ +--- +title: "v1.12.0 - 2020-07-09" +linkTitle: "v1.12.0 - 2020-07-09" +weight: -79 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-05-29 — 2020-07-09
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.12.1.html b/site/content/en/docs/contrib/leaderboard/v1.12.1.html new file mode 100644 index 0000000000..bd915e75fb --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.12.1.html @@ -0,0 +1,476 @@ +--- +title: "v1.12.1 - 2020-07-17" +linkTitle: "v1.12.1 - 2020-07-17" +weight: -80 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-07-09 — 2020-07-17
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.12.2.html b/site/content/en/docs/contrib/leaderboard/v1.12.2.html new file mode 100644 index 0000000000..8efd2be145 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.12.2.html @@ -0,0 +1,493 @@ +--- +title: "v1.12.2 - 2020-08-04" +linkTitle: "v1.12.2 - 2020-08-04" +weight: -81 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-07-17 — 2020-08-04
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.12.3.html b/site/content/en/docs/contrib/leaderboard/v1.12.3.html new file mode 100644 index 0000000000..66677ad39a --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.12.3.html @@ -0,0 +1,466 @@ +--- +title: "v1.12.3 - 2020-08-12" +linkTitle: "v1.12.3 - 2020-08-12" +weight: -82 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-08-04 — 2020-08-12
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.13.0.html b/site/content/en/docs/contrib/leaderboard/v1.13.0.html new file mode 100644 index 0000000000..67f146e7b3 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.13.0.html @@ -0,0 +1,492 @@ +--- +title: "v1.13.0 - 2020-09-03" +linkTitle: "v1.13.0 - 2020-09-03" +weight: -83 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-08-12 — 2020-09-03
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.13.1.html b/site/content/en/docs/contrib/leaderboard/v1.13.1.html new file mode 100644 index 0000000000..84c3da6725 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.13.1.html @@ -0,0 +1,473 @@ +--- +title: "v1.13.1 - 2020-09-21" +linkTitle: "v1.13.1 - 2020-09-21" +weight: -84 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-09-03 — 2020-09-21
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.14.0.html b/site/content/en/docs/contrib/leaderboard/v1.14.0.html new file mode 100644 index 0000000000..be37ee859f --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.14.0.html @@ -0,0 +1,489 @@ +--- +title: "v1.14.0 - 2020-10-12" +linkTitle: "v1.14.0 - 2020-10-12" +weight: -85 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-09-21 — 2020-10-12
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.14.1.html b/site/content/en/docs/contrib/leaderboard/v1.14.1.html new file mode 100644 index 0000000000..9d4080d633 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.14.1.html @@ -0,0 +1,491 @@ +--- +title: "v1.14.1 - 2020-10-23" +linkTitle: "v1.14.1 - 2020-10-23" +weight: -86 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-10-12 — 2020-10-23
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.14.2.html b/site/content/en/docs/contrib/leaderboard/v1.14.2.html new file mode 100644 index 0000000000..ef150992bd --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.14.2.html @@ -0,0 +1,423 @@ +--- +title: "v1.14.2 - 2020-10-27" +linkTitle: "v1.14.2 - 2020-10-27" +weight: -87 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-10-23 — 2020-10-27
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.15.0.html b/site/content/en/docs/contrib/leaderboard/v1.15.0.html new file mode 100644 index 0000000000..bf2b743862 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.15.0.html @@ -0,0 +1,484 @@ +--- +title: "v1.15.0 - 2020-11-13" +linkTitle: "v1.15.0 - 2020-11-13" +weight: -88 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-10-27 — 2020-11-13
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.15.1.html b/site/content/en/docs/contrib/leaderboard/v1.15.1.html new file mode 100644 index 0000000000..13b2c5e53c --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.15.1.html @@ -0,0 +1,427 @@ +--- +title: "v1.15.1 - 2020-11-16" +linkTitle: "v1.15.1 - 2020-11-16" +weight: -89 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-11-13 — 2020-11-16
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.16.0.html b/site/content/en/docs/contrib/leaderboard/v1.16.0.html new file mode 100644 index 0000000000..451dd078d1 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.16.0.html @@ -0,0 +1,508 @@ +--- +title: "v1.16.0 - 2020-12-17" +linkTitle: "v1.16.0 - 2020-12-17" +weight: -90 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-11-16 — 2020-12-17
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.17.0.html b/site/content/en/docs/contrib/leaderboard/v1.17.0.html new file mode 100644 index 0000000000..bdf5733717 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.17.0.html @@ -0,0 +1,497 @@ +--- +title: "v1.17.0 - 2021-01-22" +linkTitle: "v1.17.0 - 2021-01-22" +weight: -91 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-12-17 — 2021-01-22
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.17.1.html b/site/content/en/docs/contrib/leaderboard/v1.17.1.html new file mode 100644 index 0000000000..0c44c56ccc --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.17.1.html @@ -0,0 +1,460 @@ +--- +title: "v1.17.1 - 2021-01-28" +linkTitle: "v1.17.1 - 2021-01-28" +weight: -92 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-01-22 — 2021-01-28
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.18.0.html b/site/content/en/docs/contrib/leaderboard/v1.18.0.html new file mode 100644 index 0000000000..0991a098df --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.18.0.html @@ -0,0 +1,500 @@ +--- +title: "v1.18.0 - 2021-03-01" +linkTitle: "v1.18.0 - 2021-03-01" +weight: -93 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-01-28 — 2021-03-01
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.18.1.html b/site/content/en/docs/contrib/leaderboard/v1.18.1.html new file mode 100644 index 0000000000..cb7f2ab2ea --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.18.1.html @@ -0,0 +1,444 @@ +--- +title: "v1.18.1 - 2021-03-04" +linkTitle: "v1.18.1 - 2021-03-04" +weight: -94 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-03-01 — 2021-03-04
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.19.0.html b/site/content/en/docs/contrib/leaderboard/v1.19.0.html new file mode 100644 index 0000000000..5003cea316 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.19.0.html @@ -0,0 +1,509 @@ +--- +title: "v1.19.0 - 2021-04-09" +linkTitle: "v1.19.0 - 2021-04-09" +weight: -95 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-03-04 — 2021-04-09
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.2.0.html b/site/content/en/docs/contrib/leaderboard/v1.2.0.html new file mode 100644 index 0000000000..0798a89542 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.2.0.html @@ -0,0 +1,441 @@ +--- +title: "v1.2.0 - 2019-06-24" +linkTitle: "v1.2.0 - 2019-06-24" +weight: -56 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-06-07 — 2019-06-24
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.20.0.html b/site/content/en/docs/contrib/leaderboard/v1.20.0.html new file mode 100644 index 0000000000..efa8b9575a --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.20.0.html @@ -0,0 +1,492 @@ +--- +title: "v1.20.0 - 2021-05-06" +linkTitle: "v1.20.0 - 2021-05-06" +weight: -96 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-04-09 — 2021-05-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.21.0.html b/site/content/en/docs/contrib/leaderboard/v1.21.0.html new file mode 100644 index 0000000000..e497ff1b04 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.21.0.html @@ -0,0 +1,496 @@ +--- +title: "v1.21.0 - 2021-06-11" +linkTitle: "v1.21.0 - 2021-06-11" +weight: -97 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-05-06 — 2021-06-11
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.22.0.html b/site/content/en/docs/contrib/leaderboard/v1.22.0.html new file mode 100644 index 0000000000..4055e04a32 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.22.0.html @@ -0,0 +1,498 @@ +--- +title: "v1.22.0 - 2021-07-07" +linkTitle: "v1.22.0 - 2021-07-07" +weight: -98 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2021-06-11 — 2021-07-07
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.3.0.html b/site/content/en/docs/contrib/leaderboard/v1.3.0.html new file mode 100644 index 0000000000..577e1e9d43 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.3.0.html @@ -0,0 +1,509 @@ +--- +title: "v1.3.0 - 2019-08-05" +linkTitle: "v1.3.0 - 2019-08-05" +weight: -57 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-06-24 — 2019-08-05
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.3.1.html b/site/content/en/docs/contrib/leaderboard/v1.3.1.html new file mode 100644 index 0000000000..b9199a5a9c --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.3.1.html @@ -0,0 +1,453 @@ +--- +title: "v1.3.1 - 2019-08-13" +linkTitle: "v1.3.1 - 2019-08-13" +weight: -58 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-08-05 — 2019-08-13
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.4.0.html b/site/content/en/docs/contrib/leaderboard/v1.4.0.html new file mode 100644 index 0000000000..7717a557d2 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.4.0.html @@ -0,0 +1,505 @@ +--- +title: "v1.4.0 - 2019-09-19" +linkTitle: "v1.4.0 - 2019-09-19" +weight: -59 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-08-13 — 2019-09-19
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.5.0.html b/site/content/en/docs/contrib/leaderboard/v1.5.0.html new file mode 100644 index 0000000000..433040df70 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.5.0.html @@ -0,0 +1,503 @@ +--- +title: "v1.5.0 - 2019-10-25" +linkTitle: "v1.5.0 - 2019-10-25" +weight: -60 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-09-19 — 2019-10-25
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.5.1.html b/site/content/en/docs/contrib/leaderboard/v1.5.1.html new file mode 100644 index 0000000000..fb5f3b749c --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.5.1.html @@ -0,0 +1,426 @@ +--- +title: "v1.5.1 - 2019-10-29" +linkTitle: "v1.5.1 - 2019-10-29" +weight: -61 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-10-25 — 2019-10-29
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.5.2.html b/site/content/en/docs/contrib/leaderboard/v1.5.2.html new file mode 100644 index 0000000000..857fe5b549 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.5.2.html @@ -0,0 +1,433 @@ +--- +title: "v1.5.2 - 2019-10-31" +linkTitle: "v1.5.2 - 2019-10-31" +weight: -62 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-10-29 — 2019-10-31
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.6.0.html b/site/content/en/docs/contrib/leaderboard/v1.6.0.html new file mode 100644 index 0000000000..f09340c327 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.6.0.html @@ -0,0 +1,495 @@ +--- +title: "v1.6.0 - 2019-12-10" +linkTitle: "v1.6.0 - 2019-12-10" +weight: -63 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-10-31 — 2019-12-10
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.6.1.html b/site/content/en/docs/contrib/leaderboard/v1.6.1.html new file mode 100644 index 0000000000..1a867eaafb --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.6.1.html @@ -0,0 +1,413 @@ +--- +title: "v1.6.1 - 2019-12-11" +linkTitle: "v1.6.1 - 2019-12-11" +weight: -64 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-12-10 — 2019-12-11
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.6.2.html b/site/content/en/docs/contrib/leaderboard/v1.6.2.html new file mode 100644 index 0000000000..2ea7f61d75 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.6.2.html @@ -0,0 +1,457 @@ +--- +title: "v1.6.2 - 2019-12-20" +linkTitle: "v1.6.2 - 2019-12-20" +weight: -65 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-12-11 — 2019-12-20
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.7.0.html b/site/content/en/docs/contrib/leaderboard/v1.7.0.html new file mode 100644 index 0000000000..9c925b5418 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.7.0.html @@ -0,0 +1,499 @@ +--- +title: "v1.7.0 - 2020-02-05" +linkTitle: "v1.7.0 - 2020-02-05" +weight: -66 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2019-12-20 — 2020-02-05
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.7.1.html b/site/content/en/docs/contrib/leaderboard/v1.7.1.html new file mode 100644 index 0000000000..285bd8f746 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.7.1.html @@ -0,0 +1,394 @@ +--- +title: "v1.7.1 - 2020-02-05" +linkTitle: "v1.7.1 - 2020-02-05" +weight: -67 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-02-05 — 2020-02-05
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.7.2.html b/site/content/en/docs/contrib/leaderboard/v1.7.2.html new file mode 100644 index 0000000000..3bf717435a --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.7.2.html @@ -0,0 +1,437 @@ +--- +title: "v1.7.2 - 2020-02-07" +linkTitle: "v1.7.2 - 2020-02-07" +weight: -68 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-02-05 — 2020-02-07
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.7.3.html b/site/content/en/docs/contrib/leaderboard/v1.7.3.html new file mode 100644 index 0000000000..63da663677 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.7.3.html @@ -0,0 +1,477 @@ +--- +title: "v1.7.3 - 2020-02-20" +linkTitle: "v1.7.3 - 2020-02-20" +weight: -69 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-02-07 — 2020-02-20
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.8.0.html b/site/content/en/docs/contrib/leaderboard/v1.8.0.html new file mode 100644 index 0000000000..87f38c3898 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.8.0.html @@ -0,0 +1,488 @@ +--- +title: "v1.8.0 - 2020-03-06" +linkTitle: "v1.8.0 - 2020-03-06" +weight: -70 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-02-20 — 2020-03-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.8.1.html b/site/content/en/docs/contrib/leaderboard/v1.8.1.html new file mode 100644 index 0000000000..9ed59b8f5e --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.8.1.html @@ -0,0 +1,394 @@ +--- +title: "v1.8.1 - 2020-03-06" +linkTitle: "v1.8.1 - 2020-03-06" +weight: -71 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-03-06 — 2020-03-06
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.8.2.html b/site/content/en/docs/contrib/leaderboard/v1.8.2.html new file mode 100644 index 0000000000..adedfc6b01 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.8.2.html @@ -0,0 +1,462 @@ +--- +title: "v1.8.2 - 2020-03-13" +linkTitle: "v1.8.2 - 2020-03-13" +weight: -72 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-03-06 — 2020-03-13
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.9.0.html b/site/content/en/docs/contrib/leaderboard/v1.9.0.html new file mode 100644 index 0000000000..b1d0e05289 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.9.0.html @@ -0,0 +1,485 @@ +--- +title: "v1.9.0 - 2020-03-26" +linkTitle: "v1.9.0 - 2020-03-26" +weight: -73 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-03-13 — 2020-03-26
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.9.1.html b/site/content/en/docs/contrib/leaderboard/v1.9.1.html new file mode 100644 index 0000000000..d1e938fece --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.9.1.html @@ -0,0 +1,463 @@ +--- +title: "v1.9.1 - 2020-04-02" +linkTitle: "v1.9.1 - 2020-04-02" +weight: -74 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-03-26 — 2020-04-02
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/leaderboard/v1.9.2.html b/site/content/en/docs/contrib/leaderboard/v1.9.2.html new file mode 100644 index 0000000000..ad54b7c090 --- /dev/null +++ b/site/content/en/docs/contrib/leaderboard/v1.9.2.html @@ -0,0 +1,425 @@ +--- +title: "v1.9.2 - 2020-04-04" +linkTitle: "v1.9.2 - 2020-04-04" +weight: -75 +--- + + + kubernetes/minikube - Leaderboard + + + + + + + +

kubernetes/minikube

+
2020-04-02 — 2020-04-04
+ + + +

Reviewers

+ + +
+

Most Influential

+

# of Merged PRs reviewed

+
+ +
+ +
+

Most Helpful

+

# of words written in merged PRs

+
+ +
+ +
+

Most Demanding

+

# of Review Comments in merged PRs

+
+ +
+ + +

Pull Requests

+ + +
+

Most Active

+

# of Pull Requests Merged

+
+ +
+ +
+

Big Movers

+

Lines of code (delta)

+
+ +
+ +
+

Most difficult to review

+

Average PR size (added+changed)

+
+ +
+ + +

Issues

+ + +
+

Most Active

+

# of comments

+
+ +
+ +
+

Most Helpful

+

# of words (excludes authored)

+
+ +
+ +
+

Top Closers

+

# of issues closed (excludes authored)

+
+ +
+ + + + diff --git a/site/content/en/docs/contrib/releasing/iso.md b/site/content/en/docs/contrib/releasing/iso.md index 5c1fdc1963..269522f7d6 100644 --- a/site/content/en/docs/contrib/releasing/iso.md +++ b/site/content/en/docs/contrib/releasing/iso.md @@ -16,4 +16,4 @@ Note: you can build the ISO using the `hack/jenkins/build_iso.sh` script locally * For `ISO_BUCKET`, type in `minikube/iso` * Click *Build* -The build will take roughly 50 minutes. +The build will take roughly 50 minutes and will automatically create a PR with the changes. diff --git a/site/content/en/docs/contrib/test_flakes.en.md b/site/content/en/docs/contrib/test_flakes.en.md new file mode 100644 index 0000000000..febd82bf33 --- /dev/null +++ b/site/content/en/docs/contrib/test_flakes.en.md @@ -0,0 +1,22 @@ +--- +title: "Integration Test Flake Rates" +description: > + Charts to visualize flake rates of all integration tests, split by environment +--- +## Flake rate charts by Environment + +|OS|Driver|ContainerRuntime|Link| +|---|---|---|---| +|Linux|docker|docker|[Docker_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux)| +|Linux|docker|containerd|[Docker_Linux_containerd](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_containerd)| +|Linux|docker|crio|[Docker_Linux_crio](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_crio)| +|Linux - arm64|docker|crio|[Docker_Linux_crio_arm64](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_crio_arm64)| +|Linux - arm64|docker|docker|[Docker_Linux_docker_arm64](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Linux_docker_arm64)| +|Linux|kvm2|docker|[KVM_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=KVM_Linux)| +|Linux|kvm2|containerd|[KVM_Linux_containerd](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=KVM_Linux_containerd)| +|Linux|kvm2|crio|[KVM_Linux_crio](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=KVM_Linux_crio)| +|Linux|virtualbox|docker|[VirtualBox_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=VirtualBox_Linux)| +|Linux|none|docker|[none_Linux](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=none_Linux)| +|MacOS|docker|docker|[Docker_macOS](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_macOS)| +|MacOS|hyperkit|docker|[Hyperkit_macOS](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Hyperkit_macOS)| +|Windows|docker|docker|[Docker_Windows](https://storage.googleapis.com/minikube-flake-rate/flake_chart.html?env=Docker_Windows)| diff --git a/site/content/en/docs/contrib/tests.en.md b/site/content/en/docs/contrib/tests.en.md index 290a3a65db..13d3450c34 100644 --- a/site/content/en/docs/contrib/tests.en.md +++ b/site/content/en/docs/contrib/tests.en.md @@ -6,86 +6,86 @@ description: > ## TestDownloadOnly -TestDownloadOnly makes sure the --download-only parameter in minikube start caches the appropriate images and tarballs. +makes sure the --download-only parameter in minikube start caches the appropriate images and tarballs. ## TestDownloadOnlyKic -TestDownloadOnlyKic makes sure --download-only caches the docker driver images as well. +makes sure --download-only caches the docker driver images as well. ## TestOffline -TestOffline makes sure minikube works without internet, once the user has cached the necessary images. +makes sure minikube works without internet, once the user has cached the necessary images. This test has to run after TestDownloadOnly. ## TestAddons -TestAddons tests addons that require no special environment in parallel +tests addons that require no special environment in parallel #### validateIngressAddon -validateIngressAddon tests the ingress addon by deploying a default nginx pod +tests the ingress addon by deploying a default nginx pod #### validateRegistryAddon -validateRegistryAddon tests the registry addon +tests the registry addon #### validateMetricsServerAddon -validateMetricsServerAddon tests the metrics server addon by making sure "kubectl top pods" returns a sensible result +tests the metrics server addon by making sure "kubectl top pods" returns a sensible result #### validateHelmTillerAddon -validateHelmTillerAddon tests the helm tiller addon by running "helm version" inside the cluster +tests the helm tiller addon by running "helm version" inside the cluster #### validateOlmAddon -validateOlmAddon tests the OLM addon +tests the OLM addon #### validateCSIDriverAndSnapshots -validateCSIDriverAndSnapshots tests the csi hostpath driver by creating a persistent volume, snapshotting it and restoring it. +tests the csi hostpath driver by creating a persistent volume, snapshotting it and restoring it. #### validateGCPAuthAddon -validateGCPAuthAddon tests the GCP Auth addon with either phony or real credentials and makes sure the files are mounted into pods correctly +tests the GCP Auth addon with either phony or real credentials and makes sure the files are mounted into pods correctly ## TestCertOptions -TestCertOptions makes sure minikube certs respect the --apiserver-ips and --apiserver-names parameters +makes sure minikube certs respect the --apiserver-ips and --apiserver-names parameters ## TestDockerFlags -TestDockerFlags makes sure the --docker-env and --docker-opt parameters are respected +makes sure the --docker-env and --docker-opt parameters are respected ## TestForceSystemdFlag -TestForceSystemdFlag tests the --force-systemd flag, as one would expect. +tests the --force-systemd flag, as one would expect. #### validateDockerSystemd -validateDockerSystemd makes sure the --force-systemd flag worked with the docker container runtime +makes sure the --force-systemd flag worked with the docker container runtime #### validateContainerdSystemd -validateContainerdSystemd makes sure the --force-systemd flag worked with the containerd container runtime +makes sure the --force-systemd flag worked with the containerd container runtime ## TestForceSystemdEnv -TestForceSystemdEnv makes sure the MINIKUBE_FORCE_SYSTEMD environment variable works just as well as the --force-systemd flag +makes sure the MINIKUBE_FORCE_SYSTEMD environment variable works just as well as the --force-systemd flag ## TestKVMDriverInstallOrUpdate -TestKVMDriverInstallOrUpdate makes sure our docker-machine-driver-kvm2 binary can be installed properly +makes sure our docker-machine-driver-kvm2 binary can be installed properly ## TestHyperKitDriverInstallOrUpdate -TestHyperKitDriverInstallOrUpdate makes sure our docker-machine-driver-hyperkit binary can be installed properly +makes sure our docker-machine-driver-hyperkit binary can be installed properly ## TestHyperkitDriverSkipUpgrade -TestHyperkitDriverSkipUpgrade makes sure our docker-machine-driver-hyperkit binary can be installed properly +makes sure our docker-machine-driver-hyperkit binary can be installed properly ## TestErrorSpam -TestErrorSpam asserts that there are no unexpected errors displayed in minikube command outputs. +asserts that there are no unexpected errors displayed in minikube command outputs. ## TestFunctional -TestFunctional are functionality tests which can safely share a profile in parallel +are functionality tests which can safely share a profile in parallel #### validateNodeLabels -validateNodeLabels checks if minikube cluster is created with correct kubernetes's node label +checks if minikube cluster is created with correct kubernetes's node label #### validateLoadImage -validateLoadImage makes sure that `minikube image load` works as expected +makes sure that `minikube image load` works as expected #### validateRemoveImage -validateRemoveImage makes sures that `minikube image rm` works as expected +makes sures that `minikube image rm` works as expected #### validateBuildImage -validateBuildImage makes sures that `minikube image build` works as expected +makes sures that `minikube image build` works as expected #### validateListImages -validateListImages makes sures that `minikube image ls` works as expected +makes sures that `minikube image ls` works as expected #### validateDockerEnv check functionality of minikube after evaluating docker-env @@ -94,267 +94,303 @@ check functionality of minikube after evaluating docker-env check functionality of minikube after evaluating podman-env #### validateStartWithProxy -validateStartWithProxy makes sure minikube start respects the HTTP_PROXY environment variable +makes sure minikube start respects the HTTP_PROXY environment variable + +#### validateStartWithCustomCerts +makes sure minikube start respects the HTTPS_PROXY environment variable and works with custom certs +a proxy is started by calling the mitmdump binary in the background, then installing the certs generated by the binary +mitmproxy/dump creates the proxy at localhost at port 8080 +only runs on Github Actions for amd64 linux, otherwise validateStartWithProxy runs instead #### validateAuditAfterStart -validateAuditAfterStart makes sure the audit log contains the correct logging after minikube start +makes sure the audit log contains the correct logging after minikube start #### validateSoftStart -validateSoftStart validates that after minikube already started, a "minikube start" should not change the configs. +validates that after minikube already started, a "minikube start" should not change the configs. #### validateKubeContext -validateKubeContext asserts that kubectl is properly configured (race-condition prone!) +asserts that kubectl is properly configured (race-condition prone!) #### validateKubectlGetPods -validateKubectlGetPods asserts that `kubectl get pod -A` returns non-zero content +asserts that `kubectl get pod -A` returns non-zero content #### validateMinikubeKubectl -validateMinikubeKubectl validates that the `minikube kubectl` command returns content +validates that the `minikube kubectl` command returns content #### validateMinikubeKubectlDirectCall -validateMinikubeKubectlDirectCall validates that calling minikube's kubectl +validates that calling minikube's kubectl #### validateExtraConfig -validateExtraConfig verifies minikube with --extra-config works as expected +verifies minikube with --extra-config works as expected #### validateComponentHealth -validateComponentHealth asserts that all Kubernetes components are healthy +asserts that all Kubernetes components are healthy NOTE: It expects all components to be Ready, so it makes sense to run it close after only those tests that include '--wait=all' start flag #### validateStatusCmd -validateStatusCmd makes sure minikube status outputs correctly +makes sure minikube status outputs correctly #### validateDashboardCmd -validateDashboardCmd asserts that the dashboard command works +asserts that the dashboard command works #### validateDryRun -validateDryRun asserts that the dry-run mode quickly exits with the right code +asserts that the dry-run mode quickly exits with the right code + +#### validateInternationalLanguage +asserts that the language used can be changed with environment variables #### validateCacheCmd -validateCacheCmd tests functionality of cache command (cache add, delete, list) +tests functionality of cache command (cache add, delete, list) #### validateConfigCmd -validateConfigCmd asserts basic "config" command functionality +asserts basic "config" command functionality #### validateLogsCmd -validateLogsCmd asserts basic "logs" command functionality +asserts basic "logs" command functionality #### validateLogsFileCmd -validateLogsFileCmd asserts "logs --file" command functionality +asserts "logs --file" command functionality #### validateProfileCmd -validateProfileCmd asserts "profile" command functionality +asserts "profile" command functionality #### validateServiceCmd -validateServiceCmd asserts basic "service" command functionality +asserts basic "service" command functionality #### validateAddonsCmd -validateAddonsCmd asserts basic "addon" command functionality +asserts basic "addon" command functionality #### validateSSHCmd -validateSSHCmd asserts basic "ssh" command functionality +asserts basic "ssh" command functionality #### validateCpCmd -validateCpCmd asserts basic "cp" command functionality +asserts basic "cp" command functionality #### validateMySQL -validateMySQL validates a minimalist MySQL deployment +validates a minimalist MySQL deployment #### validateFileSync -validateFileSync to check existence of the test file +to check existence of the test file #### validateCertSync -validateCertSync to check existence of the test certificate +checks to make sure a custom cert has been copied into the minikube guest and installed correctly + +#### validateNotActiveRuntimeDisabled +asserts that for a given runtime, the other runtimes disabled, for example for containerd runtime, docker and crio needs to be not running #### validateUpdateContextCmd -validateUpdateContextCmd asserts basic "update-context" command functionality +asserts basic "update-context" command functionality + +#### validateVersionCmd +asserts `minikube version` command works fine for both --short and --components #### validateMountCmd -validateMountCmd verifies the minikube mount command works properly +verifies the minikube mount command works properly #### validatePersistentVolumeClaim -validatePersistentVolumeClaim makes sure PVCs work properly +makes sure PVCs work properly #### validateTunnelCmd -validateTunnelCmd makes sure the minikube tunnel command works as expected +makes sure the minikube tunnel command works as expected #### validateTunnelStart -validateTunnelStart starts `minikube tunnel` +starts `minikube tunnel` #### validateServiceStable -validateServiceStable starts nginx pod, nginx service and waits nginx having loadbalancer ingress IP +starts nginx pod, nginx service and waits nginx having loadbalancer ingress IP #### validateAccessDirect -validateAccessDirect validates if the test service can be accessed with LoadBalancer IP from host +validates if the test service can be accessed with LoadBalancer IP from host #### validateDNSDig -validateDNSDig validates if the DNS forwarding works by dig command DNS lookup +validates if the DNS forwarding works by dig command DNS lookup NOTE: DNS forwarding is experimental: https://minikube.sigs.k8s.io/docs/handbook/accessing/#dns-resolution-experimental #### validateDNSDscacheutil -validateDNSDscacheutil validates if the DNS forwarding works by dscacheutil command DNS lookup +validates if the DNS forwarding works by dscacheutil command DNS lookup NOTE: DNS forwarding is experimental: https://minikube.sigs.k8s.io/docs/handbook/accessing/#dns-resolution-experimental #### validateAccessDNS -validateAccessDNS validates if the test service can be accessed with DNS forwarding from host +validates if the test service can be accessed with DNS forwarding from host NOTE: DNS forwarding is experimental: https://minikube.sigs.k8s.io/docs/handbook/accessing/#dns-resolution-experimental #### validateTunnelDelete -validateTunnelDelete stops `minikube tunnel` +stops `minikube tunnel` ## TestGuestEnvironment -TestGuestEnvironment verifies files and packges installed inside minikube ISO/Base image +verifies files and packges installed inside minikube ISO/Base image ## TestGvisorAddon -TestGvisorAddon tests the functionality of the gVisor addon +tests the functionality of the gVisor addon ## TestJSONOutput -TestJSONOutput makes sure json output works properly for the start, pause, unpause, and stop commands +makes sure json output works properly for the start, pause, unpause, and stop commands #### validateDistinctCurrentSteps validateDistinctCurrentSteps makes sure each step has a distinct step number #### validateIncreasingCurrentSteps -validateIncreasingCurrentSteps verifies that for a successful minikube start, 'current step' should be increasing +verifies that for a successful minikube start, 'current step' should be increasing ## TestErrorJSONOutput -TestErrorJSONOutput makes sure json output can print errors properly +makes sure json output can print errors properly ## TestKicCustomNetwork -TestKicCustomNetwork verifies the docker driver works with a custom network +verifies the docker driver works with a custom network ## TestKicExistingNetwork -TestKicExistingNetwork verifies the docker driver and run with an existing network +verifies the docker driver and run with an existing network ## TestingKicBaseImage -TestingKicBaseImage will return true if the integraiton test is running against a passed --base-image flag +will return true if the integraiton test is running against a passed --base-image flag ## TestMultiNode -TestMultiNode tests all multi node cluster functionality +tests all multi node cluster functionality #### validateMultiNodeStart -validateMultiNodeStart makes sure a 2 node cluster can start +makes sure a 2 node cluster can start #### validateAddNodeToMultiNode -validateAddNodeToMultiNode uses the minikube node add command to add a node to an existing cluster +uses the minikube node add command to add a node to an existing cluster #### validateProfileListWithMultiNode +make sure minikube profile list outputs correct with multinode clusters + +#### validateCopyFileWithMultiNode validateProfileListWithMultiNode make sure minikube profile list outputs correct with multinode clusters #### validateStopRunningNode -validateStopRunningNode tests the minikube node stop command +tests the minikube node stop command #### validateStartNodeAfterStop -validateStartNodeAfterStop tests the minikube node start command on an existing stopped node +tests the minikube node start command on an existing stopped node + +#### validateRestartKeepsNodes +restarts minikube cluster and checks if the reported node list is unchanged #### validateStopMultiNodeCluster -validateStopMultiNodeCluster runs minikube stop on a multinode cluster +runs minikube stop on a multinode cluster #### validateRestartMultiNodeCluster -validateRestartMultiNodeCluster verifies a soft restart on a multinode cluster works +verifies a soft restart on a multinode cluster works #### validateDeleteNodeFromMultiNode -validateDeleteNodeFromMultiNode tests the minikube node delete command +tests the minikube node delete command #### validateNameConflict -validateNameConflict tests that the node name verification works as expected +tests that the node name verification works as expected #### validateDeployAppToMultiNode -validateDeployAppToMultiNode deploys an app to a multinode cluster and makes sure all nodes can serve traffic +deploys an app to a multinode cluster and makes sure all nodes can serve traffic + +#### validatePodsPingHost +uses app previously deplyed by validateDeployAppToMultiNode to verify its pods, located on different nodes, can resolve "host.minikube.internal". ## TestNetworkPlugins -TestNetworkPlugins tests all supported CNI options +tests all supported CNI options Options tested: kubenet, bridge, flannel, kindnet, calico, cilium Flags tested: enable-default-cni (legacy), false (CNI off), auto-detection +#### validateFalseCNI +checks that minikube returns and error +if container runtime is "containerd" or "crio" +and --cni=false + +#### validateHairpinMode +makes sure the hairpinning (https://en.wikipedia.org/wiki/Hairpinning) is correctly configured for given CNI +try to access deployment/netcat pod using external, obtained from 'netcat' service dns resolution, IP address +should fail if hairpinMode is off + ## TestChangeNoneUser -TestChangeNoneUser tests to make sure the CHANGE_MINIKUBE_NONE_USER environemt variable is respected +tests to make sure the CHANGE_MINIKUBE_NONE_USER environemt variable is respected and changes the minikube file permissions from root to the correct user. ## TestPause -TestPause tests minikube pause functionality +tests minikube pause functionality #### validateFreshStart -validateFreshStart just starts a new minikube cluster +just starts a new minikube cluster #### validateStartNoReconfigure -validateStartNoReconfigure validates that starting a running cluster does not invoke reconfiguration +validates that starting a running cluster does not invoke reconfiguration #### validatePause -validatePause runs minikube pause +runs minikube pause #### validateUnpause -validateUnpause runs minikube unpause +runs minikube unpause #### validateDelete -validateDelete deletes the unpaused cluster +deletes the unpaused cluster #### validateVerifyDeleted -validateVerifyDeleted makes sure no left over left after deleting a profile such as containers or volumes +makes sure no left over left after deleting a profile such as containers or volumes #### validateStatus -validateStatus makes sure paused clusters show up in minikube status correctly +makes sure paused clusters show up in minikube status correctly ## TestDebPackageInstall TestPackageInstall tests installation of .deb packages with minikube itself and with kvm2 driver on various debian/ubuntu docker images ## TestPreload -TestPreload verifies the preload tarballs get pulled in properly by minikube +verifies the preload tarballs get pulled in properly by minikube ## TestScheduledStopWindows -TestScheduledStopWindows tests the schedule stop functionality on Windows +tests the schedule stop functionality on Windows ## TestScheduledStopUnix TestScheduledStopWindows tests the schedule stop functionality on Unix ## TestSkaffold -TestSkaffold makes sure skaffold run can be run with minikube +makes sure skaffold run can be run with minikube ## TestStartStop -TestStartStop tests starting, stopping and restarting a minikube clusters with various Kubernetes versions and configurations +tests starting, stopping and restarting a minikube clusters with various Kubernetes versions and configurations The oldest supported, newest supported and default Kubernetes versions are always tested. #### validateFirstStart -validateFirstStart runs the initial minikube start +runs the initial minikube start #### validateDeploying -validateDeploying deploys an app the minikube cluster +deploys an app the minikube cluster + +#### validateEnableAddonWhileActive +makes sure addons can be enabled while cluster is active. #### validateStop -validateStop tests minikube stop +tests minikube stop #### validateEnableAddonAfterStop -validateEnableAddonAfterStop makes sure addons can be enabled on a stopped cluster +makes sure addons can be enabled on a stopped cluster #### validateSecondStart -validateSecondStart verifies that starting a stopped cluster works +verifies that starting a stopped cluster works #### validateAppExistsAfterStop -validateAppExistsAfterStop verifies that a user's app will not vanish after a minikube stop +verifies that a user's app will not vanish after a minikube stop #### validateAddonAfterStop -validateAddonAfterStop validates that an addon which was enabled when minikube is stopped will be enabled and working.. +validates that an addon which was enabled when minikube is stopped will be enabled and working.. #### validateKubernetesImages -validateKubernetesImages verifies that a restarted cluster contains all the necessary images +verifies that a restarted cluster contains all the necessary images #### validatePauseAfterStart -validatePauseAfterStart verifies that minikube pause works +verifies that minikube pause works ## TestInsufficientStorage -TestInsufficientStorage makes sure minikube status displays the correct info if there is insufficient disk space on the machine +makes sure minikube status displays the correct info if there is insufficient disk space on the machine ## TestRunningBinaryUpgrade -TestRunningBinaryUpgrade upgrades a running legacy cluster to minikube at HEAD +upgrades a running legacy cluster to minikube at HEAD ## TestStoppedBinaryUpgrade -TestStoppedBinaryUpgrade starts a legacy minikube, stops it, and then upgrades to minikube at HEAD +starts a legacy minikube, stops it, and then upgrades to minikube at HEAD ## TestKubernetesUpgrade -TestKubernetesUpgrade upgrades Kubernetes from oldest to newest +upgrades Kubernetes from oldest to newest ## TestMissingContainerUpgrade -TestMissingContainerUpgrade tests a Docker upgrade where the underlying container is missing +tests a Docker upgrade where the underlying container is missing -TEST COUNT: 114 diff --git a/site/content/en/docs/contrib/triage.md b/site/content/en/docs/contrib/triage.md index e8627516de..b0a0d5a757 100644 --- a/site/content/en/docs/contrib/triage.md +++ b/site/content/en/docs/contrib/triage.md @@ -9,7 +9,7 @@ description: > Community triage takes place **every Wednesday** from **11AM-12PM PST**. -- Hangouts link: https://meet.google.com/ikf-fvrs-eer +- Hangouts link: https://meet.google.com/sss-wdet-gwe - Google Group: https://groups.google.com/forum/#!forum/minikube-dev All community members are welcome and encouraged to join and help us triage minikube! diff --git a/site/content/en/docs/drivers/_index.md b/site/content/en/docs/drivers/_index.md index 753f3f1f82..46758f51bd 100644 --- a/site/content/en/docs/drivers/_index.md +++ b/site/content/en/docs/drivers/_index.md @@ -36,4 +36,5 @@ To do so, we use the [Docker Machine](https://github.com/docker/machine) library * [Hyper-V]({{}}) - VM (preferred) * [Docker]({{}}) - VM + Container (preferred) * [VirtualBox]({{}}) - VM +* [VMware]({{}}) - VM * [SSH]({{}}) - remote ssh diff --git a/site/content/en/docs/drivers/hyperv.md b/site/content/en/docs/drivers/hyperv.md index c771fa69a9..93929826bd 100644 --- a/site/content/en/docs/drivers/hyperv.md +++ b/site/content/en/docs/drivers/hyperv.md @@ -25,3 +25,7 @@ Also see [co/hyperv open issues](https://github.com/kubernetes/minikube/labels/c ## Troubleshooting * Run `minikube start --alsologtostderr -v=7` to debug crashes +* While reinstalling minikube you may encounter error in starting minikube due to stuck.vmcx file from previous installation,a possible fix is: + * Install [Handle Windows tool](https://docs.microsoft.com/en-us/sysinternals/downloads/handle), identify the process handling .vmcx file,kill it. + + * Run `minikube delete --all --purge` to remove the extra config files diff --git a/site/content/en/docs/drivers/includes/vmware_macos_usage.inc b/site/content/en/docs/drivers/includes/vmware_macos_usage.inc index 75bc5ecdb3..8d13cb2dce 100644 --- a/site/content/en/docs/drivers/includes/vmware_macos_usage.inc +++ b/site/content/en/docs/drivers/includes/vmware_macos_usage.inc @@ -14,9 +14,12 @@ Otherwise: ```shell r=https://api.github.com/repos/machine-drivers/docker-machine-driver-vmware -curl -LO $(curl -s $r/releases/latest | grep -o 'http.*darwin_amd64' | head -n1) \ - && install docker-machine-driver-vmware_darwin_amd64 \ - /usr/local/bin/docker-machine-driver-vmware +d=docker-machine-driver-vmware_darwin_amd64 +u=$(curl -s $r/releases/latest | grep -o 'http.*Darwin_amd64.tar.gz' | head -n1) +mkdir $d \ + && (cd $d && curl -L $u > $d.tar.gz && tar -xf $d.tar.gz) \ + && install $d/docker-machine-driver-vmware /usr/local/bin/docker-machine-driver-vmware \ + && rm -rf $d ``` ## Usage diff --git a/site/content/en/docs/faq/_index.md b/site/content/en/docs/faq/_index.md index 423b0c053e..2f38a1fd5e 100644 --- a/site/content/en/docs/faq/_index.md +++ b/site/content/en/docs/faq/_index.md @@ -3,14 +3,14 @@ title: "FAQ" linkTitle: "FAQ" weight: 3 description: > - Questions that come up regularly + Frequently Asked Questions --- -## How to run an older Kubernetes version with minikube ? +## Can I run an older Kubernetes version with minikube? Do I have to downgrade my minikube version? You do not need to download an older minikube to run an older kubernetes version. -You can create a Kubenretes cluster with any version you desire using `--kubernetes-version` flag. +You can create a Kubernetes cluster with any version you desire using `--kubernetes-version` flag. Example: @@ -18,27 +18,39 @@ Example: minikube start --kubernetes-version=v1.15.0 ``` +## How can I create more than one cluster with minikube? -## Docker Driver: How to set the cgroup manager minikube uses? +By default, `minikube start` creates a cluster named "minikube". If you would like to create a different cluster or change its name, you can use the `--profile` (or `-p`) flag, which will create a cluster with the specified name. Please note that you can have multiple clusters on the same machine. -By default minikube uses the `cgroupfs` cgroup manager for the Kubernetes clusters, if you are on a system with a systemd cgroup manager, this could cause conflicts. -To use `systemd` cgroup manager, run: +To see the list of your current clusters, run: +``` +minikube profile list +``` + +minikube profiles are meant to be isolated from one another, with their own settings and drivers. If you want to create a single cluster with multiple nodes, try the [multi-node feature]({{< ref "/docs/tutorials/multi_node" >}}) instead. + + +## Docker Driver: How can I set minikube's cgroup manager? + +By default minikube uses the `cgroupfs` cgroup manager for Kubernetes clusters. If you are on a system with a systemd cgroup manager, this could cause conflicts. +To use the `systemd` cgroup manager, run: ```bash minikube start --force-systemd=true ``` -## How to run minikube with Docker driver if existing cluster is VM? +## How can I run minikube with the Docker driver if I have an existing cluster with a VM driver? -If you have an existing cluster with a VM driver (virtualbox, hyperkit, KVM,...). +First please ensure your Docker service is running. Then you need to either: + +(a) Delete the existing cluster and create a new one -First please ensure your Docker service is running and then you need to either delete the existing cluster and create one ```bash minikube delete minikube start --driver=docker ``` -Alternatively, if you want to keep your existing cluster you can create a second cluster with a different profile name. (example p1) +Alternatively, (b) Create a second cluster with a different profile name: ```bash minikube start -p p1 --driver=docker @@ -46,27 +58,27 @@ minikube start -p p1 --driver=docker ## Does minikube support IPv6? -minikube currently doesn't support IPv6. However, it is on the [roadmap]({{< ref "/docs/contrib/roadmap.en.md" >}}). +minikube currently doesn't support IPv6. However, it is on the [roadmap]({{< ref "/docs/contrib/roadmap.en.md" >}}). You can also refer to the [open issue](https://github.com/kubernetes/minikube/issues/8535). ## How can I prevent password prompts on Linux? The easiest approach is to use the `docker` driver, as the backend service always runs as `root`. -`none` users may want to try `CHANGE_MINIKUBE_NONE_USER=true`, where kubectl and such will still work: [see environment variables]({{< ref "/docs/handbook/config.md#environment-variables" >}}) +`none` users may want to try `CHANGE_MINIKUBE_NONE_USER=true`, where kubectl and such will work without `sudo`. See [environment variables]({{< ref "/docs/handbook/config.md#environment-variables" >}}) for more details. -Alternatively, configure `sudo` to never prompt for the commands issued by minikube. +Alternatively, you can configure `sudo` to never prompt for commands issued by minikube. -## How to ignore system verification? +## How can I ignore system verification? -minikube's bootstrapper, [Kubeadm](https://github.com/kubernetes/kubeadm) verifies a list of features on the host system before installing Kubernetes. in case you get this error, and you still want to try minikube anyways despite your system's limitation you can skip the verification by starting minikube with this extra option: +[kubeadm](https://github.com/kubernetes/kubeadm), minikube's bootstrapper, verifies a list of features on the host system before installing Kubernetes. In the case you get an error and still want to try minikube despite your system's limitation, you can skip verification by starting minikube with this extra option: ```shell minikube start --extra-config kubeadm.ignore-preflight-errors=SystemVerification ``` -## what is the resource allocation for Knative Setup using minikube? +## What is the minimum resource allocation necessary for a Knative setup using minikube? -Please allocate sufficient resources for Knative setup using minikube, especially when you run a minikube cluster on your local machine. We recommend allocating at least 6 CPUs and 8G memory. +Please allocate sufficient resources for Knative setup using minikube, especially when running minikube cluster on your local machine. We recommend allocating at least 6 CPUs and 8G memory: ```shell minikube start --cpus 6 --memory 8000 @@ -74,4 +86,53 @@ minikube start --cpus 6 --memory 8000 ## Do I need to install kubectl locally? -No, minikube comes with built-in kubectl [see minikube's kubectl documentation]({{< ref "docs/handbook/kubectl.md" >}}). +No, minikube comes with a built-in kubectl installation. See [minikube's kubectl documentation]({{< ref "docs/handbook/kubectl.md" >}}). + +## How can I opt-in to beta release notifications? + +Simply run the following command to be enrolled into beta notifications: +``` +minikube config set WantBetaUpdateNotification true +``` + +## Can I get rid of the emoji in minikube's outpuut? + +Yes! If you prefer not having emoji in your minikube output 😔 , just set the `MINIKUBE_IN_STYLE` environment variable to `0` or `false`: + +``` +MINIKUBE_IN_STYLE=0 minikube start + +``` + +## How can I access a minikube cluster from a remote network? + +minikube's primary goal is to quickly set up local Kubernetes clusters, and therefore we strongly discourage using minikube in production or for listening to remote traffic. By design, minikube is meant to only listen on the local network. + +However, it is possible to configure minikube to listen on a remote network. This will open your network to the outside world and is not recommended. If you are not fully aware of the security implications, please avoid using this. + +For the docker and podman driver, use `--listen-address` flag: + +``` +minikube start --listen-address=0.0.0.0 +``` + +## How can I allocate maximum resources to minikube? + +Setting the `memory` and `cpus` flags on the start command to `max` will use maximum available resources: +``` +minikube start --memory=max --cpus=max +``` + +## How can I run minikube on a different hard drive? + +Set the `MINIKUBE_HOME` env to a path on the drive you want minikube to run, then run `minikube start`. + +``` +# Unix +export MINIKUBE_HOME=/otherdrive/.minikube + +# Windows +$env:MINIKUBE_HOME = "D:\.minikube" + +minikube start +``` diff --git a/site/content/en/docs/handbook/addons/gcp-auth.md b/site/content/en/docs/handbook/addons/gcp-auth.md index a36700bf91..46f71bbe1d 100644 --- a/site/content/en/docs/handbook/addons/gcp-auth.md +++ b/site/content/en/docs/handbook/addons/gcp-auth.md @@ -5,6 +5,8 @@ weight: 1 date: 2020-07-15 --- +## Tutorial + If you have a containerized GCP app with a Kubernetes yaml, you can automatically add your credentials to all your deployed pods dynamically with this minikube addon. You just need to have a credentials file, which can be generated with `gcloud auth application-default login`. If you already have a json credentials file you want specify, use the GOOGLE_APPLICATION_CREDENTIALS environment variable. - Start a cluster: @@ -80,3 +82,12 @@ spec: ports: - containerPort: 80 + + +## Refreshing existing pods + +If you had already deployed pods to your minikube cluster before enabling the gcp-auth addon, then these pods will not have any GCP credentials. There are two ways to solve this issue. + +1. If you use a Deployment to deploy your pods, just delete the existing pods with `kubectl delete pod `. The deployment will then automatically recreate the pod and it will have the correct credentials. + +2. minikube can delete and recreate your pods for you, by running `minikube addons enable gcp-auth --refresh`. It does not matter if you have already enabled the addon or not. \ No newline at end of file diff --git a/deploy/addons/ingress-dns/README.md b/site/content/en/docs/handbook/addons/ingress-dns.md similarity index 97% rename from deploy/addons/ingress-dns/README.md rename to site/content/en/docs/handbook/addons/ingress-dns.md index 145d67b374..84eb968468 100644 --- a/deploy/addons/ingress-dns/README.md +++ b/site/content/en/docs/handbook/addons/ingress-dns.md @@ -1,6 +1,9 @@ -# Minikube Ingress DNS -![Build Status](https://gitlab.com/cryptexlabs/public/development/minikube-ingress-dns/badges/master/pipeline.svg) - +--- +title: "Ingress DNS" +linkTitle: "Minikube Ingress DNS" +weight: 1 +date: 2021-06-03 +--- DNS service for ingress controllers running on your minikube server ## Overview @@ -172,7 +175,7 @@ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.pli ## TODO - Add a service that runs on the host OS which will update the files in `/etc/resolver` automatically - Start this service when running `minikube addons enable ingress-dns` and stop the service when running -`minikube addons disable ingress-dns` + `minikube addons disable ingress-dns` ## Contributors - [Josh Woodcock](https://github.com/woodcockjosh) diff --git a/site/content/en/docs/handbook/controls.md b/site/content/en/docs/handbook/controls.md index 0f1218ca63..0301da5e18 100644 --- a/site/content/en/docs/handbook/controls.md +++ b/site/content/en/docs/handbook/controls.md @@ -16,7 +16,7 @@ Start a cluster by running: minikube start ``` -Access the Kubernetes Dashboard running within the minikube cluster: +Access the Kubernetes dashboard running within the minikube cluster: ```shell minikube dashboard diff --git a/site/content/en/docs/handbook/host-access.md b/site/content/en/docs/handbook/host-access.md index 074ccc3fed..06974e82db 100644 --- a/site/content/en/docs/handbook/host-access.md +++ b/site/content/en/docs/handbook/host-access.md @@ -11,7 +11,7 @@ aliases: The service running on your host must either be bound to all IP's (0.0.0.0) and interfaces, or to the IP and interface your VM is bridged against. If the service is bound only to localhost (127.0.0.1), this will not work. -### host.minikube.internal +### `host.minikube.internal` To make it easier to access your host, minikube v1.10 adds a hostname entry `host.minikube.internal` to `/etc/hosts`. The IP which `host.minikube.internal` resolves to is different across drivers, and may be different across clusters. @@ -32,8 +32,20 @@ PING host.minikube.internal (192.168.64.1): 56 data bytes 64 bytes from 192.168.64.1: seq=0 ttl=64 time=0.225 ms ``` -To test connectivity to a specific TCP service listening on your host, use `telnet host.minikube.internal `. Here are how to interpret the different messages: +To test connectivity to a specific TCP service listening on your host, use `nc -vz host.minikube.internal `: -* ``: You are connected! Hit Ctrl-D to get back to a shell prompt. +```sh +$ nc -vz host.minikube.internal 8000 +Connection to host.minikube.internal 8000 port [tcp/*] succeeded! +``` + +Here are how to interpret the different messages: +* `Connection succeeded`: You are connected! * `Connection refused`: the service is not listening on the port, at least not across all interfaces -* `Connection closed by foreign host`: the service is listening, but decided that your telnet client did not meet the protocol handshake requirements. Using a real client will likely work. + +{{% alert title="Note" color="primary" %}} +When using an older version of minikube, you may have to manually install tools like `ping` and `netcat` within the minikube image: +```sh +sudo apt install iputils-ping netcat-openbsd +``` +{{% /alert %}} diff --git a/site/content/en/docs/handbook/kubectl.md b/site/content/en/docs/handbook/kubectl.md index 07aaecf163..22d398ed38 100644 --- a/site/content/en/docs/handbook/kubectl.md +++ b/site/content/en/docs/handbook/kubectl.md @@ -50,5 +50,4 @@ minikube kubectl -- --help ### Shell autocompletion -After applying the alias or the symbolic link you can follow https://kubernetes.io/docs/tasks/tools/install-kubectl/#enabling-shell-autocompletion to enable shell-autocompletion. -When using zsh and the alias approach you also have to execute `setopt complete_aliases`. +After applying the alias or the symbolic link you can follow https://kubernetes.io/docs/tasks/tools/included/optional-kubectl-configs-bash-linux/ to enable shell-autocompletion. diff --git a/site/content/en/docs/handbook/mount.md b/site/content/en/docs/handbook/mount.md index 72994c2e2e..8a020a7d96 100644 --- a/site/content/en/docs/handbook/mount.md +++ b/site/content/en/docs/handbook/mount.md @@ -34,23 +34,23 @@ This directory may then be referenced from a Kubernetes manifest, for example: "name": "ubuntu" }, "spec": { - "containers": [ + "containers": [ + { + "name": "ubuntu", + "image": "ubuntu:18.04", + "args": ["bash"], + "stdin": true, + "stdinOnce": true, + "tty": true, + "workingDir": "/host", + "volumeMounts": [ { - "name": "ubuntu", - "image": "ubuntu:18.04", - "args": [ - "bash" - ], - "stdin": true, - "stdinOnce": true, - "tty": true, - "workingDir": "/host", - "volumeMounts": [{ - "mountPath": "/host", - "name": "host-mount" - }] + "mountPath": "/host", + "name": "host-mount" } - ], + ] + } + ], "volumes": [ { "name": "host-mount", diff --git a/site/content/en/docs/handbook/pushing.md b/site/content/en/docs/handbook/pushing.md index 4abcc9b531..753ffe96ef 100644 --- a/site/content/en/docs/handbook/pushing.md +++ b/site/content/en/docs/handbook/pushing.md @@ -50,7 +50,7 @@ Here is a comparison table to help you choose: This is similar to podman-env but only for Docker runtime. When using a container or VM driver (all drivers except none), you can reuse the Docker daemon inside minikube cluster. -this means you don't have to build on your host machine and push the image into a docker registry. You can just build inside the same docker daemon as minikube which speeds up local experiments. +This means you don't have to build on your host machine and push the image into a docker registry. You can just build inside the same docker daemon as minikube which speeds up local experiments. To point your terminal to use the docker daemon inside minikube run this: @@ -58,21 +58,21 @@ To point your terminal to use the docker daemon inside minikube run this: eval $(minikube docker-env) ``` -now any 'docker' command you run in this current terminal will run against the docker inside minikube cluster. +Now any 'docker' command you run in this current terminal will run against the docker inside minikube cluster. -so if you do the following commands, it will show you the containers inside the minikube, inside minikube's VM or Container. +So if you do the following commands, it will show you the containers inside the minikube, inside minikube's VM or Container. ```shell docker ps ``` -now you can 'build' against the docker inside minikube. which is instantly accessible to kubernetes cluster. +Now you can 'build' against the docker inside minikube, which is instantly accessible to kubernetes cluster. ```shell docker build -t my_image . ``` -To verify your terminal is using minikuber's docker-env you can check the value of the environment variable MINIKUBE_ACTIVE_DOCKERD to reflect the cluster name. +To verify your terminal is using minikube's docker-env you can check the value of the environment variable MINIKUBE_ACTIVE_DOCKERD to reflect the cluster name. {{% pageinfo color="info" %}} Tip 1: @@ -90,7 +90,7 @@ Tip 3: In container-based drivers such as Docker or Podman, you will need to re-do docker-env each time you restart your minikube cluster. {{% /pageinfo %}} -more information on [docker-env](https://minikube.sigs.k8s.io/docs/commands/docker-env/) +More information on [docker-env](https://minikube.sigs.k8s.io/docs/commands/docker-env/) --- @@ -109,14 +109,14 @@ Tip 1 : If your image changes after your cached it, you need to do 'cache reload'. {{% /pageinfo %}} -minikube refreshes the cache images on each start. however to reload all the cached images on demand, run this command : +minikube refreshes the cache images on each start. However to reload all the cached images on demand, run this command : ```shell minikube cache reload ``` {{% pageinfo color="info" %}} Tip 2 : -if you have multiple clusters, the cache command will load the image for all of them. +If you have multiple clusters, the cache command will load the image for all of them. {{% /pageinfo %}} To display images you have added to the cache: @@ -155,7 +155,7 @@ You should now be able to use podman client on the command line on your host mac podman-remote help ``` -now you can 'build' against the storage inside minikube. which is instantly accessible to kubernetes cluster. +Now you can 'build' against the storage inside minikube, which is instantly accessible to kubernetes cluster. ```shell podman-remote build -t my_image . @@ -172,7 +172,7 @@ Note: On Linux the remote client is called "podman-remote", while the local prog podman help ``` -now you can 'build' against the storage inside minikube. which is instantly accessible to kubernetes cluster. +now you can 'build' against the storage inside minikube, which is instantly accessible to kubernetes cluster. ```shell podman build -t my_image . @@ -185,7 +185,7 @@ Note: On macOS the remote client is called "podman", since there is no local "po {{% /mactab %}} {{% windowstab %}} -now you can 'build' against the storage inside minikube. which is instantly accessible to kubernetes cluster. +now you can 'build' against the storage inside minikube, which is instantly accessible to kubernetes cluster. ```shell podman help @@ -269,7 +269,7 @@ For more information on the `ctr images` command, read the [containerd documenta For more information on the `buildctl build` command, read the [Buildkit documentation](https://github.com/moby/buildkit#quick-start) (mobyproject.org). -to exit minikube ssh and come back to your terminal type: +To exit minikube ssh and come back to your terminal type: ```shell exit @@ -354,7 +354,7 @@ buildctl --addr unix://buildkitd.sock build \ --output type=image,name=k8s.gcr.io/username/imagename:latest ``` -now you can 'build' against the storage inside minikube. which is instantly accessible to kubernetes cluster. +Now you can 'build' against the storage inside minikube. which is instantly accessible to kubernetes cluster. --- diff --git a/site/content/en/docs/handbook/registry.md b/site/content/en/docs/handbook/registry.md index 1d18b6aaf4..12995de882 100644 --- a/site/content/en/docs/handbook/registry.md +++ b/site/content/en/docs/handbook/registry.md @@ -42,7 +42,8 @@ You can use the `--insecure-registry` flag on the One nifty hack is to allow the kubelet running in minikube to talk to registries deployed inside a pod in the cluster without backing them with TLS certificates. Because the default service cluster IP is known to be available at 10.0.0.1, users can pull images from registries -deployed inside the cluster by creating the cluster with `minikube start --insecure-registry "10.0.0.0/24"`. +deployed inside the cluster by creating the cluster with `minikube start --insecure-registry "10.0.0.0/24"`. Ensure the cluster +is deleted using `minikube delete` before starting with the `--insecure-registry` flag. ### docker on macOS @@ -53,6 +54,7 @@ The first step is to enable the registry addon: ```shell minikube addons enable registry ``` +> Note: Minikube will generate a port and request you use that port when enabling registry. That instruction is not related to this guide. When enabled, the registry addon exposes its port 5000 on the minikube's virtual machine. diff --git a/site/content/en/docs/handbook/troubleshooting.md b/site/content/en/docs/handbook/troubleshooting.md index 1b6fde7413..6d2630ca81 100644 --- a/site/content/en/docs/handbook/troubleshooting.md +++ b/site/content/en/docs/handbook/troubleshooting.md @@ -7,7 +7,7 @@ description: > ## Enabling debug logs -Pass `--alsologtostderr` to minikube commands to see detailed log output output. To increase the log verbosity, you can use: +Pass `--alsologtostderr` to minikube commands to see detailed log output. To increase the log verbosity, you can use: * `-v=1`: verbose messages * `-v=2`: really verbose messages diff --git a/site/content/en/docs/handbook/vpn_and_proxy.md b/site/content/en/docs/handbook/vpn_and_proxy.md index bcd92ee5c8..5b92601853 100644 --- a/site/content/en/docs/handbook/vpn_and_proxy.md +++ b/site/content/en/docs/handbook/vpn_and_proxy.md @@ -93,6 +93,10 @@ Ask your IT department for the appropriate PEM file, and add it to: `~/.minikube/files/etc/ssl/certs` +or + +`~/.minikube/certs` + Then run `minikube delete` and `minikube start`. #### downloading binaries: proxyconnect tcp: tls: oversized record received with length 20527 diff --git a/site/content/en/docs/presentations/_index.md b/site/content/en/docs/presentations/_index.md index 200fbcd3ec..bfde5340da 100644 --- a/site/content/en/docs/presentations/_index.md +++ b/site/content/en/docs/presentations/_index.md @@ -99,6 +99,12 @@ Presentations about the minikube project, mostly from the Kubernetes blog and th * _No results found for minikube_ +### KubeCon EU 2021 (Online, Europe) - Virtual + +* (32:48) + * "Minikube and Three Different Local Kubernetes Learning Environments" + * Anders Björklund & Predrag Rogic + ## Other conferences ### Helm Summit EU 2019 (Amsterdam, The Netherlands) diff --git a/site/content/en/docs/start/_index.md b/site/content/en/docs/start/_index.md index 900141187f..a44fa855bf 100644 --- a/site/content/en/docs/start/_index.md +++ b/site/content/en/docs/start/_index.md @@ -20,62 +20,349 @@ All you need is Docker (or similarly compatible) container or a Virtual Machine

1Installation

-{{% tabs %}} -{{% linuxtab %}} +{{% card %}} -For Linux users, we provide 3 easy download options (for each architecture): +Click on the buttons that describe your target platform. For other architectures, see [the release page](https://github.com/kubernetes/minikube/releases/latest) for a complete list of minikube binaries. -### amd64 / x86_64 +{{% quiz_row base="" name="Operating system" %}} +{{% quiz_button option="Linux" %}} {{% quiz_button option="macOS" %}} {{% quiz_button option="Windows" %}} +{{% /quiz_row %}} -#### Binary download +{{% quiz_row base="/Linux" name="Architecture" %}} +{{% quiz_button option="x86-64" %}} {{% quiz_button option="ARM64" %}} {{% quiz_button option="ARMv7" %}} {{% quiz_button option="ppc64" %}} {{% quiz_button option="S390x" %}} +{{% /quiz_row %}} +{{% quiz_row base="/Linux/x86-64" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} +{{% quiz_row base="/Linux/x86-64/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/x86-64/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ARM64" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ARM64/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ARM64/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ppc64" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ppc64/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ppc64/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/S390x" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/S390x/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/S390x/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ARMv7" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ARMv7/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Linux/ARMv7/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Debian package" %}} {{% quiz_button option="RPM package" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS" name="Architecture" %}} +{{% quiz_button option="x86-64" %}} {{% quiz_button option="ARM64" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS/x86-64" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS/x86-64/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} {{% quiz_button option="Homebrew" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS/x86-64/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS/ARM64" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS/ARM64/Stable" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/macOS/ARM64/Beta" name="Installer type" %}} +{{% quiz_button option="Binary download" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Windows" name="Architecture" %}} +{{% quiz_button option="x86-64" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Windows/x86-64" name="Release type" %}} +{{% quiz_button option="Stable" %}} {{% quiz_button option="Beta" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Windows/x86-64/Stable" name="Installer type" %}} +{{% quiz_button option=".exe download" %}} {{% quiz_button option="Windows Package Manager" %}} {{% quiz_button option="Chocolatey" %}} +{{% /quiz_row %}} + +{{% quiz_row base="/Windows/x86-64/Beta" name="Installer type" %}} +{{% quiz_button option=".exe download" %}} +{{% /quiz_row %}} + +{{% quiz_instruction id="/Linux/x86-64/Stable/Binary download" %}} ```shell - curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 - sudo install minikube-linux-amd64 /usr/local/bin/minikube +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 +sudo install minikube-linux-amd64 /usr/local/bin/minikube ``` +{{% /quiz_instruction %}} -#### Debian package +{{% quiz_instruction id="/Linux/x86-64/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-linux-amd64' | head -n1) +sudo install minikube-linux-amd64 /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} +{{% quiz_instruction id="/Linux/x86-64/Stable/Debian package" %}} ```shell curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb sudo dpkg -i minikube_latest_amd64.deb ``` +{{% /quiz_instruction %}} -#### RPM package +{{% quiz_instruction id="/Linux/x86-64/Beta/Debian package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube_.*_amd64.deb' | head -n1) +curl -L $u > minikube_beta_amd64.deb && sudo dpkg -i minikube_beta_amd64.deb +``` +{{% /quiz_instruction %}} +{{% quiz_instruction id="/Linux/x86-64/Stable/RPM package" %}} ```shell curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.x86_64.rpm -sudo rpm -ivh minikube-latest.x86_64.rpm +sudo rpm -Uvh minikube-latest.x86_64.rpm ``` +{{% /quiz_instruction %}} -### arm64 / aarch64 - -#### Binary download - +{{% quiz_instruction id="/Linux/x86-64/Beta/RPM package" %}} ```shell - curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64 - sudo install minikube-linux-arm64 /usr/local/bin/minikube +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-.*.x86_64.rpm' | head -n1) +curl -L $u > minikube-beta.x86_64.rpm && sudo rpm -Uvh minikube-beta.x86_64.rpm ``` +{{% /quiz_instruction %}} -#### Debian package +{{% quiz_instruction id="/Linux/ARM64/Stable/Binary download" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64 +sudo install minikube-linux-arm64 /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} +{{% quiz_instruction id="/Linux/ARM64/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-linux-arm64' | head -n1) +sudo install minikube-linux-arm64 /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARM64/Stable/Debian package" %}} ```shell curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_arm64.deb sudo dpkg -i minikube_latest_arm64.deb ``` +{{% /quiz_instruction %}} -#### RPM package +{{% quiz_instruction id="/Linux/ARM64/Beta/Debian package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube_.*_arm64.deb' | head -n1) +curl -L $u > minikube_beta_arm64.deb && sudo dpkg -i minikube_beta_arm64.deb +``` +{{% /quiz_instruction %}} +{{% quiz_instruction id="/Linux/ARM64/Stable/RPM package" %}} ```shell curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.aarch64.rpm -sudo rpm -ivh minikube-latest.aarch64.rpm +sudo rpm -Uvh minikube-latest.aarch64.rpm ``` +{{% /quiz_instruction %}} -{{% /linuxtab %}} -{{% mactab %}} +{{% quiz_instruction id="/Linux/ARM64/Beta/RPM package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-.*.aarch64.rpm' | head -n1) +curl -L $u > minikube-beta.aarch64.rpm && sudo rpm -Uvh minikube-beta.aarch64.rpm +``` +{{% /quiz_instruction %}} -If the [Brew Package Manager](https://brew.sh/) installed: +{{% quiz_instruction id="/Linux/ppc64/Stable/Binary download" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-ppc64le +sudo install minikube-linux-ppc64le /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ppc64/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-linux-ppc64le' | head -n1) +sudo install minikube-linux-ppc64le /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ppc64/Stable/Debian package" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_ppc64le.deb +sudo dpkg -i minikube_latest_ppc64le.deb +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ppc64/Beta/Debian package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube_.*_ppc64le.deb' | head -n1) +curl -L $u > minikube_beta_ppc64le.deb && sudo dpkg -i minikube_beta_ppc64le.deb +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ppc64/Stable/RPM package" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.ppc64el.rpm +sudo rpm -Uvh minikube-latest.ppc64el.rpm +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ppc64/Beta/RPM package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-.*.ppc64el.rpm' | head -n1) +curl -L $u > minikube-beta.ppc64el.rpm && sudo rpm -Uvh minikube-beta.ppc64el.rpm +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/S390x/Stable/Binary download" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-s390x +sudo install minikube-linux-s390x /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/S390x/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-linux-s390x' | head -n1) +sudo install minikube-linux-s390x /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/S390x/Stable/Debian package" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_s390x.deb +sudo dpkg -i minikube_latest_s390x.deb +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/S390x/Beta/Debian package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube_.*_s390x.deb' | head -n1) +curl -L $u > minikube_beta_s390x.deb && sudo dpkg -i minikube_beta_s390x.deb +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/S390x/Stable/RPM package" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.s390x.rpm +sudo rpm -Uvh minikube-latest.s390x.rpm +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/S390x/Beta/RPM package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-.*.s390x.rpm' | head -n1) +curl -L $u > minikube-beta.s390x.rpm && sudo rpm -Uvh minikube-beta.s390x.rpm +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARMv7/Stable/Binary download" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm +sudo install minikube-linux-arm /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARMv7/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-linux-arm' | head -n1) +sudo install minikube-linux-arm /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARMv7/Stable/Debian package" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_armhf.deb +sudo dpkg -i minikube_latest_armhf.deb +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARMv7/Beta/Debian package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube_.*_armhf.deb' | head -n1) +curl -L $u > minikube_beta_armhf.deb && sudo dpkg -i minikube_beta_armhf.deb +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARMv7/Stable/RPM package" %}} +```shell +curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-latest.armv7hl.rpm +sudo rpm -Uvh minikube-latest.armv7hl.rpm +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/Linux/ARMv7/Beta/RPM package" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +u=$(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-.*.armv7hl.rpm' | head -n1) +curl -L $u > minikube-beta.armv7hl.rpm && sudo rpm -Uvh minikube-beta.armv7hl.rpm +``` +{{% /quiz_instruction %}} + +{{% quiz_instruction id="/macOS/x86-64/Stable/Homebrew" %}} +If the [Brew Package Manager](https://brew.sh/) is installed: ```shell brew install minikube @@ -87,49 +374,114 @@ If `which minikube` fails after installation via brew, you may have to remove th brew unlink minikube brew link minikube ``` +{{% /quiz_instruction %}} -Otherwise, download minikube directly: - -### x86 - +{{% quiz_instruction id="/macOS/x86-64/Stable/Binary download" %}} ```shell curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 sudo install minikube-darwin-amd64 /usr/local/bin/minikube ``` +{{% /quiz_instruction %}} -### ARM +{{% quiz_instruction id="/macOS/x86-64/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-darwin-amd64' | head -n1) +sudo install minikube-darwin-amd64 /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} +{{% quiz_instruction id="/macOS/ARM64/Stable/Binary download" %}} ```shell curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-arm64 sudo install minikube-darwin-arm64 /usr/local/bin/minikube ``` +{{% /quiz_instruction %}} -{{% /mactab %}} -{{% windowstab %}} - -### Windows Package Manager +{{% quiz_instruction id="/macOS/ARM64/Beta/Binary download" %}} +```shell +r=https://api.github.com/repos/kubernetes/minikube/releases +curl -LO $(curl -s $r | grep -o 'http.*download/v.*beta.*/minikube-darwin-arm64' | head -n1) +sudo install minikube-darwin-arm64 /usr/local/bin/minikube +``` +{{% /quiz_instruction %}} +{{% quiz_instruction id="/Windows/x86-64/Stable/Windows Package Manager" %}} If the [Windows Package Manager](https://docs.microsoft.com/en-us/windows/package-manager/) is installed, use the following command to install minikube: ```shell winget install minikube ``` +{{% /quiz_instruction %}} -### Chocolatey +{{% quiz_instruction id="/Windows/x86-64/Stable/Chocolatey" %}} If the [Chocolatey Package Manager](https://chocolatey.org/) is installed, use the following command: ```shell choco install minikube ``` +{{% /quiz_instruction %}} -### Stand-alone Windows Installer -Otherwise, download and run the [Windows installer](https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe) +{{% quiz_instruction id="/Windows/x86-64/Stable/.exe download" %}} +1. Download the [latest release](https://storage.googleapis.com/minikube/releases/latest/minikube-installer.exe). +
+ Or if you have `curl` installed, use this command: + ```shell + curl -Lo minikube.exe https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe + New-Item -Path "c:\" -Name "minikube" -ItemType "directory" -Force + Move-Item .\minikube.exe c:\minikube\minikube.exe -Force + ``` +2. Add the binary in to your `PATH`. +
+ _Make sure to run PowerShell as Administrator._ + ```shell + $oldpath=[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + if($oldpath -notlike "*;C:\minikube*"){` + [Environment]::SetEnvironmentVariable("Path", $oldpath+";C:\minikube", [EnvironmentVariableTarget]::Machine)` + } + ``` + _If you used a CLI to perform the installation, you will need to close that CLI and open a new one before proceeding._ +{{% /quiz_instruction %}} -_If you used a CLI to perform the installation, you will need to close that CLI and open a new one before proceeding._ +{{% quiz_instruction id="/Windows/x86-64/Beta/.exe download" %}} +1. Download the
latest beta release. +
+ Or if you have `curl` installed, use this command: + ```shell + $r='https://api.github.com/repos/kubernetes/minikube/releases' + $u=curl -s $r | Select-String -Pattern 'http.*download/v.*beta.*/minikube-windows-amd64.exe' | Select Matches -First 1 + curl -Lo minikube.exe $u.Matches.Value + New-Item -Path "c:\" -Name "minikube" -ItemType "directory" -Force + Move-Item .\minikube.exe c:\minikube\minikube.exe -Force + ``` -{{% /windowstab %}} -{{% /tabs %}} +2. Add the binary in to your `PATH`. +
+ _Make sure to run PowerShell as Administrator._ + ```shell + $oldpath=[Environment]::GetEnvironmentVariable("Path", [EnvironmentVariableTarget]::Machine) + if($oldpath -notlike "*;C:\minikube*"){` + [Environment]::SetEnvironmentVariable("Path", $oldpath+";C:\minikube", [EnvironmentVariableTarget]::Machine)` + } + ``` + _If you used a CLI to perform the installation, you will need to close that CLI and open a new one before proceeding._ + +{{% /quiz_instruction %}} + +{{% /card %}}

2Start your cluster

diff --git a/site/content/en/docs/tutorials/ambassador_ingress_controller.md b/site/content/en/docs/tutorials/ambassador_ingress_controller.md index e6751e63c2..32e5d5a76e 100644 --- a/site/content/en/docs/tutorials/ambassador_ingress_controller.md +++ b/site/content/en/docs/tutorials/ambassador_ingress_controller.md @@ -69,7 +69,7 @@ pick it up. `hello-ingress.yaml` ```yaml -apiVersion: extensions/v1beta1 +apiVersion: networking.k8s.io/v1 kind: Ingress metadata: annotations: diff --git a/site/content/en/docs/tutorials/telemetry.md b/site/content/en/docs/tutorials/telemetry.md index 41dee5f17b..55e16d4f02 100644 --- a/site/content/en/docs/tutorials/telemetry.md +++ b/site/content/en/docs/tutorials/telemetry.md @@ -23,4 +23,4 @@ MINIKUBE_GCP_PROJECT_ID= minikube start --output json --trace gcp There are many exporters available via [OpenTelemetry community contributions](https://github.com/open-telemetry/opentelemetry-collector-contrib). -If you would like to see additional exporters, please create an [issue](https://github.com/kubernetes/minikube/issues) or refer to our [contribution][https://minikube.sigs.k8s.io/docs/contrib/] guidelines and submit a pull request. Thank you! +If you would like to see additional exporters, please create an [issue](https://github.com/kubernetes/minikube/issues) or refer to our [contribution](https://minikube.sigs.k8s.io/docs/contrib/) guidelines and submit a pull request. Thank you! diff --git a/site/content/en/docs/tutorials/user_flag.md b/site/content/en/docs/tutorials/user_flag.md new file mode 100644 index 0000000000..55e8ee4752 --- /dev/null +++ b/site/content/en/docs/tutorials/user_flag.md @@ -0,0 +1,56 @@ +--- +title: "Using the User Flag" +linkTitle: "Using the User Flag" +weight: 1 +date: 2021-06-15 +description: > + Using the User Flag to Keep an Audit Log +--- + +## Overview + +In minikube, all executed commands are logged to a local audit log in the minikube home directory (default: `~/.minikube/logs/audit.json`). +These commands are logged with additional information including the user that ran them, which by default is the OS user. +However, there is a global flag `--user` that will set the user who ran the command in the audit log. + +## Prerequisites + +- minikube v1.17.1 or newer + +## What does the flag do? + +Assuming the OS user is `johndoe`, running `minikube start` will add the following to the audit log: +``` +|---------------|--------------------------|-----------------------------|--------------|----------------|-------------------------------|-------------------------------| +| Command | Args | Profile | User | Version | Start Time | End Time | +|---------------|--------------------------|-----------------------------|--------------|----------------|-------------------------------|-------------------------------| +| start | | minikube | johndoe | v1.21.0 | Tue, 15 Jun 2021 09:00:00 MST | Tue, 15 Jun 2021 09:01:00 MST | +|---------------|--------------------------|-----------------------------|--------------|----------------|-------------------------------|-------------------------------| +``` +As you can see, minikube pulled the OS user and listed them as the user for the command. + +Running the same command with `--user=mary` appended to the command will add the following to the audit log: +``` +|---------------|--------------------------|-----------------------------|--------------|----------------|-------------------------------|-------------------------------| +| Command | Args | Profile | User | Version | Start Time | End Time | +|---------------|--------------------------|-----------------------------|--------------|----------------|-------------------------------|-------------------------------| +| start | --user=mary | minikube | mary | v1.21.0 | Tue, 15 Jun 2021 09:00:00 MST | Tue, 15 Jun 2021 09:01:00 MST | +|---------------|--------------------------|-----------------------------|--------------|----------------|-------------------------------|-------------------------------| +``` +Here you can see that passing `--user=mary` overwrote the OS user with `mary` as the user for the command. + +## Example use case + +- Embedded use of minikube by multiple users (IDEs, Plugins, etc.) +- A machine shared by multiple users using the same home folder + +## How do I use minikube in a script? + +If you are using minikube in a script or plugin it is recommeneded to add `--user=your_script_name` to all operations. + +Example: +``` +minikube start --user=plugin_name +minikube profile list --user=plugin_name +minikube stop --user=plugin_name +``` diff --git a/site/layouts/partials/hooks/body-end.html b/site/layouts/partials/hooks/body-end.html index 93866b2d3d..cabf92c90d 100644 --- a/site/layouts/partials/hooks/body-end.html +++ b/site/layouts/partials/hooks/body-end.html @@ -1,3 +1,4 @@ + diff --git a/site/layouts/partials/hooks/head-end.html b/site/layouts/partials/hooks/head-end.html index bf082de3bd..308555d158 100644 --- a/site/layouts/partials/hooks/head-end.html +++ b/site/layouts/partials/hooks/head-end.html @@ -2,4 +2,5 @@ - \ No newline at end of file + + diff --git a/site/layouts/partials/sidebar-tree.html b/site/layouts/partials/sidebar-tree.html index b1527f944f..61ba2a9a81 100644 --- a/site/layouts/partials/sidebar-tree.html +++ b/site/layouts/partials/sidebar-tree.html @@ -85,7 +85,7 @@ {{ if $activeSection }} {{ $showPage = true }} - {{ $activePage := eq . $p }} + {{ $activePage = eq . $p }} {{ end }} diff --git a/site/layouts/shortcodes/card.html b/site/layouts/shortcodes/card.html new file mode 100644 index 0000000000..89f4cb2586 --- /dev/null +++ b/site/layouts/shortcodes/card.html @@ -0,0 +1 @@ +
{{ .Inner }}
diff --git a/site/layouts/shortcodes/quiz_button.html b/site/layouts/shortcodes/quiz_button.html new file mode 100644 index 0000000000..1100d1e92a --- /dev/null +++ b/site/layouts/shortcodes/quiz_button.html @@ -0,0 +1 @@ + diff --git a/site/layouts/shortcodes/quiz_instruction.html b/site/layouts/shortcodes/quiz_instruction.html new file mode 100644 index 0000000000..b02229e475 --- /dev/null +++ b/site/layouts/shortcodes/quiz_instruction.html @@ -0,0 +1,12 @@ +{{ $id := .Get "id" }} +{{ $selected := split $id "/" }} + +{{ $os := index $selected 1 }} +{{ $arch := index $selected 2 }} +{{ $release := index $selected 3 }} +{{ $installer := index $selected 4 }} + +
+

To install the latest minikube {{ lower $release }} release on {{ $arch }} {{ $os }} using {{ replace $installer "Binary" "binary" }}:

+{{ .Inner }} +
diff --git a/site/layouts/shortcodes/quiz_row.html b/site/layouts/shortcodes/quiz_row.html new file mode 100644 index 0000000000..c36b739eee --- /dev/null +++ b/site/layouts/shortcodes/quiz_row.html @@ -0,0 +1,8 @@ +{{ $level := .Get "base" | strings.Count "/" }} + +
+
+

{{ with .Get "name"}}{{.}}{{end}}

+
+
{{ .Inner }}
+
diff --git a/site/static/favicons/android-144x144.png b/site/static/favicons/android-144x144.png new file mode 100644 index 0000000000..c2b30a8df1 Binary files /dev/null and b/site/static/favicons/android-144x144.png differ diff --git a/site/static/favicons/android-192x192.png b/site/static/favicons/android-192x192.png new file mode 100644 index 0000000000..c36762c508 Binary files /dev/null and b/site/static/favicons/android-192x192.png differ diff --git a/site/static/favicons/android-36x36.png b/site/static/favicons/android-36x36.png new file mode 100644 index 0000000000..54457fca52 Binary files /dev/null and b/site/static/favicons/android-36x36.png differ diff --git a/site/static/favicons/android-48x48.png b/site/static/favicons/android-48x48.png new file mode 100644 index 0000000000..106dab23ba Binary files /dev/null and b/site/static/favicons/android-48x48.png differ diff --git a/site/static/favicons/android-72x72.png b/site/static/favicons/android-72x72.png new file mode 100644 index 0000000000..9254b42895 Binary files /dev/null and b/site/static/favicons/android-72x72.png differ diff --git a/site/static/favicons/android-96x96.png b/site/static/favicons/android-96x96.png new file mode 100644 index 0000000000..c0a69a6a03 Binary files /dev/null and b/site/static/favicons/android-96x96.png differ diff --git a/site/static/favicons/apple-touch-icon-180x180.png b/site/static/favicons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000..8af81b0128 Binary files /dev/null and b/site/static/favicons/apple-touch-icon-180x180.png differ diff --git a/site/static/favicons/favicon-16x16.png b/site/static/favicons/favicon-16x16.png new file mode 100644 index 0000000000..b1dbc98cf4 Binary files /dev/null and b/site/static/favicons/favicon-16x16.png differ diff --git a/site/static/favicons/favicon-32x32.png b/site/static/favicons/favicon-32x32.png new file mode 100644 index 0000000000..cc5607bbfb Binary files /dev/null and b/site/static/favicons/favicon-32x32.png differ diff --git a/site/static/favicons/favicon.ico b/site/static/favicons/favicon.ico new file mode 100644 index 0000000000..4ad87f2556 Binary files /dev/null and b/site/static/favicons/favicon.ico differ diff --git a/site/static/images/benchmarks/containerdRuntime/initial.png b/site/static/images/benchmarks/containerdRuntime/initial.png index d2a610e2d0..1b42ecced8 100644 Binary files a/site/static/images/benchmarks/containerdRuntime/initial.png and b/site/static/images/benchmarks/containerdRuntime/initial.png differ diff --git a/site/static/images/benchmarks/containerdRuntime/initialSummary.png b/site/static/images/benchmarks/containerdRuntime/initialSummary.png deleted file mode 100644 index 389b6b89c0..0000000000 Binary files a/site/static/images/benchmarks/containerdRuntime/initialSummary.png and /dev/null differ diff --git a/site/static/images/benchmarks/containerdRuntime/iterative.png b/site/static/images/benchmarks/containerdRuntime/iterative.png index 55317b239d..9205edef2c 100644 Binary files a/site/static/images/benchmarks/containerdRuntime/iterative.png and b/site/static/images/benchmarks/containerdRuntime/iterative.png differ diff --git a/site/static/images/benchmarks/containerdRuntime/iterativeSummary.png b/site/static/images/benchmarks/containerdRuntime/iterativeSummary.png deleted file mode 100644 index caaa5535cc..0000000000 Binary files a/site/static/images/benchmarks/containerdRuntime/iterativeSummary.png and /dev/null differ diff --git a/site/static/images/benchmarks/crioRuntime/initial.png b/site/static/images/benchmarks/crioRuntime/initial.png index 75b453ca17..9b27818693 100644 Binary files a/site/static/images/benchmarks/crioRuntime/initial.png and b/site/static/images/benchmarks/crioRuntime/initial.png differ diff --git a/site/static/images/benchmarks/crioRuntime/initialSummary.png b/site/static/images/benchmarks/crioRuntime/initialSummary.png deleted file mode 100644 index cc9bdf287e..0000000000 Binary files a/site/static/images/benchmarks/crioRuntime/initialSummary.png and /dev/null differ diff --git a/site/static/images/benchmarks/crioRuntime/iterative.png b/site/static/images/benchmarks/crioRuntime/iterative.png index adb033eb23..b475b8a7ae 100644 Binary files a/site/static/images/benchmarks/crioRuntime/iterative.png and b/site/static/images/benchmarks/crioRuntime/iterative.png differ diff --git a/site/static/images/benchmarks/crioRuntime/iterativeSummary.png b/site/static/images/benchmarks/crioRuntime/iterativeSummary.png deleted file mode 100644 index 3981b5d3dc..0000000000 Binary files a/site/static/images/benchmarks/crioRuntime/iterativeSummary.png and /dev/null differ diff --git a/site/static/images/benchmarks/dockerRuntime/initial.png b/site/static/images/benchmarks/dockerRuntime/initial.png index 183d72b473..475aee9b7f 100644 Binary files a/site/static/images/benchmarks/dockerRuntime/initial.png and b/site/static/images/benchmarks/dockerRuntime/initial.png differ diff --git a/site/static/images/benchmarks/dockerRuntime/initialSummary.png b/site/static/images/benchmarks/dockerRuntime/initialSummary.png deleted file mode 100644 index 7da498ed31..0000000000 Binary files a/site/static/images/benchmarks/dockerRuntime/initialSummary.png and /dev/null differ diff --git a/site/static/images/benchmarks/dockerRuntime/iterative.png b/site/static/images/benchmarks/dockerRuntime/iterative.png index 875fdc4046..d2deb2d418 100644 Binary files a/site/static/images/benchmarks/dockerRuntime/iterative.png and b/site/static/images/benchmarks/dockerRuntime/iterative.png differ diff --git a/site/static/images/benchmarks/dockerRuntime/iterativeSummary.png b/site/static/images/benchmarks/dockerRuntime/iterativeSummary.png deleted file mode 100644 index 856a35595f..0000000000 Binary files a/site/static/images/benchmarks/dockerRuntime/iterativeSummary.png and /dev/null differ diff --git a/site/static/images/benchmarks/macArchitecture/initial.png b/site/static/images/benchmarks/macArchitecture/initial.png index 735129497c..c39935c7e4 100644 Binary files a/site/static/images/benchmarks/macArchitecture/initial.png and b/site/static/images/benchmarks/macArchitecture/initial.png differ diff --git a/site/static/images/benchmarks/macArchitecture/iterative.png b/site/static/images/benchmarks/macArchitecture/iterative.png index c3e80d030b..975f5e48c1 100644 Binary files a/site/static/images/benchmarks/macArchitecture/iterative.png and b/site/static/images/benchmarks/macArchitecture/iterative.png differ diff --git a/site/static/images/benchmarks/minikubeVsOthers/initial.png b/site/static/images/benchmarks/minikubeVsOthers/initial.png index 7fee0287a9..14bf0e0b76 100644 Binary files a/site/static/images/benchmarks/minikubeVsOthers/initial.png and b/site/static/images/benchmarks/minikubeVsOthers/initial.png differ diff --git a/site/static/images/benchmarks/minikubeVsOthers/iterative.png b/site/static/images/benchmarks/minikubeVsOthers/iterative.png index 91bc335740..60e0a0d15d 100644 Binary files a/site/static/images/benchmarks/minikubeVsOthers/iterative.png and b/site/static/images/benchmarks/minikubeVsOthers/iterative.png differ diff --git a/site/static/images/benchmarks/timeToK8s/v1.20.0.png b/site/static/images/benchmarks/timeToK8s/v1.20.0.png new file mode 100644 index 0000000000..23ba2e7fa6 Binary files /dev/null and b/site/static/images/benchmarks/timeToK8s/v1.20.0.png differ diff --git a/site/static/images/benchmarks/timeToK8s/v1.21.0.png b/site/static/images/benchmarks/timeToK8s/v1.21.0.png new file mode 100644 index 0000000000..9c1fd87848 Binary files /dev/null and b/site/static/images/benchmarks/timeToK8s/v1.21.0.png differ 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 0000000000..f5656c515d Binary files /dev/null and b/site/static/images/benchmarks/timeToK8s/v1.22.0.png differ diff --git a/site/static/js/quiz.js b/site/static/js/quiz.js new file mode 100644 index 0000000000..68a6e4ce11 --- /dev/null +++ b/site/static/js/quiz.js @@ -0,0 +1,57 @@ +function selectQuizOption(selectedId) { + const currentLevel = selectedId.split('/').length - 1; + $('.option-row').each(function (i) { + const rowId = $(this).attr('data-quiz-id'); + // don't hide option rows if it has a lower level + // e.g. when clicking "x86_64" under Linux, we don't want to hide the operating system row + if ($(this).attr('data-level') < currentLevel) { + return; + } + if (rowId === selectedId) { + $(this).removeClass('hide'); + $(this).find('.option-button').removeClass('active'); + return; + } + // hide all other option rows + $(this).addClass('hide'); + }); + // hide other answers + $('.quiz-instruction').addClass('hide'); + // show the selected answer + $('.quiz-instruction[data-quiz-id=\'' + selectedId + '\']').removeClass('hide'); + + const buttons = $('.option-row[data-quiz-id=\'' + selectedId + '\']').find('.option-button'); + // auto-select the first option for the user, to reduce the number of clicks + if (buttons.length > 0) { + const btn = buttons.first(); + btn.addClass('active'); + selectQuizOption(btn.attr('data-quiz-id')); + } +} + +function initQuiz() { + try { + $('.option-button').click(function(e) { + $(this).parent().find('.option-button').removeClass('active'); + $(this).addClass('active'); + const dataContainerId = $(this).attr('data-quiz-id'); + + selectQuizOption(dataContainerId); + }); + let userOS = getUserOS(); + if (userOS === 'Mac') { + // use the name "macOS" to match the button + userOS = 'macOS'; + } + $('.option-row[data-level=0]').removeClass('hide'); + // auto-select the OS for user + const btn = $('.option-button[data-quiz-id=\'/' + userOS + '\']').first(); + btn.addClass('active'); + selectQuizOption(btn.attr('data-quiz-id')); + } catch(e) { + const elements = document.getElementsByClassName("quiz-instruction"); + for (let element of elements) { + element.classList.remove("hide"); + } + } +} diff --git a/site/static/js/tabs.js b/site/static/js/tabs.js index 1cd97571d4..56ab6ca9b1 100644 --- a/site/static/js/tabs.js +++ b/site/static/js/tabs.js @@ -17,7 +17,7 @@ function initTabs() { let tabSelector = getTabSelector(this); $(this).find('div'+tabSelector).addClass('active'); }) - + $('.nav-tabs a').click(function(e){ e.preventDefault(); var tab = $(this).parent(), diff --git a/test/integration/aaa_download_only_test.go b/test/integration/aaa_download_only_test.go index b48bcdb275..0037c98bd6 100644 --- a/test/integration/aaa_download_only_test.go +++ b/test/integration/aaa_download_only_test.go @@ -97,7 +97,9 @@ func TestDownloadOnly(t *testing.T) { if NoneDriver() { t.Skip("None driver does not have preload") } - if download.PreloadExists(v, containerRuntime, true) { + // Driver does not matter here, since the only exception is none driver, + // which cannot occur here. + if download.PreloadExists(v, containerRuntime, "docker", true) { // Just make sure the tarball path exists if _, err := os.Stat(download.TarballPath(v, containerRuntime)); err != nil { t.Errorf("failed to verify preloaded tarball file exists: %v", err) @@ -132,6 +134,9 @@ func TestDownloadOnly(t *testing.T) { }) t.Run("binaries", func(t *testing.T) { + if preloadExists { + t.Skip("Preload exists, binaries are present within.") + } // checking binaries downloaded (kubelet,kubeadm) for _, bin := range constants.KubernetesReleaseBinaries { fp := filepath.Join(localpath.MiniPath(), "cache", "linux", v, bin) diff --git a/test/integration/addons_test.go b/test/integration/addons_test.go index cadee30d05..369ca99271 100644 --- a/test/integration/addons_test.go +++ b/test/integration/addons_test.go @@ -462,7 +462,6 @@ func validateHelmTillerAddon(ctx context.Context, t *testing.T, profile string) // validateOlmAddon tests the OLM addon func validateOlmAddon(ctx context.Context, t *testing.T, profile string) { - t.Skip("skipping olm test till this issue is fixed https://github.com/kubernetes/minikube/issues/11311") defer PostMortemLogs(t, profile) client, err := kapi.Client(profile) @@ -498,7 +497,7 @@ func validateOlmAddon(ctx context.Context, t *testing.T, profile string) { } // Install one sample Operator such as etcd - rr, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "create", "-f", "https://operatorhub.io/install/etcd.yaml")) + rr, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "create", "-f", filepath.Join(*testdataDir, "etcd.yaml"))) if err != nil { t.Logf("etcd operator installation with %s failed: %v", rr.Command(), err) } @@ -519,7 +518,7 @@ func validateOlmAddon(ctx context.Context, t *testing.T, profile string) { } // Operator installation takes a while - if err := retry.Expo(checkOperatorInstalled, time.Second*3, Minutes(6)); err != nil { + if err := retry.Expo(checkOperatorInstalled, time.Second*3, Minutes(10)); err != nil { t.Errorf("failed checking operator installed: %v", err.Error()) } } diff --git a/test/integration/docker_test.go b/test/integration/docker_test.go index c20e05126c..c7db90f6c2 100644 --- a/test/integration/docker_test.go +++ b/test/integration/docker_test.go @@ -114,7 +114,7 @@ func validateContainerdSystemd(ctx context.Context, t *testing.T, profile string if err != nil { t.Errorf("failed to get docker cgroup driver. args %q: %v", rr.Command(), err) } - if !strings.Contains(rr.Output(), "systemd_cgroup = true") { + if !strings.Contains(rr.Output(), "SystemdCgroup = true") { t.Fatalf("expected systemd cgroup driver, got: %v", rr.Output()) } } diff --git a/test/integration/driver_install_or_update_test.go b/test/integration/driver_install_or_update_test.go index adf06060c6..24d1662348 100644 --- a/test/integration/driver_install_or_update_test.go +++ b/test/integration/driver_install_or_update_test.go @@ -25,10 +25,9 @@ import ( "runtime" "testing" - "github.com/Azure/azure-sdk-for-go/tools/apidiff/ioext" - "github.com/blang/semver" + "github.com/blang/semver/v4" - "k8s.io/minikube/pkg/minikube/driver" + "k8s.io/minikube/pkg/minikube/driver/auxdriver" "k8s.io/minikube/pkg/minikube/localpath" "k8s.io/minikube/pkg/version" ) @@ -98,7 +97,7 @@ func TestKVMDriverInstallOrUpdate(t *testing.T) { t.Fatalf("Expected new semver. test: %v, got: %v", tc.name, err) } - err = driver.InstallOrUpdate("kvm2", dir, newerVersion, true, true) + err = auxdriver.InstallOrUpdate("kvm2", dir, newerVersion, true, true) if err != nil { t.Fatalf("Failed to update driver to %v. test: %s, got: %v", newerVersion, tc.name, err) } @@ -171,7 +170,7 @@ func TestHyperKitDriverInstallOrUpdate(t *testing.T) { t.Skipf("password required to execute 'sudo', skipping remaining test") } - err = driver.InstallOrUpdate("hyperkit", dir, newerVersion, false, true) + err = auxdriver.InstallOrUpdate("hyperkit", dir, newerVersion, false, true) if err != nil { t.Fatalf("Failed to update driver to %v. test: %s, got: %v", newerVersion, tc.name, err) } @@ -290,12 +289,12 @@ func prepareTempMinikubeDirWithHyperkitDriver(name, driver string) (string, stri } // copy driver to temp bin testDriverPath := filepath.Join(mkBinDir, "docker-machine-driver-hyperkit") - if err = ioext.CopyFile(testDataDriverPath, testDriverPath, false); err != nil { + if err = CopyFile(testDataDriverPath, testDriverPath, false); err != nil { return "", "", fmt.Errorf("failed to setup current hyperkit driver: %v", err) } // try to copy cached files to the temp minikube folder to avoid downloading of iso and preloads - _ = ioext.CopyDir(filepath.Join(localpath.MakeMiniPath("cache")), filepath.Join(mkDir, "cache")) + _ = CopyDir(filepath.Join(localpath.MakeMiniPath("cache")), filepath.Join(mkDir, "cache")) // change permission to allow driver to be executable if err = os.Chmod(testDriverPath, 0755); err != nil { diff --git a/test/integration/error_spam_test.go b/test/integration/error_spam_test.go index e129edb594..6333e5eace 100644 --- a/test/integration/error_spam_test.go +++ b/test/integration/error_spam_test.go @@ -70,139 +70,144 @@ func TestErrorSpam(t *testing.T) { } defer os.RemoveAll(logDir) - // This should likely use multi-node once it's ready - // use `--log_dir` flag to run isolated and avoid race condition - ie, failing to clean up (locked) log files created by other concurently-run tests, or counting them in results - args := append([]string{"start", "-p", profile, "-n=1", "--memory=2250", "--wait=false", fmt.Sprintf("--log_dir=%s", logDir)}, StartArgs()...) + t.Run("setup", func(t *testing.T) { + // This should likely use multi-node once it's ready + // use `--log_dir` flag to run isolated and avoid race condition - ie, failing to clean up (locked) log files created by other concurently-run tests, or counting them in results + args := append([]string{"start", "-p", profile, "-n=1", "--memory=2250", "--wait=false", fmt.Sprintf("--log_dir=%s", logDir)}, StartArgs()...) - rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) - if err != nil { - t.Errorf("%q failed: %v", rr.Command(), err) - } - - stdout := rr.Stdout.String() - stderr := rr.Stderr.String() - - for _, line := range strings.Split(stderr, "\n") { - if stderrAllowRe.MatchString(line) { - t.Logf("acceptable stderr: %q", line) - continue + rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) + if err != nil { + t.Errorf("%q failed: %v", rr.Command(), err) } - if len(strings.TrimSpace(line)) > 0 { - t.Errorf("unexpected stderr: %q", line) - } - } + stdout := rr.Stdout.String() + stderr := rr.Stderr.String() - for _, line := range strings.Split(stdout, "\n") { - keywords := []string{"error", "fail", "warning", "conflict"} - for _, keyword := range keywords { - if strings.Contains(line, keyword) { - t.Errorf("unexpected %q in stdout: %q", keyword, line) + for _, line := range strings.Split(stderr, "\n") { + if stderrAllowRe.MatchString(line) { + t.Logf("acceptable stderr: %q", line) + continue + } + + if len(strings.TrimSpace(line)) > 0 { + t.Errorf("unexpected stderr: %q", line) } } - } - if t.Failed() { - t.Logf("minikube stdout:\n%s", stdout) - t.Logf("minikube stderr:\n%s", stderr) - } - - steps := []string{ - "Generating certificates and keys ...", - "Booting up control plane ...", - "Configuring RBAC rules ...", - } - for _, step := range steps { - if !strings.Contains(stdout, step) { - t.Errorf("missing kubeadm init sub-step %q", step) + for _, line := range strings.Split(stdout, "\n") { + keywords := []string{"error", "fail", "warning", "conflict"} + for _, keyword := range keywords { + if strings.Contains(line, keyword) { + t.Errorf("unexpected %q in stdout: %q", keyword, line) + } + } } - } + + if t.Failed() { + t.Logf("minikube stdout:\n%s", stdout) + t.Logf("minikube stderr:\n%s", stderr) + } + + steps := []string{ + "Generating certificates and keys ...", + "Booting up control plane ...", + "Configuring RBAC rules ...", + } + for _, step := range steps { + if !strings.Contains(stdout, step) { + t.Errorf("missing kubeadm init sub-step %q", step) + } + } + }) logTests := []struct { - command string - args []string - runCount int // number of times to run command - expectedLogFiles int // number of logfiles expected after running command runCount times + command string + args []string }{ { - command: "start", - args: []string{"--dry-run"}, - runCount: 175, // calling this 175 times should create 2 files with 1 greater than 1M - expectedLogFiles: 2, + command: "start", + args: []string{"--dry-run"}, }, { - command: "status", - runCount: 100, - expectedLogFiles: 1, + command: "status", }, { - command: "pause", - runCount: 5, - expectedLogFiles: 1, + command: "pause", }, { - command: "unpause", - runCount: 1, - expectedLogFiles: 1, + command: "unpause", }, { - command: "stop", - runCount: 1, - expectedLogFiles: 1, + command: "stop", }, } for _, test := range logTests { t.Run(test.command, func(t *testing.T) { - args := []string{test.command, "-p", profile, "--log_dir", logDir} - args = append(args, test.args...) - // before starting the test, ensure no other logs from the current command are written - logFiles, err := filepath.Glob(filepath.Join(logDir, fmt.Sprintf("minikube_%s*", test.command))) + logFiles, err := getLogFiles(logDir, test.command) if err != nil { - t.Errorf("failed to get old log files for command %s : %v", test.command, err) + t.Fatalf("failed to get old log files for command %s : %v", test.command, err) } cleanupLogFiles(t, logFiles) - // run command runCount times - for i := 0; i < test.runCount; i++ { + args := []string{"-p", profile, "--log_dir", logDir, test.command} + args = append(args, test.args...) + + // run command twice + for i := 0; i < 2; i++ { rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) if err != nil { - t.Errorf("%q failed: %v", rr.Command(), err) + t.Logf("%q failed: %v", rr.Command(), err) } } - // get log files generated above - logFiles, err = filepath.Glob(filepath.Join(logDir, fmt.Sprintf("minikube_%s*", test.command))) + // check if one log file exists + if err := checkLogFileCount(test.command, logDir, 1); err != nil { + t.Fatal(err) + } + + // get log file generated above + logFiles, err = getLogFiles(logDir, test.command) if err != nil { - t.Errorf("failed to get new log files for command %s : %v", test.command, err) + t.Fatalf("failed to get new log files for command %s : %v", test.command, err) } - // if not the expected number of files, throw err - if len(logFiles) != test.expectedLogFiles { - t.Errorf("failed to find expected number of log files: cmd %s: expected: %d got %d", test.command, test.expectedLogFiles, len(logFiles)) + // make file at least 1024 KB in size + if err := os.Truncate(logFiles[0], 2e7); err != nil { + t.Fatalf("failed to increase file size to 1024KB: %v", err) } - // if more than 1 logfile is expected, only one file should be less than 1M - if test.expectedLogFiles > 1 { - foundSmall := false - var maxSize int64 = 1024 * 1024 // 1M - for _, logFile := range logFiles { - finfo, err := os.Stat(logFile) - if err != nil { - t.Logf("logfile %q for command %q not found:", logFile, test.command) - continue - } - isSmall := finfo.Size() < maxSize - if isSmall && !foundSmall { - foundSmall = true - } else if isSmall && foundSmall { - t.Errorf("expected to find only one file less than 1MB: cmd %s:", test.command) - } - } + // run command again + rr, err := Run(t, exec.CommandContext(ctx, Target(), args...)) + if err != nil { + t.Logf("%q failed: %v", rr.Command(), err) + } + + // check if two log files exist now + if err := checkLogFileCount(test.command, logDir, 2); err != nil { + t.Fatal(err) } }) } } +func getLogFiles(logDir string, command string) ([]string, error) { + return filepath.Glob(filepath.Join(logDir, fmt.Sprintf("minikube_%s*", command))) +} + +func checkLogFileCount(command string, logDir string, expectedNumberOfLogFiles int) error { + // get log files generated above + logFiles, err := getLogFiles(logDir, command) + if err != nil { + return fmt.Errorf("failed to get new log files for command %s : %v", command, err) + } + + if len(logFiles) != expectedNumberOfLogFiles { + return fmt.Errorf("Running cmd %q resulted in %d log file(s); expected: %d", command, len(logFiles), expectedNumberOfLogFiles) + } + + return nil +} + // cleanupLogFiles removes logfiles generated during testing func cleanupLogFiles(t *testing.T, logFiles []string) { t.Logf("Cleaning up %d logfile(s) ...", len(logFiles)) diff --git a/test/integration/functional_test.go b/test/integration/functional_test.go index 185515f979..5ccae3ca6d 100644 --- a/test/integration/functional_test.go +++ b/test/integration/functional_test.go @@ -45,6 +45,7 @@ import ( "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/util/retry" + "github.com/blang/semver/v4" "github.com/elazarl/goproxy" "github.com/hashicorp/go-retryablehttp" "github.com/otiai10/copy" @@ -59,6 +60,11 @@ type validateFunc func(context.Context, *testing.T, string) // used in validateStartWithProxy and validateSoftStart var apiPortTest = 8441 +// Store the proxy session so we can clean it up at the end +var mitm *StartSession + +var runCorpProxy = GithubActionRunner() && runtime.GOOS == "linux" && !arm64Platform() + // TestFunctional are functionality tests which can safely share a profile in parallel func TestFunctional(t *testing.T) { @@ -93,19 +99,30 @@ func TestFunctional(t *testing.T) { {"MinikubeKubectlCmdDirectly", validateMinikubeKubectlDirectCall}, {"ExtraConfig", validateExtraConfig}, // Ensure extra cmdline config change is saved {"ComponentHealth", validateComponentHealth}, + {"LogsCmd", validateLogsCmd}, + {"LogsFileCmd", validateLogsFileCmd}, } for _, tc := range tests { tc := tc if ctx.Err() == context.DeadlineExceeded { t.Fatalf("Unable to run more tests (deadline exceeded)") } + if tc.name == "StartWithProxy" && runCorpProxy { + tc.name = "StartWithCustomCerts" + tc.validator = validateStartWithCustomCerts + } t.Run(tc.name, func(t *testing.T) { tc.validator(ctx, t, profile) }) } }) - defer cleanupUnwantedImages(ctx, t, profile) + defer func() { + cleanupUnwantedImages(ctx, t, profile) + if runCorpProxy { + mitm.Stop(t) + } + }() // Parallelized tests t.Run("parallel", func(t *testing.T) { @@ -116,9 +133,8 @@ func TestFunctional(t *testing.T) { {"ConfigCmd", validateConfigCmd}, {"DashboardCmd", validateDashboardCmd}, {"DryRun", validateDryRun}, + {"InternationalLanguage", validateInternationalLanguage}, {"StatusCmd", validateStatusCmd}, - {"LogsCmd", validateLogsCmd}, - {"LogsFileCmd", validateLogsFileCmd}, {"MountCmd", validateMountCmd}, {"ProfileCmd", validateProfileCmd}, {"ServiceCmd", validateServiceCmd}, @@ -138,6 +154,8 @@ func TestFunctional(t *testing.T) { {"RemoveImage", validateRemoveImage}, {"BuildImage", validateBuildImage}, {"ListImages", validateListImages}, + {"NonActiveRuntimeDisabled", validateNotActiveRuntimeDisabled}, + {"Version", validateVersionCmd}, } for _, tc := range tests { tc := tc @@ -216,7 +234,7 @@ func validateLoadImage(ctx context.Context, t *testing.T, profile string) { } defer PostMortemLogs(t, profile) // pull busybox - busyboxImage := "busybox:latest" + busyboxImage := "busybox:1.33" rr, err := Run(t, exec.CommandContext(ctx, "docker", "pull", busyboxImage)) if err != nil { t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) @@ -257,7 +275,7 @@ func validateRemoveImage(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) // pull busybox - busyboxImage := "busybox:latest" + busyboxImage := "busybox:1.32" rr, err := Run(t, exec.CommandContext(ctx, "docker", "pull", busyboxImage)) if err != nil { t.Fatalf("failed to setup test (pull image): %v\n%s", err, rr.Output()) @@ -519,40 +537,26 @@ func validatePodmanEnv(ctx context.Context, t *testing.T, profile string) { // validateStartWithProxy makes sure minikube start respects the HTTP_PROXY environment variable func validateStartWithProxy(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) - srv, err := startHTTPProxy(t) if err != nil { t.Fatalf("failed to set up the test proxy: %s", err) } - // Use more memory so that we may reliably fit MySQL and nginx - memoryFlag := "--memory=4000" - // to avoid failure for mysq/pv on virtualbox on darwin on free github actions, - if GithubActionRunner() && VirtualboxDriver() { - memoryFlag = "--memory=6000" - } - // passing --api-server-port so later verify it didn't change in soft start. - startArgs := append([]string{"start", "-p", profile, memoryFlag, fmt.Sprintf("--apiserver-port=%d", apiPortTest), "--wait=all"}, StartArgs()...) - c := exec.CommandContext(ctx, Target(), startArgs...) - env := os.Environ() - env = append(env, fmt.Sprintf("HTTP_PROXY=%s", srv.Addr)) - env = append(env, "NO_PROXY=") - c.Env = env - rr, err := Run(t, c) + startMinikubeWithProxy(ctx, t, profile, "HTTP_PROXY", srv.Addr) +} + +// validateStartWithCustomCerts makes sure minikube start respects the HTTPS_PROXY environment variable and works with custom certs +// a proxy is started by calling the mitmdump binary in the background, then installing the certs generated by the binary +// mitmproxy/dump creates the proxy at localhost at port 8080 +// only runs on Github Actions for amd64 linux, otherwise validateStartWithProxy runs instead +func validateStartWithCustomCerts(ctx context.Context, t *testing.T, profile string) { + defer PostMortemLogs(t, profile) + err := startProxyWithCustomCerts(ctx, t) if err != nil { - t.Errorf("failed minikube start. args %q: %v", rr.Command(), err) - } - - want := "Found network options:" - if !strings.Contains(rr.Stdout.String(), want) { - t.Errorf("start stdout=%s, want: *%s*", rr.Stdout.String(), want) - } - - want = "You appear to be using a proxy" - if !strings.Contains(rr.Stderr.String(), want) { - t.Errorf("start stderr=%s, want: *%s*", rr.Stderr.String(), want) + t.Fatalf("failed to set up the test proxy: %s", err) } + startMinikubeWithProxy(ctx, t, profile, "HTTPS_PROXY", "127.0.0.1:8080") } // validateAuditAfterStart makes sure the audit log contains the correct logging after minikube start @@ -643,7 +647,11 @@ func validateMinikubeKubectl(ctx context.Context, t *testing.T, profile string) func validateMinikubeKubectlDirectCall(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) dir := filepath.Dir(Target()) - dstfn := filepath.Join(dir, "kubectl") + newName := "kubectl" + if runtime.GOOS == "windows" { + newName += ".exe" + } + dstfn := filepath.Join(dir, newName) err := os.Link(Target(), dstfn) if err != nil { @@ -807,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) @@ -896,6 +904,32 @@ func validateDryRun(ctx context.Context, t *testing.T, profile string) { } } +// validateInternationalLanguage asserts that the language used can be changed with environment variables +func validateInternationalLanguage(ctx context.Context, t *testing.T, profile string) { + // dry-run mode should always be able to finish quickly (<5s) + mctx, cancel := context.WithTimeout(ctx, Seconds(5)) + defer cancel() + + // Too little memory! + startArgs := append([]string{"start", "-p", profile, "--dry-run", "--memory", "250MB", "--alsologtostderr"}, StartArgs()...) + c := exec.CommandContext(mctx, Target(), startArgs...) + c.Env = append(os.Environ(), "LC_ALL=fr") + + rr, err := Run(t, c) + + wantCode := reason.ExInsufficientMemory + if rr.ExitCode != wantCode { + if HyperVDriver() { + t.Skip("skipping this error on HyperV till this issue is solved https://github.com/kubernetes/minikube/issues/9785") + } else { + t.Errorf("dry-run(250MB) exit code = %d, wanted = %d: %v", rr.ExitCode, wantCode, err) + } + } + if !strings.Contains(rr.Stdout.String(), "Utilisation du pilote") { + t.Errorf("dry-run output was expected to be in French. Expected \"Utilisation du pilote\", but not present in output:\n%s", rr.Stdout.String()) + } +} + // validateCacheCmd tests functionality of cache command (cache add, delete, list) func validateCacheCmd(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) @@ -942,10 +976,22 @@ func validateCacheCmd(ctx context.Context, t *testing.T, profile string) { t.Skipf("failed to build docker image, skipping local test: %v", err) } + defer func() { + _, err := Run(t, exec.CommandContext(ctx, "docker", "rmi", img)) + if err != nil { + t.Errorf("failed to delete local image %q, err %v", img, err) + } + }() + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "cache", "add", img)) if err != nil { t.Errorf("failed to 'cache add' local image %q. args %q err %v", img, rr.Command(), err) } + + rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "cache", "delete", img)) + if err != nil { + t.Errorf("failed to 'cache delete' local image %q. args %q err %v", img, rr.Command(), err) + } }) t.Run("delete_k8s.gcr.io/pause:3.3", func(t *testing.T) { @@ -1442,49 +1488,13 @@ func validateSSHCmd(ctx context.Context, t *testing.T, profile string) { } } -// cpTestMinikubePath is where the test file will be located in the Minikube instance -func cpTestMinikubePath() string { - return "/home/docker/cp-test.txt" -} - -// cpTestLocalPath is where the test file located in host os -func cpTestLocalPath() string { - return filepath.Join(*testdataDir, "cp-test.txt") -} - // validateCpCmd asserts basic "cp" command functionality func validateCpCmd(ctx context.Context, t *testing.T, profile string) { if NoneDriver() { t.Skipf("skipping: cp is unsupported by none driver") } - srcPath := cpTestLocalPath() - dstPath := cpTestMinikubePath() - - rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "cp", srcPath, dstPath)) - if ctx.Err() == context.DeadlineExceeded { - t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command()) - } - if err != nil { - t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err) - } - - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", fmt.Sprintf("sudo cat %s", dstPath))) - if ctx.Err() == context.DeadlineExceeded { - t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command()) - } - if err != nil { - t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err) - } - - expected, err := ioutil.ReadFile(srcPath) - if err != nil { - t.Errorf("failed to read test file 'testdata/cp-test.txt' : %v", err) - } - - if diff := cmp.Diff(string(expected), rr.Stdout.String()); diff != "" { - t.Errorf("/testdata/cp-test.txt content mismatch (-want +got):\n%s", diff) - } + testCpCmd(ctx, t, profile, "") } // validateMySQL validates a minimalist MySQL deployment @@ -1530,11 +1540,23 @@ func testCert() string { return fmt.Sprintf("%d.pem", os.Getpid()) } -// localTestCertPath is where the test file will be synced into the VM +// testFileCert is name of the test certificate installed +func testFileCert() string { + return fmt.Sprintf("%d2.pem", os.Getpid()) +} + +// localTestCertPath is where certs can be synced from the local host into the VM +// precisely, it's $MINIKUBE_HOME/certs func localTestCertPath() string { return filepath.Join(localpath.MiniPath(), "/certs", testCert()) } +// localTestCertFilesPath is an alternate location where certs can be synced into the minikube VM +// precisely, it's $MINIKUBE_HOME/files/etc/ssl/certs +func localTestCertFilesPath() string { + return filepath.Join(localpath.MiniPath(), "/files/etc/ssl/certs", testFileCert()) +} + // localEmptyCertPath is where the test file will be synced into the VM func localEmptyCertPath() string { return filepath.Join(localpath.MiniPath(), "/certs", fmt.Sprintf("%d_empty.pem", os.Getpid())) @@ -1576,6 +1598,30 @@ func setupFileSync(ctx context.Context, t *testing.T, profile string) { t.Errorf("%s size=%d, want %d", localTestCertPath(), got.Size(), want.Size()) } + testPem2 := filepath.Join(*testdataDir, "minikube_test2.pem") + tmpPem2 := localTestCertFilesPath() + ".pem" + if err := copy.Copy(testPem2, tmpPem2); err != nil { + t.Fatalf("failed to copy %s: %v", testPem2, err) + } + + if err := os.Rename(tmpPem2, localTestCertFilesPath()); err != nil { + t.Fatalf("failed to rename %s: %v", tmpPem2, err) + } + + want, err = os.Stat(testPem2) + if err != nil { + t.Fatalf("stat failed: %v", err) + } + + got, err = os.Stat(localTestCertFilesPath()) + if err != nil { + t.Fatalf("stat failed: %v", err) + } + + if want.Size() != got.Size() { + t.Errorf("%s size=%d, want %d", localTestCertFilesPath(), got.Size(), want.Size()) + } + // Create an empty file just to mess with people if _, err := os.Create(localEmptyCertPath()); err != nil { t.Fatalf("create failed: %v", err) @@ -1610,7 +1656,7 @@ func validateFileSync(ctx context.Context, t *testing.T, profile string) { } } -// validateCertSync to check existence of the test certificate +// validateCertSync checks to make sure a custom cert has been copied into the minikube guest and installed correctly func validateCertSync(ctx context.Context, t *testing.T, profile string) { defer PostMortemLogs(t, profile) @@ -1644,6 +1690,59 @@ func validateCertSync(ctx context.Context, t *testing.T, profile string) { t.Errorf("failed verify pem file. minikube_test.pem -> %s mismatch (-want +got):\n%s", vp, diff) } } + + testPem2 := filepath.Join(*testdataDir, "minikube_test2.pem") + want, err = ioutil.ReadFile(testPem2) + if err != nil { + t.Errorf("test file not found: %v", err) + } + + // Check both the installed & reference certs (they should be symlinked) + paths = []string{ + path.Join("/etc/ssl/certs", testFileCert()), + path.Join("/usr/share/ca-certificates", testFileCert()), + // hashed path generated by: 'openssl x509 -hash -noout -in testCert()' + "/etc/ssl/certs/3ec20f2e.0", + } + for _, vp := range paths { + t.Logf("Checking for existence of %s within VM", vp) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", fmt.Sprintf("sudo cat %s", vp))) + if err != nil { + t.Errorf("failed to check existence of %q inside minikube. args %q: %v", vp, rr.Command(), err) + } + + // Strip carriage returned by ssh + got := strings.ReplaceAll(rr.Stdout.String(), "\r", "") + if diff := cmp.Diff(string(want), got); diff != "" { + t.Errorf("failed verify pem file. minikube_test2.pem -> %s mismatch (-want +got):\n%s", vp, diff) + } + } +} + +// validateNotActiveRuntimeDisabled asserts that for a given runtime, the other runtimes disabled, for example for containerd runtime, docker and crio needs to be not running +func validateNotActiveRuntimeDisabled(ctx context.Context, t *testing.T, profile string) { + if NoneDriver() { + t.Skip("skipping on none driver, minikube does not control the runtime of user on the none driver.") + } + disableMap := map[string][]string{ + "docker": {"crio"}, + "containerd": {"docker", "crio"}, + "crio": {"docker", "containerd"}, + } + + expectDisable := disableMap[ContainerRuntime()] + for _, cr := range expectDisable { + // for example: minikube sudo systemctl is-active docker + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", fmt.Sprintf("sudo systemctl is-active %s", cr))) + got := rr.Stdout.String() + if err != nil && !strings.Contains(got, "inactive") { + t.Logf("output of %s: %v", rr.Output(), err) + } + if !strings.Contains(got, "inactive") { + t.Errorf("For runtime %q: expected %q to be inactive but got %q ", ContainerRuntime(), cr, got) + } + + } } // validateUpdateContextCmd asserts basic "update-context" command functionality @@ -1718,7 +1817,6 @@ users: if err := ioutil.WriteFile(tf.Name(), tc.kubeconfig, 0644); err != nil { t.Fatal(err) } - t.Cleanup(func() { os.Remove(tf.Name()) }) @@ -1738,6 +1836,79 @@ users: } } +// startProxyWithCustomCerts mimics starts a proxy with custom certs by using mitmproxy and installing its certs +func startProxyWithCustomCerts(ctx context.Context, t *testing.T) error { + // Download the mitmproxy bundle for mitmdump + _, err := Run(t, exec.CommandContext(ctx, "curl", "-LO", "https://snapshots.mitmproxy.org/6.0.2/mitmproxy-6.0.2-linux.tar.gz")) + if err != nil { + return errors.Wrap(err, "download mitmproxy tar") + } + defer func() { + err := os.Remove("mitmproxy-6.0.2-linux.tar.gz") + if err != nil { + t.Logf("remove tarball: %v", err) + } + }() + + mitmDir, err := ioutil.TempDir("", "") + if err != nil { + return errors.Wrap(err, "create temp dir") + } + + _, err = Run(t, exec.CommandContext(ctx, "tar", "xzf", "mitmproxy-6.0.2-linux.tar.gz", "-C", mitmDir)) + if err != nil { + return errors.Wrap(err, "untar mitmproxy tar") + } + + // Start mitmdump in the background, this will create the needed certs + // and provide the necessary proxy at 127.0.0.1:8080 + mitmRR, err := Start(t, exec.CommandContext(ctx, path.Join(mitmDir, "mitmdump"), "--set", fmt.Sprintf("confdir=%s", mitmDir))) + if err != nil { + return errors.Wrap(err, "starting mitmproxy") + } + + // Store it for cleanup later + mitm = mitmRR + + // Add a symlink from the cert to the correct directory + certFile := path.Join(mitmDir, "mitmproxy-ca-cert.pem") + // wait 15 seconds for the certs to show up + _, err = os.Stat(certFile) + tries := 1 + for os.IsNotExist(err) { + time.Sleep(1 * time.Second) + tries++ + if tries > 15 { + break + } + _, err = os.Stat(certFile) + } + if os.IsNotExist(err) { + return errors.Wrap(err, "cert files never showed up") + } + + destCertPath := path.Join("/etc/ssl/certs", "mitmproxy-ca-cert.pem") + symLinkCmd := fmt.Sprintf("ln -fs %s %s", certFile, destCertPath) + if _, err := Run(t, exec.CommandContext(ctx, "sudo", "/bin/bash", "-c", symLinkCmd)); err != nil { + return errors.Wrap(err, "cert symlink") + } + + // Add a symlink of the form {hash}.0 + rr, err := Run(t, exec.CommandContext(ctx, "openssl", "x509", "-hash", "-noout", "-in", certFile)) + if err != nil { + return errors.Wrap(err, "cert hashing") + } + stringHash := strings.TrimSpace(rr.Stdout.String()) + hashLink := path.Join("/etc/ssl/certs", fmt.Sprintf("%s.0", stringHash)) + + hashCmd := fmt.Sprintf("test -L %s || ln -fs %s %s", hashLink, destCertPath, hashLink) + if _, err := Run(t, exec.CommandContext(ctx, "sudo", "/bin/bash", "-c", hashCmd)); err != nil { + return errors.Wrap(err, "cert hash symlink") + } + + return nil +} + // startHTTPProxy runs a local http proxy and sets the env vars for it. func startHTTPProxy(t *testing.T) (*http.Server, error) { port, err := freeport.GetFreePort() @@ -1755,3 +1926,66 @@ func startHTTPProxy(t *testing.T) (*http.Server, error) { }(srv, t) return srv, nil } + +func startMinikubeWithProxy(ctx context.Context, t *testing.T, profile string, proxyEnv string, addr string) { + // Use more memory so that we may reliably fit MySQL and nginx + memoryFlag := "--memory=4000" + // to avoid failure for mysq/pv on virtualbox on darwin on free github actions, + if GithubActionRunner() && VirtualboxDriver() { + memoryFlag = "--memory=6000" + } + // passing --api-server-port so later verify it didn't change in soft start. + startArgs := append([]string{"start", "-p", profile, memoryFlag, fmt.Sprintf("--apiserver-port=%d", apiPortTest), "--wait=all"}, StartArgs()...) + c := exec.CommandContext(ctx, Target(), startArgs...) + env := os.Environ() + env = append(env, fmt.Sprintf("%s=%s", proxyEnv, addr)) + env = append(env, "NO_PROXY=") + c.Env = env + rr, err := Run(t, c) + if err != nil { + t.Errorf("failed minikube start. args %q: %v", rr.Command(), err) + } + + want := "Found network options:" + if !strings.Contains(rr.Stdout.String(), want) { + t.Errorf("start stdout=%s, want: *%s*", rr.Stdout.String(), want) + } + + want = "You appear to be using a proxy" + if !strings.Contains(rr.Stderr.String(), want) { + t.Errorf("start stderr=%s, want: *%s*", rr.Stderr.String(), want) + } +} + +// validateVersionCmd asserts `minikube version` command works fine for both --short and --components +func validateVersionCmd(ctx context.Context, t *testing.T, profile string) { + + t.Run("short", func(t *testing.T) { + MaybeParallel(t) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "version", "--short")) + if err != nil { + t.Errorf("failed to get version --short: %v", err) + } + + _, err = semver.Make(strings.TrimSpace(strings.Trim(rr.Stdout.String(), "v"))) + if err != nil { + t.Errorf("failed to get a valid semver for minikube version --short:%s %v", rr.Output(), err) + } + }) + + t.Run("components", func(t *testing.T) { + MaybeParallel(t) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "version", "-o=json", "--components")) + if err != nil { + t.Errorf("error version: %v", err) + } + got := rr.Stdout.String() + for _, c := range []string{"buildctl", "commit", "containerd", "crictl", "crio", "ctr", "docker", "minikubeVersion", "podman", "run"} { + if !strings.Contains(got, c) { + t.Errorf("expected to see %q in the minikube version --components but got:\n%s", c, got) + } + + } + }) + +} diff --git a/test/integration/functional_test_mount_test.go b/test/integration/functional_test_mount_test.go index ff5893692d..211f9d4d8a 100644 --- a/test/integration/functional_test_mount_test.go +++ b/test/integration/functional_test_mount_test.go @@ -22,11 +22,13 @@ import ( "bytes" "context" "fmt" + "io" "io/ioutil" "os" "os/exec" "path" "path/filepath" + "regexp" "runtime" "strings" "testing" @@ -56,155 +58,242 @@ func validateMountCmd(ctx context.Context, t *testing.T, profile string) { // no t.Skip("skipping: mount broken on windows: https://github.com/kubernetes/minikube/issues/8303") } - if GithubActionRunner() && PodmanDriver() { - t.Skip("skipping: https://github.com/kubernetes/minikube/issues/11293") - } - - tempDir, err := ioutil.TempDir("", "mounttest") - defer func() { // clean up tempdir - err := os.RemoveAll(tempDir) - if err != nil { - t.Errorf("failed to clean up %q temp folder.", tempDir) - } - }() - if err != nil { - t.Fatalf("Unexpected error while creating tempDir: %v", err) - } - - ctx, cancel := context.WithTimeout(ctx, Minutes(10)) - - args := []string{"mount", "-p", profile, fmt.Sprintf("%s:%s", tempDir, guestMount), "--alsologtostderr", "-v=1"} - ss, err := Start(t, exec.CommandContext(ctx, Target(), args...)) - if err != nil { - t.Fatalf("%v failed: %v", args, err) - } - - defer func() { - if t.Failed() { - t.Logf("%q failed, getting debug info...", t.Name()) - rr, err := Run(t, exec.Command(Target(), "-p", profile, "ssh", "mount | grep 9p; ls -la /mount-9p; cat /mount-9p/pod-dates")) + t.Run("any-port", func(t *testing.T) { + tempDir, err := ioutil.TempDir("", "mounttest") + defer func() { // clean up tempdir + err := os.RemoveAll(tempDir) if err != nil { - t.Logf("debugging command %q failed : %v", rr.Command(), err) - } else { - t.Logf("(debug) %s:\n%s", rr.Command(), rr.Stdout) + t.Errorf("failed to clean up %q temp folder.", tempDir) + } + }() + if err != nil { + t.Fatalf("Unexpected error while creating tempDir: %v", err) + } + + ctx, cancel := context.WithTimeout(ctx, Minutes(10)) + + args := []string{"mount", "-p", profile, fmt.Sprintf("%s:%s", tempDir, guestMount), "--alsologtostderr", "-v=1"} + ss, err := Start(t, exec.CommandContext(ctx, Target(), args...)) + if err != nil { + t.Fatalf("%v failed: %v", args, err) + } + + defer func() { + if t.Failed() { + t.Logf("%q failed, getting debug info...", t.Name()) + rr, err := Run(t, exec.Command(Target(), "-p", profile, "ssh", "mount | grep 9p; ls -la /mount-9p; cat /mount-9p/pod-dates")) + if err != nil { + t.Logf("debugging command %q failed : %v", rr.Command(), err) + } else { + t.Logf("(debug) %s:\n%s", rr.Command(), rr.Stdout) + } + } + + // Cleanup in advance of future tests + rr, err := Run(t, exec.Command(Target(), "-p", profile, "ssh", "sudo umount -f /mount-9p")) + if err != nil { + t.Logf("%q: %v", rr.Command(), err) + } + ss.Stop(t) + cancel() + if *cleanup { + os.RemoveAll(tempDir) + } + }() + + // Write local files + testMarker := fmt.Sprintf("test-%d", time.Now().UnixNano()) + wantFromTest := []byte(testMarker) + for _, name := range []string{createdByTest, createdByTestRemovedByPod, testMarker} { + p := filepath.Join(tempDir, name) + err := ioutil.WriteFile(p, wantFromTest, 0644) + t.Logf("wrote %q to %s", wantFromTest, p) + if err != nil { + t.Errorf("WriteFile %s: %v", p, err) } } - // Cleanup in advance of future tests - rr, err := Run(t, exec.Command(Target(), "-p", profile, "ssh", "sudo umount -f /mount-9p")) - if err != nil { - t.Logf("%q: %v", rr.Command(), err) + // Block until the mount succeeds to avoid file race + checkMount := func() error { + _, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "findmnt -T /mount-9p | grep 9p")) + return err } + + start := time.Now() + if err := retry.Expo(checkMount, time.Millisecond*500, Seconds(15)); err != nil { + // For local testing, allow macOS users to click prompt. If they don't, skip the test. + if runtime.GOOS == "darwin" { + t.Skip("skipping: mount did not appear, likely because macOS requires prompt to allow non-codesigned binaries to listen on non-localhost port") + } + t.Fatalf("/mount-9p did not appear within %s: %v", time.Since(start), err) + } + + // Assert that we can access the mount without an error. Display for debugging. + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "--", "ls", "-la", guestMount)) + if err != nil { + t.Fatalf("failed verifying accessing to the mount. args %q : %v", rr.Command(), err) + } + t.Logf("guest mount directory contents\n%s", rr.Stdout) + + // Assert that the mount contains our unique test marker, as opposed to a stale mount + tp := filepath.Join("/mount-9p", testMarker) + rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "cat", tp)) + if err != nil { + t.Fatalf("failed to verify the mount contains unique test marked: args %q: %v", rr.Command(), err) + } + + if !bytes.Equal(rr.Stdout.Bytes(), wantFromTest) { + // The mount is hosed, exit fast before wasting time launching pods. + t.Fatalf("%s = %q, want %q", tp, rr.Stdout.Bytes(), wantFromTest) + } + + // Start the "busybox-mount" pod. + rr, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "replace", "--force", "-f", filepath.Join(*testdataDir, "busybox-mount-test.yaml"))) + if err != nil { + t.Fatalf("failed to 'kubectl replace' for busybox-mount-test. args %q : %v", rr.Command(), err) + } + + if _, err := PodWait(ctx, t, profile, "default", "integration-test=busybox-mount", Minutes(4)); err != nil { + t.Fatalf("failed waiting for busybox-mount pod: %v", err) + } + + // Read the file written by pod startup + p := filepath.Join(tempDir, createdByPod) + got, err := ioutil.ReadFile(p) + if err != nil { + t.Errorf("failed to read file created by pod %q: %v", p, err) + } + wantFromPod := []byte("test\n") + if !bytes.Equal(got, wantFromPod) { + t.Errorf("the content of the file %q is %q, but want it to be: *%q*", p, got, wantFromPod) + } + + // test that file written from host was read in by the pod via cat /mount-9p/written-by-host; + rr, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "logs", "busybox-mount")) + if err != nil { + t.Errorf("failed to get kubectl logs for busybox-mount. args %q : %v", rr.Command(), err) + } + if !bytes.Equal(rr.Stdout.Bytes(), wantFromTest) { + t.Errorf("busybox-mount logs = %q, want %q", rr.Stdout.Bytes(), wantFromTest) + } + + // test file timestamps are correct + for _, name := range []string{createdByTest, createdByPod} { + gp := path.Join(guestMount, name) + // test that file written from host was read in by the pod via cat /mount-9p/fromhost; + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "stat", gp)) + if err != nil { + t.Errorf("failed to stat the file %q iniside minikube : args %q: %v", gp, rr.Command(), err) + } + + if runtime.GOOS == "windows" { + if strings.Contains(rr.Stdout.String(), "Access: 1970-01-01") { + t.Errorf("expected to get valid access time but got: %q", rr.Stdout) + } + } + + if strings.Contains(rr.Stdout.String(), "Modify: 1970-01-01") { + t.Errorf("expected to get valid modify time but got: %q", rr.Stdout) + } + } + + p = filepath.Join(tempDir, createdByTestRemovedByPod) + if _, err := os.Stat(p); err == nil { + t.Errorf("expected file %q to be removed but exists !", p) + } + + p = filepath.Join(tempDir, createdByPodRemovedByTest) + if err := os.Remove(p); err != nil { + t.Errorf("failed to remove file %q: %v", p, err) + } + }) + t.Run("specific-port", func(t *testing.T) { + tempDir, err := ioutil.TempDir("", "mounttest") + defer func() { // clean up tempdir + err := os.RemoveAll(tempDir) + if err != nil { + t.Errorf("failed to clean up %q temp folder.", tempDir) + } + }() + if err != nil { + t.Fatalf("Unexpected error while creating tempDir: %v", err) + } + + ctx, cancel := context.WithTimeout(ctx, Minutes(10)) + + args := []string{"mount", "-p", profile, fmt.Sprintf("%s:%s", tempDir, guestMount), "--alsologtostderr", "-v=1", "--port", "46464"} + ss, err := Start(t, exec.CommandContext(ctx, Target(), args...)) + if err != nil { + t.Fatalf("%v failed: %v", args, err) + } + + defer func() { + if t.Failed() { + t.Logf("%q failed, getting debug info...", t.Name()) + rr, err := Run(t, exec.Command(Target(), "-p", profile, "ssh", "mount | grep 9p; ls -la /mount-9p; cat /mount-9p/pod-dates")) + if err != nil { + t.Logf("debugging command %q failed : %v", rr.Command(), err) + } else { + t.Logf("(debug) %s:\n%s", rr.Command(), rr.Stdout) + } + } + + // Cleanup in advance of future tests + rr, err := Run(t, exec.Command(Target(), "-p", profile, "ssh", "sudo umount -f /mount-9p")) + if err != nil { + t.Logf("%q: %v", rr.Command(), err) + } + ss.Stop(t) + cancel() + if *cleanup { + os.RemoveAll(tempDir) + } + }() + + // Block until the mount succeeds to avoid file race + checkMount := func() error { + _, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "findmnt -T /mount-9p | grep 9p")) + return err + } + + start := time.Now() + if err := retry.Expo(checkMount, time.Millisecond*500, Seconds(15)); err != nil { + // For local testing, allow macOS users to click prompt. If they don't, skip the test. + if runtime.GOOS == "darwin" { + t.Skip("skipping: mount did not appear, likely because macOS requires prompt to allow non-codesigned binaries to listen on non-localhost port") + } + t.Fatalf("/mount-9p did not appear within %s: %v", time.Since(start), err) + } + + // Assert that we can access the mount without an error. Display for debugging. + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "--", "ls", "-la", guestMount)) + if err != nil { + t.Fatalf("failed verifying accessing to the mount. args %q : %v", rr.Command(), err) + } + t.Logf("guest mount directory contents\n%s", rr.Stdout) + ss.Stop(t) - cancel() - if *cleanup { - os.RemoveAll(tempDir) - } - }() - - // Write local files - testMarker := fmt.Sprintf("test-%d", time.Now().UnixNano()) - wantFromTest := []byte(testMarker) - for _, name := range []string{createdByTest, createdByTestRemovedByPod, testMarker} { - p := filepath.Join(tempDir, name) - err := ioutil.WriteFile(p, wantFromTest, 0644) - t.Logf("wrote %q to %s", wantFromTest, p) - if err != nil { - t.Errorf("WriteFile %s: %v", p, err) - } - } - - // Block until the mount succeeds to avoid file race - checkMount := func() error { - _, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "findmnt -T /mount-9p | grep 9p")) - return err - } - - start := time.Now() - if err := retry.Expo(checkMount, time.Millisecond*500, Seconds(15)); err != nil { - // For local testing, allow macOS users to click prompt. If they don't, skip the test. - if runtime.GOOS == "darwin" { - t.Skip("skipping: mount did not appear, likely because macOS requires prompt to allow non-codesigned binaries to listen on non-localhost port") - } - t.Fatalf("/mount-9p did not appear within %s: %v", time.Since(start), err) - } - - // Assert that we can access the mount without an error. Display for debugging. - rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "--", "ls", "-la", guestMount)) - if err != nil { - t.Fatalf("failed verifying accessing to the mount. args %q : %v", rr.Command(), err) - } - t.Logf("guest mount directory contents\n%s", rr.Stdout) - - // Assert that the mount contains our unique test marker, as opposed to a stale mount - tp := filepath.Join("/mount-9p", testMarker) - rr, err = Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "cat", tp)) - if err != nil { - t.Fatalf("failed to verify the mount contains unique test marked: args %q: %v", rr.Command(), err) - } - - if !bytes.Equal(rr.Stdout.Bytes(), wantFromTest) { - // The mount is hosed, exit fast before wasting time launching pods. - t.Fatalf("%s = %q, want %q", tp, rr.Stdout.Bytes(), wantFromTest) - } - - // Start the "busybox-mount" pod. - rr, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "replace", "--force", "-f", filepath.Join(*testdataDir, "busybox-mount-test.yaml"))) - if err != nil { - t.Fatalf("failed to 'kubectl replace' for busybox-mount-test. args %q : %v", rr.Command(), err) - } - - if _, err := PodWait(ctx, t, profile, "default", "integration-test=busybox-mount", Minutes(4)); err != nil { - t.Fatalf("failed waiting for busybox-mount pod: %v", err) - } - - // Read the file written by pod startup - p := filepath.Join(tempDir, createdByPod) - got, err := ioutil.ReadFile(p) - if err != nil { - t.Errorf("failed to read file created by pod %q: %v", p, err) - } - wantFromPod := []byte("test\n") - if !bytes.Equal(got, wantFromPod) { - t.Errorf("the content of the file %q is %q, but want it to be: *%q*", p, got, wantFromPod) - } - - // test that file written from host was read in by the pod via cat /mount-9p/written-by-host; - rr, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "logs", "busybox-mount")) - if err != nil { - t.Errorf("failed to get kubectl logs for busybox-mount. args %q : %v", rr.Command(), err) - } - if !bytes.Equal(rr.Stdout.Bytes(), wantFromTest) { - t.Errorf("busybox-mount logs = %q, want %q", rr.Stdout.Bytes(), wantFromTest) - } - - // test file timestamps are correct - for _, name := range []string{createdByTest, createdByPod} { - gp := path.Join(guestMount, name) - // test that file written from host was read in by the pod via cat /mount-9p/fromhost; - rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "ssh", "stat", gp)) - if err != nil { - t.Errorf("failed to stat the file %q iniside minikube : args %q: %v", gp, rr.Command(), err) - } - - if runtime.GOOS == "windows" { - if strings.Contains(rr.Stdout.String(), "Access: 1970-01-01") { - t.Errorf("expected to get valid access time but got: %q", rr.Stdout) + t.Logf("reading mount text") + mountText := func() string { + str := "" + var err error = nil + for err == nil { + var add string + add, err = ss.Stdout.ReadString(0) + str += add } + if err != io.EOF { + t.Fatalf("failed to read stdout of mount cmd. err: %v", err) + } + return str + }() + t.Logf("done reading mount text") + match, err := regexp.Match("Bind Address:\\s*[0-9.]+:46464", []byte(mountText)) + if err != nil { + t.Fatalf("failed to match regex pattern. err: %v", err) } - - if strings.Contains(rr.Stdout.String(), "Modify: 1970-01-01") { - t.Errorf("expected to get valid modify time but got: %q", rr.Stdout) + if !match { + t.Fatalf("failed to find bind address with port 46464. Mount command out: \n%v", mountText) } - } - - p = filepath.Join(tempDir, createdByTestRemovedByPod) - if _, err := os.Stat(p); err == nil { - t.Errorf("expected file %q to be removed but exists !", p) - } - - p = filepath.Join(tempDir, createdByPodRemovedByTest) - if err := os.Remove(p); err != nil { - t.Errorf("failed to remove file %q: %v", p, err) - } + }) } diff --git a/test/integration/helpers_test.go b/test/integration/helpers_test.go index d01bf5aee3..5e1fa1fc9e 100644 --- a/test/integration/helpers_test.go +++ b/test/integration/helpers_test.go @@ -26,15 +26,20 @@ import ( "bufio" "bytes" "context" + "errors" "fmt" + "io" "io/ioutil" + "os" "os/exec" + "path/filepath" "strconv" "strings" "testing" "time" "github.com/docker/machine/libmachine/state" + "github.com/google/go-cmp/cmp" "github.com/shirou/gopsutil/v3/process" core "k8s.io/api/core/v1" meta "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -501,3 +506,167 @@ func killProcessFamily(t *testing.T, pid int) { } } } + +// cpTestMinikubePath is where the test file will be located in the Minikube instance +func cpTestMinikubePath() string { + return "/home/docker/cp-test.txt" +} + +// cpTestLocalPath is where the test file located in host os +func cpTestLocalPath() string { + return filepath.Join(*testdataDir, "cp-test.txt") +} + +// testCpCmd ensures copy functionality into minikube instance. +func testCpCmd(ctx context.Context, t *testing.T, profile string, node string) { + srcPath := cpTestLocalPath() + dstPath := cpTestMinikubePath() + + cpArgv := []string{"-p", profile, "cp", srcPath} + if node == "" { + cpArgv = append(cpArgv, dstPath) + } else { + cpArgv = append(cpArgv, fmt.Sprintf("%s:%s", node, dstPath)) + } + + rr, err := Run(t, exec.CommandContext(ctx, Target(), cpArgv...)) + if ctx.Err() == context.DeadlineExceeded { + t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command()) + } + if err != nil { + t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err) + } + + sshArgv := []string{"-p", profile, "ssh"} + if node != "" { + sshArgv = append(sshArgv, "-n", node) + } + sshArgv = append(sshArgv, fmt.Sprintf("sudo cat %s", dstPath)) + + rr, err = Run(t, exec.CommandContext(ctx, Target(), sshArgv...)) + if ctx.Err() == context.DeadlineExceeded { + t.Errorf("failed to run command by deadline. exceeded timeout : %s", rr.Command()) + } + if err != nil { + t.Errorf("failed to run an cp command. args %q : %v", rr.Command(), err) + } + + expected, err := ioutil.ReadFile(srcPath) + if err != nil { + t.Errorf("failed to read test file 'testdata/cp-test.txt' : %v", err) + } + + if diff := cmp.Diff(string(expected), rr.Stdout.String()); diff != "" { + t.Errorf("/testdata/cp-test.txt content mismatch (-want +got):\n%s", diff) + } +} + +// CopyFile copies the specified source file to the specified destination file. +// Specify true for overwrite to overwrite the destination file if it already exits. +func CopyFile(src, dst string, overwrite bool) error { + srcFile, err := os.Open(src) + if err != nil { + return err + } + defer srcFile.Close() + + if !overwrite { + // check if the file exists, if it does then return an error + _, err := os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return errors.New("won't overwrite destination file") + } + } + + dstFile, err := os.Create(dst) + if err != nil { + return err + } + defer dstFile.Close() + + _, err = io.Copy(dstFile, srcFile) + if err != nil { + return err + } + + // flush the buffer + err = dstFile.Sync() + if err != nil { + return err + } + + // copy file permissions + srcInfo, err := os.Stat(src) + if err != nil { + return err + } + + err = os.Chmod(dst, srcInfo.Mode()) + if err != nil { + return err + } + + return nil +} + +// CopyDir recursively copies the specified source directory tree to the +// specified destination. The destination directory must not exist. Any +// symlinks under src are ignored. +func CopyDir(src, dst string) error { + src = filepath.Clean(src) + dst = filepath.Clean(dst) + + // verify that src is a directory + srcInfo, err := os.Stat(src) + if err != nil { + return err + } + if !srcInfo.IsDir() { + return fmt.Errorf("source is not a directory") + } + + // now verify that dst doesn't exist + _, err = os.Stat(dst) + if err != nil && !os.IsNotExist(err) { + return err + } + if err == nil { + return fmt.Errorf("destination directory already exists") + } + + err = os.MkdirAll(dst, srcInfo.Mode()) + if err != nil { + return err + } + + // get the collection of directory entries under src. + // for each entry build its corresponding path under dst. + entries, err := ioutil.ReadDir(src) + if err != nil { + return err + } + + for _, entry := range entries { + // skip symlinks + if entry.Mode()&os.ModeSymlink != 0 { + continue + } + + srcPath := filepath.Join(src, entry.Name()) + dstPath := filepath.Join(dst, entry.Name()) + + if entry.IsDir() { + err = CopyDir(srcPath, dstPath) + if err != nil { + return err + } + } else { + err = CopyFile(srcPath, dstPath, true) + if err != nil { + return err + } + } + } + + return nil +} diff --git a/test/integration/main_test.go b/test/integration/main_test.go index 3e1003df0b..c259933bef 100644 --- a/test/integration/main_test.go +++ b/test/integration/main_test.go @@ -97,6 +97,16 @@ func setMaxParallelism() { // Each "minikube start" consumes up to 2 cores, though the average usage is somewhat lower limit := int(math.Floor(float64(maxp) / 1.75)) + // Windows and MacOS tests were failing from timeouts due to too much parallelism + if runtime.GOOS == "windows" { + limit /= 2 + } + + // Hardcode limit to 2 for macOS + if runtime.GOOS == "darwin" { + limit = 2 + } + fmt.Fprintf(os.Stderr, "Found %d cores, limiting parallelism with --test.parallel=%d\n", maxp, limit) if err := flag.Set("test.parallel", strconv.Itoa(limit)); err != nil { fmt.Fprintf(os.Stderr, "Unable to set test.parallel: %v\n", err) diff --git a/test/integration/multinode_test.go b/test/integration/multinode_test.go index 397e4fcc47..b1e74c9bb3 100644 --- a/test/integration/multinode_test.go +++ b/test/integration/multinode_test.go @@ -22,10 +22,12 @@ import ( "context" "encoding/json" "fmt" + "net" "os/exec" "strings" "testing" + "k8s.io/minikube/cmd/minikube/cmd" "k8s.io/minikube/pkg/minikube/config" ) @@ -47,10 +49,13 @@ func TestMultiNode(t *testing.T) { }{ {"FreshStart2Nodes", validateMultiNodeStart}, {"DeployApp2Nodes", validateDeployAppToMultiNode}, + {"PingHostFrom2Pods", validatePodsPingHost}, {"AddNode", validateAddNodeToMultiNode}, {"ProfileList", validateProfileListWithMultiNode}, + {"CopyFile", validateCopyFileWithMultiNode}, {"StopNode", validateStopRunningNode}, {"StartAfterStop", validateStartNodeAfterStop}, + {"RestartKeepsNodes", validateRestartKeepsNodes}, {"DeleteNode", validateDeleteNodeFromMultiNode}, {"StopMultiNode", validateStopMultiNodeCluster}, {"RestartMultiNode", validateRestartMultiNodeCluster}, @@ -152,9 +157,32 @@ func validateProfileListWithMultiNode(ctx context.Context, t *testing.T, profile t.Errorf("expected the json of 'profile list' to not include profile or node in invalid profile but got *%q*. args: %q", rr.Stdout.String(), rr.Command()) } } + } +} +// validateProfileListWithMultiNode make sure minikube profile list outputs correct with multinode clusters +func validateCopyFileWithMultiNode(ctx context.Context, t *testing.T, profile string) { + if NoneDriver() { + t.Skipf("skipping: cp is unsupported by none driver") } + rr, err := Run(t, exec.CommandContext(ctx, Target(), "-p", profile, "status", "--output", "json", "--alsologtostderr")) + if err != nil && rr.ExitCode != 7 { + t.Fatalf("failed to run minikube status. args %q : %v", rr.Command(), err) + } + + var statuses []cmd.Status + if err = json.Unmarshal(rr.Stdout.Bytes(), &statuses); err != nil { + t.Errorf("failed to decode json from status: args %q: %v", rr.Command(), err) + } + + for _, s := range statuses { + if s.Worker { + testCpCmd(ctx, t, profile, s.Name) + } else { + testCpCmd(ctx, t, profile, "") + } + } } // validateStopRunningNode tests the minikube node stop command @@ -231,6 +259,36 @@ func validateStartNodeAfterStop(ctx context.Context, t *testing.T, profile strin } } +// validateRestartKeepsNodes restarts minikube cluster and checks if the reported node list is unchanged +func validateRestartKeepsNodes(ctx context.Context, t *testing.T, profile string) { + rr, err := Run(t, exec.CommandContext(ctx, Target(), "node", "list", "-p", profile)) + if err != nil { + t.Errorf("failed to run node list. args %q : %v", rr.Command(), err) + } + + nodeList := rr.Stdout.String() + + _, err = Run(t, exec.CommandContext(ctx, Target(), "stop", "-p", profile)) + if err != nil { + t.Errorf("failed to run minikube stop. args %q : %v", rr.Command(), err) + } + + _, err = Run(t, exec.CommandContext(ctx, Target(), "start", "-p", profile, "--wait=true", "-v=8", "--alsologtostderr")) + if err != nil { + t.Errorf("failed to run minikube start. args %q : %v", rr.Command(), err) + } + + rr, err = Run(t, exec.CommandContext(ctx, Target(), "node", "list", "-p", profile)) + if err != nil { + t.Errorf("failed to run node list. args %q : %v", rr.Command(), err) + } + + restartedNodeList := rr.Stdout.String() + if nodeList != restartedNodeList { + t.Fatalf("reported node list is not the same after restart. Before restart: %s\nAfter restart: %s", nodeList, restartedNodeList) + } +} + // validateStopMultiNodeCluster runs minikube stop on a multinode cluster func validateStopMultiNodeCluster(ctx context.Context, t *testing.T, profile string) { // Run minikube stop on the cluster @@ -408,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 { @@ -437,6 +495,7 @@ func validateDeployAppToMultiNode(ctx context.Context, t *testing.T, profile str t.Errorf("Pod %s could not resolve 'kubernetes.io': %v", name, err) } } + // verify both Pods could resolve "kubernetes.default" // this one is also checked by k8s e2e node conformance tests: // https://github.com/kubernetes/kubernetes/blob/f137c4777095b3972e2dd71a01365d47be459389/test/e2e_node/environment/conformance.go#L125-L179 @@ -446,6 +505,7 @@ func validateDeployAppToMultiNode(ctx context.Context, t *testing.T, profile str t.Errorf("Pod %s could not resolve 'kubernetes.default': %v", name, err) } } + // verify both pods could resolve to a local service. for _, name := range podNames { _, err = Run(t, exec.CommandContext(ctx, Target(), "kubectl", "-p", profile, "--", "exec", name, "--", "nslookup", "kubernetes.default.svc.cluster.local")) @@ -454,3 +514,28 @@ func validateDeployAppToMultiNode(ctx context.Context, t *testing.T, profile str } } } + +// validatePodsPingHost uses app previously deplyed by validateDeployAppToMultiNode to verify its pods, located on different nodes, can resolve "host.minikube.internal". +func validatePodsPingHost(ctx context.Context, t *testing.T, profile string) { + // get Pod names + rr, err := Run(t, exec.CommandContext(ctx, Target(), "kubectl", "-p", profile, "--", "get", "pods", "-o", "jsonpath='{.items[*].metadata.name}'")) + if err != nil { + t.Fatalf("failed to get Pod names: %v", err) + } + podNames := strings.Split(strings.Trim(rr.Stdout.String(), "'"), " ") + + for _, name := range podNames { + // get host.minikube.internal ip as resolved by nslookup + out, err := Run(t, exec.CommandContext(ctx, Target(), "kubectl", "-p", profile, "--", "exec", name, "--", "sh", "-c", "nslookup host.minikube.internal | awk 'NR==5' | cut -d' ' -f3")) + if err != nil { + t.Errorf("Pod %s could not resolve 'host.minikube.internal': %v", name, err) + continue + } + hostIP := net.ParseIP(strings.TrimSpace(out.Stdout.String())) + // try pinging host from pod + ping := fmt.Sprintf("ping -c 1 %s", hostIP) + if _, err := Run(t, exec.CommandContext(ctx, Target(), "kubectl", "-p", profile, "--", "exec", name, "--", "sh", "-c", ping)); err != nil { + t.Errorf("Failed to ping host (%s) from pod (%s): %v", hostIP, name, err) + } + } +} diff --git a/test/integration/net_test.go b/test/integration/net_test.go index 36ced3d1e3..e3eb1a49d0 100644 --- a/test/integration/net_test.go +++ b/test/integration/net_test.go @@ -29,6 +29,7 @@ import ( "time" "k8s.io/minikube/pkg/kapi" + "k8s.io/minikube/pkg/minikube/reason" "k8s.io/minikube/pkg/util/retry" ) @@ -49,7 +50,8 @@ func TestNetworkPlugins(t *testing.T) { podLabel string hairpin bool }{ - {"auto", []string{}, "", "", false}, + // for containerd and crio runtimes kindnet CNI is used by default and hairpin is enabled + {"auto", []string{}, "", "", ContainerRuntime() != "docker"}, {"kubenet", []string{"--network-plugin=kubenet"}, "kubenet", "", true}, {"bridge", []string{"--cni=bridge"}, "cni", "", true}, {"enable-default-cni", []string{"--enable-default-cni=true"}, "cni", "", true}, @@ -65,17 +67,30 @@ func TestNetworkPlugins(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - if DockerDriver() && strings.Contains(tc.name, "flannel") { - t.Skipf("flannel is not yet compatible with Docker driver: iptables v1.8.3 (legacy): Couldn't load target `CNI-x': No such file or directory") - } - - start := time.Now() - MaybeParallel(t) profile := UniqueProfileName(tc.name) ctx, cancel := context.WithTimeout(context.Background(), Minutes(40)) defer CleanupWithLogs(t, profile, cancel) + if DockerDriver() && strings.Contains(tc.name, "flannel") { + t.Skipf("flannel is not yet compatible with Docker driver: iptables v1.8.3 (legacy): Couldn't load target `CNI-x': No such file or directory") + } + + if ContainerRuntime() != "docker" && tc.name == "false" { + // CNI is required for current container runtime + validateFalseCNI(ctx, t, profile) + return + } + + if ContainerRuntime() != "docker" && tc.name == "kubenet" { + // CNI is disabled when --network-plugin=kubenet option is passed. See cni.New(..) function + // But for containerd/crio CNI has to be configured + t.Skipf("Skipping the test as %s container runtimes requires CNI", ContainerRuntime()) + } + + start := time.Now() + MaybeParallel(t) + startArgs := append([]string{"start", "-p", profile, "--memory=2048", "--alsologtostderr", "--wait=true", "--wait-timeout=5m"}, tc.args...) startArgs = append(startArgs, StartArgs()...) @@ -95,10 +110,13 @@ func TestNetworkPlugins(t *testing.T) { } if !t.Failed() { t.Run("KubeletFlags", func(t *testing.T) { - // none does not support 'minikube ssh' - rr, err := Run(t, exec.CommandContext(ctx, Target(), "ssh", "-p", profile, "pgrep -a kubelet")) + var rr *RunResult + var err error if NoneDriver() { + // none does not support 'minikube ssh' rr, err = Run(t, exec.CommandContext(ctx, "pgrep", "-a", "kubelet")) + } else { + rr, err = Run(t, exec.CommandContext(ctx, Target(), "ssh", "-p", profile, "pgrep -a kubelet")) } if err != nil { t.Fatalf("ssh failed: %v", err) @@ -172,20 +190,7 @@ func TestNetworkPlugins(t *testing.T) { if !t.Failed() { t.Run("HairPin", func(t *testing.T) { - tryHairPin := func() error { - _, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "exec", "deployment/netcat", "--", "/bin/sh", "-c", "nc -w 5 -i 5 -z netcat 8080")) - return err - } - - if tc.hairpin { - if err := retry.Expo(tryHairPin, 1*time.Second, Seconds(60)); err != nil { - t.Errorf("failed to connect via pod host: %v", err) - } - } else { - if tryHairPin() == nil { - t.Fatalf("hairpin connection unexpectedly succeeded - misconfigured test?") - } - } + validateHairpinMode(ctx, t, profile, tc.hairpin) }) } @@ -195,6 +200,48 @@ func TestNetworkPlugins(t *testing.T) { }) } +// validateFalseCNI checks that minikube returns and error +// if container runtime is "containerd" or "crio" +// and --cni=false +func validateFalseCNI(ctx context.Context, t *testing.T, profile string) { + cr := ContainerRuntime() + + startArgs := []string{"start", "-p", profile, "--memory=2048", "--alsologtostderr", "--cni=false"} + startArgs = append(startArgs, StartArgs()...) + + mkCmd := exec.CommandContext(ctx, Target(), startArgs...) + rr, err := Run(t, mkCmd) + if err == nil { + t.Errorf("%s expected to fail", mkCmd) + } + if rr.ExitCode != reason.Usage.ExitCode { + t.Errorf("Expected %d exit code, got %d", reason.Usage.ExitCode, rr.ExitCode) + } + expectedMsg := fmt.Sprintf("The %q container runtime requires CNI", cr) + if !strings.Contains(rr.Output(), expectedMsg) { + t.Errorf("Expected %q line not found in output %s", expectedMsg, rr.Output()) + } +} + +// validateHairpinMode makes sure the hairpinning (https://en.wikipedia.org/wiki/Hairpinning) is correctly configured for given CNI +// try to access deployment/netcat pod using external, obtained from 'netcat' service dns resolution, IP address +// should fail if hairpinMode is off +func validateHairpinMode(ctx context.Context, t *testing.T, profile string, hairpin bool) { + tryHairPin := func() error { + _, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "exec", "deployment/netcat", "--", "/bin/sh", "-c", "nc -w 5 -i 5 -z netcat 8080")) + return err + } + if hairpin { + if err := retry.Expo(tryHairPin, 1*time.Second, Seconds(60)); err != nil { + t.Errorf("failed to connect via pod host: %v", err) + } + } else { + if tryHairPin() == nil { + t.Fatalf("hairpin connection unexpectedly succeeded - misconfigured test?") + } + } +} + func verifyKubeletFlagsOutput(t *testing.T, kubeletPlugin, out string) { if kubeletPlugin == "" { if strings.Contains(out, "--network-plugin") && ContainerRuntime() == "docker" { diff --git a/test/integration/start_stop_delete_test.go b/test/integration/start_stop_delete_test.go index 471e85b113..85e0f0f924 100644 --- a/test/integration/start_stop_delete_test.go +++ b/test/integration/start_stop_delete_test.go @@ -107,6 +107,7 @@ func TestStartStop(t *testing.T) { }{ {"FirstStart", validateFirstStart}, {"DeployApp", validateDeploying}, + {"EnableAddonWhileActive", validateEnableAddonWhileActive}, {"Stop", validateStop}, {"EnableAddonAfterStop", validateEnableAddonAfterStop}, {"SecondStart", validateSecondStart}, @@ -169,6 +170,31 @@ func validateDeploying(ctx context.Context, t *testing.T, profile string, tcName } } +// validateEnableAddonWhileActive makes sure addons can be enabled while cluster is active. +func validateEnableAddonWhileActive(ctx context.Context, t *testing.T, profile string, tcName string, tcVersion string, startArgs []string) { + defer PostMortemLogs(t, profile) + + // Enable an addon to assert it requests the correct image. + rr, err := Run(t, exec.CommandContext(ctx, Target(), "addons", "enable", "metrics-server", "-p", profile, "--images=MetricsServer=k8s.gcr.io/echoserver:1.4", "--registries=MetricsServer=fake.domain")) + if err != nil { + t.Errorf("failed to enable an addon post-stop. args %q: %v", rr.Command(), err) + } + + if strings.Contains(tcName, "cni") { + t.Logf("WARNING: cni mode requires additional setup before pods can schedule :(") + return + } + + rr, err = Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "describe", "deploy/metrics-server", "-n", "kube-system")) + if err != nil { + t.Errorf("failed to get info on auto-pause deployments. args %q: %v", rr.Command(), err) + } + deploymentInfo := rr.Stdout.String() + if !strings.Contains(deploymentInfo, " fake.domain/k8s.gcr.io/echoserver:1.4") { + t.Errorf("addon did not load correct image. Expected to contain \" fake.domain/k8s.gcr.io/echoserver:1.4\". Addon deployment info: %s", deploymentInfo) + } +} + // validateStop tests minikube stop func validateStop(ctx context.Context, t *testing.T, profile string, tcName string, tcVersion string, startArgs []string) { defer PostMortemLogs(t, profile) @@ -190,7 +216,7 @@ func validateEnableAddonAfterStop(ctx context.Context, t *testing.T, profile str } // Enable an addon to assert it comes up afterwards - rr, err := Run(t, exec.CommandContext(ctx, Target(), "addons", "enable", "dashboard", "-p", profile)) + rr, err := Run(t, exec.CommandContext(ctx, Target(), "addons", "enable", "dashboard", "-p", profile, "--images=MetricsScraper=k8s.gcr.io/echoserver:1.4")) if err != nil { t.Errorf("failed to enable an addon post-stop. args %q: %v", rr.Command(), err) } @@ -229,9 +255,20 @@ func validateAddonAfterStop(ctx context.Context, t *testing.T, profile string, t defer PostMortemLogs(t, profile) if strings.Contains(tcName, "cni") { t.Logf("WARNING: cni mode requires additional setup before pods can schedule :(") - } else if _, err := PodWait(ctx, t, profile, "kubernetes-dashboard", "k8s-app=kubernetes-dashboard", Minutes(9)); err != nil { + return + } + if _, err := PodWait(ctx, t, profile, "kubernetes-dashboard", "k8s-app=kubernetes-dashboard", Minutes(9)); err != nil { t.Errorf("failed waiting for 'addon dashboard' pod post-stop-start: %v", err) } + + rr, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "describe", "deploy/dashboard-metrics-scraper", "-n", "kubernetes-dashboard")) + if err != nil { + t.Errorf("failed to get info on kubernetes-dashboard deployments. args %q: %v", rr.Command(), err) + } + deploymentInfo := rr.Stdout.String() + if !strings.Contains(deploymentInfo, " k8s.gcr.io/echoserver:1.4") { + t.Errorf("addon did not load correct image. Expected to contain \" k8s.gcr.io/echoserver:1.4\". Addon deployment info: %s", deploymentInfo) + } } // validateKubernetesImages verifies that a restarted cluster contains all the necessary images diff --git a/test/integration/testdata/etcd.yaml b/test/integration/testdata/etcd.yaml new file mode 100644 index 0000000000..b89177a24d --- /dev/null +++ b/test/integration/testdata/etcd.yaml @@ -0,0 +1,24 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: my-etcd +--- +apiVersion: operators.coreos.com/v1 +kind: OperatorGroup +metadata: + name: operatorgroup + namespace: my-etcd +spec: + targetNamespaces: + - my-etcd +--- +apiVersion: operators.coreos.com/v1alpha1 +kind: Subscription +metadata: + name: my-etcd + namespace: my-etcd +spec: + channel: singlenamespace-alpha + name: etcd + source: operatorhubio-catalog + sourceNamespace: olm diff --git a/test/integration/testdata/minikube_test2.pem b/test/integration/testdata/minikube_test2.pem new file mode 100644 index 0000000000..e80cc3763d --- /dev/null +++ b/test/integration/testdata/minikube_test2.pem @@ -0,0 +1,28 @@ +-----BEGIN CERTIFICATE----- +MIIEwDCCAqgCCQCUeXrVemI4eTANBgkqhkiG9w0BAQsFADAiMQswCQYDVQQGEwJV +UzETMBEGA1UECAwKQ2FsaWZvcm5pYTAeFw0yMTA3MjEyMDM4MDdaFw0yMTA4MjAy +MDM4MDdaMCIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAu1+sCiosrYIy83a+KtPdoGsKun+O +jKhETWQrum5FGxqKyQzhHN8q6iZBI94m1sZb2xIJDcKaAsHpKf1z/5pkrWQW4JeL +riqJ5U0kENy6mWGoFzPLQHkKMXSYUEkRjrgJphh5zLkWDzx6uwxHIrs5yaIwn71Z +enYezHL8NyMd10+up1lNvH+xGqnSJ3ge7Rj+r5XbA3avvaJ9AVdiJMU5ArMw4Snu +dLDSUueWFedmXoQud083EvDbMY61blNKUR6BKBJLPopH+9NnUP7FRU25lvTsA8qT +zz/KertMFhCfwvK4y7a7+GbIPD3fItpm23GORuViEGgeRMH7GGSNVfm4VtK5mI4c +XK9BrCE+FXowHOWU3MTH1qsvTigd3JZc8BKTaePJGMIDT1HIAaoK7SOoZOLka7bi +IiLaojrIWY6tE5IIl46cQWLg09G+kjKVfEEvEHNe0t22I9etGeUUEwlcMITHmEdE +WrXytC8dSNFObSG5B2MX2Ovm+yNblcK7TI7lW/tkbxtKs56J1mNmi4LXXBM8FdF8 +w9MpJc+ySVj2+f+eBE08amKjC9VVbBzNSw7MRaI9fFY5AAifJ8g55F3/KCNq5aTd +rBADtAa5kQkTVjfMBhG++0Ow4f55hm73oJAy/qxb09OY7Vk9ky/K3l8GfWv8ozIF +w+Oq6vdsspvtVJ8CAwEAATANBgkqhkiG9w0BAQsFAAOCAgEAGKVxsf13kYGaQJ+J +6eyRZXlV5Bp+9EGtMPGsuVv2HJa4oxMBn7Xc/bUhjY9Is/ZwfOpPUPO/nQtSSPmO +aozQj/27p8HDTW201fwLNiZMcppBdJvIQdDzCh6e2ikg3lqsw2BoLX1vbgc9HPml +P8QCHEz2lricGdTuMRtBgH5x/ZkZGLbADQBeyoPTsPaQceRt5hPYXWifqiHhcJoL +2T+XgbaHJ4lEhCU0IXJG0vlLuAyxQzO3gMeHK8BlLt/h/JCiDndo63a4XCkenmY8 +8/6Y9Lgh+O3954YgwdXBIS33CzhY7c+tfpag1hwpDHro/zsyLwdN2JxZqWymfg8T +RyIeJ5VpY+CGm1fVTx84twQbiM241eZDYaW6Ap5/ZuxPbzY++KDMZHMuJYURorAU +JE/SE6WltXpKTvtzyPNKt8fgPQmFzlBosDZCf/5EiyVqbLzideF1l+Rd//5gRBg0 +B63fOlCdxGtDeX1gKzekV4sXQIsWKW1BSCEInJt5lOS8Ex4JTXy8crwKo7hv0zPc +sOjAXbtDYlPf/jPFGKzkgFACB87Bx4ZUZMp/ShOzjMt20MLGLJvCGCQIHetUz+GG +/LTwSNhgWCheYkbDwXhCmqbN249xE3fNHC6zQ/IMJ30v/UWN4RldGfFzmoVBRUUX +eQ7g5kXER7H/Lh/2V9FyaRhPpZM= +-----END CERTIFICATE----- diff --git a/test/integration/version_upgrade_test.go b/test/integration/version_upgrade_test.go index fea73b2b64..c5441e421d 100644 --- a/test/integration/version_upgrade_test.go +++ b/test/integration/version_upgrade_test.go @@ -87,6 +87,11 @@ func TestRunningBinaryUpgrade(t *testing.T) { legacyVersion = "v1.9.0" } } + // the version containerd in ISO was upgraded to 1.4.2 + // we need it to use runc.v2 plugin + if ContainerRuntime() == "containerd" { + legacyVersion = "v1.16.0" + } tf, err := installRelease(legacyVersion) if err != nil { @@ -98,7 +103,7 @@ func TestRunningBinaryUpgrade(t *testing.T) { rr := &RunResult{} r := func() error { c := exec.CommandContext(ctx, tf.Name(), args...) - legacyEnv := []string{} + var legacyEnv []string // replace the global KUBECONFIG with a fresh kubeconfig // because for minikube<1.17.0 it can not read the new kubeconfigs that have extra "Extenions" block // see: https://github.com/kubernetes/minikube/issues/10210 @@ -155,8 +160,16 @@ func TestStoppedBinaryUpgrade(t *testing.T) { if arm64Platform() { // first release with non-experimental arm64 KIC legacyVersion = "v1.17.0" + } else { + // v1.8.0 would be selected, but: https://github.com/kubernetes/minikube/issues/8740 + legacyVersion = "v1.9.0" } } + if ContainerRuntime() == "containerd" { + // the version containerd in ISO was upgraded to 1.4.2 + // we need it to use runc.v2 plugin + legacyVersion = "v1.16.0" + } tf, err := installRelease(legacyVersion) if err != nil { @@ -168,7 +181,7 @@ func TestStoppedBinaryUpgrade(t *testing.T) { rr := &RunResult{} r := func() error { c := exec.CommandContext(ctx, tf.Name(), args...) - legacyEnv := []string{} + var legacyEnv []string // replace the global KUBECONFIG with a fresh kubeconfig // because for minikube<1.17.0 it can not read the new kubeconfigs that have extra "Extenions" block // see: https://github.com/kubernetes/minikube/issues/10210 @@ -266,7 +279,7 @@ func TestKubernetesUpgrade(t *testing.T) { } if cv.ServerVersion.GitVersion != constants.NewestKubernetesVersion { - t.Fatalf("expected server version %s is not the same with latest version %s", cv.ServerVersion.GitVersion, constants.NewestKubernetesVersion) + t.Fatalf("server version %s is not the same with the expected version %s after upgrade", cv.ServerVersion.GitVersion, constants.NewestKubernetesVersion) } t.Logf("Attempting to downgrade Kubernetes (should fail)") diff --git a/translations/de.json b/translations/de.json index 86d0c28552..4e495e4688 100644 --- a/translations/de.json +++ b/translations/de.json @@ -7,12 +7,19 @@ "'none' driver does not support 'minikube mount' command": "", "'none' driver does not support 'minikube podman-env' command": "", "'none' driver does not support 'minikube ssh' command": "", + "'none' driver does not support 'minikube ssh-host' command": "", "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "", "- Docs https://docs.docker.com/docker-for-mac/#resources": "", "- Docs https://docs.docker.com/docker-for-windows/#resources": "", "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", "- Restart your {{.driver_name}} service": "", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "", + "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "", + "==\u003e Last Start \u003c==": "", "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "", "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "", "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "", @@ -24,7 +31,11 @@ "A set of key=value pairs that describe configuration that may be passed to different components.\nThe key should be '.' separated, and the first part before the dot is the component to apply the configuration to.\nValid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler\nValid kubeadm parameters:": "Eine Reihe von Schlüssel/Wert-Paaren, die eine Konfiguration beschreiben, die an verschiedene Komponenten weitergegeben wird.\nDer Schlüssel sollte durch \".\" getrennt werden. Der erste Teil vor dem Punkt bezeichnet die Komponente, auf die die Konfiguration angewendet wird.\nGültige Komponenten sind: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler\nGültige Parameter für kubeadm:", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "Eine Reihe von Schlüssel/Wert-Paaren, die Funktions-Gates für Alpha- oder experimentelle Funktionen beschreiben.", "Access the Kubernetes dashboard running within the minikube cluster": "", + "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "", + "Add SSH identity key to SSH authentication agent": "", "Add an image to local cache.": "", + "Add host key to SSH known_hosts file": "", + "Add image to cache for all running minikube clusters": "", "Add machine IP to NO_PROXY environment variable": "", "Add, delete, or push a local image into minikube": "", "Add, remove, or list additional nodes": "", @@ -34,23 +45,33 @@ "Adds a node to the given cluster config, and starts it.": "", "Adds a node to the given cluster.": "", "Advanced Commands:": "", + "After the addon is enabled, please run \"minikube tunnel\" and your ingress resources would be available at \"127.0.0.1\"": "", "Aliases": "", + "All existing scheduled stops cancelled": "", "Allow user prompts for more information": "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "Alternatives Bild-Repository zum Abrufen von Docker-Images. Dies ist hilfreich, wenn Sie nur eingeschränkten Zugriff auf gcr.io haben. Stellen Sie \\\"auto\\\" ein, dann wählt minikube eins für sie aus. Nutzer vom chinesischen Festland können einen lokalen gcr.io-Mirror wie registry.cn-hangzhou.aliyuncs.com/google_containers verwenden.", "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Größe des der minikube-VM zugewiesenen Arbeitsspeichers (Format: \u003cNummer\u003e [\u003cEinheit\u003e], wobei Einheit = b, k, m oder g)", - "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", "Amount of time to wait for a service in seconds": "", "Amount of time to wait for service in seconds": "", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "", + "Another minikube instance is downloading dependencies... ": "", "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "", + "At least needs control plane nodes to enable addon": "", "Automatically selected the {{.driver}} driver": "", "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "", "Available Commands": "", "Basic Commands:": "", "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "", "Bind Address: {{.Address}}": "", + "Booting up control plane ...": "", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "", + "Build a container image, using the container runtime.": "", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", + "Cache image from docker daemon": "", + "Cache image from remote registry": "", + "Cannot find directory {{.path}} for copy": "", "Cannot find directory {{.path}} for mount": "", "Cannot use both --output and --format options": "", "Check if you have unnecessary pods running by running 'kubectl get po -A": "", @@ -61,12 +82,14 @@ "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "", "Choose a smaller value for --memory, such as 2000": "", "ChromeOS is missing the kernel support necessary for running Kubernetes": "", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "", "Configure a default route on this Linux host, or use another --driver that does not require it": "", "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "", "Configure environment to use minikube's Docker daemon": "", "Configure environment to use minikube's Podman service": "", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "", + "Configuring RBAC rules ...": "", "Configuring local host environment ...": "", "Configuring {{.name}} (Container Networking Interface) ...": "", "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "", @@ -74,10 +97,15 @@ "Connect to LoadBalancer services": "", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", "Could not process error from failed deletion": "", "Could not process errors from failed deletion": "", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "Ländercode des zu verwendenden Image Mirror. Lassen Sie dieses Feld leer, um den globalen zu verwenden. Nutzer vom chinesischen Festland stellen cn ein.", "Creating mount {{.name}} ...": "Bereitstellung {{.name}} wird erstellt...", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "", @@ -94,6 +122,7 @@ "Deletes a node from a cluster.": "", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "{{.profile_name}}\" in {{.driver_name}} wird gelöscht...", "Deleting container \"{{.name}}\" ...": "", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", "Deleting node {{.name}} from cluster {{.cluster}}": "", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "Deaktivieren Sie die Überprüfung der Verfügbarkeit der Hardwarevirtualisierung vor dem Starten der VM (nur Virtualbox-Treiber)", "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "", @@ -110,20 +139,20 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "", "Docs have been saved at - {{.path}}": "", "Documentation: {{.url}}": "", "Done! kubectl is now configured to use \"{{.name}}": "Fertig! kubectl ist jetzt für die Verwendung von \"{{.name}} konfiguriert", - "Done! kubectl is now configured to use \"{{.name}}\" by default": "", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "", "Done! kubectl is now configured to use \"{{.name}}__1": "Fertig! kubectl ist jetzt für die Verwendung von \"{{.name}}\" konfiguriert", "Download complete!": "Download abgeschlossen!", "Downloading Kubernetes {{.version}} preload ...": "", "Downloading VM boot image ...": "", "Downloading driver {{.driver}}:": "", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "ERROR creating `registry-creds-acr` secret": "", "ERROR creating `registry-creds-dpr` secret": "", "ERROR creating `registry-creds-ecr` secret: {{.error}}": "", @@ -136,17 +165,22 @@ "Enable proxy for NAT DNS requests (virtualbox driver only)": "Proxy für NAT-DNS-Anforderungen aktivieren (nur Virtualbox-Treiber)", "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \\\"--network-plugin=cni\\": "Standard-CNI-Plugin-in (/etc/cni/net.d/k8s.conf) aktivieren. Wird in Verbindung mit \"--network-plugin = cni\" verwendet", "Enabled addons: {{.addons}}": "", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "", "Enabling dashboard ...": "", "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "", "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "", "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "Umgebungsvariablen, die an den Docker-Daemon übergeben werden. (Format: Schlüssel = Wert)", + "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "Fehler beim Prüfen der Treiberversion: {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -174,6 +208,7 @@ "Error starting mount": "", "Error while setting kubectl current context : {{.error}}": "", "Error while setting kubectl current context: {{.error}}": "", + "Error with ssh-add": "", "Error writing mount pid": "", "Error: You have selected Kubernetes v{{.new}}, but the existing cluster for your profile is running Kubernetes v{{.old}}. Non-destructive downgrades are not supported, but you can proceed by performing one of the following options:\n* Recreate the cluster using Kubernetes v{{.new}}: Run \"minikube delete {{.profile}}\", then \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Create a second cluster with Kubernetes v{{.new}}: Run \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\"\n* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run \"minikube start {{.profile}} --kubernetes-version={{.old}}": "Fehler: Sie haben Kubernetes v{{.new}} ausgewählt, aber auf dem vorhandenen Cluster für Ihr Profil wird Kubernetes v{{.old}} ausgeführt. Zerstörungsfreie Downgrades werden nicht unterstützt. Sie können jedoch mit einer der folgenden Optionen fortfahren:\n* Erstellen Sie den Cluster mit Kubernetes v{{.new}} neu: Führen Sie \"minikube delete {{.profile}}\" und dann \"minikube start {{.profile}} - kubernetes-version = {{.new}}\" aus.\n* Erstellen Sie einen zweiten Cluster mit Kubernetes v{{.new}}: Führen Sie \"minikube start -p \u003cnew name\u003e --kubernetes-version = {{.new}}\" aus.\n* Verwenden Sie den vorhandenen Cluster mit Kubernetes v {{.old}} oder höher: Führen Sie \"minikube start {{.profile}} --kubernetes-version = {{.old}}\" aus.", "Examples": "", @@ -181,8 +216,11 @@ "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": "", + "Failed to build image": "", "Failed to cache and load images": "", "Failed to cache binaries": "", "Failed to cache images": "", @@ -190,7 +228,11 @@ "Failed to cache kubectl": "", "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "Fehler beim Ändern der Berechtigungen für {{.minikube_dir_path}}: {{.error}}", "Failed to check main repository and mirrors for images": "", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "Fehler beim Löschen des Clusters: {{.error}}", "Failed to delete cluster: {{.error}}__1": "Fehler beim Löschen des Clusters: {{.error}}", "Failed to delete images": "", @@ -202,16 +244,23 @@ "Failed to get service URL: {{.error}}": "", "Failed to kill mount process: {{.error}}": "Fehler beim Beenden des Bereitstellungsprozesses: {{.error}}", "Failed to list cached images": "", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "", + "Failed to remove image": "", "Failed to save config {{.profile}}": "", - "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "NO_PROXY Env konnte nicht festgelegt werden. Benutzen Sie `export NO_PROXY = $ NO_PROXY, {{. Ip}}", + "Failed to save dir": "", + "Failed to save stdin": "", + "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "NO_PROXY Env konnte nicht festgelegt werden. Benutzen Sie `export NO_PROXY = $ NO_PROXY, {{.ip}}", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "", "Failed to setup certs": "", + "Failed to start container runtime": "", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "", "Failed to update cluster": "", "Failed to update config": "", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "", "File permissions used for the mount": "", "Filter to use only VM Drivers": "", @@ -223,14 +272,21 @@ "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see:": "Weitere Informationen:", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", "Force minikube to perform possibly dangerous operations": "minikube zwingen, möglicherweise gefährliche Operationen durchzuführen", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "Gefundene Netzwerkoptionen:", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "", "Get or list the current profiles (clusters)": "", "Gets the logs of the running instance, used for debugging minikube, not user code.": "", "Gets the status of a local Kubernetes cluster": "", @@ -244,31 +300,45 @@ "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "Hypervisor-Signatur vor dem Gast in minikube verbergen (nur kvm2-Treiber)", "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.": "Wenn true, speichern Sie Docker-Images für den aktuellen Bootstrapper zwischen und laden Sie sie auf den Computer. Immer falsch mit --vm-driver = none.", "If true, only download and cache files for later use - don't install or start anything.": "Wenn true, laden Sie nur Dateien für die spätere Verwendung herunter und speichern Sie sie – installieren oder starten Sie nichts.", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "Unsichere Docker-Registrys, die an den Docker-Daemon übergeben werden. Der CIDR-Bereich des Standarddienstes wird automatisch hinzugefügt.", "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", "Kubernetes requires at least 2 CPU's to start": "", @@ -278,14 +348,19 @@ "Launching proxy ...": "", "List all available images from the local cache.": "", "List existing minikube nodes.": "", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "", "List nodes.": "", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "Liste der Gast-VSock-Ports, die als Sockets auf dem Host verfügbar gemacht werden (nur Hyperkit-Treiber)", "List of ports that should be exposed (docker and podman driver only)": "", + "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "", "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", "Lists all minikube profiles.": "", "Lists all valid default values for PROPERTY_NAME": "", "Lists all valid minikube profiles and detects all possible invalid profiles.": "", "Lists the URLs for the services in your local cluster": "", + "Load a image into minikube": "", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "Lokale Ordner, die über NFS-Bereitstellungen für Gast freigegeben werden (nur Hyperkit-Treiber)", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "Speicherort des VPNKit-Sockets, der für das Netzwerk verwendet wird. Wenn leer, wird Hyperkit VPNKitSock deaktiviert. Wenn 'auto' die Docker for Mac VPNKit-Verbindung verwendet, wird andernfalls der angegebene VSock verwendet (nur Hyperkit-Treiber).", @@ -293,23 +368,26 @@ "Locations to fetch the minikube ISO from.": "", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", "Log into the minikube environment (for debugging)": "", + "Manage images": "", "Message Size: {{.size}}": "", "Modify persistent configuration values": "", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "", "Most users should use the newer 'docker' driver instead, which does not require root!": "", "Mount type: {{.name}}": "", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", "Mounts the specified directory into minikube": "", "Mounts the specified directory into minikube.": "", - "Multi-node clusters are currently experimental and might exhibit unintended behavior.": "", "Multiple errors deleting profiles": "", "Multiple minikube profiles were found - ": "", "NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "", "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", + "No minikube profile was found. ": "", "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "No such addon {{.name}}": "", "Node {{.name}} failed to start, deleting and trying again.": "", "Node {{.name}} was successfully deleted.": "", "Node {{.nodeName}} does not exist.": "", @@ -318,8 +396,8 @@ "None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "Keines der bekannten Repositories ist zugänglich. Erwägen Sie, ein alternatives Image-Repository mit der Kennzeichnung --image-repository anzugeben", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", "Number of CPUs allocated to the minikube VM": "Anzahl der CPUs, die der minikube-VM zugeordnet sind", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'yaml' or 'json'.": "", @@ -334,12 +412,15 @@ "Operations on nodes": "", "Options: {{.options}}": "", "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "", + "Path to the Dockerfile to use (optional)": "", "Pause": "", "Paused {{.count}} containers": "", "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", + "Please attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -348,10 +429,14 @@ "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "", "Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}": "Aktualisieren Sie '{{.driver_executable}}'. {{.documentation_url}}", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", "Populates the specified folder with documentation in markdown about minikube": "", @@ -366,23 +451,30 @@ "Problems detected in {{.name}}:": "", "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "Geben Sie die VM-UUID an, um die MAC-Adresse wiederherzustellen (nur Hyperkit-Treiber)", + "Pull the remote image (no caching)": "", "Pulling base image ...": "", + "Push the new image (requires tag)": "", "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "Registry-Mirror, die an den Docker-Daemon übergeben werden", "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "", "Related issues:": "", "Relaunching Kubernetes using {{.bootstrapper}} ...": "Kubernetes mit {{.bootstrapper}} neu starten...", + "Remove one or more images": "", "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "", "Removing {{.directory}} ...": "{{.directory}} wird entfernt...", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "Die angeforderte Festplattengröße {{.requested_size}} liegt unter dem Mindestwert von {{.minimum_size}}.", "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.": "Die angeforderte Speicherzuordnung ({{.memory}} MB) ist geringer als die Standardspeicherzuordnung von {{.default_memorysize}} MB. Beachten Sie, dass minikube möglicherweise nicht richtig funktioniert oder unerwartet abstürzt.", @@ -395,11 +487,13 @@ "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", "Restarting the {{.name}} service may improve performance.": "", - "Retrieve the ssh identity key path of the specified cluster": "", - "Retrieve the ssh identity key path of the specified cluster.": "", - "Retrieves the IP address of the running cluster": "", - "Retrieves the IP address of the running cluster, and writes it to STDOUT.": "", + "Retrieve the ssh host key of the specified node": "", + "Retrieve the ssh host key of the specified node.": "", + "Retrieve the ssh identity key path of the specified node": "", + "Retrieve the ssh identity key path of the specified node, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "", + "Retrieves the IP address of the specified node": "", + "Retrieves the IP address of the specified node, and writes it to STDOUT.": "", "Returns a URL to connect to a service": "", "Returns logs to debug a local Kubernetes cluster": "", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", @@ -410,18 +504,24 @@ "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "", "Run a kubectl binary matching the cluster version": "", "Run minikube from the C: drive.": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", "Select a valid value for --dnsdomain": "", + "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "", "Set flag to delete all profiles": "", "Set flag to stop all profiles (clusters)": "", + "Set flag to stop cluster after a set amount of time (e.g. --schedule=5m)": "", "Set this flag to delete the '.minikube' folder from your user directory.": "", "Sets an individual value in a minikube config file": "", "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "", @@ -431,21 +531,28 @@ "Show a list of global command-line options (applies to all commands).": "", "Show only log entries which point to known problems": "", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "Leider wird der Parameter kubeadm.{{.parameter_name}} momentan von --extra-config nicht unterstützt.", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "Die angegebene URL mit dem Flag --registry-mirror ist ungültig: {{.url}}.", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "Spezifizieren Sie arbiträre Flags, die an den Docker-Daemon übergeben werden. (Format: Schlüssel = Wert)", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "", "Starting node {{.name}} in cluster {{.cluster}}": "", @@ -468,9 +575,11 @@ "Successfully stopped node {{.name}}": "", "Suggestion: {{.advice}}": "", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Der Treiber \"{{.driver_name}}\" benötigt Root-Rechte. Führen Sie minikube aus mit 'sudo minikube --vm-driver = {{. Driver_name}}.", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", + "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Der Treiber \"{{.driver_name}}\" benötigt Root-Rechte. Führen Sie minikube aus mit 'sudo minikube --vm-driver = {{.driver_name}}.", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", "The \"{{.name}}\" cluster has been deleted.": "Der Cluster \"{{.name}}\" wurde gelöscht.", "The \"{{.name}}\" cluster has been deleted.__1": "Der Cluster \"{{.name}}\" wurde gelöscht.", @@ -482,15 +591,18 @@ "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}}, 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)", - "The Docker service within '{{.name}}' is not active": "", "The KVM QEMU connection URI. (kvm2 driver only)": "Der KVM-QEMU-Verbindungs-URI. (Nur kvm2-Treiber)", + "The KVM default network name. (kvm2 driver only)": "", "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", "The KVM network name. (kvm2 driver only)": "Der KVM-Netzwerkname. (Nur kvm2-Treiber)", "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "Der Überwachungsport des API-Servers", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Der API-Servername, der im generierten Zertifikat für Kubernetes verwendet wird. Damit kann der API-Server von außerhalb des Computers verfügbar gemacht werden.", "The argument to pass the minikube mount command on start": "Das Argument, um den Bereitstellungsbefehl für minikube beim Start zu übergeben", @@ -516,6 +628,7 @@ "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "Der Name des virtuellen Hyperv-Switch. Standardmäßig zuerst gefunden. (nur Hyperv-Treiber)", "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", "The kubernetes version that the minikube VM will use (ex: v1.2.3)": "Die von der minikube-VM verwendete Kubernetes-Version (Beispiel: v1.2.3)", @@ -524,8 +637,11 @@ "The minikube {{.driver_name}} container exited unexpectedly.": "", "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The name of the network plugin": "Der Name des Netzwerk-Plugins", + "The named space to activate after start": "", "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "", + "The node to get IP. Defaults to the primary control plane.": "", "The node to get logs from. Defaults to the primary control plane.": "", + "The node to get ssh-key path. Defaults to the primary control plane.": "", "The node to ssh into. Defaults to the primary control plane.": "", "The node {{.name}} has ran out of available PIDs.": "", "The node {{.name}} has ran out of disk space.": "", @@ -536,6 +652,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -545,7 +663,6 @@ "The time interval for each check that wait performs in seconds": "", "The value passed to --format is invalid": "", "The value passed to --format is invalid: {{.error}}": "", - "The vmwarefusion driver is deprecated and support for it will be removed in a future release.\n\t\t\tPlease consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.\n\t\t\tSee https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information.\n\t\t\tTo disable this message, run [minikube config set ShowDriverDeprecationNotification false]": "", "The {{.driver_name}} driver should not be used with root privileges.": "Der Treiber {{.driver_name}} sollte nicht mit Root-Rechten verwendet werden.", "There's a new version for '{{.driver_executable}}'. Please consider upgrading. {{.documentation_url}}": "Es gibt eine neue Version für '{{.driver_executable}}'. Bitte erwägen Sie ein Upgrade. {{.documentation_url}}", "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "", @@ -554,6 +671,7 @@ "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "Dies kann auch automatisch erfolgen, indem Sie die env var CHANGE_MINIKUBE_NONE_USER = true setzen", "This control plane is not running! (state={{.state}})": "", "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "Dadurch wird der vorhandene Kubectl-Kontext beibehalten und ein minikube-Kontext erstellt.", "This will start the mount daemon and automatically mount files into minikube": "Dadurch wird der Mount-Daemon gestartet und die Dateien werden automatisch in minikube geladen", @@ -565,13 +683,14 @@ "To connect to this cluster, use: kubectl --context={{.name}}": "Verwenden Sie zum Herstellen einer Verbindung zu diesem Cluster: kubectl --context = {{.name}}", "To connect to this cluster, use: kubectl --context={{.name}}__1": "Verwenden Sie zum Herstellen einer Verbindung zu diesem Cluster: kubectl --context = {{.name}}", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", "To start minikube with Hyper-V, Powershell must be in your PATH`": "", - "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "Möglicherweise müssen Sie Kubectl- oder minikube-Befehle verschieben, um sie als eigenen Nutzer zu verwenden. Um beispielsweise Ihre eigenen Einstellungen zu überschreiben, führen Sie aus:", "Troubleshooting Commands:": "", "Try 'minikube delete' to force new SSL certificates to be installed": "", @@ -584,6 +703,7 @@ "Unable to find control plane": "", "Unable to generate docs": "", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get bootstrapper: {{.error}}": "Bootstrapper kann nicht abgerufen werden: {{.error}}", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", @@ -592,11 +712,13 @@ "Unable to get machine status": "", "Unable to get runtime": "", "Unable to kill mount process: {{.error}}": "", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images from config file.": "Zwischengespeicherte Bilder können nicht aus der Konfigurationsdatei geladen werden.", "Unable to load cached images: {{.error}}": "", "Unable to load config: {{.error}}": "Konfig kann nicht geladen werden: {{.error}}", "Unable to load host": "", - "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "\"{{.Kubernetes_version}}\" kann nicht geparst werden: {{.error}}", + "Unable to load profile: {{.error}}": "", + "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "\"{{.kubernetes_version}}\" kann nicht geparst werden: {{.error}}", "Unable to parse default Kubernetes version from constants: {{.error}}": "", "Unable to parse memory '{{.memory}}': {{.error}}": "", "Unable to parse oldest Kubernetes version from constants: {{.error}}": "", @@ -611,11 +733,13 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "Kubernetes {{.kubernetes_version}} wird mit {{.bootstrapper_name}} deinstalliert...", "Unmounting {{.path}} ...": "", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "", "Unpausing node {{.name}} ... ": "", "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "", "Update server returned an empty list": "", "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", @@ -633,18 +757,24 @@ "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", "Use 'kubect get po -A' to find the correct and namespace name": "", "Use -A to specify all namespaces": "", + "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using image repository {{.name}}": "Verwenden des Image-Repositorys {{.name}}", - "Using podman 2 is not supported yet. your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk.": "", + "Using image {{.registry}}{{.image}}": "", + "Using image {{.registry}}{{.image}} (global image repository)": "", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "", "Using the {{.driver}} driver based on existing profile": "", "Using the {{.driver}} driver based on user configuration": "", "VM driver is one of: %v": "VM-Treiber ist einer von: %v", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "", "Verifying Kubernetes components...": "", @@ -666,28 +796,40 @@ "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "Sie scheinen einen Proxy zu verwenden, aber Ihre NO_PROXY-Umgebung enthält keine minikube-IP ({{.ip_address}}). Weitere Informationen finden Sie unter {{.documentation_url}}", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Möglicherweise müssen Sie die VM \"{{.name}}\" manuell von Ihrem Hypervisor entfernen", "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "", "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "", "Your minikube vm is not running, try minikube start.": "", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "", - "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields: \\n\\n": "", + "cancel any existing scheduled stop requests": "", + "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "", + "containers paused status: {{.paused}}": "", "dashboard service is not running: {{.error}}": "", "delete ctx": "", "deleting node": "", @@ -695,12 +837,12 @@ "dry-run mode. Validates configuration, but does not mutate system state": "", "dry-run validation complete!": "", "enable failed": "", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "", "error getting primary control plane": "", "error getting ssh port": "", + "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "", "error stopping tunnel": "", "error: --output must be 'yaml' or 'json'": "", @@ -710,9 +852,11 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", + "fish completion.": "", "if true, will embed the certs in kubeconfig.": "", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "", "initialization failed, will try again: {{.error}}": "", + "invalid kubernetes version": "", "keep the kube-context active after cluster is stopped. Defaults to false.": "", "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "", "kubectl and minikube configuration will be stored in {{.home_folder}}": "Konfiguration von Kubectl und minikube wird in {{.home_folder}} gespeichert", @@ -720,10 +864,12 @@ "kubectl proxy": "", "libmachine failed": "", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "", - "minikube is exiting due to an error. If the above message is not useful, open an issue:": "", "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", + "minikube is not meant for production use. You are opening non-local traffic": "", "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", "minikube profile was successfully set to {{.profile_name}}": "", @@ -734,11 +880,14 @@ "minikube {{.version}} is available! Download it: {{.url}}": "", "mkcmp is used to compare performance of two minikube binaries": "", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "", + "mount could not connect": "", "mount failed": "", "namespaces to pause": "", "namespaces to unpause": "", + "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", "none driver does not support multi-node clusters": "", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "", "preload extraction failed: \\\"No space left on device\\\"": "", @@ -747,6 +896,7 @@ "reload cached images.": "", "reloads images previously added using the 'cache add' subcommand": "", "retrieving node": "", + "scheduled stop is not supported on the none driver, skipping scheduling": "", "service {{.namespace_name}}/{{.service_name}} has no node port": "", "stat failed": "", "status json failure": "", @@ -754,6 +904,7 @@ "toom any arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", "tunnel creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP. for a detailed example see https://minikube.sigs.k8s.io/docs/tasks/loadbalancer": "", "unable to bind flags": "", + "unable to daemonize: {{.err}}": "", "unable to delete minikube config folder": "", "unpause Kubernetes": "", "unset failed": "", @@ -764,14 +915,18 @@ "usage: minikube addons configure ADDON_NAME": "", "usage: minikube addons disable ADDON_NAME": "", "usage: minikube addons enable ADDON_NAME": "", + "usage: minikube addons images ADDON_NAME": "", "usage: minikube addons list": "", "usage: minikube addons open ADDON_NAME": "", "usage: minikube config unset PROPERTY_NAME": "", "usage: minikube delete": "", "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "", "version yaml failure": "", "zsh completion failed": "", + "zsh completion.": "", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.count}} nodes stopped.": "", @@ -781,6 +936,8 @@ "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB": "", "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", + "{{.name}} doesn't have images.": "", + "{{.name}} has following images:": "", "{{.name}} has no available configuration options": "", "{{.name}} is already running": "", "{{.name}} was successfully configured": "", @@ -790,6 +947,7 @@ "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "", "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} auf {{.platform}}", + "{{.profile}} profile is not valid: {{.err}}": "", "{{.type}} is not yet a supported filesystem. We will try anyways!": "", "{{.url}} is not accessible: {{.error}}": "" } \ No newline at end of file diff --git a/translations/es.json b/translations/es.json index f543089fe9..4f728b2483 100644 --- a/translations/es.json +++ b/translations/es.json @@ -3,55 +3,76 @@ "\"{{.context}}\" context has been updated to point to {{.hostname}}:{{.port}}": "El contexto \"{{.context}}\" ha sido actualizado para apuntar a {{.hostname}}:{{.port}}", "\"{{.machineName}}\" does not exist, nothing to stop": "\"{{.machineName}}\" no existe, nada para detener.", "\"{{.name}}\" profile does not exist": "El perfil \"{{.name}}\" no existe.", - "\"{{.name}}\" profile does not exist, trying anyways.": "El perfil \"{.name}\" no existe, intentando de todas formas.", + "\"{{.name}}\" profile does not exist, trying anyways.": "El perfil \"{{.name}}\" no existe, intentando de todas formas.", "'none' driver does not support 'minikube docker-env' command": "El controlador 'none' no soporta el comando 'minikube docker-env'.", "'none' driver does not support 'minikube mount' command": "El driver 'none' no soporta el comando 'minikube mount'.", "'none' driver does not support 'minikube podman-env' command": "El controlador 'none' no soporta el comando 'minikube podman-env'.", "'none' driver does not support 'minikube ssh' command": "El controlador 'none' no soporta el comando 'minikube ssh'.", + "'none' driver does not support 'minikube ssh-host' command": "", "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "- Eliminando y recreando el cluster minikube\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}", "- Docs https://docs.docker.com/docker-for-mac/#resources": "Documentación https://docs.docker.com/docker-for-mac/#resources", "- Docs https://docs.docker.com/docker-for-windows/#resources": "Documentación https://docs.docker.com/docker-for-windows/#resources", "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "Garantiza que {{.driver_name}} posee suficientes recursos de CPU/Memoria", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "- Recorta las imágenes, volumenes, redes y contenedores abandonados de {{.driver_name}}.\n\n\t\t\t\t{{.driver_name}} system prune --volumes", "- Restart your {{.driver_name}} service": "- Reinicia el servicio {{.driver_name}}", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "", + "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "", + "==\u003e Last Start \u003c==": "", "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "Una VPN o cortafuegos está interfiriendo con el acceso HTTP a la máquina virtual de minikube. Alternativamente prueba otro controlador: https://minikube.sigs.k8s.io/docs/start/", "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "Un cortafuegos impide que la máquina virtual Minikube llegue al repositorio de imagenes de Docker. Es posible de deba usar --image-repository, o usa un proxy.", "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "Un firewall interfiere con la capacidad de minikube de realizar peticiones HTTPS salientes. Es posible que deba cambiar el valor de la variable de entorno HTTPS_PROXY.", "A firewall is likely blocking minikube from reaching the internet. You may need to configure minikube to use a proxy.": "Probablemente un cortafuegos impide que minikube llegue a internet. Es posible que necesite configurar minikube para usar un proxy.", - "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine":"", + "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Un conjunto de direcciones IP de apiserver que se usaron para generar certificados para kubernetes. Se pueden utilizar para que sea posible acceder al apiserver desde fuera de la máquina", "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Un conjunto de nombres de apiserver que se usaron para generar certificados de kubernetes. Se pueden utilizar para que sea posible acceder al apiserver desde fuera de la máquina", "A set of key=value pairs that describe configuration that may be passed to different components.\nThe key should be '.' separated, and the first part before the dot is the component to apply the configuration to.\nValid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler\nValid kubeadm parameters:": "Un conjunto de pares clave=valor que describen la configuración puede ser pasado a diferentes componentes.\nLa clave debe estar separada por un \".\", y la primera parte antes del punto es el componente al que se quiere aplicar la configuración.\nEstos son los componentes válidos: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy y scheduler\n", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "Un conjunto de pares clave=valor que indican si las funciones experimentales o en versión alfa deben estar o no habilitadas.", "Access the Kubernetes dashboard running within the minikube cluster": "Acceder al panel de Kubernetes que corre dentro del cluster minikube", + "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "", + "Add SSH identity key to SSH authentication agent": "", "Add an image to local cache.": "Agregar una imagen al caché local", + "Add host key to SSH known_hosts file": "", + "Add image to cache for all running minikube clusters": "", "Add machine IP to NO_PROXY environment variable": "Agregar una IP de máquina a la variable de entorno NO_PROXY", "Add, delete, or push a local image into minikube": "Agrega, elimina, o empuja una imagen local dentro de minikube, haciendo (add, delete, push) respectivamente.", "Add, remove, or list additional nodes": "Usa (add, remove, list) para agregar, eliminar o listar nodos adicionales.", - "Adding node {{.name}} to cluster {{.cluster}}": "Agregando el nodo {{.name}} al cluster.", + "Adding node {{.name}} to cluster {{.cluster}}": "Agregando el nodo {{.name}} al cluster {{.cluster}}.", "Additional help topics": "Temas de ayuda adicionales", "Additional mount options, such as cache=fscache": "Opciones de montaje adicionales, por ejemplo cache=fscache", "Adds a node to the given cluster config, and starts it.": "Agrega un nodo a la configuración de cluster dada e iniciarlo.", "Adds a node to the given cluster.": "Agrega un nodo al cluster dado.", "Advanced Commands:": "Comandos avanzados: ", + "After the addon is enabled, please run \"minikube tunnel\" and your ingress resources would be available at \"127.0.0.1\"": "", "Aliases": "Aliases", + "All existing scheduled stops cancelled": "", "Allow user prompts for more information": "Permitir que el usuario solicite más información", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "Repositorio de imágenes alternativo del que extraer imágenes de Docker. Puedes usarlo cuando tengas acceso limitado a gcr.io. Si quieres que minikube elija uno por ti, solo tienes que definir el valor como \"auto\". Los usuarios de China continental pueden utilizar réplicas locales de gcr.io, como registry.cn-hangzhou.aliyuncs.com/google_containers", "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Cantidad de RAM asignada a la VM de minikube (formato: \u003cnúmero\u003e[\u003cunidad\u003e], donde unidad = b, k, m o g)", - "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", "Amount of time to wait for a service in seconds": "Cantidad de tiempo para esperar por un servicio en segundos", "Amount of time to wait for service in seconds": "Cantidad de tiempo para esperar un servicio en segundos", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "Otro hipervisor, por ejemplo VirtualBox, está en conflicto con KVM. Por favor detén el otro hipervisor, o usa --driver para cambiarlo.", + "Another minikube instance is downloading dependencies... ": "", "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "Otro programa está usando un archivo requerido por minikube. Si estas usando Hyper-V, intenta detener la máquina virtual de minikube desde el administrador de Hyper-V", + "At least needs control plane nodes to enable addon": "", "Automatically selected the {{.driver}} driver": "Controlador {{.driver}} seleccionado automáticamente", "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "Controlador {{.driver}} seleccionado automáticamente. Otras opciones: {{.alternates}}", "Available Commands": "Comandos disponibles", "Basic Commands:": "Comandos basicos:", "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "Porque estás usando controlador Docker en {{.operating_system}}, la terminal debe abrirse para ejecutarlo.", "Bind Address: {{.Address}}": "Dirección de enlace: {{.Address}}", + "Booting up control plane ...": "", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "Ambos driver={{.driver}} y vm-driver={{.vmd}} han sido establecidos.\n\n vm-driver ya es obsoleto, el por defecto de minikube será driver={{.driver}}.\n\n Si vm-driver está establecido en la configuracion global, ejecuta \"minikube config unset vm-driver\" para resolver esta advertencia.\n\t\t\t", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "", + "Build a container image, using the container runtime.": "", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "Plug-in CNI para usar. Opciones validas: auto, bridge, calico, cilium, flannel, kindnet, o ruta a un manifiesto CNI (Por defecto: auto)", + "Cache image from docker daemon": "", + "Cache image from remote registry": "", + "Cannot find directory {{.path}} for copy": "", "Cannot find directory {{.path}} for mount": "No se pudo encontrar el directorio {{.path}} para montar", "Cannot use both --output and --format options": "No se pueden usar ambas opciones (--output y --path)", "Check if you have unnecessary pods running by running 'kubectl get po -A": "Comprueba si tienes pods innecesarios corriendo, con el comando 'kubectl get pods -A'", @@ -62,12 +83,14 @@ "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "Revisa las reglas de tu cortafuegos para detectar interferencias, y corre 'virt-host-validate' para comprobar problemas de configuración de KVM. Si estás corriendo minikube dentro de una máquina virtual considera usa --driver=none", "Choose a smaller value for --memory, such as 2000": "Elige un valor menor para --memory, por ejemplo 2000", "ChromeOS is missing the kernel support necessary for running Kubernetes": "ChromeOS no tiene el soporte necesario del kernel para correr Kubernetes", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "Comandos de configuración y administración", "Configure a default route on this Linux host, or use another --driver that does not require it": "Configura un ruteo default en este host Linux, o usa otro --driver, que no lo necesita", "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "Configura un switch de red externo siguiendo la documentación oficial, y luego añade `--hyperv-virtual-switch=\u003cswitch-name\u003e` a `minikube start`", "Configure environment to use minikube's Docker daemon": "Configura un entorno para usar el Docker daemon de minikube", "Configure environment to use minikube's Podman service": "Configura un entorno para usar el servicio Podman de minikube", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "Configura los complementos dentro de minikube con ADDON_NAME (Por ejemplo: minikube addons configure registry-creds). Para ver los complementos disponibles usa: minikube addons list", + "Configuring RBAC rules ...": "", "Configuring local host environment ...": "Configuranto entorno del host local ...", "Configuring {{.name}} (Container Networking Interface) ...": "Configurando CNI {{.name}} ...", "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "Confirma que su conexión a internet funciona y que su VM no se quedó sin recursos con: 'minikube logs'", @@ -75,10 +98,15 @@ "Connect to LoadBalancer services": "Conectar a los servicios LoadBalancer", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "Considera crear un cluster con más memoria usando `minikube start --memory CANT_MB`", "Consider increasing Docker Desktop's memory size.": "Considera incrementar la memoria asignada a Docker Desktop", + "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "No se pudo determinar un proyecto de Google Cloud que podría estar bien.", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "No se puedo encontrar ninguna credencial de GCP. Corre `gcloud auth application-default login` o establezca la variable de entorno GOOGLE_APPLICATION_CREDENTIALS en la ruta de su archivo de credentiales.", "Could not process error from failed deletion": "No se pudo procesar el error de la eliminación fallida", "Could not process errors from failed deletion": "No se pudieron procesar los errores de la eliminación fallida", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "Código de país de la réplica de imagen que quieras utilizar. Déjalo en blanco para usar el valor global. Los usuarios de China continental deben definirlo como cn.", "Creating mount {{.name}} ...": "Montando {{.name}}...", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "Creando {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...", @@ -95,6 +123,7 @@ "Deletes a node from a cluster.": "Elimina un nodo del clúster.", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "Eliminando \"{{.profile_name}}\" en {{.driver_name}}...", "Deleting container \"{{.name}}\" ...": "Eliminando contenedor \"{{.name}}\" ...", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", "Deleting node {{.name}} from cluster {{.cluster}}": "Eliminando nodo {{.name}} del clúster {{.cluster}}", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "Permite inhabilitar la comprobación de disponibilidad de la virtualización de hardware antes de iniciar la VM (solo con el controlador de Virtualbox)", "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "Desactivar memoria dinámica in tu administrador de VM, o pasa un mayor valor --memory", @@ -111,12 +140,14 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "Docker Desktop necesita estar configurado para contenedores Linux para poder usar minikube", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "Docker Desktop tiene solo {{.size}}MiB disponibles, menos que los {{.req}}MiB requeridos por Kubernetes", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "Docker Desktop tiene solo {{.size}}MiB disponibles, puede que encuentres fallas en tus deployments de aplicaciones", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "Docker tiene menos de 2 CPUs disponibles, pero Kubernetes requiere al menos 2 para estar disponible", "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "No está disponible Docker dentro de la VM. Intenta usar 'minikube delete' para reestablecer la VM.", "Docs have been saved at - {{.path}}": "La documentación ha sido guardada en - {{.path}}", "Documentation: {{.url}}": "Documentación: {{.url}}", "Done! kubectl is now configured to use \"{{.name}}\"": "¡Listo! Se ha configurado kubectl para que use \"{{.name}}\"", "Done! kubectl is now configured to use \"{{.name}}\" by default": "¡Listo! Se ha configurado kubectl para que use \"{{.name}}\" por defecto", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "", "Done! kubectl is now configured to use \"{{.name}}__1": "¡Listo! Se ha configurado kubectl para que use \"{{.name}}__1 \n", "Download complete!": "Se ha completado la descarga", "Downloading Kubernetes {{.version}} preload ...": "Descargando Kubernetes {{.version}} ...", @@ -124,6 +155,7 @@ "Downloading driver {{.driver}}:": "Descargando el controlador {{.driver}}:", "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "Debido a problemas con CRI-O post v1.17.3, necesitamos reiniciar tu cluster.", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "Debido a las limitaciones de red del controlador {{.driver_name}} en {{.os_name}}, el complemento \"{{.addon_name}}\" no está soportado.\nPara usar este complemento, puedes utilizar un controlador basado en vm\n\n\t'minikube start --vm=true'\n\nPara realizar un seguimiento de las actualizaciones de esta función consulte:\nhttps://github.com/kubernetes/minikube/issues/7332", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "Debido a limitaciones de red del controlador {{.driver_name}}, el complemento \"{{.addon_name}}\" no está soportado. Intenta usar un controlador diferente.", "ERROR creating `registry-creds-acr` secret": "ERROR creando el secreto `registry-creds-acr`", "ERROR creating `registry-creds-dpr` secret": "ERROR creando el secreto `registry-creds-dpr`", @@ -138,16 +170,22 @@ "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \\\"--network-plugin=cni\\": "Permite habilitar el complemento CNI predeterminado (/etc/cni/net.d/k8s.conf). Se utiliza junto con \"--network-plugin=cni", "Enabled addons: {{.addons}}": "Complementos habilitados: {{.addons}}", "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "Habilita complementos dentro de minikube con su ADDON_NAME (Por ejemplo: minikube addons enable dashboard). Para una lista de complementos disponibles usa: minikube addons list ", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "Habilitación de '{{.name}}' devolvió un error: {{.error}}", "Enabling dashboard ...": "Habilitando dashboard", "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "Garantiza que CRI-O está instalado y saludable: ejecuta 'sudo systemctl start crio' y 'journalctl -u crio'. O usa --container-runtime=docker", "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "Garantiza que Docker está instalado y saludable: ejecuta 'sudo systemctl start docker' and 'journalctl -u docker'. O selecciona otro valor para --driver", "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "Garantiza de que los cgroup 'pids' requeridos están activados en tu host: grep pids /proc/cgroups", "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "Garantiza de que los usuarios listados en /etc/libvirt/qemu.conf tienen acceso a tu carpeta home", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "Garantiza de que tú valor para HTTPS_PROXY apunte a un proxy HTTPS en lugar de uno HTTP", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "Garantiza que {{.driver_name}} está corriendo y está saludable.", "Environment variables to pass to the Docker daemon. (format: key=value)": "Variables de entorno que se transferirán al daemon de Docker. Formato: clave=valor", + "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "No se ha podido comprobar la versión del controlador: {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "Error al crear el directorio minikube", "Error creating view template": "Error al crear la plantilla de vista", "Error detecting shell": "Error al detectar la shell", @@ -175,6 +213,7 @@ "Error starting mount": "No se ha podido iniciar el montaje", "Error while setting kubectl current context : {{.error}}": "Error mientras se configuraba el contexto actual de kubectl: {{.error}}", "Error while setting kubectl current context: {{.error}}": "Error mientras se configuraba el contexto actual de kubectl: {{.error}}", + "Error with ssh-add": "", "Error writing mount pid": "No se ha podido escribir el pid de montaje", "Error: You have selected Kubernetes v{{.new}}, but the existing cluster for your profile is running Kubernetes v{{.old}}. Non-destructive downgrades are not supported, but you can proceed by performing one of the following options:\n* Recreate the cluster using Kubernetes v{{.new}}: Run \"minikube delete {{.profile}}\", then \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Create a second cluster with Kubernetes v{{.new}}: Run \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\"\n* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run \"minikube start {{.profile}} --kubernetes-version={{.old}}": "Error: Has seleccionado Kubernetes {{.new}}, pero el clúster de tu perfil utiliza la versión {{.old}}. No se puede cambiar a una versión inferior sin eliminar todos los datos y recursos pertinentes, pero dispones de las siguientes opciones para continuar con la operación:\n* Volver a crear el clúster con Kubernetes {{.new}}: ejecuta \"minikube delete {{.profile}}\" y, luego, \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Crear un segundo clúster con Kubernetes {{.new}}: ejecuta \"minikube start -p \u003cnuevo nombre\u003e --kubernetes-version={{.new}}\"\n* Reutilizar el clúster actual con Kubernetes {{.old}} o una versión posterior: ejecuta \"minikube start {{.profile}} --kubernetes-version={{.old}}", "Examples": "", @@ -182,8 +221,11 @@ "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": "", + "Failed to build image": "", "Failed to cache and load images": "", "Failed to cache binaries": "", "Failed to cache images": "", @@ -191,7 +233,11 @@ "Failed to cache kubectl": "", "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "No se han podido cambiar los permisos de {{.minikube_dir_path}}: {{.error}}", "Failed to check main repository and mirrors for images": "", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "No se ha podido eliminar el clúster: {{.error}}", "Failed to delete cluster: {{.error}}__1": "No se ha podido eliminar el clúster: {{.error}}", "Failed to delete images": "", @@ -203,16 +249,23 @@ "Failed to get service URL: {{.error}}": "", "Failed to kill mount process: {{.error}}": "No se ha podido detener el proceso de activación: {{.error}}", "Failed to list cached images": "", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "", + "Failed to remove image": "", "Failed to save config {{.profile}}": "", + "Failed to save dir": "", + "Failed to save stdin": "", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "No se ha podido definir la variable de entorno NO_PROXY. Utiliza export NO_PROXY=$NO_PROXY,{{.ip}}", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "", "Failed to setup certs": "", + "Failed to start container runtime": "", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "", "Failed to update cluster": "", "Failed to update config": "", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "", "File permissions used for the mount": "", "Filter to use only VM Drivers": "", @@ -224,14 +277,21 @@ "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see:": "Para obtener más información, consulta lo siguiente:", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", "Force minikube to perform possibly dangerous operations": "Permite forzar minikube para que realice operaciones potencialmente peligrosas", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "Se han encontrado las siguientes opciones de red:", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "", "Get or list the current profiles (clusters)": "", "Gets the logs of the running instance, used for debugging minikube, not user code.": "", "Gets the status of a local Kubernetes cluster": "", @@ -245,31 +305,45 @@ "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "Permite ocultar la firma del hipervisor al invitado en minikube (solo con el controlador de kvm2)", "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.": "Si el valor es \"true\", las imágenes de Docker del programa previo actual se almacenan en caché y se cargan en la máquina. Siempre es \"false\" si se especifica --vm-driver=none.", "If true, only download and cache files for later use - don't install or start anything.": "Si el valor es \"true\", los archivos solo se descargan y almacenan en caché (no se instala ni inicia nada).", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "Registros de Docker que no son seguros y que se transferirán al daemon de Docker. Se añadirá automáticamente el intervalo CIDR de servicio predeterminado.", "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", "Kubernetes requires at least 2 CPU's to start": "", @@ -279,14 +353,19 @@ "Launching proxy ...": "", "List all available images from the local cache.": "", "List existing minikube nodes.": "", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "", "List nodes.": "", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "Lista de puertos del VSock invitado que se deben mostrar como sockets en el host (solo con el controlador de hyperkit)", "List of ports that should be exposed (docker and podman driver only)": "", + "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "", "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", "Lists all minikube profiles.": "", "Lists all valid default values for PROPERTY_NAME": "", "Lists all valid minikube profiles and detects all possible invalid profiles.": "", "Lists the URLs for the services in your local cluster": "", + "Load a image into minikube": "", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "Carpetas locales que se compartirán con el invitado mediante activaciones de NFS (solo con el controlador de hyperkit)", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "Ubicación del socket de VPNKit que se utiliza para ofrecer funciones de red. Si se deja en blanco, se inhabilita VPNKitSock de Hyperkit; si se define como \"auto\", se utiliza Docker para las conexiones de VPNKit en Mac. Con cualquier otro valor, se utiliza el VSock especificado (solo con el controlador de hyperkit)", @@ -294,23 +373,26 @@ "Locations to fetch the minikube ISO from.": "", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", "Log into the minikube environment (for debugging)": "", + "Manage images": "", "Message Size: {{.size}}": "", "Modify persistent configuration values": "", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "", "Most users should use the newer 'docker' driver instead, which does not require root!": "", "Mount type: {{.name}}": "", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", "Mounts the specified directory into minikube": "", "Mounts the specified directory into minikube.": "", - "Multi-node clusters are currently experimental and might exhibit unintended behavior.": "", "Multiple errors deleting profiles": "", "Multiple minikube profiles were found - ": "", "NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "", "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", + "No minikube profile was found. ": "", "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "No such addon {{.name}}": "", "Node {{.name}} failed to start, deleting and trying again.": "", "Node {{.name}} was successfully deleted.": "", "Node {{.nodeName}} does not exist.": "", @@ -319,8 +401,8 @@ "None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "No se puede acceder a ninguno de los repositorios conocidos. Plantéate indicar un repositorio de imágenes alternativo con la marca --image-repository.", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", "Number of CPUs allocated to the minikube VM": "Número de CPU asignadas a la VM de minikube", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'yaml' or 'json'.": "", @@ -335,12 +417,15 @@ "Operations on nodes": "", "Options: {{.options}}": "", "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "", + "Path to the Dockerfile to use (optional)": "", "Pause": "", "Paused {{.count}} containers": "", "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", + "Please attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -349,10 +434,14 @@ "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "", "Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}": "Actualiza \"{{.driver_executable}}\". {{.documentation_url}}", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", "Populates the specified folder with documentation in markdown about minikube": "", @@ -367,23 +456,30 @@ "Problems detected in {{.name}}:": "", "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "Permite especificar un UUID de VM para restaurar la dirección MAC (solo con el controlador de hyperkit)", + "Pull the remote image (no caching)": "", "Pulling base image ...": "", + "Push the new image (requires tag)": "", "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "Réplicas del registro que se transferirán al daemon de Docker", "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "", "Related issues:": "", "Relaunching Kubernetes using {{.bootstrapper}} ...": "Reiniciando Kubernetes con {{.bootstrapper}}...", + "Remove one or more images": "", "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "", "Removing {{.directory}} ...": "Eliminando {{.directory}}...", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "El tamaño de disco de {{.requested_size}} que se ha solicitado es inferior al tamaño mínimo de {{.minimum_size}}", "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.": "El valor de la asignación de memoria ({{.memory}} MB) solicitada es inferior a la asignación de memoria predeterminada de {{.default_memorysize}} MB. minikube podría no funcionar correctamente o fallar de manera inesperada.", @@ -396,11 +492,13 @@ "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", "Restarting the {{.name}} service may improve performance.": "", - "Retrieve the ssh identity key path of the specified cluster": "", - "Retrieve the ssh identity key path of the specified cluster.": "", - "Retrieves the IP address of the running cluster": "", - "Retrieves the IP address of the running cluster, and writes it to STDOUT.": "", + "Retrieve the ssh host key of the specified node": "", + "Retrieve the ssh host key of the specified node.": "", + "Retrieve the ssh identity key path of the specified node": "", + "Retrieve the ssh identity key path of the specified node, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "", + "Retrieves the IP address of the specified node": "", + "Retrieves the IP address of the specified node, and writes it to STDOUT.": "", "Returns a URL to connect to a service": "", "Returns logs to debug a local Kubernetes cluster": "", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", @@ -411,18 +509,24 @@ "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "", "Run a kubectl binary matching the cluster version": "", "Run minikube from the C: drive.": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", "Select a valid value for --dnsdomain": "", + "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "", "Set flag to delete all profiles": "", "Set flag to stop all profiles (clusters)": "", + "Set flag to stop cluster after a set amount of time (e.g. --schedule=5m)": "", "Set this flag to delete the '.minikube' folder from your user directory.": "", "Sets an individual value in a minikube config file": "", "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "", @@ -432,21 +536,28 @@ "Show a list of global command-line options (applies to all commands).": "", "Show only log entries which point to known problems": "", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "De momento, --extra-config no admite el parámetro kubeadm.{{.parameter_name}}", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "La URL proporcionada con la marca --registry-mirror no es válida: {{.url}}", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "Permite indicar marcas arbitrarias que se transferirán al daemon de Docker (el formato es \"clave=valor\").", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "", "Starting node {{.name}} in cluster {{.cluster}}": "", @@ -469,8 +580,10 @@ "Successfully stopped node {{.name}}": "", "Suggestion: {{.advice}}": "", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "El controlador \"{{.driver_name}}\" requiere privilegios de raíz. Ejecuta minikube mediante sudo minikube --vm-driver={{.driver_name}}", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", "The \"{{.name}}\" cluster has been deleted.": "Se ha eliminado el clúster \"{{.name}}\".", @@ -483,15 +596,18 @@ "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}}, 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)", - "The Docker service within '{{.name}}' is not active": "", "The KVM QEMU connection URI. (kvm2 driver only)": "El URI de la conexión de QEMU de la KVM (solo con el controlador de kvm2).", + "The KVM default network name. (kvm2 driver only)": "", "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", "The KVM network name. (kvm2 driver only)": "El nombre de la red de KVM (solo con el controlador de kvm2).", "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "El puerto de escucha del apiserver", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "El nombre del apiserver del certificado de Kubernetes generado. Se puede utilizar para que sea posible acceder al apiserver desde fuera de la máquina", "The argument to pass the minikube mount command on start": "El argumento para ejecutar el comando de activación de minikube durante el inicio", @@ -517,6 +633,7 @@ "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "El nombre del conmutador virtual de hyperv. El valor predeterminado será el primer nombre que se encuentre (solo con el controlador de hyperv).", "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", "The kubernetes version that the minikube VM will use (ex: v1.2.3)": "La versión de Kubernetes que utilizará la VM de minikube (p. ej.: versión 1.2.3)", @@ -525,8 +642,11 @@ "The minikube {{.driver_name}} container exited unexpectedly.": "", "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The name of the network plugin": "El nombre del complemento de red", + "The named space to activate after start": "", "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "", + "The node to get IP. Defaults to the primary control plane.": "", "The node to get logs from. Defaults to the primary control plane.": "", + "The node to get ssh-key path. Defaults to the primary control plane.": "", "The node to ssh into. Defaults to the primary control plane.": "", "The node {{.name}} has ran out of available PIDs.": "", "The node {{.name}} has ran out of disk space.": "", @@ -537,6 +657,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -546,7 +668,6 @@ "The time interval for each check that wait performs in seconds": "", "The value passed to --format is invalid": "", "The value passed to --format is invalid: {{.error}}": "", - "The vmwarefusion driver is deprecated and support for it will be removed in a future release.\n\t\t\tPlease consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.\n\t\t\tSee https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information.\n\t\t\tTo disable this message, run [minikube config set ShowDriverDeprecationNotification false]": "", "The {{.driver_name}} driver should not be used with root privileges.": "El controlador {{.driver_name}} no se debe utilizar con privilegios de raíz.", "There's a new version for '{{.driver_executable}}'. Please consider upgrading. {{.documentation_url}}": "Hay una nueva versión de \"{{.driver_executable}}\". Te recomendamos que realices la actualización. {{.documentation_url}}", "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "", @@ -555,6 +676,7 @@ "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "El proceso se puede automatizar si se define la variable de entorno CHANGE_MINIKUBE_NONE_USER=true", "This control plane is not running! (state={{.state}})": "", "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "Se conservará el contexto de kubectl actual y se creará uno de minikube.", "This will start the mount daemon and automatically mount files into minikube": "Se iniciará el daemon de activación y se activarán automáticamente los archivos en minikube", @@ -566,13 +688,14 @@ "To connect to this cluster, use: kubectl --context={{.name}}": "Para conectarte a este clúster, usa: kubectl --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.name}}__1": "Para conectarte a este clúster, usa: kubectl --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", "To start minikube with Hyper-V, Powershell must be in your PATH`": "", - "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "Para usar comandos de kubectl o minikube como tu propio usuario, puede que debas reubicarlos. Por ejemplo, para sobrescribir tu configuración, ejecuta:", "Troubleshooting Commands:": "", "Try 'minikube delete' to force new SSL certificates to be installed": "", @@ -585,6 +708,7 @@ "Unable to find control plane": "", "Unable to generate docs": "", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get bootstrapper: {{.error}}": "No se ha podido obtener el programa previo: {{.error}}", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", @@ -593,10 +717,12 @@ "Unable to get machine status": "", "Unable to get runtime": "", "Unable to kill mount process: {{.error}}": "", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images from config file.": "No se han podido cargar las imágenes almacenadas en caché del archivo de configuración.", "Unable to load cached images: {{.error}}": "", "Unable to load config: {{.error}}": "No se ha podido cargar la configuración: {{.error}}", "Unable to load host": "", + "Unable to load profile: {{.error}}": "", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "No se ha podido analizar la versión \"{{.kubernetes_version}}\": {{.error}}", "Unable to parse default Kubernetes version from constants: {{.error}}": "", "Unable to parse memory '{{.memory}}': {{.error}}": "", @@ -612,11 +738,13 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "Desinstalando Kubernetes {{.kubernetes_version}} mediante {{.bootstrapper_name}}...", "Unmounting {{.path}} ...": "", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "", "Unpausing node {{.name}} ... ": "", "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "", "Update server returned an empty list": "", "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", @@ -634,18 +762,24 @@ "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", "Use 'kubect get po -A' to find the correct and namespace name": "", "Use -A to specify all namespaces": "", + "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using image repository {{.name}}": "Utilizando el repositorio de imágenes {{.name}}", - "Using podman 2 is not supported yet. your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk.": "", + "Using image {{.registry}}{{.image}}": "", + "Using image {{.registry}}{{.image}} (global image repository)": "", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "", "Using the {{.driver}} driver based on existing profile": "", "Using the {{.driver}} driver based on user configuration": "", "VM driver is one of: %v": "El controlador de la VM es uno de los siguientes: %v", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "", "Verifying Kubernetes components...": "", @@ -667,28 +801,40 @@ "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "Parece que estás usando un proxy, pero tu entorno NO_PROXY no incluye la dirección IP de minikube ({{.ip_address}}). Consulta {{.documentation_url}} para obtener más información", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Puede que tengas que retirar manualmente la VM \"{{.name}}\" de tu hipervisor", "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "", "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "", "Your minikube vm is not running, try minikube start.": "", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "", - "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields: \\n\\n": "", + "cancel any existing scheduled stop requests": "", + "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "", + "containers paused status: {{.paused}}": "", "dashboard service is not running: {{.error}}": "", "delete ctx": "", "deleting node": "", @@ -696,12 +842,12 @@ "dry-run mode. Validates configuration, but does not mutate system state": "", "dry-run validation complete!": "", "enable failed": "", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "", "error getting primary control plane": "", "error getting ssh port": "", + "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "", "error stopping tunnel": "", "error: --output must be 'yaml' or 'json'": "", @@ -711,9 +857,11 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", + "fish completion.": "", "if true, will embed the certs in kubeconfig.": "", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "", "initialization failed, will try again: {{.error}}": "", + "invalid kubernetes version": "", "keep the kube-context active after cluster is stopped. Defaults to false.": "", "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "", "kubectl and minikube configuration will be stored in {{.home_folder}}": "La configuración de kubectl y de minikube se almacenará en {{.home_folder}}", @@ -721,10 +869,12 @@ "kubectl proxy": "", "libmachine failed": "", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "", - "minikube is exiting due to an error. If the above message is not useful, open an issue:": "", "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", + "minikube is not meant for production use. You are opening non-local traffic": "", "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", "minikube profile was successfully set to {{.profile_name}}": "", @@ -735,11 +885,14 @@ "minikube {{.version}} is available! Download it: {{.url}}": "", "mkcmp is used to compare performance of two minikube binaries": "", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "", + "mount could not connect": "", "mount failed": "", "namespaces to pause": "", "namespaces to unpause": "", + "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", "none driver does not support multi-node clusters": "", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "", "preload extraction failed: \\\"No space left on device\\\"": "", @@ -748,6 +901,7 @@ "reload cached images.": "", "reloads images previously added using the 'cache add' subcommand": "", "retrieving node": "", + "scheduled stop is not supported on the none driver, skipping scheduling": "", "service {{.namespace_name}}/{{.service_name}} has no node port": "", "stat failed": "", "status json failure": "", @@ -755,6 +909,7 @@ "toom any arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", "tunnel creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP. for a detailed example see https://minikube.sigs.k8s.io/docs/tasks/loadbalancer": "", "unable to bind flags": "", + "unable to daemonize: {{.err}}": "", "unable to delete minikube config folder": "", "unpause Kubernetes": "", "unset failed": "", @@ -765,14 +920,18 @@ "usage: minikube addons configure ADDON_NAME": "", "usage: minikube addons disable ADDON_NAME": "", "usage: minikube addons enable ADDON_NAME": "", + "usage: minikube addons images ADDON_NAME": "", "usage: minikube addons list": "", "usage: minikube addons open ADDON_NAME": "", "usage: minikube config unset PROPERTY_NAME": "", "usage: minikube delete": "", "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "", "version yaml failure": "", "zsh completion failed": "", + "zsh completion.": "", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.count}} nodes stopped.": "", @@ -782,6 +941,8 @@ "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB": "", "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", + "{{.name}} doesn't have images.": "", + "{{.name}} has following images:": "", "{{.name}} has no available configuration options": "", "{{.name}} is already running": "", "{{.name}} was successfully configured": "", @@ -790,6 +951,7 @@ "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "", "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} en {{.platform}}", + "{{.profile}} profile is not valid: {{.err}}": "", "{{.type}} is not yet a supported filesystem. We will try anyways!": "", "{{.url}} is not accessible: {{.error}}": "" -} +} \ No newline at end of file diff --git a/translations/fr.json b/translations/fr.json index d5734e4ef1..c86e3a257a 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -7,13 +7,20 @@ "'none' driver does not support 'minikube mount' command": "Le pilote 'none' ne prend pas en charge la commande 'minikube mount'", "'none' driver does not support 'minikube podman-env' command": "Le pilote 'none' ne prend pas en charge la commande 'minikube podman-env'", "'none' driver does not support 'minikube ssh' command": "Le pilote 'none' ne prend pas en charge la commande 'minikube ssh'", + "'none' driver does not support 'minikube ssh-host' command": "Le pilote 'none' ne prend pas en charge la commande 'minikube ssh-host'", "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "- Supprimer et recréer le cluster de minikube\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}", "- Docs https://docs.docker.com/docker-for-mac/#resources": "- Documentation https://docs.docker.com/docker-for-mac/#resources", "- Docs https://docs.docker.com/docker-for-windows/#resources": "- Docs https://docs.docker.com/docker-for-windows/#resources", "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- Assurez-vous que votre démon {{.driver_name}} a accès à suffisamment de ressources CPU/mémoire.", "- Prune unused {{.driver_name}} images, volumes and abandoned containers.": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes et les conteneurs abandonnés.", - "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", + "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "- Nettoyer les images {{.driver_name}} non utilisées, les volumes, les réseaux et les conteneurs abandonnées.\n\n\t\t\t\t{{.driver_name}} system prune --volumes", "- Restart your {{.driver_name}} service": "- Redémarrer votre service {{.driver_name}}", + "- {{.logPath}}": "- {{.logPath}}", + "--kvm-numa-count range is 1-8": "la tranche de --kvm-numa-count est 1 à 8", + "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "le drapeau --network est valide uniquement avec les pilotes docker/podman et KVM, il va être ignoré", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "\u003ctarget file absolute path\u003e doit être un chemin absolu. Les chemins relatifs ne sont pas autorisés (exemple: \"/home/docker/copied.txt\")", + "==\u003e Audit \u003c==": "==\u003e Audit \u003c==", + "==\u003e Last Start \u003c==": "==\u003e Dernier démarrage \u003c==", "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "Un VPN ou un pare-feu interfère avec l'accès HTTP à la machine virtuelle minikube. Vous pouvez également essayer un autre pilote de machine virtuelle : https://minikube.sigs.k8s.io/docs/start/", "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "Un pare-feu empêche le Docker de la machine virtuelle minikube d'atteindre le dépôt d'images. Vous devriez peut-être sélectionner --image-repository, ou utiliser un proxy.", "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "Un pare-feu interfère avec la capacité de minikube à executer des requêtes HTTPS sortantes. Vous devriez peut-être modifier la valeur de la variable d'environnement HTTPS_PROXY.", @@ -25,7 +32,11 @@ "A set of key=value pairs that describe configuration that may be passed to different components.\nThe key should be '.' separated, and the first part before the dot is the component to apply the configuration to.\nValid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler\nValid kubeadm parameters:": "Ensemble de paires clé = valeur qui décrivent la configuration pouvant être transmise à différents composants.\nLa clé doit être séparée par le caractère \".\", la première partie placée avant le point étant le composant auquel la configuration est appliquée.\nVoici la liste des composants valides : apiserver, controller-manager, etcd, kubeadm, kubelet, proxy et scheduler.\nParamètres valides pour le composant kubeadm :", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "Ensemble de paires clé = valeur qui décrivent l'entrée de configuration pour des fonctionnalités alpha ou expérimentales.", "Access the Kubernetes dashboard running within the minikube cluster": "Accéder au tableau de bord Kubernetes exécuté dans le cluster de minikube", + "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "Accéder aux ports inférieurs à 1024 peut échouer sur Windows avec les clients OpenSSH antérieurs à v8.1. Pour plus d'information, voir: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission", + "Add SSH identity key to SSH authentication agent": "Ajouter la clé d'identité SSH à l'agent d'authentication SSH", "Add an image to local cache.": "Ajouter une image au cache local.", + "Add host key to SSH known_hosts file": "Ajouter la clé hôte au fichier SSH known_hosts", + "Add image to cache for all running minikube clusters": "Ajouter l'image au cache pour tous les cluster minikube en fonctionnement", "Add machine IP to NO_PROXY environment variable": "Ajouter l'IP de la machine à la variable d'environnement NO_PROXY", "Add, delete, or push a local image into minikube": "Ajouter, supprimer ou pousser une image locale dans minikube", "Add, remove, or list additional nodes": "Ajouter, supprimer ou lister des nœuds supplémentaires", @@ -35,724 +46,869 @@ "Adds a node to the given cluster config, and starts it.": "Ajoute un nœud à la configuration du cluster et démarre le cluster.", "Adds a node to the given cluster.": "Ajoute un nœud au cluster.", "Advanced Commands:": "Commandes avancées :", + "After the addon is enabled, please run \"minikube tunnel\" and your ingress resources would be available at \"127.0.0.1\"": "Après que le module est activé, veuiller exécuter \"minikube tunnel\" et vos ressources ingress seront disponibles à \"127.0.0.1\"", "Aliases": "Alias", - "Allow user prompts for more information": "Autoriser les utilisateur à saisir plus d'informations", + "All existing scheduled stops cancelled": "Tous les arrêts programmés existants annulés", + "Allow user prompts for more information": "Autoriser les utilisateurs à saisir plus d'informations", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "Autre dépôt d'images d'où extraire des images Docker. Il peut être utilisé en cas d'accès limité à gcr.io. Définissez-le sur \\\"auto\\\" pour permettre à minikube de choisir la valeur à votre place. Pour les utilisateurs situés en Chine continentale, vous pouvez utiliser des miroirs gcr.io locaux tels que registry.cn-hangzhou.aliyuncs.com/google_containers.", "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Quantité de mémoire RAM allouée à la VM minikube (format : \u003cnombre\u003e[\u003cunité\u003e], où \"unité\" = b, k, m ou g).", "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "Quantité de mémoire RAM à allouer à Kubernetes (format: \u003cnombre\u003e[\u003cunité\u003e], où unité = b, k, m ou g).", "Amount of time to wait for a service in seconds": "Temps d'attente pour un service en secondes", "Amount of time to wait for service in seconds": "Temps d'attente pour un service en secondes", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "Un autre hyperviseur, tel que VirtualBox, est en conflit avec KVM. Veuillez arrêter l'autre hyperviseur ou utiliser --driver pour y basculer.", + "Another minikube instance is downloading dependencies... ": "Une autre instance minikube télécharge des dépendances", "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "Un autre programme utilise un fichier requis par minikube. Si vous utilisez Hyper-V, essayez d'arrêter la machine virtuelle minikube à partir du gestionnaire Hyper-V", + "At least needs control plane nodes to enable addon": "Nécessite au moins des nœuds de plan de contrôle pour activer le module", "Automatically selected the {{.driver}} driver": "Choix automatique du pilote {{.driver}}", - "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "Choix automatique du pilote {{.driver}}. Autres choix: {{.alternatives}}", + "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "Choix automatique du pilote {{.driver}}. Autres choix: {{.alternates}}", "Available Commands": "Commandes disponibles", "Basic Commands:": "Commandes basiques :", "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "Comme vous utilisez un pilote Docker sur {{.operating_system}}, le terminal doit être ouvert pour l'exécuter.", "Bind Address: {{.Address}}": "Adresse de liaison : {{.Address}}", - "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", - "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", - "Cannot find directory {{.path}} for mount": "", - "Cannot use both --output and --format options": "", - "Check if you have unnecessary pods running by running 'kubectl get po -A": "", - "Check output of 'journalctl -xeu kubelet', try passing --extra-config=kubelet.cgroup-driver=systemd to minikube start": "", - "Check that libvirt is setup properly": "", - "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.": "", - "Check that the provided apiserver flags are valid, and that SELinux is disabled": "", - "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "", - "Choose a smaller value for --memory, such as 2000": "", - "ChromeOS is missing the kernel support necessary for running Kubernetes": "", - "Configuration and Management Commands:": "", - "Configure a default route on this Linux host, or use another --driver that does not require it": "", - "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "", - "Configure environment to use minikube's Docker daemon": "", - "Configure environment to use minikube's Podman service": "", - "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "", + "Booting up control plane ...": "Démarrage du plan de contrôle ...", + "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "Driver={{.driver}} et vm-driver={{.vmd}} ont été définis.\n\n Étant donné que vm-driver est obsolète, minikube utilisera par défaut driver={{.driver}}.\n \n Si vm-driver est défini dans la configuration globale, veuillez exécuter \"minikube config unset vm-driver\" pour résoudre cet avertissement.\n\t\t\t", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "Le pont CNI est incompatible avec les clusters multi-nœuds, utilisez un autre CNI", + "Build a container image in minikube": "Construire une image de conteneur dans minikube", + "Build a container image, using the container runtime.": "Construire une image de conteneur à l'aide de l'environnement d'exécution du conteneur.", + "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "Plug-in CNI à utiliser. Options valides : auto, bridge, calico, cilium, flannel, kindnet ou chemin vers un manifeste CNI (par défaut : auto)", + "Cache image from docker daemon": "Cacher l'image du démon docker", + "Cache image from remote registry": "Cacher l'image du registre distant", + "Cannot find directory {{.path}} for copy": "Impossible de trouver le répertoire {{.path}} pour la copie", + "Cannot find directory {{.path}} for mount": "Impossible de trouver le répertoire {{.path}} pour le montage", + "Cannot use both --output and --format options": "Impossible d'utiliser à la fois les options --output et --format", + "Check if you have unnecessary pods running by running 'kubectl get po -A": "Vérifiez si vous avez des pods inutiles en cours d'exécution en exécutant 'kubectl get po -A'", + "Check output of 'journalctl -xeu kubelet', try passing --extra-config=kubelet.cgroup-driver=systemd to minikube start": "Vérifiez la sortie de 'journalctl -xeu kubelet', essayez de passer --extra-config=kubelet.cgroup-driver=systemd au démarrage de minikube", + "Check that libvirt is setup properly": "Vérifiez que libvirt est correctement configuré", + "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.": "Vérifiez que minikube est en cours d'exécution et que vous avez spécifié le bon espace de noms (indicateur -n) si nécessaire", + "Check that the provided apiserver flags are valid, and that SELinux is disabled": "Vérifiez que les indicateur apiserver fournis sont valides et que SELinux est désactivé", + "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "Vérifiez vos règles de pare-feu pour les interférences et exécutez 'virt-host-validate' pour vérifier les problèmes de configuration KVM. Si vous exécutez minikube dans une machine virtuelle, envisagez d'utiliser --driver=none", + "Choose a smaller value for --memory, such as 2000": "Choisissez une valeur plus petite pour --memory, telle que 2000", + "ChromeOS is missing the kernel support necessary for running Kubernetes": "ChromeOS ne dispose pas de la prise en charge du noyau nécessaire à l'exécution de Kubernetes", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "Le cluster a été créé sans aucun CNI, l'ajout d'un nœud peut provoquer un réseau inopérant.", + "Configuration and Management Commands:": "Commandes de configuration et de gestion :", + "Configure a default route on this Linux host, or use another --driver that does not require it": "Configurez une route par défaut sur cet hôte Linux ou utilisez un autre --driver qui ne l'exige pas", + "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "Configurez un commutateur réseau externe en suivant la documentation officielle, puis ajoutez `--hyperv-virtual-switch=\u003cswitch-name\u003e` à `minikube start`", + "Configure environment to use minikube's Docker daemon": "Configurer l'environnement pour utiliser le démon Docker de minikube", + "Configure environment to use minikube's Podman service": "Configurer l'environnement pour utiliser le service Podman de minikube", + "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "Configure le module w/ADDON_NAME dans minikube (exemple : minikube addons configure registry-creds). Pour une liste des modules disponibles, utilisez : minikube addons list", + "Configuring RBAC rules ...": "Configuration des règles RBAC ...", "Configuring environment for Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}}": "Configuration de l'environment pour Kubernetes {{.k8sVersion}} sur {{.runtime}} {{.runtimeVersion}}", - "Configuring local host environment ...": "", - "Configuring {{.name}} (Container Networking Interface) ...": "", - "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "", - "Confirm that you have supplied the correct value to --hyperv-virtual-switch using the 'Get-VMSwitch' command": "", - "Connect to LoadBalancer services": "", - "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", - "Consider increasing Docker Desktop's memory size.": "", - "Could not determine a Google Cloud project, which might be ok.": "", - "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", - "Could not process error from failed deletion": "", - "Could not process errors from failed deletion": "", + "Configuring local host environment ...": "Configuration de l'environnement de l'hôte local...", + "Configuring {{.name}} (Container Networking Interface) ...": "Configuration de {{.name}} (Container Networking Interface)...", + "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "Confirmez que vous disposez d'une connexion Internet fonctionnelle et que votre VM n'est pas à court de ressources en utilisant : 'minikube logs'", + "Confirm that you have supplied the correct value to --hyperv-virtual-switch using the 'Get-VMSwitch' command": "Confirmez que vous avez fourni la valeur correcte à --hyperv-virtual-switch à l'aide de la commande 'Get-VMSwitch'", + "Connect to LoadBalancer services": "Se connecter aux services LoadBalancer", + "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "Envisagez de créer un cluster avec une plus grande taille de mémoire en utilisant `minikube start --memory SIZE_MB`", + "Consider increasing Docker Desktop's memory size.": "Envisagez d'augmenter la taille de la mémoire de Docker Desktop.", + "Continuously listing/getting the status with optional interval duration.": "Répertorier/obtenir le statut en continu avec une durée d'intervalle facultative.", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "Copiez le fichier spécifié dans minikube", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "Copiez le fichier spécifié dans minikube, il sera enregistré au chemin \u003ctarget file absolute path\u003e dans votre minikube.\\nExemple de commande : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n", + "Could not determine a Google Cloud project, which might be ok.": "Impossible de déterminer un projet Google Cloud, ce qui peut convenir.", + "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "Impossible de trouver les identifiants GCP. Exécutez `gcloud auth application-default login` ou définissez la variable d'environnement GOOGLE_APPLICATION_CREDENTIALS vers le chemin de votre fichier d'informations d'identification.", + "Could not process error from failed deletion": "Impossible de traiter l'erreur due à l'échec de la suppression", + "Could not process errors from failed deletion": "Impossible de traiter les erreurs dues à l'échec de la suppression", + "Could not resolve IP address": "Impossible de résoudre l'adresse IP", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "Code pays du miroir d'images à utiliser. Laissez ce paramètre vide pour utiliser le miroir international. Pour les utilisateurs situés en Chine continentale, définissez sa valeur sur \"cn\".", "Creating mount {{.name}} ...": "Création de l'installation {{.name}}…", - "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "", + "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "Création de {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}Mo) ...", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "Création de {{.machine_type}} {{.driver_name}} (CPUs={{.number_of_cpus}}, Mémoire={{.memory_size}}MB, Disque={{.disk_size}}MB)...", - "Current context is \"{{.context}}\"": "", - "DEPRECATED, use `driver` instead.": "", - "DEPRECATED: Replaced by --cni=bridge": "", - "Default group id used for the mount": "", - "Default user id used for the mount": "", - "Delete an image from the local cache.": "", - "Deletes a local Kubernetes cluster": "", - "Deletes a local Kubernetes cluster. This command deletes the VM, and removes all\nassociated files.": "", + "Current context is \"{{.context}}\"": "Le contexte courant est \"{{.context}}\"", + "DEPRECATED, use `driver` instead.": "DÉPRÉCIÉ, utilisez plutôt `driver`.", + "DEPRECATED: Replaced by --cni=bridge": "DÉPRÉCIÉ : remplacé par --cni=bridge", + "Default group id used for the mount": "ID de groupe par défaut utilisé pour le montage", + "Default user id used for the mount": "ID utilisateur par défaut utilisé pour le montage", + "Delete an image from the local cache.": "Supprimez une image du cache local.", + "Deletes a local Kubernetes cluster": "Supprime un cluster Kubernetes local", + "Deletes a local Kubernetes cluster. This command deletes the VM, and removes all\nassociated files.": "Supprime le cluster Kubernetes local. Cette commande supprime la VM ainsi que tous les fichiers associés.", "Deletes a local kubernetes cluster. This command deletes the VM, and removes all\nassociated files.": "Supprime le cluster Kubernetes local. Cette commande supprime la VM ainsi que tous les fichiers associés.", - "Deletes a node from a cluster.": "", + "Deletes a node from a cluster.": "Supprime un nœud d'un cluster.", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "Suppression de \"{{.profile_name}}\" dans {{.driver_name}}...", - "Deleting container \"{{.name}}\" ...": "", + "Deleting container \"{{.name}}\" ...": "Suppression du conteneur \"{{.name}}\" ...", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "Suppression du cluster existant {{.name}} avec un pilote différent {{.driver_name}} en raison de l'indicateur --delete-on-failure défini par l'utilisateur.", "Deleting node {{.name}} from cluster {{.cluster}}": "Suppression de noeuds {{.name}} de cluster {{.cluster}}", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "Désactive la vérification de la disponibilité de la virtualisation du matériel avant le démarrage de la VM (pilote virtualbox uniquement).", - "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "", - "Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list ": "", + "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "Désactivez la mémoire dynamique dans votre gestionnaire de machine virtuelle ou transmettez une valeur --memory plus grande", + "Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list ": "Désactive le module w/ADDON_NAME dans minikube (exemple : minikube addons disable dashboard). Pour une liste des addons disponibles, utilisez : minikube addons list", "Disables the filesystem mounts provided by the hypervisors": "Désactive les installations de systèmes de fichiers fournies par les hyperviseurs.", "Disk size allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Taille de disque allouée à la VM minikube (format : \u003cnombre\u003e[\u003cunité\u003e], où \"unité\" = b, k, m ou g)", - "Disk size allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", - "Display dashboard URL instead of opening a browser": "", - "Display the Kubernetes addons URL in the CLI instead of opening it in the default browser": "", - "Display the Kubernetes service URL in the CLI instead of opening it in the default browser": "", - "Display values currently set in the minikube config file": "", - "Display values currently set in the minikube config file.": "", - "Docker Desktop has less than 2 CPUs configured, but Kubernetes requires at least 2 to be available": "", - "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", - "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", - "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", - "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", - "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "", - "Docs have been saved at - {{.path}}": "", - "Documentation: {{.url}}": "", + "Disk size allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "Taille du disque alloué à la VM minikube (format : \u003cnombre\u003e[\u003cunité\u003e], où unité = b, k, m ou g).", + "Display dashboard URL instead of opening a browser": "Afficher l'URL du tableau de bord au lieu d'ouvrir un navigateur", + "Display the Kubernetes addons URL in the CLI instead of opening it in the default browser": "Afficher l'URL des modules Kubernetes dans la CLI au lieu de l'ouvrir dans le navigateur par défaut", + "Display the Kubernetes service URL in the CLI instead of opening it in the default browser": "Afficher l'URL du service Kubernetes dans la CLI au lieu de l'ouvrir dans le navigateur par défaut", + "Display values currently set in the minikube config file": "Afficher les valeurs actuellement définies dans le fichier de configuration minikube", + "Display values currently set in the minikube config file.": "Afficher les valeurs actuellement définies dans le fichier de configuration minikube", + "Docker Desktop has less than 2 CPUs configured, but Kubernetes requires at least 2 to be available": "Docker Desktop a moins de 2 processeurs configurés, mais Kubernetes nécessite au moins 2 pour être disponible", + "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "Docker Desktop est configuré pour les conteneurs Windows, mais les conteneurs Linux sont requis pour minikube", + "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "Docker Desktop n'a que {{.size}} Mio disponibles, moins que les {{.req}} Mio requis pour Kubernetes", + "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "Docker Desktop n'a que {{.size}}Mio disponibles, vous pouvez rencontrer des échecs de déploiement d'applications.", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "Le conteneur Docker s'est fermé prématurément après sa création, envisagez d'enquêter sur les performances/l'intégrité de Docker.", + "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "Docker a moins de 2 processeurs disponibles, mais Kubernetes a besoin d'au moins 2 pour être disponible", + "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "Docker à l'intérieur de la VM n'est pas disponible. Essayez d'exécuter « minikube delete » pour réinitialiser la machine virtuelle.", + "Docs have been saved at - {{.path}}": "Les documents ont été enregistrés à - {{.path}}", + "Documentation: {{.url}}": "Documentation: {{.url}}", "Done! kubectl is now configured to use \"{{.name}}\"": "Terminé ! kubectl est maintenant configuré pour utiliser \"{{.name}}\".", - "Done! kubectl is now configured to use \"{{.name}}\" by default": "", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "Terminé ! kubectl est maintenant configuré pour utiliser \"{{.name}}\" cluster et espace de noms \"{{.ns}}\" par défaut.", "Download complete!": "Téléchargement terminé !", - "Downloading Kubernetes {{.version}} preload ...": "", - "Downloading VM boot image ...": "", - "Downloading driver {{.driver}}:": "", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", - "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", - "ERROR creating `registry-creds-acr` secret": "", - "ERROR creating `registry-creds-dpr` secret": "", - "ERROR creating `registry-creds-ecr` secret: {{.error}}": "", - "ERROR creating `registry-creds-gcr` secret: {{.error}}": "", - "Either systemctl is not installed, or Docker is broken. Run 'sudo systemctl start docker' and 'journalctl -u docker'": "", - "Enable addons. see `minikube addons list` for a list of valid addon names.": "", + "Downloading Kubernetes {{.version}} preload ...": "Téléchargement du préchargement de Kubernetes {{.version}}...", + "Downloading VM boot image ...": "Téléchargement de l'image de démarrage de la VM...", + "Downloading driver {{.driver}}:": "Téléchargement du pilote {{.driver}} :", + "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "En raison des limitations réseau du pilote {{.driver_name}} sur {{.os_name}}, le module {{.addon_name}} n'est pas pris en charge.\nAlternativement, pour utiliser ce module, vous pouvez utiliser un pilote basé sur vm :\n\n \t'minikube start --vm=true'\n\nPour suivre la mise à jour de cette fonctionnalité en cours de travail, veuillez vérifier :\nhttps://github.com/kubernetes/minikube/issues/7332", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "En raison des limitations réseau du pilote {{.driver_name}}, le module {{.addon_name}} n'est pas entièrement pris en charge. Essayez d'utiliser un autre pilote.", + "ERROR creating `registry-creds-acr` secret": "ERREUR lors de la création du secret `registry-creds-acr`", + "ERROR creating `registry-creds-dpr` secret": "ERREUR lors de la création du secret `registry-creds-dpr`", + "ERROR creating `registry-creds-ecr` secret: {{.error}}": "ERREUR lors de la création du secret `registry-creds-ecr` : {{.error}}", + "ERROR creating `registry-creds-gcr` secret: {{.error}}": "ERREUR lors de la création du secret `registry-creds-gcr` : {{.error}}", + "Either systemctl is not installed, or Docker is broken. Run 'sudo systemctl start docker' and 'journalctl -u docker'": "Soit systemctl n'est pas installé, soit Docker ne fonctionne plus. Exécutez 'sudo systemctl start docker' et 'journalctl -u docker'", + "Enable addons. see `minikube addons list` for a list of valid addon names.": "Activer les modules. Voir `minikube addons list` pour une liste de noms de modules valides.", "Enable experimental NVIDIA GPU support in minikube": "Active l'assistance expérimentale du GPU NVIDIA dans minikube.", "Enable host resolver for NAT DNS requests (virtualbox driver only)": "Active le résolveur d'hôte pour les requêtes DNS NAT (pilote VirtualBox uniquement).", - "Enable or disable a minikube addon": "", + "Enable or disable a minikube addon": "Activer ou désactiver un module minikube", "Enable proxy for NAT DNS requests (virtualbox driver only)": "Active le proxy pour les requêtes DNS NAT (pilote VirtualBox uniquement).", "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \\\"--network-plugin=cni\\": "Active le plug-in CNI par défaut (/etc/cni/net.d/k8s.conf). Utilisé en association avec \\\"--network-plugin=cni\\\".", - "Enabled addons: {{.addons}}": "", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", - "Enabling '{{.name}}' returned an error: {{.error}}": "", - "Enabling addons: {{.addons}}": "Installation des addons: {{.addons}}", - "Enabling dashboard ...": "", - "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "", - "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "", - "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", - "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "", - "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "", - "Ensure your {{.driver_name}} is running and is healthy.": "", + "Enabled addons: {{.addons}}": "Modules activés: {{.addons}}", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "Active le module w/ADDON_NAME dans minikube. Pour une liste des modules disponibles, utilisez : minikube addons list", + "Enabling '{{.name}}' returned an error: {{.error}}": "L'activation de '{{.name}}' a renvoyé une erreur : {{.error}}", + "Enabling addons: {{.addons}}": "Installation des modules: {{.addons}}", + "Enabling dashboard ...": "Activation du tableau de bord...", + "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "Assurez-vous que CRI-O est installé et en fonctionnement : exécutez 'sudo systemctl start crio' et 'journalctl -u crio'. Sinon, utilisez --container-runtime=docker", + "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "Assurez-vous que Docker est installé et en fonctionnement : exécutez 'sudo systemctl start docker' et 'journalctl -u docker'. Sinon, sélectionnez une autre valeur pour --driver", + "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "Assurez-vous que le groupe de contrôle 'pids' requis est activé sur votre hôte : grep pids /proc/cgroups", + "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "Assurez-vous que l'utilisateur répertorié dans /etc/libvirt/qemu.conf a accès à votre répertoire personnel", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "Assurez-vous que vous êtes membre du groupe libvirt approprié (n'oubliez pas de vous reconnecter pour que les modifications du groupe prennent effet !)", + "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "Assurez-vous que votre valeur pour HTTPS_PROXY pointe vers un proxy HTTPS plutôt qu'un proxy HTTP", + "Ensure the tmp directory path is writable to the current user.": "Assurez-vous que le chemin du répertoire tmp est accessible en écriture à l'utilisateur actuel.", + "Ensure you have at least 20GB of free disk space.": "Assurez-vous d'avoir au moins 20 Go d'espace disque libre.", + "Ensure your {{.driver_name}} is running and is healthy.": "Assurez-vous que votre {{.driver_name}} est en cours d'exécution et en fonctionnement.", "Environment variables to pass to the Docker daemon. (format: key=value)": "Variables d'environment à transmettre au daemon Docker (format : clé = valeur).", + "Environment variables to pass to the build. (format: key=value)": "Variables d'environnement à transmettre au build. (format : clé=valeur)", "Error checking driver version: {{.error}}": "Erreur lors de la vérification de la version du driver : {{.error}}", - "Error creating minikube directory": "", - "Error creating view template": "", - "Error detecting shell": "", - "Error executing view template": "", - "Error finding port for mount": "", - "Error generating set output": "", - "Error generating unset output": "", - "Error getting cluster bootstrapper": "", - "Error getting cluster config": "", - "Error getting host": "", - "Error getting port binding for '{{.driver_name}} driver: {{.error}}": "", - "Error getting primary control plane": "", - "Error getting service with namespace: {{.namespace}} and labels {{.labelName}}:{{.addonName}}: {{.error}}": "", - "Error getting ssh client": "", - "Error getting the host IP address to use from within the VM": "", - "Error killing mount process": "", - "Error loading profile config: {{.error}}": "", + "Error code docs have been saved at - {{.path}}": "Les documents de code d'erreur ont été enregistrés à - {{.path}}", + "Error creating minikube directory": "Erreur lors de la création du répertoire minikube", + "Error creating view template": "Erreur lors de la création du modèle de vue", + "Error detecting shell": "Erreur de détection du shell", + "Error executing view template": "Erreur lors de l'exécution du modèle de vue", + "Error finding port for mount": "Erreur lors de la recherche du port pour le montage", + "Error generating set output": "Erreur lors de la génération set output", + "Error generating unset output": "Erreur lors de la génération unset output", + "Error getting cluster bootstrapper": "Erreur lors de l'obtention du programme d'amorçage du cluster", + "Error getting cluster config": "Erreur lors de l'obtention de la configuration du cluster", + "Error getting host": "Erreur lors de l'obtention de l'hôte", + "Error getting port binding for '{{.driver_name}} driver: {{.error}}": "Erreur lors de l'obtention de la liaison de port pour le pilote '{{.driver_name}} : {{.error}}", + "Error getting primary control plane": "Erreur lors de l'obtention du plan de contrôle principal", + "Error getting service with namespace: {{.namespace}} and labels {{.labelName}}:{{.addonName}}: {{.error}}": "Erreur lors de l'obtention du service avec l'espace de noms : {{.namespace}} et les étiquettes {{.labelName}} :{{.addonName}} : {{.error}}", + "Error getting ssh client": "Erreur lors de l'obtention du client ssh", + "Error getting the host IP address to use from within the VM": "Erreur lors de l'obtention de l'adresse IP de l'hôte à utiliser depuis la VM", + "Error killing mount process": "Erreur lors de la suppression du processus de montage", + "Error loading profile config: {{.error}}": "Erreur lors du chargement de la configuration du profil : {{.error}}", "Error loading profile {{.name}}: {{.error}}": "Erreur lors du chargement du profil {{.name}} : {{.error}}", - "Error opening service": "", + "Error opening service": "Erreur d'ouverture du service", "Error parsing Driver version: {{.error}}": "Erreur lors de l'analyse de la version du pilote de la VM : {{.error}}", "Error parsing minikube version: {{.error}}": "Erreur lors de l'analyse de la version de minikube : {{.error}}", - "Error parsing {{.name}}={{.value}}, {{.err}}": "", - "Error reading {{.path}}: {{.error}}": "", - "Error starting cluster": "", - "Error starting mount": "", - "Error while setting kubectl current context : {{.error}}": "", - "Error while setting kubectl current context: {{.error}}": "", - "Error writing mount pid": "", + "Error parsing {{.name}}={{.value}}, {{.err}}": "Erreur lors de l'analyse de {{.name}}={{.value}}, {{.err}}", + "Error reading {{.path}}: {{.error}}": "Erreur de lecture {{.path}} : {{.error}}", + "Error starting cluster": "Erreur lors du démarrage du cluster", + "Error starting mount": "Erreur lors du démarrage du montage", + "Error while setting kubectl current context : {{.error}}": "Erreur lors de la définition du contexte actuel de kubectl : {{.error}}", + "Error while setting kubectl current context: {{.error}}": "Erreur lors de la définition du contexte actuel de kubectl : {{.error}}", + "Error with ssh-add": "Erreur avec ssh-add", + "Error writing mount pid": "Erreur lors de l'écriture du pid de montage", "Error: You have selected Kubernetes v{{.new}}, but the existing cluster for your profile is running Kubernetes v{{.old}}. Non-destructive downgrades are not supported, but you can proceed by performing one of the following options:\n* Recreate the cluster using Kubernetes v{{.new}}: Run \"minikube delete {{.profile}}\", then \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Create a second cluster with Kubernetes v{{.new}}: Run \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\"\n* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run \"minikube start {{.profile}} --kubernetes-version={{.old}}": "Erreur : Vous avez sélectionné Kubernetes v{{.new}}, mais le cluster existent pour votre profil exécute Kubernetes v{{.old}}. Les rétrogradations non-destructives ne sont pas compatibles. Toutefois, vous pouvez poursuivre le processus en réalisant l'une des trois actions suivantes :\n* Créer à nouveau le cluster en utilisant Kubernetes v{{.new}} – exécutez \"minikube delete {{.profile}}\", puis \"minikube start {{.profile}} --kubernetes-version={{.new}}\".\n* Créer un second cluster avec Kubernetes v{{.new}} – exécutez \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\".\n* Réutiliser le cluster existent avec Kubernetes v{{.old}} ou version ultérieure – exécutez \"minikube start {{.profile}} --kubernetes-version={{.old}}\".", - "Examples": "", - "Executing \"{{.command}}\" took an unusually long time: {{.duration}}": "", - "Existing disk is missing new features ({{.error}}). To upgrade, run 'minikube delete'": "", + "Examples": "Exemples", + "Executing \"{{.command}}\" took an unusually long time: {{.duration}}": "L'exécution de \"{{.command}}\" a pris un temps inhabituellement long : {{.duration}}", + "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}}": "", - "External Adapter on which external switch will be created if no external switch is found. (hyperv driver only)": "", - "Failed runtime": "", - "Failed to cache and load images": "", - "Failed to cache binaries": "", - "Failed to cache images": "", - "Failed to cache images to tar": "", - "Failed to cache kubectl": "", + "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", + "Failed to build image": "Échec de la création de l'image", + "Failed to cache and load images": "Échec de la mise en cache et du chargement des images", + "Failed to cache binaries": "Échec de la mise en cache des binaires", + "Failed to cache images": "Échec de la mise en cache des images", + "Failed to cache images to tar": "Échec de la mise en cache des images dans l'archive tar", + "Failed to cache kubectl": "Échec de la mise en cache de kubectl", "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "Échec de la modification des autorisations pour {{.minikube_dir_path}} : {{.error}}", - "Failed to check main repository and mirrors for images": "", - "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to check main repository and mirrors for images": "Échec de la vérification du référentiel principal et des miroirs pour les images", + "Failed to configure metallb IP {{.profile}}": "Échec de la configuration de metallb IP {{.profile}}", + "Failed to create file": "La création du fichier a échoué", + "Failed to create runtime": "Échec de la création de l'environnement d'exécution", + "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "Échec de la suppression du cluster {{.name}}, réessayez quand même.", + "Failed to delete cluster {{.name}}.": "Échec de la suppression du cluster {{.name}}.", "Failed to delete cluster: {{.error}}": "Échec de la suppression du cluster : {{.error}}", "Failed to delete cluster: {{.error}}__1": "Échec de la suppression du cluster : {{.error}}", - "Failed to delete images": "", - "Failed to delete images from config": "", - "Failed to enable container runtime": "", - "Failed to get bootstrapper": "", - "Failed to get command runner": "", - "Failed to get image map": "", - "Failed to get service URL: {{.error}}": "", + "Failed to delete images": "Échec de la suppression des images", + "Failed to delete images from config": "Échec de la suppression des images de la configuration", + "Failed to enable container runtime": "Échec de l'activation de l'environnement d'exécution du conteneur", + "Failed to get bootstrapper": "Échec de l'obtention du programme d'amorçage", + "Failed to get command runner": "Impossible d'obtenir le lanceur de commandes", + "Failed to get image map": "Échec de l'obtention de la carte d'image", + "Failed to get service URL: {{.error}}": "Échec de l'obtention de l'URL du service : {{.error}}", "Failed to kill mount process: {{.error}}": "Échec de l'arrêt du processus d'installation : {{.error}}", - "Failed to list cached images": "", - "Failed to reload cached images": "", - "Failed to save config {{.profile}}": "", - "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "Échec de la définition de NO_PROXY Env. Veuillez utiliser `export NO_PROXY=$NO_PROXY,{{.ip}}.", - "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "", - "Failed to setup certs": "", - "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", - "Failed to stop node {{.name}}": "", - "Failed to update cluster": "", - "Failed to update config": "", - "Failed to verify '{{.driver_name}} info' will try again ...": "", - "Failed unmount: {{.error}}": "", - "File permissions used for the mount": "", - "Filter to use only VM Drivers": "", - "Flags": "", - "Follow": "", + "Failed to list cached images": "Échec de l'obtention de la liste des images mises en cache", + "Failed to list images": "Échec de l'obtention de la liste des images", + "Failed to load image": "Échec du chargement de l'image", + "Failed to persist images": "Échec de la persistance des images", + "Failed to pull image": "Échec de l'extraction de l'image", + "Failed to reload cached images": "Échec du rechargement des images mises en cache", + "Failed to remove image": "Échec de la suppression de l'image", + "Failed to save config {{.profile}}": "Échec de l'enregistrement de la configuration {{.profile}}", + "Failed to save dir": "Échec de l'enregistrement du répertoire", + "Failed to save stdin": "Échec de l'enregistrement de l'entrée standard", + "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "Échec de la définition la variable d'environnement NO_PROXY. Veuillez utiliser `export NO_PROXY=$NO_PROXY,{{.ip}}.", + "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "Échec de la définition de la variable d'environnement NO_PROXY. Veuillez utiliser `export NO_PROXY=$NO_PROXY,{{.ip}}`.", + "Failed to setup certs": "Échec de la configuration des certificats", + "Failed to start container runtime": "Échec du démarrage de l'exécution du conteneur", + "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "Échec du démarrage de {{.driver}} {{.driver_type}}. L'exécution de \"{{.cmd}}\" peut résoudre le problème : {{.error}}", + "Failed to stop node {{.name}}": "Échec de l'arrêt du nœud {{.name}}", + "Failed to update cluster": "Échec de la mise à jour du cluster", + "Failed to update config": "Échec de la mise à jour de la configuration", + "Failed to verify '{{.driver_name}} info' will try again ...": "Échec de la vérification des informations sur '{{.driver_name}}' va réessayer ...", + "Failed unmount: {{.error}}": "Échec du démontage : {{.error}}", + "File permissions used for the mount": "Autorisations de fichier utilisées pour le montage", + "Filter to use only VM Drivers": "Filtrer pour n'utiliser que les pilotes VM", + "Flags": "Indicateurs", + "Follow": "Suivre", "For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/": "Pour des résultats optimaux, installez kubectl à l'adresse suivante : https://kubernetes.io/docs/tasks/tools/install-kubectl/", "For best results, install kubectl: https://kubernetes.io/docs/tasks/tools/install-kubectl/__1": "Pour des résultats optimaux, installez kubectl à l'adresse suivante : https://kubernetes.io/docs/tasks/tools/install-kubectl/", - "For improved {{.driver}} performance, {{.fix}}": "", - "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", + "For improved {{.driver}} performance, {{.fix}}": "Pour de meilleures performances {{.driver}}, {{.fix}}", + "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "Pour plus d'informations, voir : https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}", "For more information, see:": "Pour en savoir plus, consultez les pages suivantes :", - "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", - "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", + "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "Pour plus d'informations, voir : https://minikube.sigs.k8s.io/docs/reference/drivers/none/", + "For more information, see: {{.url}}": "Pour plus d'informations, voir : {{.url}}", + "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "Forcer l'environnement à être configuré pour un shell spécifié : [fish, cmd, powershell, tcsh, bash, zsh], la valeur par défaut est la détection automatique", "Force minikube to perform possibly dangerous operations": "Oblige minikube à réaliser des opérations possiblement dangereuses.", - "Format to print stdout in. Options include: [text,json]": "", + "Format to print stdout in. Options include: [text,json]": "Format dans lequel imprimer la sortie standard. Les options incluent : [text,json]", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "Docker trouvé, mais le service docker ne fonctionne pas. Essayez de redémarrer le service Docker.", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "Pilote(s) trouvé(s) mais aucun n'était en fonctionnement. Voir ci-dessus pour des suggestions sur la façon de réparer les pilotes installés.", "Found network options:": "Options de réseau trouvées :", - "Found {{.number}} invalid profile(s) ! ": "", - "Generate command completion for a shell": "", - "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", - "Generate unable to parse memory '{{.memory}}': {{.error}}": "", - "Get or list the current profiles (clusters)": "", - "Gets the logs of the running instance, used for debugging minikube, not user code.": "", - "Gets the status of a local Kubernetes cluster": "", - "Gets the status of a local Kubernetes cluster.\n\tExit status contains the status of minikube's VM, cluster and Kubernetes encoded on it's bits in this order from right to left.\n\tEg: 7 meaning: 1 (for minikube NOK) + 2 (for cluster NOK) + 4 (for Kubernetes NOK)": "", - "Gets the value of PROPERTY_NAME from the minikube config file": "", - "Global Flags": "", - "Go template format string for the cache list output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list of accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd#CacheListTemplate": "", - "Go template format string for the config view output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list of accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd/config#ConfigViewTemplate": "", - "Go template format string for the status output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd#Status": "", - "Group ID: {{.groupID}}": "", + "Found {{.number}} invalid profile(s) ! ": "{{.number}} profil(s) invalide(s) trouvé(s) !", + "Generate command completion for a shell": "Générer la complétion de commande pour un shell", + "Generate command completion for bash.": "Générer la complétion de la commande pour bash.", + "Generate command completion for fish .": "Générer la complétion de la commande pour fish.", + "Generate command completion for zsh.": "Générer la complétion de la commande pour zsh.", + "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "Générer impossible d'analyser la taille du disque '{{.diskSize}}' : {{.error}}", + "Generate unable to parse memory '{{.memory}}': {{.error}}": "Générer impossible d'analyser la mémoire '{{.memory}}' : {{.error}}", + "Generating certificates and keys ...": "Génération des certificats et des clés", + "Get or list the current profiles (clusters)": "Obtenir ou répertorier les profils actuels (clusters)", + "Gets the logs of the running instance, used for debugging minikube, not user code.": "Obtenir les journaux de l'instance en cours d'exécution, utilisés pour le débogage de minikube, pas le code utilisateur.", + "Gets the status of a local Kubernetes cluster": "Obtient l'état d'un cluster Kubernetes local", + "Gets the status of a local Kubernetes cluster.\n\tExit status contains the status of minikube's VM, cluster and Kubernetes encoded on it's bits in this order from right to left.\n\tEg: 7 meaning: 1 (for minikube NOK) + 2 (for cluster NOK) + 4 (for Kubernetes NOK)": "Obtient le statut d'un cluster Kubernetes local.\n\tLe statut de sortie contient le statut de la VM minikube, du cluster et de Kubernetes encodé sur ses bits dans cet ordre de droite à gauche.\n\tEx : 7 signifiant : 1 (pour minikube NOK) + 2 (pour le cluster NOK) + 4 (pour Kubernetes NOK)", + "Gets the value of PROPERTY_NAME from the minikube config file": "Obtient la valeur de PROPERTY_NAME à partir du fichier de configuration minikube", + "Global Flags": "Indicateurs globaux", + "Go template format string for the cache list output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list of accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd#CacheListTemplate": "Chaîne de format de modèle Go pour la sortie de la liste de cache. Le format des modèles Go peut être trouvé ici : https://golang.org/pkg/text/template/\nPour la liste des variables accessibles pour le modèle, voir les valeurs de structure ici : https://godoc.org/k8s .io/minikube/cmd/minikube/cmd#CacheListTemplate", + "Go template format string for the config view output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list of accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd/config#ConfigViewTemplate": "Go chaîne de format de modèle pour la sortie de la vue de configuration. Le format des modèles Go peut être trouvé ici : https://golang.org/pkg/text/template/\nPour la liste des variables accessibles pour le modèle, voir les valeurs de structure ici : https://godoc.org/k8s .io/minikube/cmd/minikube/cmd/config#ConfigViewTemplate", + "Go template format string for the status output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd#Status": "Go chaîne de format de modèle pour la sortie d'état. Le format des modèles Go peut être trouvé ici : https://golang.org/pkg/text/template/\nPour la liste des variables accessibles pour le modèle, consultez les valeurs de structure ici : https://godoc.org/k8s. io/minikube/cmd/minikube/cmd#Status", + "Group ID: {{.groupID}}": "Identifiant du groupe: {{.groupID}}", "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "Masque la signature de l'hyperviseur de l'invité dans minikube (pilote kvm2 uniquement).", - "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", - "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", - "If set, automatically updates drivers to the latest version. Defaults to true.": "", - "If set, delete the current cluster if start fails and try again. Defaults to false.": "", - "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", - "If set, install addons. Defaults to true.": "", - "If set, pause all namespaces": "", - "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", - "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", - "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.": "Si la valeur est \"true\", mettez les images Docker en cache pour l'amorceur actuel et chargez-les dans la machine. La valeur est toujours \"false\" avec --vm-driver=none.", + "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "Hyperkit ne fonctionne pas. Mettez à niveau vers la dernière version d'hyperkit et/ou Docker for Desktop. Alternativement, vous pouvez choisir un autre --driver", + "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "Le réseau Hyperkit ne fonctionne pas. Mettez à niveau vers la dernière version d'hyperkit et/ou Docker for Desktop. Alternativement, vous pouvez choisir un autre --driver", + "IP Address to use to expose ports (docker and podman driver only)": "Adresse IP à utiliser pour exposer les ports (pilote docker et podman uniquement)", + "IP address (ssh driver only)": "Adresse IP (pilote ssh uniquement)", + "If present, writes to the provided file instead of stdout.": "S'il est présent, écrit dans le fichier fourni au lieu de la sortie standard.", + "If set, automatically updates drivers to the latest version. Defaults to true.": "Si défini, met automatiquement à jour les pilotes vers la dernière version. La valeur par défaut est true.", + "If set, delete the current cluster if start fails and try again. Defaults to false.": "Si défini, supprime le cluster actuel si le démarrage échoue et réessaye. La valeur par défaut est false.", + "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "Si défini, télécharge l'archive tar des images préchargées si disponibles pour améliorer le temps de démarrage. La valeur par défaut est true.", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "S'il est défini, force l'environnement d'exécution du conteneur à utiliser systemd comme gestionnaire de groupe de contrôle. La valeur par défaut est false.", + "If set, install addons. Defaults to true.": "Si défini, installe les modules. La valeur par défaut est true.", + "If set, pause all namespaces": "Si défini, suspend tous les espaces de noms", + "If set, unpause all namespaces": "Si défini, annule la pause de tous les espaces de noms", + "If the above advice does not help, please let us know:": "Si les conseils ci-dessus ne vous aident pas, veuillez nous en informer :", + "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "Si vrai, met en cache les images Docker pour le programme d'amorçage actuel et les charge dans la machine. Toujours faux avec --driver=none.", + "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.": "Si la valeur est \"true\", met les images Docker en cache pour l'amorceur actuel et les charge dans la machine. La valeur est toujours \"false\" avec --vm-driver=none.", "If true, only download and cache files for later use - don't install or start anything.": "Si la valeur est \"true\", téléchargez les fichiers et mettez-les en cache uniquement pour une utilisation future. Ne lancez pas d'installation et ne commencez aucun processus.", - "If true, the added node will be marked for work. Defaults to true.": "", - "If true, the node added will also be a control plane in addition to a worker.": "", - "If you are running minikube within a VM, consider using --driver=none:": "", - "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", - "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", - "Images Commands:": "", - "In order to use the fall back image, you need to log in to the github packages registry": "", - "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", + "If true, pods might get deleted and restarted on addon enable": "Si vrai, les pods peuvent être supprimés et redémarrés lors addon enable", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "Si vrai, renvoie la liste des profils plus rapidement en ignorant la validation de l'état du cluster.", + "If true, the added node will be marked for work. Defaults to true.": "Si vrai, le nœud ajouté sera marqué pour le travail. La valeur par défaut est true.", + "If true, the node added will also be a control plane in addition to a worker.": "Si vrai, le nœud ajouté sera également un plan de contrôle en plus d'un travailleur.", + "If true, will perform potentially dangerous operations. Use with discretion.": "Si vrai, effectuera des opérations potentiellement dangereuses. A utiliser avec discrétion.", + "If you are running minikube within a VM, consider using --driver=none:": "Si vous exécutez minikube dans une machine virtuelle, envisagez d'utiliser --driver=none", + "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "Si vous êtes toujours intéressé à faire fonctionner le pilote {{.driver_name}}. Les suggestions suivantes pourraient vous aider à surmonter ce problème :", + "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "Si vous ne voulez pas que vos informations d'identification soient montées dans un pod spécifique, ajoutez une étiquette avec la clé `gcp-auth-skip-secret` à votre configuration de pod.", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "Si vous souhaitez que les pods existants soient montés avec des informations d'identification, recréez-les ou réexécutez les modules complémentaires activés avec --refresh.", + "Ignoring empty custom image {{.name}}": "Ignorer l'image personnalisée vide {{.name}}", + "Ignoring invalid pair entry {{.pair}}": "Ignorer l'entrée de paire non valide {{.pair}}", + "Ignoring unknown custom image {{.name}}": "Ignorer l'image personnalisée inconnue {{.name}}", + "Ignoring unknown custom registry {{.name}}": "Ignorer le registre personnalisé inconnu {{.name}}", + "Images Commands:": "Commandes d'images:", + "Images used by this addon. Separated by commas.": "Images utilisées par ce module. Séparé par des virgules.", + "In order to use the fall back image, you need to log in to the github packages registry": "Pour utiliser l'image de secours, vous devez vous connecter au registre des packages github", + "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "Registres Docker non sécurisés à transmettre au démon Docker. La plage CIDR de service par défaut sera automatiquement ajoutée.", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "Registres Docker non sécurisés à transmettre au daemon Docker. La plage CIDR par défaut du service sera ajoutée automatiquement.", - "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}}": "", - "Istio needs {{.minCPUs}} CPUs -- your configuration only allocates {{.cpus}} CPUs": "", - "Istio needs {{.minMem}}MB of memory -- your configuration only allocates {{.memory}}MB": "", - "Kill the mount process spawned by minikube start": "", - "Kubelet network plug-in to use (default: auto)": "", - "Kubernetes requires at least 2 CPU's to start": "", - "Kubernetes {{.new}} is now available. If you would like to upgrade, specify: --kubernetes-version={{.prefix}}{{.new}}": "", - "Kubernetes {{.version}} is not supported by this release of minikube": "", + "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.", + "Kill the mount process spawned by minikube start": "Tuez le processus de montage généré par le démarrage de minikube", + "Kubelet network plug-in to use (default: auto)": "Plug-in réseau Kubelet à utiliser (par défaut : auto)", + "Kubernetes requires at least 2 CPU's to start": "Kubernetes nécessite au moins 2 processeurs pour démarrer", + "Kubernetes {{.new}} is now available. If you would like to upgrade, specify: --kubernetes-version={{.prefix}}{{.new}}": "Kubernetes {{.new}} est désormais disponible. Si vous souhaitez effectuer une mise à niveau, spécifiez : --kubernetes-version={{.prefix}}{{.new}}", + "Kubernetes {{.version}} is not supported by this release of minikube": "Kubernetes {{.version}} n'est pas pris en charge par cette version de minikube", "Launching Kubernetes ...": "Lancement de Kubernetes...", - "Launching proxy ...": "", - "List all available images from the local cache.": "", - "List existing minikube nodes.": "", - "List nodes.": "", + "Launching proxy ...": "Lancement du proxy...", + "List all available images from the local cache.": "Répertoriez toutes les images disponibles à partir du cache local.", + "List existing minikube nodes.": "Répertoriez les nœuds minikube existants.", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "Répertoriez les noms d'images que le module w/ADDON_NAME a utilisé. Pour une liste des modules disponibles, utilisez: minikube addons list", + "List images": "Lister les images", + "List nodes.": "Lister les nœuds.", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "Liste de ports VSock invités qui devraient être exposés comme sockets sur l'hôte (pilote hyperkit uniquement).", - "List of ports that should be exposed (docker and podman driver only)": "", - "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", - "Lists all minikube profiles.": "", - "Lists all valid default values for PROPERTY_NAME": "", - "Lists all valid minikube profiles and detects all possible invalid profiles.": "", - "Lists the URLs for the services in your local cluster": "", + "List of ports that should be exposed (docker and podman driver only)": "Liste des ports qui doivent être exposés (pilote docker et podman uniquement)", + "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "Écoute de 0.0.0.0 sur l'hôte docker externe {{.host}}. Veuillez être informé", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "Écoute {{.listenAddr}}. Ceci n'est pas recommandé et peut entraîner une faille de sécurité. À utiliser à vos risques et périls", + "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "Répertorie tous les modules minikube disponibles ainsi que leurs statuts actuels (activé/désactivé)", + "Lists all minikube profiles.": "Répertorie tous les profils minikube.", + "Lists all valid default values for PROPERTY_NAME": "Répertorie toutes les valeurs par défaut valides pour PROPERTY_NAME", + "Lists all valid minikube profiles and detects all possible invalid profiles.": "Répertorie tous les profils minikube valides et détecte tous les profils invalides possibles.", + "Lists the URLs for the services in your local cluster": "Répertorie les URL des services de votre cluster local", + "Load a image into minikube": "Charger une image dans minikube", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "Dossiers locaux à partager avec l'invité par des installations NFS (pilote hyperkit uniquement).", - "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", + "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "Proxy local ignoré : ne pas passer {{.name}}={{.value}} à docker env.", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "Emplacement du socket VPNKit exploité pour la mise en réseau. Si la valeur est vide, désactive Hyperkit VPNKitSock. Si la valeur affiche \"auto\", utilise la connexion VPNKit de Docker pour Mac. Sinon, utilise le VSock spécifié (pilote hyperkit uniquement).", "Location of the minikube iso": "Emplacement de l'ISO minikube.", - "Locations to fetch the minikube ISO from.": "", - "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", - "Log into the minikube environment (for debugging)": "", - "Message Size: {{.size}}": "", - "Modify persistent configuration values": "", - "Most users should use the newer 'docker' driver instead, which does not require root!": "", - "Mount type: {{.name}}": "", - "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", - "Mounts the specified directory into minikube": "", - "Mounts the specified directory into minikube.": "", - "Multi-node clusters are currently experimental and might exhibit unintended behavior.": "", - "Multiple errors deleting profiles": "", - "Multiple minikube profiles were found - ": "", - "NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", - "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", - "NOTE: This process must stay alive for the mount to be accessible ...": "", - "Networking and Connectivity Commands:": "", - "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", - "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "Locations to fetch the minikube ISO from.": "Emplacements à partir desquels récupérer l'ISO minikube.", + "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "Connectez-vous ou exécutez une commande sur une machine avec SSH ; similaire à 'docker-machine ssh'.", + "Log into the minikube environment (for debugging)": "Connectez-vous à l'environnement minikube (pour le débogage)", + "Manage images": "Gérer les images", + "Message Size: {{.size}}": "Taille du message : {{.size}}", + "Modify persistent configuration values": "Modifier les valeurs de configuration persistantes", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "Plus d'informations: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities", + "Most users should use the newer 'docker' driver instead, which does not require root!": "La plupart des utilisateurs devraient plutôt utiliser le nouveau pilote 'docker', qui ne nécessite pas de root !", + "Mount type: {{.name}}": "Type de montage : {{.name}}", + "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "Montage du chemin d'hôte {{.sourcePath}} dans la machine virtuelle en tant que {{.destinationPath}} ...", + "Mounts the specified directory into minikube": "Monte le répertoire spécifié dans minikube", + "Mounts the specified directory into minikube.": "Monte le répertoire spécifié dans minikube.", + "Multiple errors deleting profiles": "Plusieurs erreurs lors de la suppression des profils", + "Multiple minikube profiles were found - ": "Plusieurs profils minikube ont été trouvés -", + "NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "Type de carte réseau utilisé pour le réseau hôte uniquement. Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM ou virtio (pilote virtualbox uniquement)", + "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "Type de carte réseau utilisé pour le réseau nat. Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM ou virtio (pilote virtualbox uniquement)", + "NOTE: This process must stay alive for the mount to be accessible ...": "REMARQUE : ce processus doit rester actif pour que le montage soit accessible...", + "Networking and Connectivity Commands:": "Commandes de mise en réseau et de connectivité :", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "Aucune adresse IP fournie. Essayez de spécifier --ssh-ip-address, ou consultez https://minikube.sigs.k8s.io/docs/drivers/ssh/", + "No changes required for the \"{{.context}}\" context": "Aucune modification requise pour le contexte \"{{.context}}\"", + "No minikube profile was found. ": "Aucun profil minikube n'a été trouvé.", + "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "Aucun pilote possible n'a été détecté. Essayez de spécifier --driver, ou consultez https://minikube.sigs.k8s.io/docs/start/", + "No such addon {{.name}}": "Aucun module de ce type {{.name}}", "Node \"{{.node_name}}\" stopped.": "Le noeud \"{{.node_name}}\" est arrêté.", - "Node {{.name}} failed to start, deleting and trying again.": "", - "Node {{.name}} was successfully deleted.": "", - "Node {{.nodeName}} does not exist.": "", - "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "", + "Node {{.name}} failed to start, deleting and trying again.": "Le nœud {{.name}} n'a pas pu démarrer, suppression et réessai.", + "Node {{.name}} was successfully deleted.": "Le nœud {{.name}} a été supprimé avec succès.", + "Node {{.nodeName}} does not exist.": "Le nœud {{.nodeName}} n'existe pas.", + "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "Aucun des référentiels connus n'est accessible. Envisagez de spécifier un référentiel d'images alternatif avec l'indicateur --image-repository", "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "Aucun dépôt connu dans votre emplacement n'est accessible. {{.image_repository_name}} est utilisé comme dépôt de remplacement.", "None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "Aucun dépôt connu n'est accessible. Pensez à spécifier un autre dépôt d'images à l'aide de l'indicateur \"--image-repository\".", - "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", - "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", + "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un docker-env activé sur le pilote {{.driver_name}} dans ce terminal :", + "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "Vous avez remarqué que vous avez un pilote podman-env activé sur {{.driver_name}} dans ce terminal :", "Number of CPUs allocated to the minikube VM": "Nombre de processeurs alloués à la VM minikube.", - "Number of lines back to go within the log": "", - "OS release is {{.pretty_name}}": "", - "One of 'yaml' or 'json'.": "", - "Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "", - "Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "", - "Open the addons URL with https instead of http": "", - "Open the service URL with https instead of http (defaults to \\\"false\\\")": "", - "Opening Kubernetes service {{.namespace_name}}/{{.service_name}} in default browser...": "", - "Opening service {{.namespace_name}}/{{.service_name}} in default browser...": "", - "Opening {{.url}} in your default browser...": "", - "Opens the addon w/ADDON_NAME within minikube (example: minikube addons open dashboard). For a list of available addons use: minikube addons list ": "", - "Operations on nodes": "", - "Options: {{.options}}": "", - "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", - "Pause": "", - "Paused {{.count}} containers": "", - "Paused {{.count}} containers in: {{.namespaces}}": "", - "Pausing node {{.name}} ... ": "", - "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", - "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", - "Please enter a value:": "", - "Please free up disk or prune images.": "", - "Please increse Desktop's disk size.": "", - "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", - "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", - "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", - "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", - "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", - "Please see {{.documentation_url}} for more details": "", - "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", + "Number of lines back to go within the log": "Nombre de lignes à remonter dans le journal", + "OS release is {{.pretty_name}}": "La version du système d'exploitation est {{.pretty_name}}", + "One of 'yaml' or 'json'.": "Un parmi 'yaml' ou 'json'.", + "Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "Seuls les caractères alphanumériques et les tirets '-' sont autorisés. Minimum 1 caractère, commençant par alphanumérique.", + "Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "Seuls les caractères alphanumériques et les tirets '-' sont autorisés. Minimum 2 caractères, commençant par alphanumérique.", + "Open the addons URL with https instead of http": "Ouvrez l'URL des modules avec https au lieu de http", + "Open the service URL with https instead of http (defaults to \\\"false\\\")": "Ouvrez l'URL du service avec https au lieu de http (par défaut \\\"false\\\")", + "Opening Kubernetes service {{.namespace_name}}/{{.service_name}} in default browser...": "Ouverture du service Kubernetes {{.namespace_name}}/{{.service_name}} dans le navigateur par défaut...", + "Opening service {{.namespace_name}}/{{.service_name}} in default browser...": "Ouverture du service {{.namespace_name}}/{{.service_name}} dans le navigateur par défaut...", + "Opening {{.url}} in your default browser...": "Ouverture de {{.url}} dans votre navigateur par défaut...", + "Opens the addon w/ADDON_NAME within minikube (example: minikube addons open dashboard). For a list of available addons use: minikube addons list ": "Ouvre le module avec ADDON_NAME dans minikube (exemple : minikube addons open dashboard). Pour une liste des modules disponibles, utilisez: minikube addons list", + "Operations on nodes": "Opérations sur les nœuds", + "Options: {{.options}}": "Options: {{.options}}", + "Output format. Accepted values: [json]": "Format de sortie. Valeurs acceptées : [json]", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "Affiche la complétion du shell minikube pour le shell donné (bash, zsh ou fish)\n\n\tCela dépend du binaire bash-completion. Exemple d'instructions d'installation :\n\tOS X :\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # pour les utilisateurs bash\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # pour les utilisateurs zsh\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # pour les utilisateurs de fish\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t \t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # pour les utilisateurs bash\n\t\t$ source \u003c(minikube completion zsh) # pour les utilisateurs zsh\n\t \t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # pour les utilisateurs de fish\n\n\tDe plus, vous voudrez peut-être sortir la complétion dans un fichier et une source dans votre .bashrc\n n\tRemarque pour les utilisateurs de zsh : [1] les complétions zsh ne sont prises en charge que dans les versions de zsh \u003e= 5.2\n\tRemarque pour les utilisateurs de fish : [2] veuillez vous référer à cette documentation pour plus de détails https://fishshell.com/docs/current/#tab-completion\n", + "Overwrite image even if same image:tag name exists": "Écraser l'image même si la même image:balise existe", + "Path to the Dockerfile to use (optional)": "Chemin d'accès au Dockerfile à utiliser (facultatif)", + "Pause": "Pause", + "Paused {{.count}} containers": "{{.count}} conteneurs suspendus", + "Paused {{.count}} containers in: {{.namespaces}}": "{{.count}} conteneurs suspendus dans : {{.namespaces}}", + "Pausing node {{.name}} ... ": "Suspendre le nœud {{.name}} ...", + "Permissions: {{.octalMode}} ({{.writtenMode}})": "Autorisations : {{.octalMode}} ({{.writtenMode}})", + "Please attach the following file to the GitHub issue:": "Veuillez joindre le fichier suivant au problème GitHub :", + "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Veuillez créer un cluster avec une plus grande taille de disque : `minikube start --disk SIZE_MB`", + "Please either authenticate to the registry or use --base-image flag to use a different registry.": "Veuillez vous authentifier auprès du registre ou utiliser l'indicateur --base-image pour utiliser un registre différent.", + "Please enter a value:": "Entrer un nombre, SVP:", + "Please free up disk or prune images.": "Veuillez libérer le disque ou élaguer les images.", + "Please increse Desktop's disk size.": "Veuillez augmenter la taille du disque du bureau.", + "Please install the minikube hyperkit VM driver, or select an alternative --driver": "Veuillez installer le pilote minikube hyperkit VM, ou sélectionnez un --driver alternatif", + "Please install the minikube kvm2 VM driver, or select an alternative --driver": "Veuillez installer le pilote minikube kvm2 VM, ou sélectionnez un --driver alternatif", + "Please make sure the service you are looking for is deployed or is in the correct namespace.": "Veuillez vous assurer que le service que vous recherchez est déployé ou se trouve dans le bon espace de noms.", + "Please provide a path or url to build": "Veuillez fournir un chemin ou une URL à construire", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "Veuillez fournir une image dans votre démon local à charger dans minikube via \u003cminikube image load IMAGE_NAME\u003e", + "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "Veuillez réévaluer votre docker-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t", + "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "Veuillez réévaluer votre podman-env, pour vous assurer que vos variables d'environnement ont des ports mis à jour :\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t", + "Please see {{.documentation_url}} for more details": "Veuillez consulter {{.documentation_url}} pour plus de détails", + "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "Veuillez spécifier le répertoire à monter : \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (exemple : \"/host-home:/vm-home\")", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "Veuillez spécifier le chemin à copier : \n\tminikube cp \u003cchemin du fichier source\u003e \u003cchemin absolu du fichier cible\u003e (exemple : \"minikube cp a/b.txt /copied.txt\")", + "Please try purging minikube using `minikube delete --all --purge`": "Veuillez essayer de purger minikube en utilisant `minikube delete --all --purge`", "Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}": "Veuillez mettre à niveau l'exécutable \"{{.driver_executable}}\". {{.documentation_url}}", - "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", - "Populates the specified folder with documentation in markdown about minikube": "", - "PowerShell is running in constrained mode, which is incompatible with Hyper-V scripting.": "", + "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "Veuillez visiter le lien suivant pour la documentation à ce sujet : \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with -github-packages#authentiating-to-github-packages\n", + "Populates the specified folder with documentation in markdown about minikube": "Remplit le dossier spécifié avec la documentation en markdown sur minikube", + "PowerShell is running in constrained mode, which is incompatible with Hyper-V scripting.": "PowerShell s'exécute en mode contraint, ce qui est incompatible avec les scripts Hyper-V.", "Powering off \"{{.profile_name}}\" via SSH ...": "Mise hors tension du profil \"{{.profile_name}}\" via SSH…", "Preparing Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}} ...": "Préparation de Kubernetes {{.k8sVersion}} sur {{.runtime}} {{.runtimeVersion}}...", - "Print current and latest version number": "", - "Print just the version number.": "", - "Print the version of minikube": "", - "Print the version of minikube.": "", - "Problems detected in {{.entry}}:": "", - "Problems detected in {{.name}}:": "", - "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", - "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", - "Profile name '{{.name}}' is not valid": "", - "Profile name '{{.profilename}}' is not valid": "", + "Print current and latest version number": "Imprimer le numéro de version actuel et le plus récent", + "Print just the version number.": "Imprimez uniquement le numéro de version.", + "Print the version of minikube": "Imprimer la version de minikube", + "Print the version of minikube.": "Imprimez la version de minikube.", + "Problems detected in {{.entry}}:": "Problèmes détectés dans {{.entry}} :", + "Problems detected in {{.name}}:": "Problèmes détectés dans {{.name}} :", + "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "Profil \"{{.cluster}}\" introuvable. Exécutez \"minikube profile list\" pour afficher tous les profils.", + "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "Le nom du profil \"{{.profilename}}\" est un mot-clé réservé. Pour supprimer ce profil, exécutez : \"{{.cmd}}\"", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "Le nom de profil '{{.name}}' est dupliqué avec le nom de machine '{{.machine}}' dans le profil '{{.profile}}'", + "Profile name '{{.name}}' is not valid": "Le nom de profil '{{.name}}' n'est pas valide", + "Profile name '{{.profilename}}' is not valid": "Le nom de profil '{{.profilename}}' n'est pas valide", + "Profile name should be unique": "Le nom du profil doit être unique", "Provide VM UUID to restore MAC address (hyperkit driver only)": "Fournit l'identifiant unique universel (UUID) de la VM pour restaurer l'adresse MAC (pilote hyperkit uniquement).", - "Pulling base image ...": "", + "Pull the remote image (no caching)": "Extraire l'image distante (pas de mise en cache)", + "Pulling base image ...": "Extraction de l'image de base...", "Pulling images ...": "Extraction des images... ", - "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", - "Rebuild libvirt with virt-network support": "", - "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Push the new image (requires tag)": "Pousser la nouvelle image (nécessite une balise)", + "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "Redémarrez pour terminer l'installation de VirtualBox, vérifiez que VirtualBox n'est pas bloqué par votre système et/ou utilisez un autre hyperviseur", + "Rebuild libvirt with virt-network support": "Reconstruire libvirt avec le support de virt-network", + "Received {{.name}} signal": "Signal {{.name}} reçu", + "Registries used by this addon. Separated by commas.": "Registres utilisés par ce module. Séparé par des virgules.", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "Le module complémentaire de registre avec le pilote {{.driver}} utilise le port {{.port}}, veuillez l'utiliser au lieu du port par défaut 5000", "Registry mirrors to pass to the Docker daemon": "Miroirs de dépôt à transmettre au daemon Docker.", - "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", - "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", - "Related issue: {{.url}}": "", - "Related issues:": "", + "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "Réinstallez VirtualBox et redémarrez. Sinon, essayez le pilote kvm2 : https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/", + "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "Réinstallez VirtualBox et vérifiez qu'il n'est pas bloqué : Préférences Système -\u003e Sécurité \u0026 Confidentialité -\u003e Général -\u003e Le chargement de certains logiciels système a été bloqué", + "Related issue: {{.url}}": "Problème connexe: {{.url}}", + "Related issues:": "Problème connexe:", "Relaunching Kubernetes using {{.bootstrapper}} ...": "Redémarrage de Kubernetes à l'aide de {{.bootstrapper}}…", - "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", + "Remove one or more images": "Supprimer une ou plusieurs images", + "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "Supprimez l'indicateur --docker-opt ou --insecure-registry non valide s'il a été fourni", "Removed all traces of the \"{{.name}}\" cluster.": "Le cluster \"{{.name}}\" a été supprimé.", "Removing {{.directory}} ...": "Suppression du répertoire {{.directory}}…", - "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "Le nombre de processeurs demandés {{.requested_cpus}} est supérieur au nombre de processeurs disponibles de {{.avail_cpus}}", + "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "Le nombre de processeurs demandés {{.requested_cpus}} est inférieur au minimum autorisé de {{.minimum_cpus}}", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "La taille de disque demandée ({{.requested_size}}) est inférieure à la taille minimale ({{.minimum_size}}).", "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.": "L'allocation de mémoire demandée ({{.memory}} Mo) est inférieure à l'allocation de mémoire par défaut ({{.default_memorysize}} Mo). Sachez que minikube pourrait ne pas fonctionner correctement ou planter de manière inattendue.", - "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommend}}MB. Deployments may fail.": "", + "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommend}}MB. Deployments may fail.": "L'allocation de mémoire demandée ({{.requested}} Mo) est inférieure au minimum recommandé de {{.recommend}} Mo. Les déploiements peuvent échouer.", "Requested memory allocation {{.requested_size}} is less than the minimum allowed of {{.minimum_size}}": "L'allocation de mémoire demandée ({{.requested_size}}) est inférieure au minimum autorisé ({{.minimum_size}}).", - "Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB.": "", - "Requested memory allocation {{.requested}}MiB is less than the usable minimum of {{.minimum_memory}}MB": "", - "Reset Docker to factory defaults": "", - "Restart Docker": "", - "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", - "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", - "Restarting the {{.name}} service may improve performance.": "", - "Retrieve the ssh identity key path of the specified cluster": "", - "Retrieve the ssh identity key path of the specified cluster.": "", - "Retrieves the IP address of the running cluster": "", - "Retrieves the IP address of the running cluster, and writes it to STDOUT.": "", - "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "", - "Returns a URL to connect to a service": "", - "Returns logs to debug a local Kubernetes cluster": "", - "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", - "Returns the value of PROPERTY_NAME from the minikube config file. Can be overwritten at runtime by flags or environmental variables.": "", - "Right-click the PowerShell icon and select Run as Administrator to open PowerShell in elevated mode.": "", - "Run 'kubectl describe pod coredns -n kube-system' and check for a firewall or DNS conflict": "", - "Run 'minikube delete' to delete the stale VM, or and ensure that minikube is running as the same user you are issuing this command with": "", - "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "", - "Run a kubectl binary matching the cluster version": "", - "Run minikube from the C: drive.": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", - "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", - "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", - "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", - "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", - "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", - "Select a valid value for --dnsdomain": "", - "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", - "Set failed": "", - "Set flag to delete all profiles": "", - "Set flag to stop all profiles (clusters)": "", - "Set this flag to delete the '.minikube' folder from your user directory.": "", - "Sets an individual value in a minikube config file": "", - "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "", - "Sets up docker env variables; similar to '$(docker-machine env)'.": "", - "Sets up podman env variables; similar to '$(podman-machine env)'.": "", - "Setting profile failed": "", - "Show a list of global command-line options (applies to all commands).": "", - "Show only log entries which point to known problems": "", - "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", - "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", - "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", - "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", - "Sorry, completion support is not yet implemented for {{.name}}": "", - "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", + "Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB.": "L'allocation de mémoire demandée {{.requested}} Mo est supérieure à la limite de votre système {{.system_limit}} Mo.", + "Requested memory allocation {{.requested}}MiB is less than the usable minimum of {{.minimum_memory}}MB": "L'allocation de mémoire demandée {{.requested}} Mio est inférieure au minimum utilisable de {{.minimum_memory}} Mo", + "Reset Docker to factory defaults": "Réinitialiser Docker aux paramètres d'usine", + "Restart Docker": "Redémarrer Docker", + "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "Redémarrez Docker, assurez-vous que docker est en cours d'exécution, puis exécutez : 'minikube delete' puis 'minikube start' à nouveau", + "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "Redémarrage du {{.driver_name}} {{.machine_type}} existant pour \"{{.cluster}}\" ...", + "Restarting the {{.name}} service may improve performance.": "Le redémarrage du service {{.name}} peut améliorer les performances.", + "Retrieve the ssh host key of the specified node": "Récupérer la clé d'hôte ssh du nœud spécifié", + "Retrieve the ssh host key of the specified node.": "Récupérez la clé d'hôte ssh du nœud spécifié.", + "Retrieve the ssh identity key path of the specified node": "Récupérer le chemin de la clé d'identité ssh du nœud spécifié", + "Retrieve the ssh identity key path of the specified node, and writes it to STDOUT.": "Récupérez le chemin de la clé d'identité ssh du nœud spécifié et l'écrit dans la sortie standard.", + "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "Récupère l'adresse IP du cluster en cours d'exécution, la vérifie\n\t\t\tavec l'adresse IP dans kubeconfig et corrige kubeconfig si elle est incorrecte.", + "Retrieves the IP address of the specified node": "Récupère l'adresse IP du nœud spécifié", + "Retrieves the IP address of the specified node, and writes it to STDOUT.": "Récupère l'adresse IP du nœud spécifié et l'écrit dans la sortie standard.", + "Returns a URL to connect to a service": "Renvoie une URL pour se connecter à un service", + "Returns logs to debug a local Kubernetes cluster": "Renvoie les journaux pour déboguer un cluster Kubernetes local", + "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "Renvoie l'URL Kubernetes d'un service de votre cluster local. Dans le cas de plusieurs URL, elles seront imprimées une à la fois.", + "Returns the value of PROPERTY_NAME from the minikube config file. Can be overwritten at runtime by flags or environmental variables.": "Renvoie la valeur de PROPERTY_NAME à partir du fichier de configuration minikube. Peut être écrasé à l'exécution par des indicateurs ou des variables d'environnement.", + "Right-click the PowerShell icon and select Run as Administrator to open PowerShell in elevated mode.": "Cliquez avec le bouton droit sur l'icône PowerShell et sélectionnez Exécuter en tant qu'administrateur pour ouvrir PowerShell en mode élevé.", + "Run 'kubectl describe pod coredns -n kube-system' and check for a firewall or DNS conflict": "Exécutez 'kubectl describe pod coredns -n kube-system' et recherchez un pare-feu ou un conflit DNS", + "Run 'minikube delete' to delete the stale VM, or and ensure that minikube is running as the same user you are issuing this command with": "Exécutez 'minikube delete' pour supprimer la machine virtuelle obsolète ou assurez-vous que minikube s'exécute en tant qu'utilisateur avec lequel vous exécutez cette commande", + "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "Exécutez 'sudo sysctl fs.protected_regular=0', ou essayez un pilote qui ne nécessite pas de root, tel que '--driver=docker'", + "Run a kubectl binary matching the cluster version": "Exécuter un binaire kubectl correspondant à la version du cluster", + "Run minikube from the C: drive.": "Exécutez minikube à partir du lecteur C:.", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "Exécutez le client Kubernetes, téléchargez-le si nécessaire. N'oubliez pas -- après kubectl !\n\nCela exécutera le client Kubernetes (kubectl) avec la même version que le cluster\n\nNormalement, il téléchargera un binaire correspondant au système d'exploitation et à l'architecture de l'hôte,\nmais vous pouvez également l'exécuter en option directement sur le plan de contrôle via la connexion ssh.\nCela peut être utile si vous ne pouvez pas exécuter kubectl localement pour une raison quelconque, comme un hôte non pris en charge. Veuillez noter que lors de l'utilisation de --ssh, tous les chemins s'appliqueront à la machine distante.", + "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "Exécutez : 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'", + "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "Exécutez : 'kubectl delete clusterrolebinding kubernetes-dashboard'", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "Exécutez : 'minikube delete --all' pour nettoyer tous les réseaux abandonnés.", + "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "Exécutez : 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'", + "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "Exécutez : 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'", + "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "Exécution sur localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}Mo, Disk={{.disk_size}}Mo) ...", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "Exécution à distance (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}Mo, Disk={{.disk_size}}Mo) ...", + "SSH key (ssh driver only)": "Clé SSH (pilote ssh uniquement)", + "SSH port (ssh driver only)": "Port SSH (pilote ssh uniquement)", + "SSH user (ssh driver only)": "Utilisateur SSH (pilote ssh uniquement)", + "Select a valid value for --dnsdomain": "Sélectionnez une valeur valide pour --dnsdomain", + "Send trace events. Options include: [gcp]": "Envoyer des événements de trace. Les options incluent : [gcp]", + "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "Le service '{{.service}}' n'a pas été trouvé dans l'espace de noms '{{.namespace}}'.\nVous pouvez sélectionner un autre espace de noms en utilisant 'minikube service {{.service}} -n \u003cnamespace\u003e'. Ou répertoriez tous les services à l'aide de 'minikube service list'", + "Set failed": "Échec de la définition", + "Set flag to delete all profiles": "Définir un indicateur pour supprimer tous les profils", + "Set flag to stop all profiles (clusters)": "Définir un indicateur pour arrêter tous les profils (clusters)", + "Set flag to stop cluster after a set amount of time (e.g. --schedule=5m)": "Définir un indicateur pour arrêter le cluster après un laps de temps défini (par exemple, --schedule=5m)", + "Set this flag to delete the '.minikube' folder from your user directory.": "Définissez cet indicateur pour supprimer le dossier '.minikube' de votre répertoire utilisateur.", + "Sets an individual value in a minikube config file": "Définit une valeur individuelle dans un fichier de configuration minikube", + "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "Définit la valeur de configuration PROPERTY_NAME sur PROPERTY_VALUE\n\tCes valeurs peuvent être écrasées par des indicateurs ou des variables d'environnement lors de l'exécution.", + "Sets up docker env variables; similar to '$(docker-machine env)'.": "Configure les variables d'environnement docker ; similaire à '$(docker-machine env)'.", + "Sets up podman env variables; similar to '$(podman-machine env)'.": "Configure les variables d'environnement podman ; similaire à '$(podman-machine env)'.", + "Setting profile failed": "Échec de la définition du profil", + "Show a list of global command-line options (applies to all commands).": "Affiche une liste des options de ligne de commande globales (s'applique à toutes les commandes).", + "Show only log entries which point to known problems": "Afficher uniquement les entrées de journal qui pointent vers des problèmes connus", + "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "Affichez uniquement les entrées de journal les plus récentes et imprimez en continu de nouvelles entrées au fur et à mesure qu'elles sont ajoutées au journal.", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "Simulez le nombre de nœuds numa dans minikube, la plage de nombre de nœuds numa pris en charge est de 1 à 8 (pilote kvm2 uniquement)", + "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Changement de contexte kubectl ignoré pour {{.profile_name}} car --keep-context a été défini.", + "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "Certaines fonctionnalités du tableau de bord nécessitent le module metrics-server. Pour activer toutes les fonctionnalités, veuillez exécuter :\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n", + "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "Désolé, Kubernetes {{.k8sVersion}} nécessite que conntrack soit installé dans le chemin de la racine", + "Sorry, completion support is not yet implemented for {{.name}}": "Désolé, la prise en charge de la complétion n'est pas encore implémentée pour {{.name}}", + "Sorry, please set the --output flag to one of the following valid options: [text,json]": "Désolé, veuillez définir l'indicateur --output sur l'une des options valides suivantes : [text,json]", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "Désolé, l'adresse IP fournie avec l'indicateur --listen-address n'est pas valide : {{.listenAddr}}.", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "Désolé, l'adresse fournie avec l'indicateur --insecure-registry n'est pas valide : {{.addr}}. Les formats attendus sont : \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] ou \u003cnetwork\u003e/\u003cnetmask\u003e", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "Désolé, le paramètre kubeadm.{{.parameter_name}} ne peut actuellement pas être utilisé avec \"--extra-config\".", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "Désolé, l'URL fournie avec l'indicateur \"--registry-mirror\" n'est pas valide : {{.url}}", - "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", - "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", - "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", - "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", + "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "Désolé, {{.driver}} n'autorise pas la modification des montages après la création du conteneur (montage précédent : '{{.old}}', nouveau montage : '{{.new}})'", + "Source {{.path}} can not be empty": "La source {{.path}} ne peut pas être vide", + "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "La version spécifiée de Kubernetes {{.specified}} est inférieure à la plus ancienne version prise en charge : {{.oldest}}", + "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "Spécifiez --kubernetes-version avec la forme v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e. exemple : 'v1.1.14'", + "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "Spécifiez une autre valeur --host-only-cidr, telle que 172.16.0.1/24", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "Spécifie des indicateurs arbitraires à transmettre au daemon Docker (format : clé = valeur).", - "Specify the 9p version that the mount should use": "", - "Specify the ip that the mount should be setup on": "", - "Specify the mount filesystem type (supported types: 9p)": "", - "StartHost failed, but will try again: {{.error}}": "", + "Specify arbitrary flags to pass to the build. (format: key=value)": "Spécifiez des indicateurs arbitraires à transmettre au build. (format : clé=valeur)", + "Specify the 9p version that the mount should use": "Spécifiez la version 9p que la montage doit utiliser", + "Specify the ip that the mount should be setup on": "Spécifiez l'adresse IP sur laquelle le montage doit être configuré", + "Specify the mount filesystem type (supported types: 9p)": "Spécifiez le type de système de fichiers de montage (types pris en charge : 9p)", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", + "StartHost failed, but will try again: {{.error}}": "StartHost a échoué, mais va réessayer : {{.error}}", "Starting control plane node {{.name}} in cluster {{.cluster}}": "Démarrage du noeud de plan de contrôle {{.name}} dans le cluster {{.cluster}}", "Starting node {{.name}} in cluster {{.cluster}}": "Démarrage du noeud {{.name}} dans le cluster {{.cluster}}", - "Starting tunnel for service {{.service}}.": "", - "Starts a local Kubernetes cluster": "", + "Starting tunnel for service {{.service}}.": "Tunnel de démarrage pour le service {{.service}}.", + "Starts a local Kubernetes cluster": "Démarre un cluster Kubernetes local", "Starts a local kubernetes cluster": "Démarre un cluster Kubernetes local.", - "Starts a node.": "", - "Starts an existing stopped node in a cluster.": "", - "Startup with {{.old_driver}} driver failed, trying with alternate driver {{.new_driver}}: {{.error}}": "", + "Starts a node.": "Démarre un nœud.", + "Starts an existing stopped node in a cluster.": "Démarre un nœud arrêté existant dans un cluster.", + "Startup with {{.old_driver}} driver failed, trying with alternate driver {{.new_driver}}: {{.error}}": "Échec du démarrage avec le pilote {{.old_driver}}, essai avec un autre pilote {{.new_driver}} : {{.error}}", "Stopping \"{{.profile_name}}\" in {{.driver_name}} ...": "Arrêt de \"{{.profile_name}}\" sur {{.driver_name}}...", - "Stopping node \"{{.name}}\" ...": "", - "Stopping tunnel for service {{.service}}.": "", - "Stops a local Kubernetes cluster. This command stops the underlying VM or container, but keeps user data intact. The cluster can be started again with the \"start\" command.": "", - "Stops a node in a cluster.": "", - "Stops a running local Kubernetes cluster": "", - "Successfully added {{.name}} to {{.cluster}}!": "", - "Successfully deleted all profiles": "", - "Successfully mounted {{.sourcePath}} to {{.destinationPath}}": "", - "Successfully purged minikube directory located at - [{{.minikubeDirectory}}]": "", - "Successfully started node {{.name}}!": "", - "Successfully stopped node {{.name}}": "", - "Suggestion: {{.advice}}": "", - "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", - "Target directory {{.path}} must be an absolute path": "", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "", + "Stopping node \"{{.name}}\" ...": "Nœud d'arrêt \"{{.name}}\" ...", + "Stopping tunnel for service {{.service}}.": "Tunnel d'arrêt pour le service {{.service}}.", + "Stops a local Kubernetes cluster. This command stops the underlying VM or container, but keeps user data intact. The cluster can be started again with the \"start\" command.": "Arrête un cluster Kubernetes local. Cette commande arrête la VM ou le conteneur sous-jacent, mais conserve les données utilisateur intactes. Le cluster peut être redémarré avec la commande \"start\".", + "Stops a node in a cluster.": "Arrête un nœud dans un cluster.", + "Stops a running local Kubernetes cluster": "Arrête un cluster Kubernetes local en cours d'exécution", + "Successfully added {{.name}} to {{.cluster}}!": "{{.name}} a été ajouté avec succès à {{.cluster}} !", + "Successfully deleted all profiles": "Tous les profils ont été supprimés avec succès", + "Successfully mounted {{.sourcePath}} to {{.destinationPath}}": "{{.sourcePath}} monté avec succès sur {{.destinationPath}}", + "Successfully purged minikube directory located at - [{{.minikubeDirectory}}]": "Répertoire minikube purgé avec succès situé à - [{{.minikubeDirectory}}]", + "Successfully started node {{.name}}!": "Nœud {{.name}} démarré avec succès !", + "Successfully stopped node {{.name}}": "Nœud {{.name}} arrêté avec succès", + "Suggestion: {{.advice}}": "Suggestion : {{.advice}}", + "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "Le système n'a que {{.size}} Mio disponibles, moins que les {{.req}} Mio requis pour Kubernetes", + "Tag to apply to the new image (optional)": "Tag à appliquer à la nouvelle image (facultatif)", + "Target directory {{.path}} must be an absolute path": "Le répertoire cible {{.path}} doit être un chemin absolu", + "Target {{.path}} can not be empty": "La cible {{.path}} ne peut pas être vide", + "Test docs have been saved at - {{.path}}": "Les documents de test ont été enregistrés à - {{.path}}", "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "Le pilote \"{{.driver_name}}\" nécessite de disposer de droits racine. Veuillez exécuter minikube à l'aide de \"sudo minikube --vm-driver={{.driver_name}}\".", - "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", - "The 'none' driver is designed for experts who need to integrate with an existing VM": "", + "The \"{{.driver_name}}\" driver should not be used with root privileges.": "Le pilote \"{{.driver_name}}\" ne doit pas être utilisé avec les privilèges root.", + "The 'none' driver is designed for experts who need to integrate with an existing VM": "Le pilote 'none' est conçu pour les experts qui doivent s'intégrer à une machine virtuelle existante", "The 'none' driver provides limited isolation and may reduce system security and reliability.": "L'isolation fournie par le pilote \"none\" (aucun) est limitée, ce qui peut diminuer la sécurité et la fiabilité du système.", - "The '{{.addonName}}' addon is enabled": "", - "The '{{.driver}}' driver requires elevated permissions. The following commands will be executed:\\n\\n{{ .example }}\\n": "", - "The '{{.driver}}' provider was not found: {{.error}}": "", - "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 '{{.addonName}}' addon is enabled": "Le module '{{.addonName}}' est activé", + "The '{{.driver}}' driver requires elevated permissions. The following commands will be executed:\\n\\n{{ .example }}\\n": "Le pilote '{{.driver}}' nécessite des autorisations élevées. Les commandes suivantes seront exécutées :\\n\\n{{ .example }}\\n", + "The '{{.driver}}' provider was not found: {{.error}}": "Le fournisseur '{{.driver}}' n'a pas été trouvé : {{.error}}", + "The '{{.name}} driver does not support multiple profiles: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "Le pilote '{{.name}}' ne prend pas en charge plusieurs profils : https://minikube.sigs.k8s.io/docs/reference/drivers/none/", + "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).", - "The Docker service within '{{.name}}' is not active": "", "The KVM QEMU connection URI. (kvm2 driver only)": "URI de connexion QEMU de la KVM (pilote kvm2 uniquement).", - "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", + "The KVM default network name. (kvm2 driver only)": "Le nom de réseau par défaut de KVM. (pilote kvm2 uniquement)", + "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "Le pilote KVM est incapable de ressusciter cette ancienne VM. Veuillez exécuter `minikube delete` pour la supprimer et réessayer.", "The KVM network name. (kvm2 driver only)": "Nom du réseau de la KVM (pilote kvm2 uniquement).", - "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", - "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", - "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "Le pilote VM s'est écrasé. Exécutez 'minikube start --alsologtostderr -v=8' pour voir le message d'erreur du pilote VM", + "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "Le pilote VM s'est terminé avec une erreur et est peut-être corrompu. Exécutez 'minikube start' avec --alsologtostderr -v=8 pour voir l'erreur", + "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "La machine virtuelle pour laquelle minikube est configuré n'existe plus. Exécutez 'minikube delete'", + "The \\\"{{.name}}\\\" container runtime requires CNI": "L'environnement d'exécution du conteneur \\\"{{.name}}\\\" nécessite CNI", "The apiserver listening port": "Port d'écoute du serveur d'API.", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Nom du serveur d'API utilisé dans le certificat généré pour Kubernetes. Vous pouvez l'utiliser si vous souhaitez que le serveur d'API soit disponible en dehors de la machine.", "The argument to pass the minikube mount command on start": "Argument à transmettre à la commande d'installation de minikube au démarrage.", - "The argument to pass the minikube mount command on start.": "", - "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", - "The base image to use for docker/podman drivers. Intended for local development.": "", - "The certificate hostname provided appears to be invalid (may be a minikube bug, try 'minikube delete')": "", - "The cluster dns domain name used in the Kubernetes cluster": "", + "The argument to pass the minikube mount command on start.": "L'argument pour passer la commande de montage minikube au démarrage.", + "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "Le nom d'hôte apiserver faisant autorité pour les certificats apiserver et la connectivité. Cela peut être utilisé si vous souhaitez rendre l'apiserver disponible depuis l'extérieur de la machine", + "The base image to use for docker/podman drivers. Intended for local development.": "L'image de base à utiliser pour les pilotes docker/podman. Destiné au développement local.", + "The certificate hostname provided appears to be invalid (may be a minikube bug, try 'minikube delete')": "Le nom d'hôte du certificat fourni semble être invalide (peut être un bogue minikube, essayez 'minikube delete')", + "The cluster dns domain name used in the Kubernetes cluster": "Le nom de domaine DNS du cluster utilisé dans le cluster Kubernetes", "The cluster dns domain name used in the kubernetes cluster": "Nom du domaine DNS du cluster utilisé dans le cluster Kubernetes.", - "The cluster {{.cluster}} already exists which means the --nodes parameter will be ignored. Use \"minikube node add\" to add nodes to an existing cluster.": "", + "The cluster {{.cluster}} already exists which means the --nodes parameter will be ignored. Use \"minikube node add\" to add nodes to an existing cluster.": "Le cluster {{.cluster}} existe déjà, ce qui signifie que le paramètre --nodes sera ignoré. Utilisez \"minikube node add\" pour ajouter des nœuds à un cluster existant.", "The container runtime to be used (docker, crio, containerd)": "environment d'exécution du conteneur à utiliser (docker, crio, containerd).", - "The control plane for \"{{.name}}\" is paused!": "", - "The control plane node \"{{.name}}\" does not exist.": "", - "The control plane node is not running (state={{.state}})": "", - "The control plane node must be running for this command": "", + "The control plane for \"{{.name}}\" is paused!": "Le plan de contrôle pour \"{{.name}}\" est en pause !", + "The control plane node \"{{.name}}\" does not exist.": "Le nœud du plan de contrôle \"{{.name}}\" n'existe pas.", + "The control plane node is not running (state={{.state}})": "Le nœud du plan de contrôle n'est pas en cours d'exécution (state={{.state}})", + "The control plane node must be running for this command": "Le nœud du plan de contrôle doit être en cours d'exécution pour cette commande", "The cri socket path to be used": "Chemin d'accès au socket CRI à utiliser.", - "The cri socket path to be used.": "", - "The docker-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", - "The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "", + "The cri socket path to be used.": "Le chemin de socket cri à utiliser.", + "The docker-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "La commande docker-env est incompatible avec les clusters multi-nœuds. Utilisez le module 'registry' : https://minikube.sigs.k8s.io/docs/handbook/registry/", + "The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "La commande docker-env n'est compatible qu'avec le runtime \"docker\", mais ce cluster a été configuré pour utiliser le runtime \"{{.runtime}}\".", "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}": "Le pilote \"{{.driver}}\" n'est pas compatible avec {{.os}}/{{.arch}}.", - "The existing \"{{.name}}\" cluster was created using the \"{{.old}}\" driver, which is incompatible with requested \"{{.new}}\" driver.": "", - "The existing node configuration appears to be corrupt. Run 'minikube delete'": "", - "The heapster addon is depreciated. please try to disable metrics-server instead": "", + "The existing \"{{.name}}\" cluster was created using the \"{{.old}}\" driver, which is incompatible with requested \"{{.new}}\" driver.": "Le cluster \"{{.name}}\" existant a été créé à l'aide du pilote \"{{.old}}\", qui est incompatible avec le pilote \"{{.new}}\" demandé.", + "The existing node configuration appears to be corrupt. Run 'minikube delete'": "La configuration de nœud existante semble être corrompue. Exécutez 'minikube delete'", + "The heapster addon is depreciated. please try to disable metrics-server instead": "Le module heapster est déprécié. s'il vous plaît essayez de désactiver metrics-server à la place", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "Nom du commutateur virtuel hyperv. La valeur par défaut affiche le premier commutateur trouvé (pilote hyperv uniquement).", - "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", - "The initial time interval for each check that wait performs in seconds": "", - "The kubeadm binary within the Docker container is not executable": "", + "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "L'hyperviseur ne semble pas être configuré correctement. Exécutez 'minikube start --alsologtostderr -v=1' et inspectez le code d'erreur", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "L'image '{{.imageName}}' n'a pas été trouvée ; impossible de l'ajouter au cache.", + "The initial time interval for each check that wait performs in seconds": "L'intervalle de temps initial pour chaque vérification effectuée en secondes", + "The kubeadm binary within the Docker container is not executable": "Le binaire kubeadm dans le conteneur Docker n'est pas exécutable", "The kubernetes version that the minikube VM will use (ex: v1.2.3)": "Version de Kubernetes qu'utilisera la VM minikube (exemple : v1.2.3).", - "The machine-driver specified is failing to start. Try running 'docker-machine-driver-\u003ctype\u003e version'": "", - "The minikube VM is offline. Please run 'minikube start' to start it again.": "", - "The minikube {{.driver_name}} container exited unexpectedly.": "", - "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", + "The machine-driver specified is failing to start. Try running 'docker-machine-driver-\u003ctype\u003e version'": "Le pilote de machine spécifié ne démarre pas. Essayez d'exécuter 'docker-machine-driver-\u003ctype\u003e version'", + "The minikube VM is offline. Please run 'minikube start' to start it again.": "La machine virtuelle minikube est hors ligne. Veuillez exécuter 'minikube start' pour le redémarrer.", + "The minikube {{.driver_name}} container exited unexpectedly.": "Le conteneur minikube {{.driver_name}} s'est fermé de manière inattendue.", + "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "La version minimale requise pour podman est \"{{.minVersion}}\". votre version est \"{{.currentVersion}}\". minikube pourrait ne pas fonctionner. À utiliser à vos risques et périls. Pour installer la dernière version, veuillez consulter https://podman.io/getting-started/installation.html", "The name of the network plugin": "Nom du plug-in réseau.", - "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "", - "The node to get logs from. Defaults to the primary control plane.": "", - "The node to ssh into. Defaults to the primary control plane.": "", - "The node {{.name}} has ran out of available PIDs.": "", - "The node {{.name}} has ran out of disk space.": "", - "The node {{.name}} has ran out of memory.": "", - "The node {{.name}} network is not available. Please verify network settings.": "", - "The none driver is not compatible with multi-node clusters.": "", - "The number of bytes to use for 9p packet payload": "", - "The number of nodes to spin up. Defaults to 1.": "", - "The output format. One of 'json', 'table'": "", - "The path on the file system where the docs in markdown need to be saved": "", - "The podman service within '{{.cluster}}' is not active": "", - "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", - "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", - "The service namespace": "", - "The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "", - "The services namespace": "", - "The time interval for each check that wait performs in seconds": "", - "The value passed to --format is invalid": "", - "The value passed to --format is invalid: {{.error}}": "", - "The vmwarefusion driver is deprecated and support for it will be removed in a future release.\n\t\t\tPlease consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.\n\t\t\tSee https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information.\n\t\t\tTo disable this message, run [minikube config set ShowDriverDeprecationNotification false]": "", + "The named space to activate after start": "L'espace nommé à activer après le démarrage", + "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "Le nœud pour lequel vérifier l'état. La valeur par défaut est le plan de contrôle. Laissez vide avec le format par défaut pour l'état sur tous les nœuds.", + "The node to get IP. Defaults to the primary control plane.": "Le nœud pour obtenir l'IP. La valeur par défaut est le plan de contrôle principal.", + "The node to get logs from. Defaults to the primary control plane.": "Le nœud à partir duquel obtenir les journaux. La valeur par défaut est le plan de contrôle principal.", + "The node to get ssh-key path. Defaults to the primary control plane.": "Le nœud pour obtenir le chemin de la clé ssh. La valeur par défaut est le plan de contrôle principal.", + "The node to ssh into. Defaults to the primary control plane.": "Le nœud dans lequel ssh. La valeur par défaut est le plan de contrôle principal.", + "The node {{.name}} has ran out of available PIDs.": "Le nœud {{.name}} n'a plus de PID disponibles.", + "The node {{.name}} has ran out of disk space.": "Le nœud {{.name}} a manqué d'espace disque.", + "The node {{.name}} has ran out of memory.": "Le nœud {{.name}} est à court de mémoire.", + "The node {{.name}} network is not available. Please verify network settings.": "Le réseau du nœud {{.name}} n'est pas disponible. Veuillez vérifier les paramètres réseau.", + "The none driver is not compatible with multi-node clusters.": "Le pilote none n'est pas compatible avec les clusters multi-nœuds.", + "The number of bytes to use for 9p packet payload": "Le nombre d'octets à utiliser pour la charge utile du paquet 9p", + "The number of nodes to spin up. Defaults to 1.": "Le nombre de nœuds à faire tourner. La valeur par défaut est 1.", + "The output format. One of 'json', 'table'": "Le format de sortie. 'json' ou 'table'", + "The path on the file system where the docs in markdown need to be saved": "Le chemin sur le système de fichiers où les documents en markdown doivent être enregistrés", + "The path on the file system where the error code docs in markdown need to be saved": "Le chemin sur le système de fichiers où les documents code d'erreur en markdown doivent être enregistrés", + "The path on the file system where the testing docs in markdown need to be saved": "Le chemin sur le système de fichiers où les documents de test en markdown doivent être enregistrés", + "The podman service within '{{.cluster}}' is not active": "Le service podman dans '{{.cluster}}' n'est pas actif", + "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "La commande podman-env est incompatible avec les clusters multi-nœuds. Utilisez le module 'registry' : https://minikube.sigs.k8s.io/docs/handbook/registry/", + "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "L'allocation de mémoire demandée de {{.requested}}MiB ne laisse pas de place pour la surcharge système (mémoire système totale : {{.system_limit}}MiB). Vous pouvez rencontrer des problèmes de stabilité.", + "The service namespace": "L'espace de nom du service", + "The service {{.service}} requires privileged ports to be exposed: {{.ports}}": "Le service {{.service}} nécessite l'exposition des ports privilégiés : {{.ports}}", + "The services namespace": "L'espace de noms des services", + "The time interval for each check that wait performs in seconds": "L'intervalle de temps pour chaque contrôle que wait effectue en secondes", + "The value passed to --format is invalid": "La valeur passée à --format n'est pas valide", + "The value passed to --format is invalid: {{.error}}": "La valeur passée à --format n'est pas valide : {{.error}}", "The {{.driver_name}} driver should not be used with root privileges.": "Le pilote {{.driver_name}} ne doit pas être utilisé avec des droits racine.", "There's a new version for '{{.driver_executable}}'. Please consider upgrading. {{.documentation_url}}": "Une nouvelle version de \"{{.driver_executable}}\" est disponible. Pensez à effectuer la mise à niveau. {{.documentation_url}}", - "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "", - "These changes will take effect upon a minikube delete and then a minikube start": "", - "This addon does not have an endpoint defined for the 'addons open' command.\nYou can add one by annotating a service with the label {{.labelName}}:{{.addonName}}": "", + "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "Ces paramètres --extra-config ne sont pas valides : {{.invalid_extra_opts}}", + "These changes will take effect upon a minikube delete and then a minikube start": "Ces modifications prendront effet lors d'une suppression de minikube, puis d'un démarrage de minikube", + "This addon does not have an endpoint defined for the 'addons open' command.\nYou can add one by annotating a service with the label {{.labelName}}:{{.addonName}}": "Ce module n'a pas de point de terminaison défini pour la commande 'addons open'.\nVous pouvez en ajouter un en annotant un service avec le libellé {{.labelName}} :{{.addonName}}", "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "Cette opération peut également être réalisée en définissant la variable d'environment \"CHANGE_MINIKUBE_NONE_USER=true\".", - "This control plane is not running! (state={{.state}})": "", - "This driver does not yet work on your architecture. Maybe try --driver=none": "", - "This is unusual - you may want to investigate using \"{{.command}}\"": "", + "This control plane is not running! (state={{.state}})": "Ce plan de contrôle ne fonctionne pas ! (état={{.state}})", + "This driver does not yet work on your architecture. Maybe try --driver=none": "Ce pilote ne fonctionne pas encore sur votre architecture. Essayez peut-être --driver=none", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "Il s'agit d'un problème connu avec le pilote de stockage BTRFS, il existe une solution de contournement, veuillez vérifier le problème sur GitHub", + "This is unusual - you may want to investigate using \"{{.command}}\"": "C'est inhabituel - vous voudrez peut-être investiguer en utilisant \"{{.command}}\"", "This will keep the existing kubectl context and will create a minikube context.": "Cela permet de conserver le contexte kubectl existent et de créer un contexte minikube.", "This will start the mount daemon and automatically mount files into minikube": "Cela permet de lancer le daemon d'installation et d'installer automatiquement les fichiers dans minikube.", - "This will start the mount daemon and automatically mount files into minikube.": "", - "This {{.type}} is having trouble accessing https://{{.repository}}": "", - "Tip: To remove this root owned cluster, run: sudo {{.cmd}}": "", + "This will start the mount daemon and automatically mount files into minikube.": "Cela démarrera le démon de montage et montera automatiquement les fichiers dans minikube.", + "This {{.type}} is having trouble accessing https://{{.repository}}": "Ce {{.type}} rencontre des difficultés pour accéder à https://{{.repository}}", + "Tip: To remove this root owned cluster, run: sudo {{.cmd}}": "Astuce : Pour supprimer ce cluster appartenant à la racine, exécutez : sudo {{.cmd}}", "Tip: To remove this root owned cluster, run: sudo {{.cmd}} delete": "Conseil : Pour supprimer ce cluster appartenant à la racine, exécutez la commande \"sudo {{.cmd}} delete\".", - "To connect to this cluster, use: --context={{.name}}": "", + "To connect to this cluster, use: --context={{.name}}": "Pour vous connecter à ce cluster, utilisez : --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.name}}": "Pour vous connecter à ce cluster, utilisez la commande \"kubectl --context={{.name}}\".", "To connect to this cluster, use: kubectl --context={{.name}}__1": "Pour vous connecter à ce cluster, utilisez la commande \"kubectl --context={{.name}}\".", - "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", - "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", - "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", - "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", - "To start a cluster, run: \"{{.command}}\"": "", - "To start minikube with Hyper-V, Powershell must be in your PATH`": "", - "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "", + "To connect to this cluster, use: kubectl --context={{.profile_name}}": "Pour vous connecter à ce cluster, utilisez : kubectl --context={{.profile_name}}", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "Pour désactiver les notifications bêta, exécutez : 'minikube config set WantBetaUpdateNotification false'", + "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "Pour désactiver cette notification, exécutez : 'minikube config set WantUpdateNotification false'\\n", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "Pour désactiver les notifications de mise à jour en général, exécutez : 'minikube config set WantUpdateNotification false'\\n", + "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "Pour extraire de nouvelles images externes, vous devrez peut-être configurer un proxy : https://minikube.sigs.k8s.io/docs/reference/networking/proxy/", + "To see addons list for other profiles use: `minikube addons -p name list`": "Pour voir la liste des modules pour d'autres profils, utilisez: `minikube addons -p name list`", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "Pour définir votre projet Google Cloud, exécutez :\n\n\t\tgcloud config set project \u003cproject name\u003e\n\n\n définissez la variable d'environnement GOOGLE_CLOUD_PROJECT.", + "To start a cluster, run: \"{{.command}}\"": "Pour démarrer un cluster, exécutez : \"{{.command}}\"", + "To start minikube with Hyper-V, Powershell must be in your PATH`": "Pour démarrer minikube avec Hyper-V, Powershell doit être dans votre PATH`", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "Pour utiliser les commandes kubectl ou minikube sous votre propre nom d'utilisateur, vous devrez peut-être les déplacer. Par exemple, pour écraser vos propres paramètres, exécutez la commande suivante :", - "Troubleshooting Commands:": "", - "Try 'minikube delete' to force new SSL certificates to be installed": "", - "Try 'minikube delete', and disable any conflicting VPN or firewall software": "", - "Trying to delete invalid profile {{.profile}}": "", - "Unable to bind flags": "", - "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", - "Unable to enable dashboard": "", - "Unable to fetch latest version info": "", - "Unable to find control plane": "", - "Unable to generate docs": "", - "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Troubleshooting Commands:": "Commandes de dépannage :", + "Try 'minikube delete' to force new SSL certificates to be installed": "Essayez 'minikube delete' pour forcer l'installation de nouveaux certificats SSL", + "Try 'minikube delete', and disable any conflicting VPN or firewall software": "Essayez 'minikube delete' et désactivez tout logiciel VPN ou pare-feu en conflit", + "Trying to delete invalid profile {{.profile}}": "Tentative de suppression du profil non valide {{.profile}}", + "Unable to bind flags": "Impossible de lier les drapeaux", + "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "Impossible de créer un réseau dédié, cela peut entraîner une modification de l'adresse IP du cluster après le redémarrage : {{.error}}", + "Unable to enable dashboard": "Impossible d'activer le tableau de bord", + "Unable to fetch latest version info": "Impossible de récupérer les informations sur la dernière version", + "Unable to find control plane": "Impossible de trouver le plan de contrôle", + "Unable to generate docs": "Impossible de générer des documents", + "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "Impossible de générer la documentation. Veuillez vous assurer que le chemin spécifié est un répertoire, existe \u0026 vous avez la permission d'y écrire.", + "Unable to get CPU info: {{.err}}": "Impossible d'obtenir les informations sur le processeur : {{.err}}", "Unable to get bootstrapper: {{.error}}": "Impossible d'obtenir l'amorceur : {{.error}}", - "Unable to get command runner": "", - "Unable to get control plane status: {{.error}}": "", - "Unable to get current user": "", - "Unable to get forwarded endpoint": "", - "Unable to get machine status": "", - "Unable to get runtime": "", - "Unable to kill mount process: {{.error}}": "", + "Unable to get command runner": "Impossible d'obtenir le lanceur de commandes", + "Unable to get control plane status: {{.error}}": "Impossible d'obtenir l'état du plan de contrôle : {{.error}}", + "Unable to get current user": "Impossible d'obtenir l'utilisateur actuel", + "Unable to get forwarded endpoint": "Impossible d'obtenir le point de terminaison transféré", + "Unable to get machine status": "Impossible d'obtenir l'état de la machine", + "Unable to get runtime": "Impossible d'obtenir l'environnement d'exécution", + "Unable to kill mount process: {{.error}}": "Impossible d'arrêter le processus de montage : {{.error}}", + "Unable to list profiles: {{.error}}": "Impossible de répertorier les profils : {{.error}}", "Unable to load cached images from config file.": "Impossible de charger les images mises en cache depuis le fichier de configuration.", - "Unable to load cached images: {{.error}}": "", + "Unable to load cached images: {{.error}}": "Impossible de charger les images mises en cache : {{.error}}", "Unable to load config: {{.error}}": "Impossible de charger la configuration : {{.error}}", - "Unable to load host": "", + "Unable to load host": "Impossible de charger l'hôte", + "Unable to load profile: {{.error}}": "Impossible de charger le profil : {{.error}}", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "Impossible d'analyser la version \"{{.kubernetes_version}}\" : {{.error}}", - "Unable to parse default Kubernetes version from constants: {{.error}}": "", - "Unable to parse memory '{{.memory}}': {{.error}}": "", - "Unable to parse oldest Kubernetes version from constants: {{.error}}": "", - "Unable to pick a default driver. Here is what was considered, in preference order:": "", + "Unable to parse default Kubernetes version from constants: {{.error}}": "Impossible d'analyser la version Kubernetes par défaut à partir des constantes : {{.error}}", + "Unable to parse memory '{{.memory}}': {{.error}}": "Impossible d'analyser la mémoire '{{.memory}}' : {{.error}}", + "Unable to parse oldest Kubernetes version from constants: {{.error}}": "Impossible d'analyser la version la plus ancienne de Kubernetes à partir des constantes : {{.error}}", + "Unable to pick a default driver. Here is what was considered, in preference order:": "Impossible de choisir un pilote par défaut. Voici ce qui a été considéré, par ordre de préférence :", "Unable to pull images, which may be OK: {{.error}}": "Impossible d'extraire des images, qui sont peut-être au bon format : {{.error}}", - "Unable to push cached images: {{.error}}": "", - "Unable to remove machine directory": "", - "Unable to restart cluster, will reset it: {{.error}}": "", - "Unable to safely downgrade existing Kubernetes v{{.old}} cluster to v{{.new}}": "", - "Unable to stop VM": "", - "Unable to update {{.driver}} driver: {{.error}}": "", - "Unfortunately, could not download the base image {{.image_name}} ": "", + "Unable to push cached images: {{.error}}": "Impossible de pousser les images mises en cache : {{.error}}", + "Unable to remove machine directory": "Impossible de supprimer le répertoire de la machine", + "Unable to restart cluster, will reset it: {{.error}}": "Impossible de redémarrer le cluster, va être réinitialisé : {{.error}}", + "Unable to safely downgrade existing Kubernetes v{{.old}} cluster to v{{.new}}": "Impossible de rétrograder en toute sécurité le cluster Kubernetes v{{.old}} existant vers v{{.new}}", + "Unable to stop VM": "Impossible d'arrêter la VM", + "Unable to update {{.driver}} driver: {{.error}}": "Impossible de mettre à jour le pilote {{.driver}} : {{.error}}", + "Unfortunately, could not download the base image {{.image_name}} ": "Malheureusement, impossible de télécharger l'image de base {{.image_name}}", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "Désinstallation de Kubernetes {{.kubernetes_version}} à l'aide de {{.bootstrapper_name}}…", - "Unmounting {{.path}} ...": "", - "Unpaused {{.count}} containers": "", - "Unpaused {{.count}} containers in: {{.namespaces}}": "", - "Unpausing node {{.name}} ... ": "", - "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", - "Unset variables instead of setting them": "", - "Update kubeconfig in case of an IP or port change": "", - "Update server returned an empty list": "", + "Unmounting {{.path}} ...": "Démontage de {{.path}} ...", + "Unpause": "Annuler la pause", + "Unpaused {{.count}} containers": "{{.count}} conteneurs non mis en veille", + "Unpaused {{.count}} containers in: {{.namespaces}}": "{{.count}} conteneurs non mis en veille dans : {{.namespaces}}", + "Unpausing node {{.name}} ... ": "Rétablissement du nœud {{.name}} ...", + "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "Désactivez la variable d'environnement KUBECONFIG ou vérifiez qu'elle ne pointe pas vers un chemin vide ou non valide", + "Unset variables instead of setting them": "Désactivez les variables au lieu de les définir", + "Update Docker to the latest minor version, this version is unsupported": "Mettez à jour Docker vers la dernière version mineure, cette version n'est pas prise en charge", + "Update kubeconfig in case of an IP or port change": "Mettre à jour kubeconfig en cas de changement d'IP ou de port", + "Update server returned an empty list": "Le serveur de mise à jour a renvoyé une liste vide", "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "Mise à jour du {{.machine_type}} {{.driver_name}} en marche \"{{.cluster}}\" ...", - "Upgrade to QEMU v3.1.0+, run 'virt-host-validate', or ensure that you are not running in a nested VM environment.": "", + "Upgrade to QEMU v3.1.0+, run 'virt-host-validate', or ensure that you are not running in a nested VM environment.": "Mettez à niveau vers QEMU v3.1.0+, exécutez 'virt-host-validate' ou assurez-vous que vous n'exécutez pas dans un environnement VM imbriqué.", "Upgrading from Kubernetes {{.old}} to {{.new}}": "Mise à niveau de Kubernetes de la version {{.old}} à la version {{.new}}…", "Usage": "Usage", - "Usage: minikube completion SHELL": "", - "Usage: minikube delete": "", - "Usage: minikube delete --all --purge": "", - "Usage: minikube node [add|start|stop|delete|list]": "", - "Usage: minikube node delete [name]": "", - "Usage: minikube node list": "", - "Usage: minikube node start [name]": "", - "Usage: minikube node stop [name]": "", - "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", - "Use 'kubect get po -A' to find the correct and namespace name": "", - "Use -A to specify all namespaces": "", - "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", - "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", - "User ID: {{.userID}}": "", - "Userspace file server is shutdown": "", - "Userspace file server: ": "", + "Usage: minikube completion SHELL": "Utilisation : minikube completion SHELL", + "Usage: minikube delete": "Utilisation: minikube delete", + "Usage: minikube delete --all --purge": "Utilisation: minikube delete --all --purge", + "Usage: minikube node [add|start|stop|delete|list]": "Utilisation: minikube node [add|start|stop|delete|list]", + "Usage: minikube node delete [name]": "Utilisation: minikube node delete [name]", + "Usage: minikube node list": "Utilisation: minikube node list", + "Usage: minikube node start [name]": "Utilisation: minikube node start [name]", + "Usage: minikube node stop [name]": "Utilisation: minikube node stop [name]", + "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "Utilisez \"{{.CommandPath}} [commande] --help\" pour plus d'informations sur une commande.", + "Use 'kubect get po -A' to find the correct and namespace name": "Utilisez 'kubect get po -A' pour trouver le nom correct et l'espace de noms", + "Use -A to specify all namespaces": "Utilisez -A pour spécifier tous les espaces de noms", + "Use SSH connection instead of HTTPS (port 2376)": "Utiliser la connexion SSH au lieu de HTTPS (port 2376)", + "Use SSH for running kubernetes client on the node": "Utiliser SSH pour exécuter le client kubernetes sur le nœud", + "Use VirtualBox to remove the conflicting VM and/or network interfaces": "Utilisez VirtualBox pour supprimer la VM et/ou les interfaces réseau en conflit", + "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "Utilisez le client Golang SSH natif (par défaut vrai). Définissez sur 'false' pour utiliser la commande de ligne de commande 'ssh' lors de l'accès à la machine docker. Utile pour les pilotes de machine lorsqu'ils ne démarrent pas avec 'Waiting for SSH'.", + "User ID: {{.userID}}": "ID utilisateur : {{.userID}}", + "User name '{{.username}}' is not valid": "Le nom d'utilisateur '{{.username}}' n'est pas valide", + "User name must be 60 chars or less.": "Le nom d'utilisateur doit comporter 60 caractères ou moins.", + "Userspace file server is shutdown": "Le serveur de fichiers de l'espace utilisateur est arrêté", + "Userspace file server: ": "Serveur de fichiers de l'espace utilisateur :", "Using image repository {{.name}}": "Utilisation du dépôt d'images {{.name}}…", - "Using podman 2 is not supported yet. your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk.": "", - "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "", + "Using image {{.registry}}{{.image}}": "Utilisation de l'image {{.registry}}{{.image}}", + "Using image {{.registry}}{{.image}} (global image repository)": "Utilisation de l'image {{.registry}}{{.image}} (référentiel d'images global)", + "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "L'utilisation du runtime '{{.runtime}}' avec le pilote 'none' est une configuration non testée !", "Using the {{.driver}} driver based on existing profile": "Utilisation du pilote {{.driver}} basé sur le profil existant", "Using the {{.driver}} driver based on user configuration": "Utilisation du pilote {{.driver}} basé sur la configuration de l'utilisateur", "VM driver is one of: %v": "Le pilote de la VM appartient à : %v", - "Valid components are: {{.valid_extra_opts}}": "", - "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", - "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "", - "Verifying Kubernetes components...": "", - "Verifying dashboard health ...": "", - "Verifying proxy health ...": "", - "Verifying {{.addon_name}} addon...": "", + "Valid components are: {{.valid_extra_opts}}": "Les composants valides sont : {{.valid_extra_opts}}", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "Validez vos réseaux KVM. Exécutez : virt-host-validate puis virsh net-list --all", + "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "La validation n'a pas pu analyser la taille du disque '{{.diskSize}}' : {{.error}}", + "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "Vérifiez que vos variables d'environnement HTTP_PROXY et HTTPS_PROXY sont correctement définies.", + "Verifying Kubernetes components...": "Vérification des composants Kubernetes...", + "Verifying dashboard health ...": "Vérification de l'état du tableau de bord...", + "Verifying proxy health ...": "Vérification de l'état du proxy...", + "Verifying {{.addon_name}} addon...": "Vérification du module {{.addon_name}}...", "Verifying:": "Vérification :", - "Version: {{.version}}": "", - "VirtualBox and Hyper-V are having a conflict. Use '--driver=hyperv' or disable Hyper-V using: 'bcdedit /set hypervisorlaunchtype off'": "", - "VirtualBox cannot create a network, probably because it conflicts with an existing network that minikube no longer knows about. Try running 'minikube delete'": "", - "VirtualBox is broken. Disable real-time anti-virus software, reboot, and reinstall VirtualBox if the problem continues.": "", - "VirtualBox is broken. Reinstall VirtualBox, reboot, and run 'minikube delete'.": "", - "VirtualBox is unable to find its network interface. Try upgrading to the latest release and rebooting.": "", - "Virtualization support is disabled on your computer. If you are running minikube within a VM, try '--driver=docker'. Otherwise, consult your systems BIOS manual for how to enable virtualization.": "", - "Wait failed: {{.error}}": "", + "Version: {{.version}}": "Version : {{.version}}", + "VirtualBox and Hyper-V are having a conflict. Use '--driver=hyperv' or disable Hyper-V using: 'bcdedit /set hypervisorlaunchtype off'": "VirtualBox et Hyper-V ont un conflit. Utilisez '--driver=hyperv' ou désactivez Hyper-V en utilisant : 'bcdedit /set hypervisorlaunchtype off'", + "VirtualBox cannot create a network, probably because it conflicts with an existing network that minikube no longer knows about. Try running 'minikube delete'": "VirtualBox ne peut pas créer de réseau, probablement parce qu'il entre en conflit avec un réseau existant que minikube ne connaît plus. Essayez d'exécuter 'minikube delete'", + "VirtualBox is broken. Disable real-time anti-virus software, reboot, and reinstall VirtualBox if the problem continues.": "VirtualBox ne fonctionne pas. Désactivez le logiciel antivirus en temps réel, redémarrez et réinstallez VirtualBox si le problème persiste.", + "VirtualBox is broken. Reinstall VirtualBox, reboot, and run 'minikube delete'.": "VirtualBox ne fonctionne pas. Réinstallez VirtualBox, redémarrez et exécutez « minikube delete ».", + "VirtualBox is unable to find its network interface. Try upgrading to the latest release and rebooting.": "VirtualBox est incapable de trouver son interface réseau. Essayez de mettre à niveau vers la dernière version et de redémarrer.", + "Virtualization support is disabled on your computer. If you are running minikube within a VM, try '--driver=docker'. Otherwise, consult your systems BIOS manual for how to enable virtualization.": "La prise en charge de la virtualisation est désactivée sur votre ordinateur. Si vous exécutez minikube dans une machine virtuelle, essayez '--driver=docker'. Sinon, consultez le manuel du BIOS de votre système pour savoir comment activer la virtualisation.", + "Wait failed: {{.error}}": "Échec de l'attente : {{.error}}", "Wait until Kubernetes core services are healthy before exiting": "Avant de quitter, veuillez patienter jusqu'à ce que les principaux services Kubernetes soient opérationnels.", "Waiting for SSH access ...": "En attente de l'accès SSH...", "Waiting for:": "En attente de :", - "Want kubectl {{.version}}? Try 'minikube kubectl -- get pods -A'": "", + "Want kubectl {{.version}}? Try 'minikube kubectl -- get pods -A'": "Vous voulez kubectl {{.version}} ? Essayez 'minikube kubectl -- get pods -A'", "Where to root the NFS Shares, defaults to /nfsshares (hyperkit driver only)": "Emplacement permettant d'accéder aux partages NFS en mode root, la valeur par défaut affichant /nfsshares (pilote hyperkit uniquement).", - "Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "", - "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", - "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", + "Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "S'il faut utiliser le commutateur externe sur le commutateur par défaut si le commutateur virtuel n'est pas explicitement spécifié. (pilote hyperv uniquement)", + "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "Avec --network-plugin=cni, vous devrez fournir votre propre CNI. Voir --cni flag comme alternative conviviale", + "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "Vous semblez utiliser un proxy, mais votre environnement NO_PROXY n'inclut pas l'IP minikube ({{.ip_address}}).", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "Il semble que vous utilisiez un proxy, mais votre environment NO_PROXY n'inclut pas l'adresse IP ({{.ip_address}}) de minikube. Consultez la documentation à l'adresse {{.documentation_url}} pour en savoir plus.", - "You can delete them using the following command(s): ": "", - "You can force an unsupported Kubernetes version via the --force flag": "", - "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "Vous essayez d'exécuter un binaire Windows .exe dans WSL. Pour une meilleure intégration, veuillez utiliser un binaire Linux à la place (Télécharger sur https://minikube.sigs.k8s.io/docs/start/.). Sinon, si vous voulez toujours le faire, vous pouvez le faire en utilisant --force", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "Vous essayez d'exécuter le binaire amd64 sur le système M1. Veuillez utiliser le binaire darwin/arm64 à la place (télécharger sur {{.url}}.)", + "You are trying to run windows .exe binary inside WSL, for better integration please use Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "Vous essayez d'exécuter le binaire Windows .exe dans WSL. Pour une meilleure intégration, veuillez utiliser le binaire Linux à la place (Télécharger sur https://minikube.sigs.k8s.io/docs/start/.). Sinon, si vous voulez toujours le faire, vous pouvez le faire en utilisant --force", + "You can delete them using the following command(s): ": "Vous pouvez les supprimer à l'aide de la ou des commandes suivantes :", + "You can force an unsupported Kubernetes version via the --force flag": "Vous pouvez forcer une version Kubernetes non prise en charge via l'indicateur --force", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier les processeurs d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille du disque pour un cluster minikube existant. Veuillez d'abord supprimer le cluster.", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "Vous ne pouvez pas modifier la taille de la mémoire d'un cluster minikube existant. Veuillez d'abord supprimer le cluster.", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "Vous avez choisi de désactiver le CNI mais le runtime du conteneur \\\"{{.name}}\\\" nécessite CNI", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "Vous devrez peut-être supprimer la VM \"{{.name}}\" manuellement de votre hyperviseur.", - "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", - "You must specify a service name": "", - "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", - "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "", - "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", - "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", - "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "", - "Your minikube vm is not running, try minikube start.": "", - "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", - "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", - "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", - "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "", - "bash completion failed": "", - "call with cleanup=true to remove old tunnels": "", - "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields: \\n\\n": "", - "config view failed": "", - "dashboard service is not running: {{.error}}": "", - "delete ctx": "", - "deleting node": "", - "disable failed": "", - "dry-run mode. Validates configuration, but does not mutate system state": "", - "dry-run validation complete!": "", - "enable failed": "", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", - "error creating clientset": "", - "error getting primary control plane": "", - "error getting ssh port": "", - "error parsing the input ip address for mount": "", - "error provisioning host": "", - "error starting tunnel": "", - "error stopping tunnel": "", - "error: --output must be 'yaml' or 'json'": "", - "experimental": "", - "failed to add node": "", - "failed to open browser: {{.error}}": "", - "failed to save config": "", - "failed to start node": "", - "fish completion failed": "", - "if true, will embed the certs in kubeconfig.": "", - "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "", - "initialization failed, will try again: {{.error}}": "", - "keep the kube-context active after cluster is stopped. Defaults to false.": "", - "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "", + "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "Vous devrez peut-être arrêter le gestionnaire Hyper-V et exécuter à nouveau 'minikube delete'.", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "Vous utilisez peut-être une version amd64 de minikube sur un Mac M1, utilisez plutôt la version arm64 de minikube", + "You must specify a service name": "Vous devez spécifier un nom de service", + "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "Vos identifiants GCP seront désormais installés dans chaque pod créé dans le cluster {{.name}}.", + "Your cgroup does not allow setting memory.": "Votre groupe de contrôle ne permet pas de définir la mémoire.", + "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "Votre hébergeur ne prend pas en charge la virtualisation KVM. Assurez-vous que qemu-kvm est installé et exécutez 'virt-host-validate' pour déboguer le problème", + "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "Votre hébergeur ne prend pas en charge la virtualisation. Si vous exécutez minikube dans une machine virtuelle, essayez '--driver=docker'. Sinon, activez la virtualisation dans votre BIOS", + "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "Votre hôte ne parvient pas à acheminer les paquets vers la machine virtuelle minikube. Si vous disposez d'un logiciel VPN, essayez de le désactiver ou de le configurer afin qu'il ne réachemine pas le trafic vers l'adresse IP de la VM. Sinon, vérifiez les options de routage de votre environnement de machine virtuelle.", + "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "Votre configuration minikube fait référence à un pilote non pris en charge. Effacez ~/.minikube et réessayez.", + "Your minikube vm is not running, try minikube start.": "Votre minikube vm ne fonctionne pas, essayez de démarrer minikube.", + "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "[AVERTISSEMENT] Pour une fonctionnalité complète, le module 'csi-hostpath-driver' nécessite que le module 'volumesnapshots' soit activé.\n\nVous pouvez activer le module 'volumesnapshots' en exécutant : 'minikube addons enable volumesnapshots'\n", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "\\\"minikube cache\\\" sera obsolète dans les prochaines versions, veuillez passer à \\\"minikube image load\\\"", + "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "Le module '{{.name}}' n'est actuellement pas activé.\nPour activer ce module, exécutez :\nminikube addons enable {{.name}}", + "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "Le module '{{.name}}' n'est pas un module valide fourni avec minikube.\nPour voir la liste des modules disponibles, exécutez :\nminikube addons list", + "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "addons modifie les fichiers de modules minikube à l'aide de sous-commandes telles que \"minikube addons enable dashboard\"", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "Le module auto-pause est une fonctionnalité alpha et encore en développement précoce. Veuillez signaler les problèmes pour nous aider à l'améliorer.", + "auto-pause currently is only supported on docker runtime. Track progress of others here: https://github.com/kubernetes/minikube/issues/10601": "la pause automatique n'est actuellement prise en charge que sur le runtime docker. Suivez les progrès des autres ici : https://github.com/kubernetes/minikube/issues/10601", + "bash completion failed": "échec de la complétion bash", + "bash completion.": "complétion bash", + "call with cleanup=true to remove old tunnels": "appelez avec cleanup=true pour supprimer les anciens tunnels", + "cancel any existing scheduled stop requests": "annuler toutes les demandes d'arrêt programmées existantes", + "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "config modifie les fichiers de configuration de minikube à l'aide de sous-commandes telles que \"minikube config set driver kvm2\"\nChamps configurables : \\n\\n", + "config view failed": "échec de la vue de configuration", + "containers paused status: {{.paused}}": "état des conteneurs en pause : {{.paused}}", + "dashboard service is not running: {{.error}}": "le service de tableau de bord ne fonctionne pas : {{.error}}", + "delete ctx": "supprimer ctx", + "deleting node": "suppression d'un nœud", + "disable failed": "échec de la désactivation", + "dry-run mode. Validates configuration, but does not mutate system state": "mode simulation. Valide la configuration, mais ne modifie pas l'état du système", + "dry-run validation complete!": "validation de la simulation terminée !", + "enable failed": "échec de l'activation", + "error creating clientset": "erreur lors de la création de l'ensemble de clients", + "error getting primary control plane": "erreur lors de l'obtention du plan de contrôle principal", + "error getting ssh port": "erreur lors de l'obtention du port ssh", + "error initializing tracing: {{.Error}}": "erreur d'initialisation du traçage : {{.Error}}", + "error parsing the input ip address for mount": "erreur lors de l'analyse de l'adresse IP d'entrée pour le montage", + "error provisioning guest": "erreur lors de l'approvisionnement de l'invité", + "error provisioning host": "erreur lors de l'approvisionnement de l'hôte", + "error starting tunnel": "erreur de démarrage du tunnel", + "error stopping tunnel": "erreur d'arrêt du tunnel", + "error: --output must be 'yaml' or 'json'": "erreur : --output doit être 'yaml' ou 'json'", + "experimental": "expérimental", + "failed to add node": "échec de l'ajout du nœud", + "failed to open browser: {{.error}}": "échec de l'ouverture du navigateur : {{.error}}", + "failed to save config": "échec de l'enregistrement de la configuration", + "failed to start node": "échec du démarrage du nœud", + "fish completion failed": "la complétion fish a échoué", + "fish completion.": "complétion fish.", + "if true, will embed the certs in kubeconfig.": "si vrai, intégrera les certificats dans kubeconfig.", + "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "si vous voulez créer un profil vous pouvez par cette commande : minikube start -p {{.profile_name}}", + "initialization failed, will try again: {{.error}}": "l'initialisation a échoué, va réessayer : {{.error}}", + "invalid kubernetes version": "version kubernetes invalide", + "keep the kube-context active after cluster is stopped. Defaults to false.": "garder le kube-context actif après l'arrêt du cluster. La valeur par défaut est false.", + "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "kubeadm a détecté un conflit de port TCP avec un autre processus : probablement une autre installation locale de Kubernetes. Exécutez lsof -p\u003cport\u003e pour trouver le processus et le tuer", "kubectl and minikube configuration will be stored in {{.home_folder}}": "Les configurations kubectl et minikube seront stockées dans le dossier {{.home_folder}}.", - "kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "", - "kubectl proxy": "", - "libmachine failed": "", - "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", - "max time to wait per Kubernetes or host to be healthy.": "", - "minikube addons list --output OUTPUT. json, list": "", - "minikube is exiting due to an error. If the above message is not useful, open an issue:": "", - "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", - "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", - "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", + "kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "kubectl introuvable. Si vous en avez besoin, essayez : 'minikube kubectl -- get pods -A'", + "kubectl proxy": "proxy kubectl", + "libmachine failed": "libmachine a échoué", + "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "la liste affiche tous les paramètres par défaut valides pour PROPERTY_NAME\nChamps acceptables : \\n\\n", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "profil de chargement", + "max time to wait per Kubernetes or host to be healthy.": "temps d'attente maximal par Kubernetes ou hôte pour être en bonne santé.", + "minikube addons list --output OUTPUT. json, list": "liste des modules minikube --output OUTPUT. json, liste", + "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "minikube manque des fichiers relatifs à votre environnement invité. Cela peut être corrigé en exécutant 'minikube delete'", + "minikube is not meant for production use. You are opening non-local traffic": "minikube n'est pas destiné à une utilisation en production. Vous ouvrez du trafic non local", + "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "minikube ne peut pas accéder à Google Container Registry. Vous devrez peut-être le configurer pour utiliser un proxy HTTP.", + "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "minikube ne parvient pas à se connecter à la VM : {{.error}}\n\n\tCela est probablement dû à l'une des deux raisons suivantes :\n\n\t- Interférence VPN ou pare-feu\n\t- {{.hypervisor}} problème de configuration réseau\n\n\tSolutions suggérées :\n\n\t- Désactivez votre logiciel VPN ou pare-feu local\n\t- Configurez votre VPN ou pare-feu local pour autoriser l'accès à {{.ip}}\n \t- Redémarrez ou réinstallez {{.hypervisor}}\n\t- Utilisez un autre --vm-driver\n\t- Utilisez --force pour annuler cette vérification de connectivité\n\t", "minikube profile was successfully set to {{.profile_name}}": "Le profil de minikube a été défini avec succès sur {{.profile_name}}", "minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "minikube provisionne et gère des clusters Kubernetes locaux optimisés pour les workflows de développement.", "minikube quickly sets up a local Kubernetes cluster": "minikube configure rapidement un cluster Kubernetes local", "minikube skips various validations when --force is supplied; this may lead to unexpected behavior": "minikube ignore diverses validations lorsque --force est fourni ; cela peut conduire à un comportement inattendu", - "minikube status --output OUTPUT. json, text": "", + "minikube status --output OUTPUT. json, text": "état minikube --sortie SORTIE. json, texte", "minikube {{.version}} is available! Download it: {{.url}}": "minikube {{.version}} est disponible ! Téléchargez-le ici : {{.url}}", "mkcmp is used to compare performance of two minikube binaries": "mkcmp est utilisé pour comparer les performances de deux binaires minikube", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "argument de montage \"{{.value}}\" doit être de la forme : \u003cdossier source\u003e:\u003cdossier de destination\u003e", + "mount could not connect": "", "mount failed": "échec du montage", "namespaces to pause": "espaces de noms à mettre en pause", "namespaces to unpause": "espaces de noms à réactiver", + "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "réseau avec lequel exécuter minikube. Maintenant, il est utilisé par les pilotes docker/podman et KVM. Si laissé vide, minikube créera un nouveau réseau.", "none driver does not support multi-node clusters": "aucun pilote ne prend pas en charge les clusters multi-nœuds", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "pas assez d'arguments ({{.ArgCount}}).\\nusage : minikube config set PROPERTY_NAME PROPERTY_VALUE", + "numa node is only supported on k8s v1.18 and later": "le nœud numa n'est pris en charge que sur k8s v1.18 et versions ultérieures", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "format de sortie (EXPERIMENTAL, JSON uniquement) : 'nodes' ou 'cluster'", "pause Kubernetes": "met Kubernetes en pause", - "preload extraction failed: \\\"No space left on device\\\"": "", + "preload extraction failed: \\\"No space left on device\\\"": "échec de l'extraction du préchargement : \\\"Pas d'espace disponible sur l'appareil\\\"", "profile sets the current minikube profile, or gets the current profile if no arguments are provided. This is used to run and manage multiple minikube instance. You can return to the default minikube profile by running `minikube profile default`": "profile définit le profil courrant de minikube, ou obtient le profil actuel si aucun argument n'est fourni. Ceci est utilisé pour exécuter et gérer plusieurs instances de minikube. Vous pouvez revenir au profil par défaut du minikube en exécutant `minikube profile default`", "provisioning host for node": "provisionne un hôte pour le nœud", "reload cached images.": "recharge les cache des images.", "reloads images previously added using the 'cache add' subcommand": "recharge les images précédemment ajoutées à l'aide de la sous-commande 'cache add'", "retrieving node": "récupération du nœud", + "scheduled stop is not supported on the none driver, skipping scheduling": "l'arrêt programmé n'est pas pris en charge sur le pilote none, programmation non prise en compte", "service {{.namespace_name}}/{{.service_name}} has no node port": "le service {{.namespace_name}}/{{.service_name}} n'a pas de port de nœud", "stat failed": "stat en échec", "status json failure": "état du JSON en échec", @@ -760,6 +916,7 @@ "toom any arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "toom tous les arguments ({{.ArgCount}}).\\nusage : jeu de configuration de minikube PROPERTY_NAME PROPERTY_VALUE", "tunnel creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP. for a detailed example see https://minikube.sigs.k8s.io/docs/tasks/loadbalancer": "le tunnel crée une route vers les services déployés avec le type LoadBalancer et définit leur Ingress sur leur ClusterIP. Pour un exemple détaillé, voir https://minikube.sigs.k8s.io/docs/tasks/loadbalancer", "unable to bind flags": "impossible de lier les configurations", + "unable to daemonize: {{.err}}": "impossible de démoniser : {{.err}}", "unable to delete minikube config folder": "impossible de supprimer le dossier de configuration de minikube", "unable to set logtostderr": "impossible de définir logtostderr", "unpause Kubernetes": "réactive Kubernetes", @@ -768,34 +925,41 @@ "unsets an individual value in a minikube config file": "déconfigure une valeur individuelle dans le fichier de configuration de minikube", "unsupported or missing driver: {{.name}}": "pilote non pris en charge ou manquant : {{.name}}", "update config": "mettre à jour la configuration", - "usage: minikube addons configure ADDON_NAME": "usage : minikube addons configure ADDON_NAME", - "usage: minikube addons disable ADDON_NAME": "usage : minikube addons disable ADDON_NAME", - "usage: minikube addons enable ADDON_NAME": "usage : minikube addons enable ADDON_NAME", - "usage: minikube addons list": "usage : minikube addons list", - "usage: minikube addons open ADDON_NAME": "usage : minikube addons open ADDON_NAME", - "usage: minikube config unset PROPERTY_NAME": "usage : minikube config unset PROPERTY_NAME", - "usage: minikube delete": "usage : minikube delete", - "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "usage : minikube profile [MINIKUBE_PROFILE_NAME]", + "usage: minikube addons configure ADDON_NAME": "utilisation : minikube addons configure ADDON_NAME", + "usage: minikube addons disable ADDON_NAME": "utilisation : minikube addons disable ADDON_NAME", + "usage: minikube addons enable ADDON_NAME": "utilisation : minikube addons enable ADDON_NAME", + "usage: minikube addons images ADDON_NAME": "utilisation: minikube addons images ADDON_NAME", + "usage: minikube addons list": "utilisation : minikube addons list", + "usage: minikube addons open ADDON_NAME": "utilisation : minikube addons open ADDON_NAME", + "usage: minikube config unset PROPERTY_NAME": "utilisation : minikube config unset PROPERTY_NAME", + "usage: minikube delete": "utilisation : minikube delete", + "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "utilisation : minikube profile [MINIKUBE_PROFILE_NAME]", + "using metrics-server addon, heapster is deprecated": "utilisation du module metrics-server, heapster est obsolète", "version json failure": "échec de la version du JSON", "version yaml failure": "échec de la version du YAML", "zsh completion failed": "complétion de zsh en échec", + "zsh completion.": "complétion zsh.", + "{{ .name }}: Suggestion: {{ .suggestion}}": "{{ .name }}: Suggestion: {{ .suggestion}}", "{{ .name }}: {{ .rejection }}": "{{ .name }} : {{ .rejection }}", - "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", + "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "{{.Driver}} utilise actuellement le pilote de stockage {{.StorageDriver}}, envisagez de passer à overlay2 pour de meilleures performances", "{{.count}} nodes stopped.": "{{.count}} nœud(s) arrêté(s).", "{{.driver_name}} \"{{.cluster}}\" {{.machine_type}} is missing, will recreate.": "{{.driver_name}} \"{{.cluster}}\" {{.machine_type}} est manquant, il va être recréé.", "{{.driver_name}} couldn't proceed because {{.driver_name}} service is not healthy.": "{{.driver_name}} n'a pas pu continuer car le service {{.driver_name}} n'est pas fonctionnel.", "{{.driver_name}} has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "{{.driver_name}} dispose de moins de 2 processeurs disponibles, mais Kubernetes nécessite au moins 2 procésseurs pour fonctionner", "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB": "{{.driver_name}} ne dispose que de {{.container_limit}}Mo de mémoire, mais vous avez spécifié {{.specified_memory}}Mo", "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "{{.driver}} ne dispose que de {{.size}}Mio disponible, moins que les {{.req}}Mio requis pour Kubernetes", - "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", + "{{.extra_option_component_name}}.{{.key}}={{.value}}": "{{.extra_option_component_name}}.{{.key}}={{.value}}", + "{{.name}} doesn't have images.": "{{.name}} n'a pas d'images.", + "{{.name}} has following images:": "{{.name}} a les images suivantes :", "{{.name}} has no available configuration options": "{{.name}} n'a pas d'options de configuration disponible", "{{.name}} is already running": "{{.name}} est déjà en cours d'exécution", "{{.name}} was successfully configured": "{{.name}} a été configuré avec succès", - "{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "", - "{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "", - "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "{{.oxibin}} prend un temps anormalement long pour répondre, pensez à redémarrer {{.osibin}}", + "{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "{{.n}} manque presque d'espace disque, ce qui peut entraîner l'échec des déploiements ! ({{.p}} % de la capacité)", + "{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "{{.n}} n'a plus d'espace disque ! (/var est à {{.p}} % de capacité)", + "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "{{.ocibin}} prend un temps anormalement long pour répondre, pensez à redémarrer {{.ocibin}}", "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "{{.path}} est la version {{.client_version}}, qui peut comporter des incompatibilités avec Kubernetes {{.cluster_version}}.", "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} sur {{.platform}}", + "{{.profile}} profile is not valid: {{.err}}": "Le profil {{.profile}} n'est pas valide : {{.err}}", "{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} n'est pas encore un système de fichiers pris en charge. Nous essaierons quand même !", "{{.url}} is not accessible: {{.error}}": "{{.url}} n'est pas accessible : {{.error}}" } \ No newline at end of file diff --git a/translations/ja.json b/translations/ja.json index 3a74fc6ca1..c2439c79af 100644 --- a/translations/ja.json +++ b/translations/ja.json @@ -7,6 +7,7 @@ "'none' driver does not support 'minikube mount' command": "「none」ドライバーは「minikube mount」コマンドをサポートしていません", "'none' driver does not support 'minikube podman-env' command": "「none」ドライバーは「minikube podman-env」コマンドをサポートしていません", "'none' driver does not support 'minikube ssh' command": "「none」ドライバーは「minikube ssh」コマンドをサポートしていません", + "'none' driver does not support 'minikube ssh-host' command": "", "'{{.driver}}' driver reported a issue that could affect the performance.": "「{{.driver}}」ドライバーがパフォーマンスに影響しうる問題を報告しました。", "'{{.driver}}' driver reported an issue: {{.error}}": "「{{.driver}}」ドライバーがエラーを報告しました: {{.error}}", "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "", @@ -15,6 +16,12 @@ "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", "- Restart your {{.driver_name}} service": "", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "", + "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "", + "==\u003e Last Start \u003c==": "", "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "VPN、あるいはファイアウォールによって、minkube VM への HTTP アクセスが干渉されています。他の手段として、別の VM を試してみてください: https://minikube.sigs.k8s.io/docs/start/", "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "", "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "ファイアウォールによって、minikube は外側への HTTPS リクエストをすることができません。HTTPS_PROXY 環境変数の値を変える必要があるかもしれません", @@ -23,7 +30,11 @@ "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Kubernetes 用に生成された証明書で使用される一連の API サーバー名。マシンの外部から API サーバーを利用できるようにする場合に使用します", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "アルファ版または試験運用版の機能のフィーチャーゲートを記述する一連の key=value ペアです", "Access the Kubernetes dashboard running within the minikube cluster": "minikube クラスタ内で動いている Kubernetes のダッシュボードにアクセスします", + "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "", + "Add SSH identity key to SSH authentication agent": "", "Add an image to local cache.": "イメージをローカルキャッシュに追加します", + "Add host key to SSH known_hosts file": "", + "Add image to cache for all running minikube clusters": "", "Add machine IP to NO_PROXY environment variable": "マシーンの IP アドレスをNO_PROXY 環境変数に追加します", "Add, delete, or push a local image into minikube": "ローカルイメージをminikubeに追加、削除、またはプッシュします", "Add, remove, or list additional nodes": "追加のノードを追加、削除またはリストアップします", @@ -33,14 +44,18 @@ "Adds a node to the given cluster config, and starts it.": "ノードをクラスタの設定に追加して、起動します", "Adds a node to the given cluster.": "ノードをクラスタに追加します", "Advanced Commands:": "高度なコマンド:", + "After the addon is enabled, please run \"minikube tunnel\" and your ingress resources would be available at \"127.0.0.1\"": "", "Aliases": "エイリアス", + "All existing scheduled stops cancelled": "", "Allow user prompts for more information": "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "Docker イメージの pull 元の代替イメージ リポジトリ。これは、gcr.io へのアクセスが制限されている場合に使用できます。これを \\\"auto\\\" に設定すると、minikube によって自動的に指定されるようになります。中国本土のユーザーの場合、registry.cn-hangzhou.aliyuncs.com/google_containers などのローカル gcr.io ミラーを使用できます", "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "Kubernetesに割り当てられた RAM 容量(形式: \u003cnumber\u003e[\u003cunit\u003e]、unit = b、k、m、g)", "Amount of time to wait for a service in seconds": "", "Amount of time to wait for service in seconds": "", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "", + "Another minikube instance is downloading dependencies... ": "", "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "", + "At least needs control plane nodes to enable addon": "", "Automatically selected the {{.driver}} driver": "{{.driver}}ドライバーが自動的に選択されました", "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "{{.driver}}ドライバーが自動的に選択されました。他の選択肢: {{.alternates}}", "Available Commands": "", @@ -48,8 +63,15 @@ "Basic Commands:": "基本的なコマンド:", "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "Dockerドライバーを{{.operating_system}}上で動かしているため、実行するにはターミナルを開く必要があります。", "Bind Address: {{.Address}}": "アドレスをバインドします: {{.Address}}", + "Booting up control plane ...": "Control Plane を起動しています...", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "", + "Build a container image, using the container runtime.": "", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", + "Cache image from docker daemon": "", + "Cache image from remote registry": "", + "Cannot find directory {{.path}} for copy": "", "Cannot find directory {{.path}} for mount": "マウントのためのディレクトリ{{.path}}が見つかりません", "Cannot use both --output and --format options": "", "Check if you have unnecessary pods running by running 'kubectl get po -A": "", @@ -60,12 +82,14 @@ "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "", "Choose a smaller value for --memory, such as 2000": "", "ChromeOS is missing the kernel support necessary for running Kubernetes": "", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "設定及び管理コマンド:", "Configure a default route on this Linux host, or use another --driver that does not require it": "", "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "", "Configure environment to use minikube's Docker daemon": "minikube の Docker デーモンを使うように環境を設定します", "Configure environment to use minikube's Podman service": "minikube の Podman サービスを使うように環境を設定します", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "", + "Configuring RBAC rules ...": "RBAC のルールを設定中です...", "Configuring local host environment ...": "", "Configuring {{.name}} (Container Networking Interface) ...": "", "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "", @@ -73,10 +97,15 @@ "Connect to LoadBalancer services": "LoadBalancer サービスに接続します", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", "Could not process error from failed deletion": "", "Could not process errors from failed deletion": "", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "使用するイメージミラーの国コード。グローバルのものを使用する場合は空のままにします。中国本土のユーザーの場合は、「cn」に設定します", "Creating mount {{.name}} ...": "マウント {{.name}} を作成しています...", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) を作成しています...", @@ -92,6 +121,7 @@ "Deletes a node from a cluster.": "ノードをクラスタから削除します", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "{{.driver_name}} の「{{.profile_name}}」を削除しています...", "Deleting container \"{{.name}}\" ...": "コンテナ \"{{.name}}\" を削除しています...", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", "Deleting node {{.name}} from cluster {{.cluster}}": "{{.cluster}} クラスタから {{.name}} ノードを削除しています", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "VM が起動する前にハードウェアの仮想化の可用性チェックを無効にします(virtualbox ドライバのみ)", "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "", @@ -107,19 +137,19 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "", "Docs have been saved at - {{.path}}": "ドキュメントは以下のパスに保存されました。{{.path}}", "Documentation: {{.url}}": "ドキュメント: {{.url}}", - "Done! kubectl is now configured to use \"{{.name}}\"": "完了しました!kubectl が「\"{{.name}}\"」を使用するよう構成されました", - "Done! kubectl is now configured to use \"{{.name}}\" by default": "", + "Done! kubectl is now configured to use \"{{.name}}\"": "完了しました! kubectl が「\"{{.name}}\"」を使用するよう構成されました", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "完了しました! kubectl が「\"{{.name}}\"」クラスタと「\"{{.ns}}\"」ネームスペースを使用するよう構成されました", "Download complete!": "ダウンロードが完了しました", "Downloading Kubernetes {{.version}} preload ...": "Kubernetes {{.version}} のダウンロードの準備をしています", "Downloading VM boot image ...": "VM ブートイメージをダウンロードしています...", "Downloading driver {{.driver}}:": "{{.driver}} ドライバをダウンロードしています:", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "ERROR creating `registry-creds-acr` secret": "`registry-creds-acr` シークレット作成中にエラーが発生しました", "ERROR creating `registry-creds-dpr` secret": "`registry-creds-dpr` シークレット作成中にエラーが発生しました", "ERROR creating `registry-creds-ecr` secret: {{.error}}": "`registry-creds-ecr` シークレット作成中にエラーが発生しました。{{.error}}", @@ -131,16 +161,21 @@ "Enable or disable a minikube addon": "minikube のアドオンを有効化または無効化します", "Enable proxy for NAT DNS requests (virtualbox driver only)": "NAT DNS リクエスト用のプロキシを有効にします(virtualbox ドライバのみ)", "Enabled addons: {{.addons}}": "有効なアドオン: {{.addons}}", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "'{{.name}}' を有効にする際にエラーが発生しました。{{.error}}", "Enabling dashboard ...": "ダッシュボードを有効化しています...", "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "", "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "", "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "Docker デーモンに渡す環境変数(形式: Key=Value)", + "Environment variables to pass to the build. (format: key=value)": "", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "minikube のディレクトリ作成中にエラーが発生しました", "Error creating view template": "表示用のテンプレートを作成中にエラーが発生しました", "Error detecting shell": "シェルの確認中にエラーが発生しました", @@ -151,7 +186,7 @@ "Error getting cluster bootstrapper": "クラスタのブートストラッパを取得中にエラーが発生しました", "Error getting cluster config": "クラスタの設定を取得中にエラーが発生しました", "Error getting host": "ホストを取得中にエラーが発生しました", - "Error getting port binding for '{{.driver_name}} driver: {{.error}}": "「{{.driver_name}}」ドライバー用のポートをバインディング中にエラーが発生しました", + "Error getting port binding for '{{.driver_name}} driver: {{.error}}": "「{{.driver_name}}」ドライバー用のポートをバインディング中にエラーが発生しました: {{.error}}", "Error getting primary control plane": "コントロールプレーンを取得中にエラーが発生しました", "Error getting service with namespace: {{.namespace}} and labels {{.labelName}}:{{.addonName}}: {{.error}}": "", "Error getting ssh client": "SSH クライアントを取得中にエラーが発生しました", @@ -166,6 +201,7 @@ "Error starting mount": "マウントを開始中にエラーが発生しました", "Error while setting kubectl current context : {{.error}}": "", "Error while setting kubectl current context: {{.error}}": "", + "Error with ssh-add": "", "Error writing mount pid": "マウントした pid を書き込み中にエラーが発生しました", "Examples": "例", "Executing \"{{.command}}\" took an unusually long time: {{.duration}}": "", @@ -173,8 +209,11 @@ "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": "", + "Failed to build image": "", "Failed to cache and load images": "", "Failed to cache binaries": "", "Failed to cache images": "", @@ -182,7 +221,11 @@ "Failed to cache kubectl": "", "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "{{.minikube_dir_path}} に対する権限を変更できませんでした。{{.error}}", "Failed to check main repository and mirrors for images": "", - "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "クラスタを削除できませんでしたが、処理を続行します。", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", + "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "クラスタ {{.name}} を削除できませんでしたが、処理を続行します。", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "", "Failed to delete cluster: {{.error}}__1": "クラスタを削除できませんでした。{{.error}}", "Failed to delete images": "イメージの削除に失敗しました", @@ -195,15 +238,22 @@ "Failed to get service URL: {{.error}}": "", "Failed to kill mount process: {{.error}}": "マウント プロセスを強制終了できませんでした。{{.error}}", "Failed to list cached images": "", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "", + "Failed to remove image": "", "Failed to save config {{.profile}}": "", + "Failed to save dir": "", + "Failed to save stdin": "", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "NO_PROXY 環境変数を設定できませんでした。「export NO_PROXY=$NO_PROXY,{{.ip}}」を使用してください。", "Failed to setup certs": "", + "Failed to start container runtime": "", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "", "Failed to update cluster": "", "Failed to update config": "", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "", "File permissions used for the mount": "", "Filter to use only VM Drivers": "", @@ -213,14 +263,21 @@ "For improved {{.driver}} performance, {{.fix}}": "", "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", "Force minikube to perform possibly dangerous operations": "minikube で危険な可能性のある操作を強制的に実行します", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "ネットワーク オプションが見つかりました", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "シェルのコマンド補完コードを生成します", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "証明書と鍵を作成しています...", "Get or list the current profiles (clusters)": "現在指定しているクラスタプロファイルを取得、またはリストアップします", "Gets the logs of the running instance, used for debugging minikube, not user code.": "", "Gets the status of a local Kubernetes cluster": "ローカル Kubernetes クラスタの状態を取得します", @@ -234,31 +291,45 @@ "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "minikube でゲストに対し、ハイパーバイザ署名を非表示にします(kvm2 ドライバのみ)", "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.": "true の場合、現在のブートストラッパの Docker イメージをキャッシュに保存して、マシンに読み込みます。--vm-driver=none の場合は常に false です", "If true, only download and cache files for later use - don't install or start anything.": "true の場合、後で使用できるようにファイルのダウンロードとキャッシュ保存だけが行われます。インストールも起動も行われません", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "イメージ用コマンド:", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "Docker デーモンに渡す Docker レジストリが安全ではありません。デフォルトのサービス CIDR 範囲が自動的に追加されます", "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", "Kubernetes requires at least 2 CPU's to start": "", @@ -268,14 +339,19 @@ "Launching proxy ...": "プロキシを起動しています...", "List all available images from the local cache.": "", "List existing minikube nodes.": "", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "", "List nodes.": "", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "ホストでソケットとして公開する必要のあるゲスト VSock ポートのリスト(hyperkit ドライバのみ)", "List of ports that should be exposed (docker and podman driver only)": "", + "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "", "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", "Lists all minikube profiles.": "すべてのminikubeのプロフィールを一覧で表示します", "Lists all valid default values for PROPERTY_NAME": "", "Lists all valid minikube profiles and detects all possible invalid profiles.": "", "Lists the URLs for the services in your local cluster": "", + "Load a image into minikube": "", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "NFS マウントを介してゲストと共有するローカル フォルダ(hyperkit ドライバのみ)", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "ネットワーキングに使用する VPNKit ソケットのロケーション。空の場合、Hyperkit VPNKitSock が無効になり、「auto」の場合、Mac VPNKit 接続に Docker が使用され、それ以外の場合、指定された VSock が使用されます(hyperkit ドライバのみ)", @@ -283,16 +359,17 @@ "Locations to fetch the minikube ISO from.": "", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", "Log into the minikube environment (for debugging)": "minikube の環境にログインします(デバッグ用)", + "Manage images": "", "Message Size: {{.size}}": "メッセージのサイズ: {{.size}}", "Modify minikube config": "minikube の設定を修正しています", "Modify minikube's kubernetes addons": "minikube の Kubernetes アドオンを修正しています", "Modify persistent configuration values": "永続的な設定値を変更します", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "", "Most users should use the newer 'docker' driver instead, which does not require root!": "", "Mount type: {{.name}}": "マウントタイプ: {{.name}}", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", "Mounts the specified directory into minikube": "minikube に指定されたディレクトリをマウントします", "Mounts the specified directory into minikube.": "", - "Multi-node clusters are currently experimental and might exhibit unintended behavior.": "", "Multiple errors deleting profiles": "プロフィールを削除中に複数のエラーが発生しました", "Multiple minikube profiles were found -": "複数の minikube のプロフィールが見つかりました", "Multiple minikube profiles were found - ": "", @@ -300,21 +377,23 @@ "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "ネットワーキング及び接続性コマンド:", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "", "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", + "No minikube profile was found. ": "", "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "No such addon {{.name}}": "", "Node \"{{.node_name}}\" stopped.": "「{{.node_name}}」ノードが停止しました。", "Node operations": "ノードの運用", "Node {{.name}} failed to start, deleting and trying again.": "", "Node {{.name}} was successfully deleted.": "{{.name}} ノードは削除されました。", - "Node {{.nodeName}} does not exist.": "{{.name}} ノードは存在しません。", + "Node {{.nodeName}} does not exist.": "{{.nodeName}} ノードは存在しません。", "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "", "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "使用しているロケーション内で既知のいずれのリポジトリにもアクセスできません。フォールバックとして {{.image_repository_name}} を使用します", "None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "既知のいずれのリポジトリにもアクセスできません。--image-repository フラグとともに代替のイメージ リポジトリを指定することを検討してください", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", "Number of CPUs allocated to the minikube VM": "minikube VM に割り当てられた CPU の数", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "OS は {{.pretty_name}} です。", "One of 'yaml' or 'json'.": "", @@ -329,13 +408,16 @@ "Operations on nodes": "", "Options: {{.options}}": "", "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "", + "Path to the Dockerfile to use (optional)": "", "Pause": "", "Paused {{.count}} containers": "", "Paused {{.count}} containers in: {{.namespaces}}": "次のnamespaceに存在する {{.count}} 個のコンテナを停止しました: {{.namespaces}}", "Pausing node {{.name}} ...": "ノード {{.name}} を一時停止しています ...", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", + "Please attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", @@ -344,10 +426,14 @@ "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "", "Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}": "「{{.driver_executable}}」をアップグレードしてください。{{.documentation_url}}", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", "Populates the specified folder with documentation in markdown about minikube": "", @@ -362,23 +448,30 @@ "Problems detected in {{.name}}:": "", "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "MAC アドレスを復元するための VM UUID を指定します(hyperkit ドライバのみ)", - "Pulling base image ...": "", + "Pull the remote image (no caching)": "", + "Pulling base image ...": "イメージを Pull しています...", + "Push the new image (requires tag)": "", "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "Docker デーモンに渡すレジストリ ミラー", "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "", "Related issues:": "", "Relaunching Kubernetes using {{.bootstrapper}} ...": "{{.bootstrapper}} を使用して Kubernetes を再起動しています...", + "Remove one or more images": "", "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "クラスタ \"{{.name}}\" の全てのトレースを削除しました。", "Removing {{.directory}} ...": "{{.directory}} を削除しています...", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "リクエストされたディスクサイズ {{.requested_size}} が最小値 {{.minimum_size}} 未満です", "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.": "リクエストされたメモリ割り当て({{.memory}} MB)がデフォルトのメモリ割り当て {{.default_memorysize}} MB 未満です。minikube が正常に動作しないか、予期せずクラッシュする可能性があることに注意してください", @@ -391,11 +484,15 @@ "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "既存の {{.driver_name}} {{.machine_type}} を \"{{.cluster}}\" のために再起動しています...", "Restarting the {{.name}} service may improve performance.": "", + "Retrieve the ssh host key of the specified node": "", + "Retrieve the ssh host key of the specified node.": "", "Retrieve the ssh identity key path of the specified cluster": "指定されたクラスタの SSH 鍵のパスを取得します", - "Retrieve the ssh identity key path of the specified cluster.": "", + "Retrieve the ssh identity key path of the specified node": "", + "Retrieve the ssh identity key path of the specified node, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster": "実行中のクラスタの IP アドレスを取得します", - "Retrieves the IP address of the running cluster, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "", + "Retrieves the IP address of the specified node": "", + "Retrieves the IP address of the specified node, and writes it to STDOUT.": "", "Returns a URL to connect to a service": "サービスに接続するための URL を返します", "Returns logs to debug a local Kubernetes cluster": "ローカル Kubernetes クラスタをデバッグするためのログを返します", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", @@ -406,18 +503,24 @@ "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "", "Run a kubectl binary matching the cluster version": "クラスタのバージョンに適合する kubectl のバイナリを実行します", "Run minikube from the C: drive.": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", "Select a valid value for --dnsdomain": "", + "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "", "Set flag to delete all profiles": "", "Set flag to stop all profiles (clusters)": "", + "Set flag to stop cluster after a set amount of time (e.g. --schedule=5m)": "", "Set this flag to delete the '.minikube' folder from your user directory.": "", "Sets an individual value in a minikube config file": "", "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "", @@ -427,21 +530,28 @@ "Show a list of global command-line options (applies to all commands).": "", "Show only log entries which point to known problems": "", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "申し訳ありません。現在、kubeadm.{{.parameter_name}} パラメータは --extra-config でサポートされていません", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "申し訳ありません。--registry-mirror フラグとともに指定された URL は無効です。{{.url}}", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "Docker デーモンに渡す任意のフラグを指定します(形式: key=value)", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "コントロールプレーンのノード {{.name}} を {{.cluster}} 上で起動しています", "Starting node {{.name}} in cluster {{.cluster}}": "", @@ -457,7 +567,7 @@ "Stops a node in a cluster.": "", "Stops a running local Kubernetes cluster": "ローカル Kubernetes クラスタを停止します", "Successfully added {{.name}} to {{.cluster}}!": "", - "Successfully deleted all profiles": "", + "Successfully deleted all profiles": "全てのプロファイルの削除に成功しました", "Successfully mounted {{.sourcePath}} to {{.destinationPath}}": "", "Successfully purged minikube directory located at - [{{.minikubeDirectory}}]": "", "Successfully started node {{.name}}!": "", @@ -465,8 +575,10 @@ "Suggestion: {{.advice}}": "提案: {{.advice}}", "Suggestion: {{.fix}}": "提案: {{.fix}}", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "「{{.driver_name}}」ドライバにはルート権限が必要です。「sudo minikube --vm-driver={{.driver_name}}」を使用して minikube を実行してください", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", "The \"{{.name}}\" cluster has been deleted.": "「{{.name}}」クラスタが削除されました", @@ -479,15 +591,18 @@ "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}}, 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 ドライバのみ)", - "The Docker service within '{{.name}}' is not active": "", "The KVM QEMU connection URI. (kvm2 driver only)": "KVM QEMU 接続 URI(kvm2 ドライバのみ)", + "The KVM default network name. (kvm2 driver only)": "", "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", "The KVM network name. (kvm2 driver only)": "KVM ネットワーク名(kvm2 ドライバのみ)", "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "API サーバー リスニング ポート", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "Kubernetes 用に生成された証明書で使用される API サーバー名。マシンの外部から API サーバーを利用できるようにする場合に使用します", "The argument to pass the minikube mount command on start": "起動時に minikube マウント コマンドを渡す引数", @@ -513,6 +628,7 @@ "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "hyperv 仮想スイッチ名。最初に見つかったものにデフォルト設定されます(hyperv ドライバのみ)", "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", "The kubernetes version that the minikube VM will use (ex: v1.2.3)": "minikube VM で使用される Kubernetes バージョン(例: v1.2.3)", @@ -521,8 +637,11 @@ "The minikube {{.driver_name}} container exited unexpectedly.": "", "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The name of the network plugin": "ネットワーク プラグインの名前", + "The named space to activate after start": "", "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "", + "The node to get IP. Defaults to the primary control plane.": "", "The node to get logs from. Defaults to the primary control plane.": "", + "The node to get ssh-key path. Defaults to the primary control plane.": "", "The node to ssh into. Defaults to the primary control plane.": "", "The node {{.name}} has ran out of available PIDs.": "", "The node {{.name}} has ran out of disk space.": "", @@ -533,6 +652,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -542,7 +663,6 @@ "The time interval for each check that wait performs in seconds": "", "The value passed to --format is invalid": "", "The value passed to --format is invalid: {{.error}}": "", - "The vmwarefusion driver is deprecated and support for it will be removed in a future release.\n\t\t\tPlease consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.\n\t\t\tSee https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information.\n\t\t\tTo disable this message, run [minikube config set ShowDriverDeprecationNotification false]": "", "The {{.driver_name}} driver should not be used with root privileges.": "{{.driver_name}} ドライバをルート権限で使用しないでください", "There's a new version for '{{.driver_executable}}'. Please consider upgrading. {{.documentation_url}}": "「{{.driver_executable}}」の新しいバージョンがあります。アップグレードを検討してください。{{.documentation_url}}", "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "", @@ -551,6 +671,7 @@ "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "これは環境変数 CHANGE_MINIKUBE_NONE_USER=true を設定して自動的に行うこともできます", "This control plane is not running! (state={{.state}})": "", "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "これにより既存の kubectl コンテキストが保持され、minikube コンテキストが作成されます", "This will start the mount daemon and automatically mount files into minikube": "これによりマウント デーモンが起動し、ファイルが minikube に自動的にマウントされます", @@ -562,13 +683,14 @@ "To connect to this cluster, use: kubectl --context={{.name}}": "このクラスタに接続するには、「kubectl --context={{.name}}」を使用します", "To connect to this cluster, use: kubectl --context={{.name}}__1": "このクラスタに接続するには、「kubectl --context={{.name}}」を使用します", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", "To start minikube with Hyper-V, Powershell must be in your PATH`": "", - "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "kubectl か minikube コマンドを独自のユーザーとして使用するには、そのコマンドの再配置が必要な場合があります。たとえば、独自の設定を上書きするには、以下を実行します", "Troubleshooting Commands:": "トラブルシュート用コマンド:", "Try 'minikube delete' to force new SSL certificates to be installed": "", @@ -581,6 +703,7 @@ "Unable to find control plane": "", "Unable to generate docs": "", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get bootstrapper: {{.error}}": "ブートストラッパを取得できません。{{.error}}", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", @@ -589,10 +712,12 @@ "Unable to get machine status": "", "Unable to get runtime": "", "Unable to kill mount process: {{.error}}": "", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images from config file.": "キャッシュに保存されているイメージを構成ファイルから読み込むことができません", "Unable to load cached images: {{.error}}": "", "Unable to load config: {{.error}}": "構成を読み込むことができません。{{.error}}", "Unable to load host": "", + "Unable to load profile: {{.error}}": "", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "「{{.kubernetes_version}}」を解析できません。{{.error}}", "Unable to parse default Kubernetes version from constants: {{.error}}": "", "Unable to parse memory '{{.memory}}': {{.error}}": "", @@ -608,15 +733,17 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "{{.bootstrapper_name}} を使用して Kubernetes {{.kubernetes_version}} をアンインストールしています...", "Unmounting {{.path}} ...": "", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "次のnamespaceに存在する {{.count}} 個のコンテナを再稼働させました: {{.namespaces}}", "Unpausing node {{.name}} ...": "ノード {{.name}} を再稼働させています ...", "Unpausing node {{.name}} ... ": "", "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "IP アドレスやポート番号が変わった場合に kubeconfig を更新します", "Update server returned an empty list": "", - "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", + "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "起動中の {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} を更新しています...", "Upgrade to QEMU v3.1.0+, run 'virt-host-validate', or ensure that you are not running in a nested VM environment.": "", "Upgrading from Kubernetes {{.old}} to {{.new}}": "Kubernetes を {{.old}} から {{.new}} にアップグレードしています", "Usage": "", @@ -631,26 +758,32 @@ "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", "Use 'kubect get po -A' to find the correct and namespace name": "", "Use -A to specify all namespaces": "", + "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "ユーザー ID: {{.userID}}", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "ユーザー側のファイルサーバーが停止しました", "Userspace file server:": "ユーザー側のファイルサーバー", "Userspace file server: ": "", "Using image repository {{.name}}": "イメージ リポジトリ {{.name}} を使用しています", - "Using podman 2 is not supported yet. your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk.": "", + "Using image {{.registry}}{{.image}}": "イメージ {{.registry}}{{.image}} を使用しています", + "Using image {{.registry}}{{.image}} (global image repository)": "イメージ {{.registry}}{{.image}}(グローバルイメージリポジトリ) を使用しています", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "「 none 」ドライバで「 {{.runtime}} 」ランタイムを使用することは、テストされていない設定です!", "Using the {{.driver}} driver based on existing profile": "プロフィールを元に、 {{.driver}} ドライバを使用します", "Using the {{.driver}} driver based on user configuration": "設定を元に、 {{.driver}} ドライバを使用します", "VM driver is one of: %v": "VM ドライバは次のいずれかです。%v", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "検証中に、ディスクのサイズ( {{.diskSize}} )をパースできませんでした。{{.error}}", "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "HTTP_PROXY と HTTPS_PROXY 環境変数が正常に設定されているかを確認します", "Verify the IP address of the running cluster in kubeconfig.": "Kubernetes の設定ファイルのクラスタの IP アドレスを確認します", "Verifying Kubernetes components...": "Kubernetes コンポーネントを検証しています...", "Verifying dashboard health ...": "ダッシュボードの状態を確認しています...", "Verifying proxy health ...": "プロキシの状態を確認しています...", - "Verifying {{.addon_name}} addon...": "", + "Verifying {{.addon_name}} addon...": "{{.addon_name}} アドオンを検証中です...", "Version: {{.version}}": "バージョン: {{.version}}", "VirtualBox and Hyper-V are having a conflict. Use '--driver=hyperv' or disable Hyper-V using: 'bcdedit /set hypervisorlaunchtype off'": "VirtualBox と Hyper-V が衝突しています。「 --driver=hyperv 」を使用するか、以下のコマンドで Hyper-V を無効にしてください。 bcdedit /set hypervisorlaunchtype off", "VirtualBox cannot create a network, probably because it conflicts with an existing network that minikube no longer knows about. Try running 'minikube delete'": "VirtualBox がネットワークを作成できません。おそらく minikube が把握していないネットワークと衝突しています。「 minikube delete 」を実行してみてください", @@ -666,17 +799,24 @@ "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "プロキシを使用しようとしていますが、現在の NO_PROXY 環境に minikube IP({{.ip_address}})は含まれていません。詳細については、{{.documentation_url}} をご覧ください", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can also use 'minikube kubectl -- get pods' to invoke a matching version": "「 minikube kubectl -- get pods 」で、一致するバージョンを表示することができます", "You can delete them using the following command(s):": "以下のコマンドで削除することができます", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "ハイパーバイザから「{{.name}}」VM を手動で削除することが必要な可能性があります", "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "Hyper-V マネージャを停止して、「 minikube delete 」を再実行する必要があるかもしれません ", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "サービスの名前を明示する必要があります", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "ホストマシーンは KVM 仮想化をサポートしていません。 qemu-kvm がインストールされていることを確認してください。「 virt-host-validate 」を実行して、デバッグしてください", "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "ホストマシーンは仮想化をサポートしていません。もし VM 内で minikube を動かすのであれば、「 --driver=docker 」を試してください。そうでなければ、 BIOS で仮想化を有効にしてください", "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "ホストマシーンが minikube の VM にパケットをルーティングすることができていません。もし VPN を有効しているのであれば、VPN を無効にする、あるいは VM の IP アドレスに再ルーティングしないように設定してください。もし VPN を使用していないのであれば、 VM 環境のルーティング周りのオプションを確認してください", @@ -684,15 +824,20 @@ "Your minikube vm is not running, try minikube start.": "minikube の VM が動いていません。以下のコマンドを試してみてください。 minikube start", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", "[{{.id}}] {{.msg}} {{.error}}": "[{{.id}}] {{.msg}} {{.error}}", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "adding node": "ノードを追加しています", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "「 {{.name}} 」アドオンは現在無効になっています。\n有効にするためには、以下のコマンドを実行してください。 \nminikube addons enable {{.name}}", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "「 {{.name}} 」アドオンは minikube では有効なアドオンではありません。\n利用可能なアドオンの一覧を表示するためには、以下のコマンドを実行してください。 \nminikube addons list", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "addons では以下のようにサブコマンドを使用することで、 minikube のアドオンのファイルを編集することができます。 \"minikube addons enable dashboard\"", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "bash の補完が失敗しました", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "cleanup=true で呼び出すことで、古い tunnel を削除することができます", - "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields: \\n\\n": "", + "cancel any existing scheduled stop requests": "", "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields:\\n\\n": "config では以下のようにサブコマンドを使用して、minikube の設定ファイルを編集することができます。 \"minikube config set driver kvm\"\n設定可能なフィールドは以下です。\\n\\n", + "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "設定を表示するのに失敗しました", + "containers paused status: {{.paused}}": "", "dashboard service is not running: {{.error}}": "ダッシュボードのサービスが動いていません。 {{.error}}", "delete ctx": "", "deleting node": "ノードを削除しています", @@ -700,12 +845,12 @@ "dry-run mode. Validates configuration, but does not mutate system state": "dry-run モードです。設定は検証しますが、実際にシステムの状態を変更することはしません", "dry-run validation complete!": "dry-run の検証が終了しました", "enable failed": "有効にするのに失敗しました", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "Clientset を作成する際にエラーが発生しました", "error getting primary control plane": "コントロールプレーンを取得する際にエラーが発生しました", "error getting ssh port": "SSH のポートを取得する際にエラーが発生しました", + "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "マウント用の入力された IP アドレスをパースする際にエラーが発生しました", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "tunnel を開始する際にエラーが発生しました", "error stopping tunnel": "tunnel を停止する際にエラーが発生しました", "error: --output must be 'yaml' or 'json'": "エラーです。 --output は「 yaml 」、あるいは「 json 」である必要があります", @@ -715,9 +860,11 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", + "fish completion.": "", "if true, will embed the certs in kubeconfig.": "有効であれば、Kubernetes の設定ファイルに証明書を埋め込みます", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "minikube のプロフィールを作成する場合は、以下のコマンドで作成できます。 minikube start -p {{.profile_name}}", "initialization failed, will try again: {{.error}}": "初期化が失敗しました。再施行します。 {{.error}}", + "invalid kubernetes version": "", "keep the kube-context active after cluster is stopped. Defaults to false.": "", "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "kubeadm が他のプロセス(おそらくローカルでの他の Kubernetes をインストールするプロセス)との TCP ポートでの衝突を検知しました。 lsof -p\u003cport\u003e を実行して、そのプロセスを Kill してください", "kubectl and minikube configuration will be stored in {{.home_folder}}": "kubectl と minikube の構成は {{.home_folder}} に保存されます", @@ -725,12 +872,15 @@ "kubectl proxy": "kubectl proxy", "libmachine failed": "libmachine が失敗しました", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "", "logdir set failed": "logdir の値を設定するのに失敗しました", "max time to wait per Kubernetes core services to be healthy.": "Kubernetes の core サービスが正常に稼働するまで待つ最大時間", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "minikube addons list --output OUTPUT. json, list", "minikube is exiting due to an error. If the above message is not useful, open an issue:": "minikube がエラーで終了しました。もし上のメッセージが不十分であれば、Issue を作成してください", "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", + "minikube is not meant for production use. You are opening non-local traffic": "", "minikube is not yet compatible with ChromeOS": "minikube はまだ ChromeOS と互換性がありません", "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "minikube が Google Container Registry に接続できません。 HTTP プロキシを使用するように設定する必要があるかもしれません", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check": "minikube が VM に接続できませんでした。 {{.error}}\n\n\t考えられる理由は以下の二つです。\n\n\t- VPN 、あるいはファイアウォールによる干渉\n\t- {{.hypervisor}} のネットワークの設定での問題\n\n\t迂回策には以下があります。\n\n\t- ローカルの VPN 、あるいはファイアウォールを無効にする\n\t- {{.ip}} へのアクセスを許可するようにローカルの VPN 、あるいはファイアウォールを設定する\n\t- {{.hypervisor}} を再起動、あるいは再インストールする\n\t- 別の VM ドライバーを使用する\n\t- --force を使用してこの接続チェックを上書きする", @@ -743,11 +893,14 @@ "minikube {{.version}} is available! Download it: {{.url}}": "minikube {{.version}} が利用可能です! 以下のURLでダウンロードできます。 {{.url}}", "mkcmp is used to compare performance of two minikube binaries": "mkcmp で二つの minikube のバイナリのパフォーマンスを比較することができます", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "mount への引数 \"{{.value}}\" は以下のフォーマットである必要があります。\u003cソースディレクトリ\u003e:\u003cターゲットディレクトリ\u003e", + "mount could not connect": "", "mount failed": "マウントが失敗しました", "namespaces to pause": "停止する名前空間", "namespaces to unpause": "停止を解除する名前空間", + "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", "none driver does not support multi-node clusters": "マルチクラスタをサポートしているドライバーがありません", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "引数({{.ArgCount}})が少なすぎます。\\n使用方法: minikube config set PROPERTY_NAME PROPERTY_VALUE", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "Kubernetes を一時停止させます", "pause containers": "コンテナを一時停止させます", @@ -758,6 +911,7 @@ "reloads images previously added using the 'cache add' subcommand": "", "retrieving node": "ノードを取得しています", "saving node": "ノードを保存しています", + "scheduled stop is not supported on the none driver, skipping scheduling": "", "service {{.namespace_name}}/{{.service_name}} has no node port": "サービス {{.namespace_name}}/{{.service_name}} は NodePort を持っていません", "startup failed": "起動に失敗しました", "stat failed": "stat が失敗しました", @@ -767,6 +921,7 @@ "tunnel creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP. for a detailed example see https://minikube.sigs.k8s.io/docs/tasks/loadbalancer": "tunnel によってタイプが LoadBalancer なサービスへのルーティングが作成され、Ingress をサービスの ClusterIP へと向けさせます。より詳細な例は以下を参照してください。https://minikube.sigs.k8s.io/docs/tasks/loadbalancer", "tunnel makes services of type LoadBalancer accessible on localhost": "tunnel によってタイプが LoadBalancer なサービスが localhost からアクセス可能になります", "unable to bind flags": "フラグをバインドすることができませんでした", + "unable to daemonize: {{.err}}": "", "unable to delete minikube config folder": "minikube の設定フォルダーを削除できませんでした", "unable to set logtostderr": "logtostderr を設定することができませんでした", "unpause Kubernetes": "Kubernetes を再開させます", @@ -778,14 +933,18 @@ "usage: minikube addons configure ADDON_NAME": "使用方法: minikube addons configure ADDON_NAME", "usage: minikube addons disable ADDON_NAME": "使用方法: minikube addons disable ADDON_NAME", "usage: minikube addons enable ADDON_NAME": "使用方法: minikube addons enable ADDON_NAME", + "usage: minikube addons images ADDON_NAME": "", "usage: minikube addons list": "使用方法: minikube addons list", "usage: minikube addons open ADDON_NAME": "使用方法: minikube addons open ADDON_NAME", "usage: minikube config unset PROPERTY_NAME": "使用方法: minikube config unset PROPERTY_NAME", "usage: minikube delete": "使用方法: minikube delete", "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "使用方法: minikube profile [MINIKUBE_PROFILE_NAME]", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "JSON でバージョンを表示するのに失敗しました", "version yaml failure": "YAML でバージョンを表示するのに失敗しました", "zsh completion failed": "zsh の補完が失敗しました", + "zsh completion.": "", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "{{ .name }}: {{ .rejection }}", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.cluster}} IP has been updated to point at {{.ip}}": "{{.cluster}} の IP アドレスは {{.ip}} へと更新されました", @@ -799,6 +958,8 @@ "{{.driver}} does not appear to be installed, but is specified by an existing profile. Please run 'minikube delete' or install {{.driver}}": "{{.driver}} がインストールされていないようですが、既存のプロフィールから指定されています。「 minikube delete 」を実行、あるいは {{.driver}} をインストールしてください", "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "{{.extra_option_component_name}}.{{.key}}={{.value}}", + "{{.name}} doesn't have images.": "", + "{{.name}} has following images:": "", "{{.name}} has no available configuration options": "{{.name}} には利用可能なオプションがありません", "{{.name}} is already running": "{{.name}} はすでに起動しています", "{{.name}} was successfully configured": "{{.name}} は正常に設定されました", @@ -808,6 +969,7 @@ "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", "{{.path}} is v{{.client_version}}, which may be incompatible with Kubernetes v{{.cluster_version}}.": "{{.path}} のバージョンは {{.client_version}}です。 {{.cluster_version}} の Kubernetes とは互換性がないかもしれません", "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.platform}} 上の {{.prefix}}minikube {{.version}}", + "{{.profile}} profile is not valid: {{.err}}": "", "{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} はまだサポートされていなファイルシステムです。とにかくやってみます!", "{{.url}} is not accessible: {{.error}}": "{{.url}} はアクセス可能ではありません。 {{.error}}" } \ No newline at end of file diff --git a/translations/ko.json b/translations/ko.json index ec07d96c5f..312446022d 100644 --- a/translations/ko.json +++ b/translations/ko.json @@ -1,7 +1,7 @@ { "\"The '{{.minikube_addon}}' addon is disabled": "\"The '{{.minikube_addon}}' 이 비활성화되었습니다", "\"{{.context}}\" context has been updated to point to {{.hostname}}:{{.port}}": "\"{{.context}}\" 컨텍스트가 {{.hostname}}:{{.port}}로 갱신되었습니다.", - "\"{{.machineName}}\" does not exist, nothing to stop": "", + "\"{{.machineName}}\" does not exist, nothing to stop": "\"{{.machineName}}\" 이 존재하지 않아, 중단할 것이 없습니다", "\"{{.name}}\" profile does not exist": "\"{{.name}}\" 프로필이 존재하지 않습니다", "\"{{.name}}\" profile does not exist, trying anyways.": "\"{{.name}}\" 프로필이 존재하지 않습니다, 그럼에도 불구하고 시도합니다", "\"{{.node_name}}\" stopped.": "\"{{.node_name}}\" 이 중단되었습니다", @@ -14,21 +14,31 @@ "'none' driver does not support 'minikube ssh-host' command": "'none' 드라이버는 'minikube ssh-host' 명령어를 지원하지 않습니다", "'{{.driver}}' driver reported an issue: {{.error}}": "'{{.driver}}' 드라이버가 다음 이슈를 기록하였습니다: {{.error}}", "'{{.profile}}' is not running": "'{{.profile}}' 이 실행 중이지 않습니다", - "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "", - "- Docs https://docs.docker.com/docker-for-mac/#resources": "", - "- Docs https://docs.docker.com/docker-for-windows/#resources": "", - "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "", + "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "minikube 클러스터를 삭제하고 재생성합니다.\n\t\tminikube를 삭제합니다.\n\t\tminikube start --driver={{.driver_name}}", + "- Docs https://docs.docker.com/docker-for-mac/#resources": "- 문서: https://docs.docker.com/docker-for-mac/#resources", + "- Docs https://docs.docker.com/docker-for-windows/#resources": "- 문서: https://docs.docker.com/docker-for-windows/#resources", + "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- {{.driver_name}} 데몬이 충분한 CPU/메모리 리소스에 액세스할 수 있는지 확인합니다.", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", "- Restart your {{.driver_name}} service": "{{.driver_name}} 서비스를 다시 시작하세요", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "--kvm-numa-count 범위는 1부터 8입니다", "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "", + "==\u003e Last Start \u003c==": "", + "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "", + "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "", + "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "", + "A firewall is likely blocking minikube from reaching the internet. You may need to configure minikube to use a proxy.": "", "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "", - "Access the kubernetes dashboard running within the minikube cluster": "minikube 클러스터 내의 쿠버네티스 대시보드에 접근합니다", + "Access the Kubernetes dashboard running within the minikube cluster": "minikube 클러스터 내의 쿠버네티스 대시보드에 접근합니다", "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "", - "Add SSH identity key to SSH authentication agent": "", + "Add SSH identity key to SSH authentication agent": "SSH 인증 에이전트에 SSH ID 키 추가합니다", "Add an image to local cache.": "로컬 캐시에 이미지를 추가합니다", - "Add host key to SSH known_hosts file": "", + "Add host key to SSH known_hosts file": "SSH known_hosts 파일에 호스트 키를 추가합니다", + "Add image to cache for all running minikube clusters": "실행 중인 모든 미니큐브 클러스터의 캐시에 이미지를 추가합니다", "Add machine IP to NO_PROXY environment variable": "NO_PROXY 환경 변수에 머신 IP를 추가합니다", "Add or delete an image from the local cache.": "로컬 캐시에 이미지를 추가하거나 삭제합니다", "Add, delete, or push a local image into minikube": "minikube에 로컬 이미지를 추가하거나 삭제, 푸시합니다", @@ -45,42 +55,66 @@ "Allow user prompts for more information": "많은 정보를 위해 사용자 프롬프트를 허가합니다", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "", "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "minikube 가상 머신에 할당할 RAM 의 용량 (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)", - "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", "Amount of time to wait for a service in seconds": "", "Amount of time to wait for service in seconds": "", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "VirtualBox 와 같은 또 다른 하이퍼바이저가 KVM 과 충돌이 발생합니다. 다른 하이퍼바이저를 중단하거나 --driver 로 변경하세요", + "Another minikube instance is downloading dependencies... ": "", + "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "", + "At least needs control plane nodes to enable addon": "", "Automatically selected the {{.driver}} driver": "자동적으로 {{.driver}} 드라이버가 선택되었습니다", "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "자동적으로 {{.driver}} 드라이버가 선택되었습니다. 다른 드라이버 목록: {{.alternates}}", "Available Commands": "사용 가능한 명령어", "Basic Commands:": "기본 명령어:", "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "", - "Bind Address: {{.Address}}": "", + "Bind Address: {{.Address}}": "연결된 주소 : {{.Address}}", "Block until the apiserver is servicing API requests": "apiserver 가 API 요청을 서비스할 때까지 막습니다", + "Booting up control plane ...": "컨트롤 플레인이 부팅...", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "minikube 내 컨테이너 이미지를 빌드합니다", + "Build a container image, using the container runtime.": "컨테이너 런타임을 사용하여 컨테이너 이미지를 빌드합니다.", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", + "Cache image from docker daemon": "도커 데몬의 캐시 이미지", + "Cache image from remote registry": "원격 레지스트리의 캐시 이미지", + "Cannot find directory {{.path}} for copy": "복사하기 위한 디렉토리 {{.path}} 를 찾을 수 없습니다.", "Cannot find directory {{.path}} for mount": "마운트하기 위한 디렉토리 {{.path}} 를 찾을 수 없습니다", "Cannot use both --output and --format options": "--output 과 --format 옵션을 함께 사용할 수 없습니다", "Check if you have unnecessary pods running by running 'kubectl get po -A": "", + "Check output of 'journalctl -xeu kubelet', try passing --extra-config=kubelet.cgroup-driver=systemd to minikube start": "", + "Check that libvirt is setup properly": "", "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.": "minikube 가 실행 중인지 그리고 정확한 네임스페이스를 (-n 플래그로) 명시하였는지 확인하세요", "Check that the provided apiserver flags are valid": "주어진 apiserver 플래그가 유효한지 확인하세요", + "Check that the provided apiserver flags are valid, and that SELinux is disabled": "", "Check that your --kubernetes-version has a leading 'v'. For example: 'v1.1.14'": "입력한 --kubernetes-version 이 'v'로 시작하는지 확인하세요. 예시: 'v1.1.14'", - "Cluster was created without any CNI, adding node to it might cause broken network.": "", + "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "", + "Choose a smaller value for --memory, such as 2000": "", + "ChromeOS is missing the kernel support necessary for running Kubernetes": "", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "환경 설정 및 관리 명령어:", + "Configure a default route on this Linux host, or use another --driver that does not require it": "", + "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "", "Configure environment to use minikube's Docker daemon": "", "Configure environment to use minikube's Podman service": "", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "", + "Configuring RBAC rules ...": "RBAC 규칙을 구성하는 중 ...", "Configuring local host environment ...": "로컬 환경 변수를 구성하는 중 ...", "Configuring {{.name}} (Container Networking Interface) ...": "", + "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "", + "Confirm that you have supplied the correct value to --hyperv-virtual-switch using the 'Get-VMSwitch' command": "", "Connect to LoadBalancer services": "", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", "Could not process error from failed deletion": "", "Could not process errors from failed deletion": "", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "", - "Creating Kubernetes in {{.driver_name}} {{.machine_type}} with (CPUs={{.number_of_cpus}}) ({{.number_of_host_cpus}} available), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) 에 쿠버네티스를 설치하는 중 ...", + "Creating Kubernetes in {{.driver_name}} {{.machine_type}} with (CPUs={{.number_of_cpus}}) ({{.number_of_host_cpus}} available), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "{{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}} ({{.number_of_host_cpus}}MB 유효한), Memory={{.memory_size}}MB ({{.host_memory_size}}MB 유효한) ...", "Creating mount {{.name}} ...": "", "Creating {{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "{{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) 를 생성하는 중 ...", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "", @@ -98,8 +132,10 @@ "Deletes a node from a cluster.": "클러스터에서 노드를 삭제합니다", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "{{.driver_name}} 의 \"{{.profile_name}}\" 를 삭제하는 중 ...", "Deleting container \"{{.name}}\" ...": "", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", "Deleting node {{.name}} from cluster {{.cluster}}": "클러스터 {{.cluster}} 에서 노드 {{.name}} 를 삭제하는 중 ...", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "가상 머신 시작 전 하드웨어 가상화 지원 여부 확인 작업을 비활성화합니다 (virtualbox 드라이버 한정)", + "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "", "Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list ": "", "Disables the filesystem mounts provided by the hypervisors": "", "Disk size allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", @@ -112,36 +148,48 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", + "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "", "Docs have been saved at - {{.path}}": "문서가 다음 경로에 저장되었습니다 - {{.path}}", "Documentation: {{.url}}": "문서: {{.url}}", "Done! kubectl is now configured to use \"{{.name}}\"": "끝났습니다! 이제 kubectl 이 \"{{.name}}\" 를 사용할 수 있도록 설정되었습니다", - "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "끝났습니다! kubectl이 \"{{.name}}\" 클러스터와 \"{{.ns}}\" 네임스페이스를 기본적으로 사용하도록 구성되었습니다.", "Download complete!": "다운로드가 성공하였습니다!", - "Downloading Kubernetes {{.version}} preload ...": "", + "Downloading Kubernetes {{.version}} preload ...": "쿠버네티스 {{.version}} 을 다운로드 중 ...", "Downloading VM boot image ...": "가상 머신 부트 이미지 다운로드 중 ...", "Downloading driver {{.driver}}:": "드라이버 {{.driver}} 다운로드 중 :", "Downloading {{.name}} {{.version}}": "{{.name}} {{.version}} 다운로드 중", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "ERROR creating `registry-creds-acr` secret": "registry-creds-acr` secret 생성 오류", "ERROR creating `registry-creds-dpr` secret": "`registry-creds-dpr` secret 생성 오류", "ERROR creating `registry-creds-ecr` secret: {{.error}}": "`registry-creds-ecr` secret 생성 오류: {{.error}}", "ERROR creating `registry-creds-gcr` secret: {{.error}}": "`registry-creds-gcr` secret 생성 오류: {{.error}}", + "Either systemctl is not installed, or Docker is broken. Run 'sudo systemctl start docker' and 'journalctl -u docker'": "", "Enable addons. see `minikube addons list` for a list of valid addon names.": "", "Enable experimental NVIDIA GPU support in minikube": "", "Enable host resolver for NAT DNS requests (virtualbox driver only)": "", "Enable or disable a minikube addon": "", "Enable proxy for NAT DNS requests (virtualbox driver only)": "", - "Enabled addons: {{.addons}}": "", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", + "Enabled addons: {{.addons}}": "애드온 활성화 : {{.addons}}", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "", "Enabling addons: {{.addons}}": "애드온을 활성화하는 중: {{.addons}}", "Enabling dashboard ...": "대시보드를 활성화하는 중 ...", + "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "", + "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "", + "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", + "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", + "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "", + "Environment variables to pass to the build. (format: key=value)": "", "Error adding node to cluster": "클러스터에 노드 추가 오류", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "minikube 폴더 생성 오류", "Error creating view template": "", "Error detecting shell": "shell 탐지 오류", @@ -185,8 +233,11 @@ "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": "런타임이 실패하였습니다", + "Failed to build image": "", "Failed to cache ISO": "ISO 캐싱에 실패하였습니다", "Failed to cache and load images": "이미지 캐싱 및 로딩에 실패하였습니다", "Failed to cache binaries": "바이너리 캐싱에 실패하였습니다", @@ -196,7 +247,11 @@ "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "{{.minikube_dir_path}} 의 권한 변경에 실패하였습니다: {{.error}}", "Failed to check if machine exists": "머신이 존재하는지 확인하는 데 실패하였습니다", "Failed to check main repository and mirrors for images": "", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "클러스터 제거에 실패하였습니다: {{.error}}", "Failed to delete images": "이미지 제거에 실패하였습니다", "Failed to delete images from config": "컨피그로부터 이미지 제거에 실패하였습니다", @@ -210,18 +265,25 @@ "Failed to get service URL: {{.error}}": "서비스 URL 조회에 실패하였습니다: {{.error}}", "Failed to kill mount process: {{.error}}": "마운트 프로세스 중지에 실패하였습니다: {{.error}}", "Failed to list cached images": "캐시된 이미지를 조회하는 데 실패하였습니다", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "캐시된 이미지를 다시 불러오는 데 실패하였습니다", + "Failed to remove image": "", "Failed to save config": "컨피그 저장에 실패하였습니다", "Failed to save config {{.profile}}": "", + "Failed to save dir": "", + "Failed to save stdin": "", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "", "Failed to setup certs": "", "Failed to setup kubeconfig": "kubeconfig 설정에 실패하였습니다", + "Failed to start container runtime": "", "Failed to start node {{.name}}": "노드 {{.name}} 시작에 실패하였습니다", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "노드 {{.name}} 중지에 실패하였습니다", "Failed to update cluster": "클러스터를 수정하는 데 실패하였습니다", "Failed to update config": "컨피그를 수정하는 데 실패하였습니다", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "마운트 해제에 실패하였습니다: {{.error}}", "File permissions used for the mount": "", "Filter to use only VM Drivers": "", @@ -231,15 +293,22 @@ "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see:": "더 많은 정보를 보려면, 다음을 참고하세요:", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", "Force minikube to perform possibly dangerous operations": "", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "네트워크 옵션을 찾았습니다", "Found {{.number}} invalid profile(s) !": "{{.number}} 개의 무효한 프로필을 찾았습니다", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "인증서 및 키를 생성하는 중 ...", "Get or list the current profiles (clusters)": "", "Gets the logs of the running instance, used for debugging minikube, not user code.": "", "Gets the status of a local Kubernetes cluster": "로컬 쿠버네티스 클러스터의 상태를 가져옵니다", @@ -253,54 +322,79 @@ "Group ID: {{.groupID}}": "", "Have you set up libvirt correctly?": "libvirt 설정을 알맞게 하셨습니까?", "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "", + "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, only download and cache files for later use - don't install or start anything.": "", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "이미지 명령어", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", + "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", + "Kubernetes requires at least 2 CPU's to start": "", "Kubernetes {{.new}} is now available. If you would like to upgrade, specify: --kubernetes-version={{.prefix}}{{.new}}": "이제 {{.new}} 버전의 쿠버네티스를 사용할 수 있습니다. 업그레이드를 원하신다면 다음과 같이 지정하세요: --kubernetes-version={{.prefix}}{{.new}}", "Kubernetes {{.version}} is not supported by this release of minikube": "{{.version}} 버전의 쿠버네티스는 설치되어 있는 버전의 minikube에서 지원되지 않습니다.", "Launching Kubernetes ...": "쿠버네티스를 시작하는 중 ...", "Launching proxy ...": "프록시를 시작하는 중 ...", "List all available images from the local cache.": "", "List existing minikube nodes.": "", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "", "List nodes.": "", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "", "List of ports that should be exposed (docker and podman driver only)": "", "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "", "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", "Lists all minikube profiles.": "모든 minikube 프로필을 조회합니다", "Lists all valid default values for PROPERTY_NAME": "", "Lists all valid minikube profiles and detects all possible invalid profiles.": "", "Lists the URLs for the services in your local cluster": "", + "Load a image into minikube": "", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "", "Locations to fetch the minikube ISO from.": "", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", "Log into the minikube environment (for debugging)": "(디버깅을 위해) minikube 환경에 접속합니다", + "Manage images": "", "Message Size: {{.size}}": "메시지 사이즈: {{.size}}", "Minikube is a CLI tool that provisions and manages single-node Kubernetes clusters optimized for development workflows.": "Minikube 는 개발용으로 최적화된 싱글 노드 쿠버네티스 클러스터 제공 및 관리 CLI 툴입니다", "Minikube is a tool for managing local Kubernetes clusters.": "Minikube 는 로컬 쿠버네티스 클러스터 관리 툴입니다", "Modify persistent configuration values": "", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "", "Most users should use the newer 'docker' driver instead, which does not require root!": "", "Mount type: {{.name}}": "", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", @@ -312,9 +406,11 @@ "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "", "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", + "No minikube profile was found. ": "", "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "No such addon {{.name}}": "", "Node {{.name}} failed to start, deleting and trying again.": "", "Node {{.name}} was successfully deleted.": "", "Node {{.nodeName}} does not exist.": "", @@ -322,7 +418,7 @@ "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'yaml' or 'json'.": "", @@ -337,23 +433,34 @@ "Operations on nodes": "", "Options: {{.options}}": "옵션: {{.options}}", "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "", + "Path to the Dockerfile to use (optional)": "", "Pause": "", "Paused {{.count}} containers": "", "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", + "Please attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "값을 입력하세요", "Please free up disk or prune images.": "", "Please increse Desktop's disk size.": "", + "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", + "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", + "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", "Populates the specified folder with documentation in markdown about minikube": "", + "PowerShell is running in constrained mode, which is incompatible with Hyper-V scripting.": "", "Powering off \"{{.profile_name}}\" via SSH ...": "", "Preparing Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}} ...": "쿠버네티스 {{.k8sVersion}} 을 {{.runtime}} {{.runtimeVersion}} 런타임으로 설치하는 중", "Print current and latest version number": "현재 그리고 최신 버전을 출력합니다", @@ -364,22 +471,37 @@ "Problems detected in {{.name}}:": "", "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "", - "Pulling base image ...": "", + "Pull the remote image (no caching)": "", + "Pulling base image ...": "베이스 이미지를 다운받는 중 ...", + "Push the new image (requires tag)": "", + "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", + "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "", + "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", + "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "관련 이슈: {{.url}}", "Related issues:": "관련 이슈들:", + "Remove one or more images": "", + "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "\"{{.name}}\" 클러스터 관련 정보가 모두 삭제되었습니다", - "Removing {{.directory}} ...": "{{.directory}} 제거 중...", + "Removing {{.directory}} ...": "{{.directory}} 제거 중 ...", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "", "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommend}}MB. Deployments may fail.": "", "Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB.": "", "Requested memory allocation {{.requested}}MiB is less than the usable minimum of {{.minimum_memory}}MB": "", + "Reset Docker to factory defaults": "", + "Restart Docker": "", + "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", "Restarting the {{.name}} service may improve performance.": "", "Retrieve the ssh host key of the specified node": "", @@ -393,12 +515,26 @@ "Returns logs to debug a local Kubernetes cluster": "로컬 쿠버네티스 클러스터를 디버그하기 위해 로그를 반환합니다", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", "Returns the value of PROPERTY_NAME from the minikube config file. Can be overwritten at runtime by flags or environmental variables.": "", + "Right-click the PowerShell icon and select Run as Administrator to open PowerShell in elevated mode.": "", + "Run 'kubectl describe pod coredns -n kube-system' and check for a firewall or DNS conflict": "", + "Run 'minikube delete' to delete the stale VM, or and ensure that minikube is running as the same user you are issuing this command with": "", + "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "", "Run a kubectl binary matching the cluster version": "클러스터 버전에 맞는 kubectl 바이너리를 실행합니다", "Run kubectl": "kubectl 을 실행합니다", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run minikube from the C: drive.": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", "Run the minikube command as an Administrator": "minikube 명령어를 관리자 권한으로 실행합니다", + "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", + "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", + "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", + "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", + "Select a valid value for --dnsdomain": "", "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "설정이 실패하였습니다", @@ -414,21 +550,29 @@ "Show a list of global command-line options (applies to all commands).": "", "Show only log entries which point to known problems": "", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, Kubernetes {{.version}} is not supported by this release of minikube": "죄송합니다, 쿠버네티스 {{.version}} 는 해당 minikube 버전에서 지원하지 않습니다", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", - "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e:\u003cport\u003e, \u003chostname\u003e:\u003cport\u003e or \u003cnetwork\u003e/\u003cnetmask\u003e": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", + "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", + "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "{{.cluster}} 클러스터의 {{.name}} 컨트롤 플레인 노드를 시작하는 중", "Starting node": "노드를 시작하는 중", @@ -453,7 +597,10 @@ "Successfully stopped node {{.name}}": "{{.name}} 노드가 정상적으로 중지되었습니다", "Suggestion: {{.advice}}": "권장: {{.advice}}", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "타겟 폴더 {{.path}} 는 절대 경로여야 합니다", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --driver={{.driver_name}}'.": "\"{{.driver_name}}\" 드라이버는 root 권한으로 실행되어야 합니다. minikube 를 다음과 같이 실행하세요 'sudo minikube --driver={{.driver_name}}'", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "\"{{.driver_name}}\" 드라이버는 root 권한으로 실행되면 안 됩니다", "The 'none' driver is designed for experts who need to integrate with an existing VM": "", @@ -463,14 +610,22 @@ "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}}, 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)": "", "The KVM QEMU connection URI. (kvm2 driver only)": "", - "The KVM network name. (kvm2 driver only)": "", + "The KVM default network name. (kvm2 driver only)": "", + "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", + "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", + "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", + "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "API 서버 수신 포트", "The argument to pass the minikube mount command on start.": "", "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", "The base image to use for docker/podman drivers. Intended for local development.": "", + "The certificate hostname provided appears to be invalid (may be a minikube bug, try 'minikube delete')": "", "The cluster dns domain name used in the Kubernetes cluster": "", "The cluster {{.cluster}} already exists which means the --nodes parameter will be ignored. Use \"minikube node add\" to add nodes to an existing cluster.": "", "The control plane for \"{{.name}}\" is paused!": "\"{{.name}}\"의 컨트롤 플레인이 중지되었습니다!", @@ -482,10 +637,15 @@ "The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "", "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}": "", "The existing \"{{.name}}\" cluster was created using the \"{{.old}}\" driver, which is incompatible with requested \"{{.new}}\" driver.": "", + "The existing node configuration appears to be corrupt. Run 'minikube delete'": "", "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "", + "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", + "The machine-driver specified is failing to start. Try running 'docker-machine-driver-\u003ctype\u003e version'": "", + "The minikube VM is offline. Please run 'minikube start' to start it again.": "", "The minikube {{.driver_name}} container exited unexpectedly.": "", "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The named space to activate after start": "", @@ -503,6 +663,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -517,6 +679,8 @@ "This addon does not have an endpoint defined for the 'addons open' command.\nYou can add one by annotating a service with the label {{.labelName}}:{{.addonName}}": "", "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "", "This control plane is not running! (state={{.state}})": "", + "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "", "This will start the mount daemon and automatically mount files into minikube.": "", @@ -524,13 +688,18 @@ "Tip: To remove this root owned cluster, run: sudo {{.cmd}}": "", "To connect to this cluster, use: --context={{.name}}": "", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "해당 알림을 비활성화하려면 다음 명령어를 실행하세요. 'minikube config set WantUpdateNotification false'", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", + "To start minikube with Hyper-V, Powershell must be in your PATH`": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "", "Troubleshooting Commands:": "", + "Try 'minikube delete' to force new SSL certificates to be installed": "", + "Try 'minikube delete', and disable any conflicting VPN or firewall software": "", "Trying to delete invalid profile {{.profile}}": "무효한 프로필 {{.profile}} 를 삭제하는 중", "Unable to bind flags": "flags 를 합칠 수 없습니다", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", @@ -539,6 +708,7 @@ "Unable to find control plane": "", "Unable to generate docs": "문서를 생성할 수 없습니다", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get VM IP address": "가상 머신 IP 주소를 조회할 수 없습니다", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", @@ -548,10 +718,12 @@ "Unable to get runtime": "런타임을 조회할 수 없습니다", "Unable to get the status of the {{.name}} cluster.": "{{.name}} 클러스터의 상태를 조회할 수 없습니다", "Unable to kill mount process: {{.error}}": "마운트 프로세스를 중지할 수 없습니다: {{.error}}", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images from config file.": "컨피그 파일로부터 캐시된 이미지를 로드할 수 없습니다", "Unable to load cached images: {{.error}}": "캐시된 이미지를 로드할 수 없습니다: {{.error}}", "Unable to load config: {{.error}}": "컨피그를 로드할 수 없습니다: {{.error}}", "Unable to load host": "", + "Unable to load profile: {{.error}}": "", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": " \"{{.kubernetes_version}}\" 를 파싱할 수 없습니다: {{.error}}", "Unable to parse default Kubernetes version from constants: {{.error}}": "", "Unable to parse memory '{{.memory}}': {{.error}}": "", @@ -569,13 +741,17 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "{{.bootstrapper_name}} 를 사용하여 쿠버네티스 {{.kubernetes_version}} 를 제거하는 중 ...", "Unmounting {{.path}} ...": "{{.path}} 를 마운트 해제하는 중 ...", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "", "Unpausing node {{.name}} ... ": "", + "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "", "Update server returned an empty list": "", - "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", + "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "실행중인 {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} 를 업데이트 하는 중 ...", + "Upgrade to QEMU v3.1.0+, run 'virt-host-validate', or ensure that you are not running in a nested VM environment.": "", "Usage": "", "Usage: minikube completion SHELL": "", "Usage: minikube delete": "", @@ -586,23 +762,38 @@ "Usage: minikube node start [name]": "", "Usage: minikube node stop [name]": "", "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", + "Use 'kubect get po -A' to find the correct and namespace name": "", "Use -A to specify all namespaces": "모든 namespace 를 확인하려면 -A 를 사용하세요", "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", + "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using image repository {{.name}}": "", + "Using image {{.registry}}{{.image}}": "", + "Using image {{.registry}}{{.image}} (global image repository)": "", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "", "Using the {{.driver}} driver based on existing profile": "기존 프로필에 기반하여 {{.driver}} 드라이버를 사용하는 중", "Using the {{.driver}} driver based on user configuration": "유저 환경 설정 정보에 기반하여 {{.driver}} 드라이버를 사용하는 중", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", - "Verifying Kubernetes components...": "", + "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "", + "Verifying Kubernetes components...": "Kubernetes 구성 요소를 확인...", "Verifying dashboard health ...": "", "Verifying proxy health ...": "", "Verifying {{.addon_name}} addon...": "", "Version: {{.version}}": "버전: {{.version}}", + "VirtualBox and Hyper-V are having a conflict. Use '--driver=hyperv' or disable Hyper-V using: 'bcdedit /set hypervisorlaunchtype off'": "", + "VirtualBox cannot create a network, probably because it conflicts with an existing network that minikube no longer knows about. Try running 'minikube delete'": "", + "VirtualBox is broken. Disable real-time anti-virus software, reboot, and reinstall VirtualBox if the problem continues.": "", + "VirtualBox is broken. Reinstall VirtualBox, reboot, and run 'minikube delete'.": "", + "VirtualBox is unable to find its network interface. Try upgrading to the latest release and rebooting.": "", + "Virtualization support is disabled on your computer. If you are running minikube within a VM, try '--driver=docker'. Otherwise, consult your systems BIOS manual for how to enable virtualization.": "", "Wait failed: {{.error}}": "", "Waiting for cluster to come online ...": "클러스터가 사용 가능하기까지 기다리는 중 ...", "Want kubectl {{.version}}? Try 'minikube kubectl -- get pods -A'": "", @@ -610,29 +801,43 @@ "Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "", "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can also use 'minikube kubectl -- get pods' to invoke a matching version": "맞는 버전의 kubectl 을 사용하기 위해서는 다음과 같이 사용 가능합니다. minikube kubectl -- get pods'", "You can delete them using the following command(s):": "다음 명령어(들)을 사용하여 제거할 수 있습니다", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", + "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "service 이름을 명시해야 합니다", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "호스트가 KVM 가상화를 지원하지 않습니다. qemu-kvm 이 설치되었는지 확인 후, 문제 디버그를 위해 'virt-host-validate' 를 실행하세요", + "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=none'. Otherwise, enable virtualization in your BIOS": "호스트가 가상화를 지원하지 않습니다. 가상 머신 안에서 minikube 를 실행 중인 경우, '--driver=none' 로 시도하세요. 그렇지 않다면, BIOS 에서 가상화를 활성화하세요", + "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "minikube config 가 미지원 드라이버를 참조하고 있습니다. ~/.minikube 를 제거한 후, 다시 시도하세요", "Your minikube vm is not running, try minikube start.": "minikube 가상 머신이 실행 중이 아닙니다, minikube start 를 시도하세요", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "bash 자동 완성이 실패하였습니다", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "", "cancel any existing scheduled stop requests": "예정된 모든 중지 요청을 취소합니다", "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "config view 가 실패하였습니다", + "containers paused status: {{.paused}}": "", "creating api client": "api 클라이언트 생성 중", "dashboard service is not running: {{.error}}": "대시보드 서비스가 실행 중이지 않습니다: {{.error}}", "delete ctx": "", @@ -641,14 +846,13 @@ "dry-run mode. Validates configuration, but does not mutate system state": "", "dry-run validation complete!": "dry-run 검증 완료!", "enable failed": "활성화가 실패하였습니다", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "clientset 생성 오류", "error creating machine client": "머신 client 생성 오류", "error getting primary control plane": "", "error getting ssh port": "ssh 포트 조회 오류", "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "", "error stopping tunnel": "", "error: --output must be 'yaml' or 'json'": "", @@ -658,23 +862,30 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", + "fish completion.": "", "getting config": "컨피그 조회 중", "if true, will embed the certs in kubeconfig.": "", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "프로필을 생성하려면 다음 명령어를 입력하세요: minikube start -p {{.profile_name}}\"", "initialization failed, will try again: {{.error}}": "", + "invalid kubernetes version": "", "keep the kube-context active after cluster is stopped. Defaults to false.": "", + "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "", "kubectl and minikube configuration will be stored in {{.home_folder}}": "kubectl 과 minikube 환경 정보는 {{.home_folder}} 에 저장될 것입니다", "kubectl not found in PATH, but is required for the dashboard. Installation guide: https://kubernetes.io/docs/tasks/tools/install-kubectl/": "kubectl 이 PATH 에 없습니다, 하지만 이는 대시보드에서 필요로 합니다. 설치 가이드:https://kubernetes.io/docs/tasks/tools/install-kubectl/", - "kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "", + "kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "kubectl 을 찾을 수 없습니다. 만약 필요하다면, 'minikube kubectl -- get pods -A'를 시도합니다.", "kubectl proxy": "kubectl 프록시", "libmachine failed": "", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", "loading config": "컨피그 로딩 중", + "loading profile": "", "logdir set failed": "logdir 설정이 실패하였습니다", "machine '{{.name}}' does not exist. Proceeding ahead with recreating VM.": "머신 '{{.name}}' 이 존재하지 않습니다. 진행하기 앞서 가상 머신을 재생성합니다", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "", - "minikube is exiting due to an error. If the above message is not useful, open an issue:": "", + "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", + "minikube is not meant for production use. You are opening non-local traffic": "", + "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", "minikube profile was successfully set to {{.profile_name}}": "", "minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "minikube는 개발 워크플로우에 최적화된 로컬 쿠버네티스를 제공하고 관리합니다.", @@ -684,12 +895,14 @@ "minikube {{.version}} is available! Download it: {{.url}}": "minikube {{.version}} 이 사용가능합니다! 다음 경로에서 다운받으세요: {{.url}}", "mkcmp is used to compare performance of two minikube binaries": "", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "", + "mount could not connect": "", "mount failed": "마운트 실패", "namespaces to pause": "잠시 멈추려는 네임스페이스", "namespaces to unpause": "재개하려는 네임스페이스", "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", "none driver does not support multi-node clusters": "", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "쿠버네티스를 잠시 멈춥니다", "preload extraction failed: \\\"No space left on device\\\"": "", @@ -718,14 +931,18 @@ "usage: minikube addons configure ADDON_NAME": "", "usage: minikube addons disable ADDON_NAME": "", "usage: minikube addons enable ADDON_NAME": "", + "usage: minikube addons images ADDON_NAME": "", "usage: minikube addons list": "", "usage: minikube addons open ADDON_NAME": "", "usage: minikube config unset PROPERTY_NAME": "", "usage: minikube delete": "", "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "", "version yaml failure": "", "zsh completion failed": "zsh 완성이 실패하였습니다", + "zsh completion.": "", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.count}} nodes stopped.": "{{.count}}개의 노드가 중지되었습니다.", @@ -737,15 +954,18 @@ "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", "{{.name}} cluster does not exist": "{{.name}} 클러스터가 존재하지 않습니다", - "{{.name}} has no available configuration options": "{{.driver}} 이 사용 가능한 환경 정보 옵션이 없습니다", - "{{.name}} is already running": "{{.driver}} 이 이미 실행 중입니다", - "{{.name}} was successfully configured": "{{.driver}} 이 성공적으로 설정되었습니다", + "{{.name}} doesn't have images.": "{{.name}} 이미지가 없습니다.", + "{{.name}} has following images:": "{{.name}}에는 다음과 같은 이미지가 있습니다.", + "{{.name}} has no available configuration options": "{{.name}} 이 사용 가능한 환경 정보 옵션이 없습니다", + "{{.name}} is already running": "{{.name}} 이 이미 실행 중입니다", + "{{.name}} was successfully configured": "{{.name}} 이 성공적으로 설정되었습니다", "{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "", "{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "", "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "", "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", "{{.path}} is v{{.client_version}}, which may be incompatible with Kubernetes v{{.cluster_version}}.": "{{.path}} 의 버전은 v{{.client_version}} 이므로, 쿠버네티스 버전 v{{.cluster_version}} 과 호환되지 않을 수 있습니다", - "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}{{.platform}} 위의 minikube {{.version}}", + "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}{{.platform}} 의 minikube {{.version}}", + "{{.profile}} profile is not valid: {{.err}}": "{{.profile}} 프로파일이 올바르지 않습니다: {{.err}}", "{{.type}} is not yet a supported filesystem. We will try anyways!": "", "{{.url}} is not accessible: {{.error}}": "{{.url}} 이 접근 불가능합니다: {{.error}}" -} +} \ No newline at end of file diff --git a/translations/pl.json b/translations/pl.json index 121292080d..e634bbdefd 100644 --- a/translations/pl.json +++ b/translations/pl.json @@ -12,77 +12,104 @@ "'none' driver does not support 'minikube mount' command": "sterownik 'none' nie wspiera komendy 'minikube mount'", "'none' driver does not support 'minikube podman-env' command": "", "'none' driver does not support 'minikube ssh' command": "sterownik 'none' nie wspiera komendy 'minikube ssh'", + "'none' driver does not support 'minikube ssh-host' command": "", "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "", "- Docs https://docs.docker.com/docker-for-mac/#resources": "", "- Docs https://docs.docker.com/docker-for-windows/#resources": "", "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", "- Restart your {{.driver_name}} service": "", - "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "", + "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "==\u003e Audyt \u003c==", + "==\u003e Last Start \u003c==": "==\u003e Ostatni start \u003c==", + "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "VPN lub zapora sieciowa przeszkadza w komunikacji protokołem HTTP z maszyną wirtualną minikube. Spróbuj użyć innego sterownika: https://minikube.sigs.k8s.io/docs/start/", "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "", "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "", "A firewall is likely blocking minikube from reaching the internet. You may need to configure minikube to use a proxy.": "", "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "", - "Access the kubernetes dashboard running within the minikube cluster": "Dostęp do dashboardu uruchomionego w klastrze kubernetesa w minikube", - "Add an image to local cache.": "", - "Add machine IP to NO_PROXY environment variable": "", - "Add, delete, or push a local image into minikube": "", - "Add, remove, or list additional nodes": "", - "Adding node {{.name}} to cluster {{.cluster}}": "", + "Access the Kubernetes dashboard running within the minikube cluster": "Dostęp do dashboardu uruchomionego w klastrze kubernetesa w minikube", + "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "", + "Add SSH identity key to SSH authentication agent": "", + "Add an image to local cache.": "Dodaj obraz do lokalnego cache", + "Add host key to SSH known_hosts file": "Dodaj klucz hosta do pliku known_hosts", + "Add image to cache for all running minikube clusters": "Dodaj obraz do cache'a dla wszystkich uruchomionych klastrów minikube", + "Add machine IP to NO_PROXY environment variable": "Dodaj IP serwera do zmiennej środowiskowej NO_PROXY", + "Add, delete, or push a local image into minikube": "Dodaj, usuń lub wypchnij lokalny obraz do minikube", + "Add, remove, or list additional nodes": "Dodaj, usuń lub wylistuj pozostałe węzły", + "Adding node {{.name}} to cluster {{.cluster}}": "Dodawanie węzła {{.name}} do klastra {{.cluster}}", "Additional help topics": "Dodatkowe tematy pomocy", "Additional mount options, such as cache=fscache": "Dodatkowe opcje montowania, jak na przykład cache=fscache", - "Adds a node to the given cluster config, and starts it.": "", - "Adds a node to the given cluster.": "", + "Adds a node to the given cluster config, and starts it.": "Dodaje węzeł do konfiguracji danego klastra i wystartowuje go", + "Adds a node to the given cluster.": "Dodaje węzeł do danego klastra", "Advanced Commands:": "Zaawansowane komendy", + "After the addon is enabled, please run \"minikube tunnel\" and your ingress resources would be available at \"127.0.0.1\"": "Po włączeniu addona wykonaj komendę \"minikube tunnel\". Twoje zasoby będą dostępne pod adresem \"127.0.0.1\"", "Aliases": "Aliasy", + "All existing scheduled stops cancelled": "Wszystkie zaplanowane zatrzymania zostały anulowane", "Allow user prompts for more information": "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "", - "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Ilość zarezerwowanej pamięci RAM dla maszyny wirtualnej minikube (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or )", - "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "Ilość zarezerwowanej pamięci RAM dla maszyny wirtualnej minikube (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or )", - "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", + "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "Ilość zarezerwowanej pamięci RAM dla maszyny wirtualnej minikube (format: \u003cnumber\u003e[\u003cunit\u003e], gdzie jednostka to = b, k, m lub g)", "Amount of time to wait for a service in seconds": "Czas oczekiwania na serwis w sekundach", "Amount of time to wait for service in seconds": "Czas oczekiwania na serwis w sekundach", - "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "", - "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "", - "Automatically selected the {{.driver}} driver": "", - "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "", + "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "Inny hiperwizor, taki jak Virtualbox, powoduje konflikty z KVM. Zatrzymaj innego hiperwizora lub użyj flagi --driver żeby go zmienić.", + "Another minikube instance is downloading dependencies... ": "Inny program minikube już pobiera zależności...", + "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "Inny program używa pliku wymaganego przez minikube. Jeśli używasz Hyper-V, spróbuj zatrzymać maszynę wirtualną minikube z poziomu managera Hyper-V", + "At least needs control plane nodes to enable addon": "Wymaga węzłów z płaszczyzny kontrolnej do włączenia addona", + "Automatically selected the {{.driver}} driver": "Automatycznie wybrano sterownik {{.driver}}", + "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "Automatycznie wybrano sterownik {{.driver}}. Inne możliwe sterowniki: {{.alternates}}", "Available Commands": "Dostępne polecenia", "Basic Commands:": "Podstawowe polecenia", - "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "", + "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "Z powodu użycia sterownika dockera na systemie operacyjnym {{.operating_system}}, terminal musi zostać uruchomiony.", "Bind Address: {{.Address}}": "", + "Booting up control plane ...": "Uruchamianie płaszczyzny kontrolnej ...", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "Zbuduj obraz kontenera w minikube", + "Build a container image, using the container runtime.": "Zbuduj obraz kontenera używając środowiska uruchomieniowego kontenera", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", + "Cache image from docker daemon": "", + "Cache image from remote registry": "", + "Cannot find directory {{.path}} for copy": "Nie znaleziono katalogu {{.path}} do skopiowania", "Cannot find directory {{.path}} for mount": "Nie można odnaleźć folderu {{.path}} do zamontowania", - "Cannot use both --output and --format options": "", - "Check if you have unnecessary pods running by running 'kubectl get po -A": "", + "Cannot use both --output and --format options": "Nie można użyć obydwu opcji --output i --format jednocześnie", + "Check if you have unnecessary pods running by running 'kubectl get po -A": "Sprawdź czy są uruchomione jakieś niepotrzebne pody za pomocą komendy: 'kubectl get pod -A' ", "Check output of 'journalctl -xeu kubelet', try passing --extra-config=kubelet.cgroup-driver=systemd to minikube start": "", - "Check that libvirt is setup properly": "", + "Check that libvirt is setup properly": "Sprawdź czy bibliteka libvirt jest poprawnie zainstalowana", "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.": "Upewnij się, że minikube zostało uruchomione i że podano poprawną przestrzeń nazw (flaga -n) celem zamontowania", "Check that the provided apiserver flags are valid, and that SELinux is disabled": "", "Check that your --kubernetes-version has a leading 'v'. For example: 'v1.1.14'": "Upewnij się, że --kubernetes-version ma 'v' z przodu. Na przykład `v1.1.14`", "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "", - "Choose a smaller value for --memory, such as 2000": "", + "Choose a smaller value for --memory, such as 2000": "Wybierz mniejszą wartość dla --memory, przykładowo 2000", "ChromeOS is missing the kernel support necessary for running Kubernetes": "", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "Polecenia konfiguracji i zarządzania", "Configure a default route on this Linux host, or use another --driver that does not require it": "", "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "", "Configure environment to use minikube's Docker daemon": "", "Configure environment to use minikube's Podman service": "", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "", + "Configuring RBAC rules ...": "Konfigurowanie zasad RBAC ...", "Configuring environment for Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}}": "Konfigurowanie środowiska dla Kubernetesa w wersji {{.k8sVersion}} na {{.runtime}} {{.runtimeVersion}}", "Configuring local host environment ...": "Konfigurowanie lokalnego środowiska hosta...", "Configuring {{.name}} (Container Networking Interface) ...": "", "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "", "Confirm that you have supplied the correct value to --hyperv-virtual-switch using the 'Get-VMSwitch' command": "", - "Connect to LoadBalancer services": "", + "Connect to LoadBalancer services": "Połącz się do serwisów LoadBalancer'a", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", - "Consider increasing Docker Desktop's memory size.": "", + "Consider increasing Docker Desktop's memory size.": "Rozważ przydzielenie większej ilości pamięci RAM dla programu Docker Desktop", + "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "Skopiuj dany plik do minikube", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", "Could not process error from failed deletion": "", "Could not process errors from failed deletion": "", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "", "Created a new profile : {{.profile_name}}": "Stworzono nowy profil : {{.profile_name}}", "Creating a new profile failed": "Tworzenie nowego profilu nie powiodło się", @@ -90,21 +117,22 @@ "Creating {{.driver_name}} VM (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "Tworzenie {{.driver_name}} (CPUs={{.number_of_cpus}}, Pamięć={{.memory_size}}MB, Dysk={{.disk_size}}MB)...", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "Current context is \"{{.context}}\"": "", - "DEPRECATED, use `driver` instead.": "", - "DEPRECATED: Replaced by --cni=bridge": "", + "Current context is \"{{.context}}\"": "Obecny kontekst to \"{{.context}}\"", + "DEPRECATED, use `driver` instead.": "PRZESTARZAŁE, użyj zamiast tego `driver`", + "DEPRECATED: Replaced by --cni=bridge": "PRZESTARZAŁE, zostało zastąpione przez --cni=bridge", "Default group id used for the mount": "Domyślne id groupy użyte dla montowania", "Default user id used for the mount": "Domyślne id użytkownika użyte dla montowania ", - "Delete an image from the local cache.": "", - "Deletes a local Kubernetes cluster": "", + "Delete an image from the local cache.": "Usuń obraz z lokalnego cache'a", + "Deletes a local Kubernetes cluster": "Usuwa lokalny klaster Kubernetesa", "Deletes a local Kubernetes cluster. This command deletes the VM, and removes all\nassociated files.": "", - "Deletes a local kubernetes cluster": "Usuwa lokalny klaster kubernetesa", + "Deletes a local kubernetes cluster": "Usuwa lokalny klaster Kubernetesa", "Deletes a local kubernetes cluster. This command deletes the VM, and removes all\nassociated files.": "Usuwa lokalny klaster kubernetesa. Ta komenda usuwa maszynę wirtualną i wszystkie powiązane pliki.", "Deletes a local kubernetes cluster. This command deletes the VM, and removes all associated files.": "Usuwa lokalny klaster kubernetesa. Ta komenda usuwa maszynę wirtualną i wszystkie powiązane pliki.", - "Deletes a node from a cluster.": "", + "Deletes a node from a cluster.": "Usuwa węzeł z klastra", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "Usuwanie \"{{.profile_name}}\" - {{.driver_name}}...", - "Deleting container \"{{.name}}\" ...": "", - "Deleting node {{.name}} from cluster {{.cluster}}": "", + "Deleting container \"{{.name}}\" ...": "Usuwanie kontenera \"{{.name}}\" ...", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", + "Deleting node {{.name}} from cluster {{.cluster}}": "Usuwanie węzła {{.name}} z klastra {{.cluster}}", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "", "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "", "Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list ": "", @@ -119,21 +147,21 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "", "Docs have been saved at - {{.path}}": "Dokumentacja została zapisana w {{.path}}", "Documentation: {{.url}}": "Dokumentacja: {{.url}}", "Done! kubectl is now configured to use \"{{.name}}": "Gotowe! kubectl jest skonfigurowany do użycia z \"{{.name}}\".", "Done! kubectl is now configured to use \"{{.name}}\"": "Gotowe! kubectl jest skonfigurowany do użycia z \"{{.name}}\".", - "Done! kubectl is now configured to use \"{{.name}}\" by default": "", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "", "Download complete!": "Pobieranie zakończone!", "Downloading Kubernetes {{.version}} preload ...": "", "Downloading VM boot image ...": "Pobieranie obrazu maszyny wirtualnej ...", "Downloading driver {{.driver}}:": "", "Downloading {{.name}} {{.version}}": "Pobieranie {{.name}} {{.version}}", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "ERROR creating `registry-creds-acr` secret": "", "ERROR creating `registry-creds-dpr` secret": "", "ERROR creating `registry-creds-ecr` secret: {{.error}}": "", @@ -145,17 +173,22 @@ "Enable or disable a minikube addon": "", "Enable proxy for NAT DNS requests (virtualbox driver only)": "", "Enabled addons: {{.addons}}": "", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "", "Enabling dashboard ...": "", "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "", "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "", "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "Zmienne środowiskowe do przekazania do demona docker (format: klucz-wartość)", + "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "Błąd podczas sprawdzania wersji sterownika : {{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -184,14 +217,18 @@ "Error starting mount": "", "Error while setting kubectl current context : {{.error}}": "Błąd podczas ustawiania kontekstu kubectl: {{.error}}", "Error while setting kubectl current context: {{.error}}": "", + "Error with ssh-add": "", "Error writing mount pid": "", "Error: You have selected Kubernetes v{{.new}}, but the existing cluster for your profile is running Kubernetes v{{.old}}. Non-destructive downgrades are not supported, but you can proceed by performing one of the following options:\n* Recreate the cluster using Kubernetes v{{.new}}: Run \"minikube delete {{.profile}}\", then \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Create a second cluster with Kubernetes v{{.new}}: Run \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\"\n* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run \"minikube start {{.profile}} --kubernetes-version={{.old}}": "Erreur : Vous avez sélectionné Kubernetes v{{.new}}, mais le cluster existent pour votre profil exécute Kubernetes v{{.old}}. Les rétrogradations non-destructives ne sont pas compatibles. Toutefois, vous pouvez poursuivre le processus en réalisant l'une des trois actions suivantes :\n* Créer à nouveau le cluster en utilisant Kubernetes v{{.new}} – exécutez \"minikube delete {{.profile}}\", puis \"minikube start {{.profile}} --kubernetes-version={{.new}}\".\n* Créer un second cluster avec Kubernetes v{{.new}} – exécutez \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\".\n* Réutiliser le cluster existent avec Kubernetes v{{.old}} ou version ultérieure – exécutez \"minikube start {{.profile}} --kubernetes-version={{.old}}\".", "Examples": "Przykłady", "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": "", + "Failed to build image": "", "Failed to cache and load images": "", "Failed to cache binaries": "", "Failed to cache images": "", @@ -199,7 +236,11 @@ "Failed to cache kubectl": "", "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "Nie udało się zmienić uprawnień pliku {{.minikube_dir_path}}: {{.error}}", "Failed to check main repository and mirrors for images": "", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "", "Failed to delete images": "", "Failed to delete images from config": "", @@ -211,18 +252,25 @@ "Failed to get service URL: {{.error}}": "", "Failed to kill mount process: {{.error}}": "Zabicie procesu nie powiodło się: {{.error}}", "Failed to list cached images": "", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "", + "Failed to remove image": "", "Failed to remove profile": "Usunięcie profilu nie powiodło się", "Failed to save config": "Zapisywanie konfiguracji nie powiodło się", "Failed to save config {{.profile}}": "", + "Failed to save dir": "", + "Failed to save stdin": "", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "", "Failed to setup certs": "Konfiguracja certyfikatów nie powiodła się", "Failed to setup kubeconfig": "Konfiguracja kubeconfig nie powiodła się", + "Failed to start container runtime": "", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "", "Failed to update cluster": "Aktualizacja klastra nie powiodła się", "Failed to update config": "Aktualizacja konfiguracji nie powiodła się", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "", "File permissions used for the mount": "", "Filter to use only VM Drivers": "", @@ -231,15 +279,22 @@ "For improved {{.driver}} performance, {{.fix}}": "", "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", "Force minikube to perform possibly dangerous operations": "Wymuś wykonanie potencjalnie niebezpiecznych operacji", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "Wykryto opcje sieciowe:", "Found {{.number}} invalid profile(s) !": "Wykryto {{.number}} nieprawidłowych profili ! ", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "", "Get or list the current profiles (clusters)": "", "Gets the logs of the running instance, used for debugging minikube, not user code.": "Pobiera logi z aktualnie uruchomionej instancji. Przydatne do debugowania kodu, który nie należy do aplikacji użytkownika", "Gets the status of a local Kubernetes cluster": "", @@ -255,149 +310,186 @@ "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "", "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, only download and cache files for later use - don't install or start anything.": "", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If using the none driver, ensure that systemctl is installed": "Jeśli użyto sterownika 'none', upewnij się że systemctl jest zainstalowany", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", "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": "", + "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", "Kubernetes requires at least 2 CPU's to start": "", "Kubernetes {{.new}} is now available. If you would like to upgrade, specify: --kubernetes-version={{.prefix}}{{.new}}": "", "Kubernetes {{.version}} is not supported by this release of minikube": "", - "Launching Kubernetes ...": "Uruchamianie Kubernetesa...", - "Launching proxy ...": "", + "Launching Kubernetes ...": "Uruchamianie Kubernetesa ...", + "Launching proxy ...": "Uruchamianie proxy ...", "List all available images from the local cache.": "", - "List existing minikube nodes.": "", - "List nodes.": "", + "List existing minikube nodes.": "Wylistuj istniejące węzły minikube", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "Wylistuj obrazy", + "List nodes.": "Wylistuj węzły", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "", - "List of ports that should be exposed (docker and podman driver only)": "", - "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", + "List of ports that should be exposed (docker and podman driver only)": "Lista portów, które powinny zostać wystawione (tylko dla sterowników docker i podman)", + "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "Nasłuchiwanie na adresie {{.listenAddr}}. Jest to niezalecane i może spowodować powstanie podaności bezpieczeństwa. Używaj na własne ryzyko", + "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "Wylistuj wszystkie dostępne addony minikube razem z ich obecnymi statusami (włączony/wyłączony)", "Lists all minikube profiles.": "Wylistuj wszystkie profile minikube", - "Lists all valid default values for PROPERTY_NAME": "", - "Lists all valid minikube profiles and detects all possible invalid profiles.": "", - "Lists the URLs for the services in your local cluster": "", - "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "", + "Lists all valid default values for PROPERTY_NAME": "Wylistuj wszystkie prawidłowe domyślne wartości dla opcji konfiguracyjnej PROPERTY_NAME", + "Lists all valid minikube profiles and detects all possible invalid profiles.": "Wylistuj wszystkie prawidłowe profile minikube i wykryj wszystkie nieprawidłowe profile.", + "Lists the URLs for the services in your local cluster": "Wylistuj adresy URL serwisów w twoim lokalnym klastrze", + "Load a image into minikube": "Załaduj obraz do minikube", + "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "Lokalne katalogi do współdzielenia z Guestem poprzez NFS (tylko sterownik hyperkit)", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "", "Location of the minikube iso": "Ścieżka do obrazu iso minikube", "Location of the minikube iso.": "Ścieżka do obrazu iso minikube", - "Locations to fetch the minikube ISO from.": "", + "Locations to fetch the minikube ISO from.": "Ścieżki, z których pobrany będzie obra ISO minikube", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'": "Zaloguj się i wykonaj polecenie w maszynie za pomocą ssh. Podobne do 'docker-machine ssh'", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "Zaloguj się i wykonaj polecenie w maszynie za pomocą ssh. Podobne do 'docker-machine ssh'", - "Log into the minikube environment (for debugging)": "", - "Message Size: {{.size}}": "", - "Modify persistent configuration values": "", - "Most users should use the newer 'docker' driver instead, which does not require root!": "", + "Log into the minikube environment (for debugging)": "Zaloguj się do środowiska minikube (do debugowania)", + "Manage images": "Zarządzaj obrazami", + "Message Size: {{.size}}": "Rozmiar wiadomości: {{.size}}", + "Modify persistent configuration values": "Modyfikuj globalne opcje konfiguracyjne", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "Więcej informacji: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities", + "Most users should use the newer 'docker' driver instead, which does not require root!": "Większość użytkowników powinna używać nowszego sterownika docker, ktory nie wymaga uruchamiania z poziomu roota!", "Mount type: {{.name}}": "", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", "Mounts the specified directory into minikube": "Montuje podany katalog wewnątrz minikube", "Mounts the specified directory into minikube.": "Montuje podany katalog wewnątrz minikube", - "Multi-node clusters are currently experimental and might exhibit unintended behavior.": "", - "Multiple errors deleting profiles": "", - "Multiple minikube profiles were found - ": "", + "Multiple errors deleting profiles": "Wystąpiło wiele błędów podczas usuwania profili", + "Multiple minikube profiles were found - ": "Znaleziono wiele profili minikube - ", "NIC Type used for host only network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "", - "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", - "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", - "Node {{.name}} failed to start, deleting and trying again.": "", - "Node {{.name}} was successfully deleted.": "", - "Node {{.nodeName}} does not exist.": "", - "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "", - "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "Nie znaleziono adresu IP. Spróbuj przekazać adres IP za pomocą flagi --ssh-ip-address lub odwiedź https://minikube.sigs.k8s.io/docs/drivers/ssh/", + "No changes required for the \"{{.context}}\" context": "Żadne zmiany nie są wymagane dla kontekstu \"{{.context}}\"", + "No minikube profile was found. ": "Nie znaleziono żadnego profilu minikube", + "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "Nie znaleziono żadnego możliwego sterownika. Spróbuj przekazać sterownik za pomocą flagi --driver lub odwiedź https://minikube.sigs.k8s.io/docs/start/", + "No such addon {{.name}}": "Nie istnieje addon {{.name}}", + "Node {{.name}} failed to start, deleting and trying again.": "Węzeł {{.name}} nie uruchomił się pomyślnie. Usuwam i próbuję uruchomić węzeł ponownie", + "Node {{.name}} was successfully deleted.": "Węzeł {{.name}} został pomyślnie usunięty", + "Node {{.nodeName}} does not exist.": "Węzeł {{.nodeName}} nie istnieje", + "None of the known repositories are accessible. Consider specifying an alternative image repository with --image-repository flag": "Żadne znane repozytorium nie jest osiągalne. Rozważ wyspecyfikowanie alternatywnego repozytorium za pomocą flagi --image-repository", + "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "Żadne znane repozytorium w twojej lokalizacji nie jest osiągalne. Używam zamiast tego {{.image_repository_name}}", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", + "Number of CPUs allocated to Kubernetes.": "Liczba procesorów przypisana do Kubernetesa", "Number of CPUs allocated to the minikube VM": "Liczba procesorów przypisana do maszyny wirtualnej minikube", - "Number of CPUs allocated to the minikube VM.": "Liczba procesorów przypisana do maszyny wirtualnej minikube.", + "Number of CPUs allocated to the minikube VM.": "Liczba procesorów przypisana do maszyny wirtualnej minikube", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", - "OS release is {{.pretty_name}}": "", - "One of 'yaml' or 'json'.": "", - "Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "", - "Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "", - "Open the addons URL with https instead of http": "", - "Open the service URL with https instead of http (defaults to \\\"false\\\")": "", - "Opening Kubernetes service {{.namespace_name}}/{{.service_name}} in default browser...": "", - "Opening service {{.namespace_name}}/{{.service_name}} in default browser...": "", - "Opening {{.url}} in your default browser...": "", + "OS release is {{.pretty_name}}": "Wersja systemu operacyjnego to {{.pretty_name}}", + "One of 'yaml' or 'json'.": "Jeden z dwóćh formatów - 'yaml' lub 'json'", + "Only alphanumeric and dashes '-' are permitted. Minimum 1 character, starting with alphanumeric.": "Tylko znaki alfanumeryczne oraz myślniki '-' są dozwolone. Co najmniej jeden znak, zaczynając od znaku alfanumerycznego", + "Only alphanumeric and dashes '-' are permitted. Minimum 2 characters, starting with alphanumeric.": "Tylko znaki alfanumeryczne oraz myślniki '-' są dozwolone. Co najmniej dwa znaki, zaczynając od znaku alfanumerycznego", + "Open the addons URL with https instead of http": "Otwórz URL addonów używając protokołu https zamiast http", + "Open the service URL with https instead of http (defaults to \\\"false\\\")": "Otwórz URL serwisu używając protokołu https zamiast http (domyślnie ma wartość fałsz)", + "Opening Kubernetes service {{.namespace_name}}/{{.service_name}} in default browser...": "Otwieranie serwisu Kubernetesa {{.namespace_name}}/{{.service_name}} w domyślnej przeglądarce...", + "Opening service {{.namespace_name}}/{{.service_name}} in default browser...": "Otwieranie serwisu {{.namespace_name}}/{{.service_name}} w domyślnej przeglądarce...", + "Opening {{.url}} in your default browser...": "Otwieranie {{.url}} w domyślnej przeglądarce...", "Opens the addon w/ADDON_NAME within minikube (example: minikube addons open dashboard). For a list of available addons use: minikube addons list ": "", - "Operations on nodes": "", - "Options: {{.options}}": "", - "Output format. Accepted values: [json]": "", + "Operations on nodes": "Operacje na węzłach", + "Options: {{.options}}": "Opcje: {{.options}}", + "Output format. Accepted values: [json]": "Format wyjściowy. Akceptowane wartości: [json]", "Outputs minikube shell completion for the given shell (bash or zsh)": "Zwraca autouzupełnianie poleceń minikube dla danej powłoki (bash, zsh)", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", - "Pause": "", - "Paused {{.count}} containers": "", - "Paused {{.count}} containers in: {{.namespaces}}": "", - "Pausing node {{.name}} ... ": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "Nadpisuje obraz nawet jeśli istnieje obraz o tej samej nazwie i tagu.", + "Path to the Dockerfile to use (optional)": "Ścieżka pliku Dockerfile, którego należy użyć (opcjonalne)", + "Pause": "Stop", + "Paused {{.count}} containers": "Zatrzymane kontenery: {{.count}}", + "Paused {{.count}} containers in: {{.namespaces}}": "Zatrzymane kontenery: {{.count}} w przestrzeniach nazw: {{.namespaces}}", + "Pausing node {{.name}} ... ": "Zatrzymywanie węzła {{.name}} ... ", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", - "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", - "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", + "Please attach the following file to the GitHub issue:": "Dołącz następujący plik do zgłoszenia problemu na GitHubie:", + "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "Utwórz klaster z większym rozmiarem dysku: `minikube start --disk SIZE_MB`", + "Please either authenticate to the registry or use --base-image flag to use a different registry.": "Uwierzytelnij się w rejestrze lub użyć flagi --base-image w celu użycia innego rejestru.", "Please enter a value:": "Wprowadź wartość", - "Please free up disk or prune images.": "", - "Please increse Desktop's disk size.": "", - "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", - "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", + "Please free up disk or prune images.": "Zwolnij miejsce na dysku lub usuń niepotrzebne obrazy", + "Please increse Desktop's disk size.": "Zwiększ miejsce na dysku dla programu Docker Desktop", + "Please install the minikube hyperkit VM driver, or select an alternative --driver": "Zainstaluj sterownik hyperkit lub wybierz inny sterownik używając flagi --driver", + "Please install the minikube kvm2 VM driver, or select an alternative --driver": "Zainstaluj sterownik kvm2 lub wybierz inny sterownik używając flagi --driver", "Please make sure the service you are looking for is deployed or is in the correct namespace.": "Proszę upewnij się, że serwis którego szukasz znajduje się w prawidłowej przestrzeni nazw", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", - "Please see {{.documentation_url}} for more details": "", - "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please see {{.documentation_url}} for more details": "Zobacz {{.documentation_url}} żeby uzyskać więcej informacji", + "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "Sprecyzuj katalog, który ma być zamontowany: \n\tminikube mount \u003ckatalog źródłowy\u003e:\u003ckatalog docelowy\u003e (przykład: \"/host-home:/vm-home\")", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "Spróbuj wyczyścic minikube używając: `minikube delete --all --purge`", "Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}": "Proszę zaktualizować '{{.driver_executable}}'. {{.documentation_url}}", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", - "Populates the specified folder with documentation in markdown about minikube": "", - "PowerShell is running in constrained mode, which is incompatible with Hyper-V scripting.": "", - "Powering off \"{{.profile_name}}\" via SSH ...": "", + "Populates the specified folder with documentation in markdown about minikube": "Umieszcza dokumentację minikube w formacie markdown w podanym katalogu", + "PowerShell is running in constrained mode, which is incompatible with Hyper-V scripting.": "PowerShell jest uruchomiony w trybie ograniczonym, co jest niekompatybilne ze skryptowaniem w wirtualizacji z użyciem Hyper-V", + "Powering off \"{{.profile_name}}\" via SSH ...": "Wyłączanie klastra \"{{.profile_name}}\" przez SSH ...", "Preparing Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}} ...": "Przygotowywanie Kubernetesa {{.k8sVersion}} na {{.runtime}} {{.runtimeVersion}}...", "Print current and latest version number": "Wyświetl aktualną i najnowszą wersję", - "Print just the version number.": "", + "Print just the version number.": "Wyświetl tylko numer wersji", "Print the version of minikube": "Wyświetl wersję minikube", "Print the version of minikube.": "Wyświetl wersję minikube.", - "Problems detected in {{.entry}}:": "Wykryto problem w {{.name}}", + "Problems detected in {{.entry}}:": "Wykryto problem w {{.entry}}", "Problems detected in {{.name}}:": "Wykryto problem w {{.name}}:", "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", "Profile gets or sets the current minikube profile": "Pobiera lub ustawia aktywny profil minikube", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "", + "Pull the remote image (no caching)": "", "Pulling base image ...": "", + "Push the new image (requires tag)": "", "Reboot to complete VirtualBox installation, and verify that VirtualBox is not blocked by your system": "Uruchom ponownie komputer aby zakończyć instalację VirtualBox'a i upewnij się, że nie jest on blokowany przez twój system", "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "", "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "", "Related issues:": "Powiązane problemy", + "Remove one or more images": "", "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "", "Removing {{.directory}} ...": "", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "", "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommend}}MB. Deployments may fail.": "", @@ -408,11 +500,17 @@ "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", "Restarting the {{.name}} service may improve performance.": "", + "Retrieve the ssh host key of the specified node": "", + "Retrieve the ssh host key of the specified node.": "", "Retrieve the ssh identity key path of the specified cluster": "Pozyskuje ścieżkę do klucza ssh dla wyspecyfikowanego klastra", "Retrieve the ssh identity key path of the specified cluster.": "Pozyskuje ścieżkę do klucza ssh dla wyspecyfikowanego klastra.", + "Retrieve the ssh identity key path of the specified node": "", + "Retrieve the ssh identity key path of the specified node, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster": "Pobiera adres IP aktualnie uruchomionego klastra", "Retrieves the IP address of the running cluster, and writes it to STDOUT.": "Pobiera adres IP aktualnie uruchomionego klastra i wypisuje go do STDOUT", "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "", + "Retrieves the IP address of the specified node": "", + "Retrieves the IP address of the specified node, and writes it to STDOUT.": "", "Returns a URL to connect to a service": "", "Returns logs to debug a local Kubernetes cluster": "", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", @@ -424,18 +522,24 @@ "Run a kubectl binary matching the cluster version": "", "Run kubectl": "Uruchamia kubectl", "Run minikube from the C: drive.": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", "Select a valid value for --dnsdomain": "", + "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "", "Set flag to delete all profiles": "", "Set flag to stop all profiles (clusters)": "", + "Set flag to stop cluster after a set amount of time (e.g. --schedule=5m)": "", "Set this flag to delete the '.minikube' folder from your user directory.": "", "Sets an individual value in a minikube config file": "", "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "", @@ -446,21 +550,28 @@ "Show a list of global command-line options (applies to all commands).": "", "Show only log entries which point to known problems": "Pokaż logi które wskazują na znane problemy", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", - "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Zignorowano zmianę kontekstu kubectl ponieważ --keep-context zostało przekazane", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", + "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "Zignorowano zmianę kontekstu kubectl dla {{.profile_name}} ponieważ --keep-context zostało przekazane", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "", "Starting node {{.name}} in cluster {{.cluster}}": "", @@ -485,9 +596,11 @@ "Successfully stopped node {{.name}}": "", "Suggestion: {{.advice}}": "Sugestia: {{.advice}}", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", "The \"{{.cluster_name}}\" cluster has been deleted.": "Klaster \"{{.cluster_name}}\" został usunięty", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "", "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}'.": "Sterownik \"{{.driver_name}}\" wymaga uprawnień root'a. Użyj 'sudo minikube --vm-driver={{.driver_name}}'", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", "The \"{{.name}}\" cluster has been deleted.": "Klaster \"{{.name}}\" został usunięty.", @@ -498,15 +611,18 @@ "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}}, 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)": "", - "The Docker service within '{{.name}}' is not active": "", "The KVM QEMU connection URI. (kvm2 driver only)": "", + "The KVM default network name. (kvm2 driver only)": "", "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", "The KVM network name. (kvm2 driver only)": "Nazwa sieci KVM. (wspierane tylko przez kvm2)", "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "API nasłuchuje na porcie:", "The argument to pass the minikube mount command on start.": "", "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", @@ -530,6 +646,7 @@ "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "", "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", "The kubernetes version that the minikube VM will use (ex: v1.2.3)": "Wersja kubernetesa, która zostanie użyta przez wirtualną maszynę minikube (np. v1.2.3)", @@ -539,8 +656,11 @@ "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The name of the network plugin": "Nazwa pluginu sieciowego", "The name of the network plugin.": "Nazwa pluginu sieciowego", + "The named space to activate after start": "", "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "", + "The node to get IP. Defaults to the primary control plane.": "", "The node to get logs from. Defaults to the primary control plane.": "", + "The node to get ssh-key path. Defaults to the primary control plane.": "", "The node to ssh into. Defaults to the primary control plane.": "", "The node {{.name}} has ran out of available PIDs.": "", "The node {{.name}} has ran out of disk space.": "", @@ -551,6 +671,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -560,7 +682,6 @@ "The time interval for each check that wait performs in seconds": "", "The value passed to --format is invalid": "Wartość przekazana do --format jest nieprawidłowa", "The value passed to --format is invalid: {{.error}}": "Wartość przekazana do --format jest nieprawidłowa: {{.error}}", - "The vmwarefusion driver is deprecated and support for it will be removed in a future release.\n\t\t\tPlease consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.\n\t\t\tSee https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information.\n\t\t\tTo disable this message, run [minikube config set ShowDriverDeprecationNotification false]": "", "The {{.driver_name}} driver should not be used with root privileges.": "{{.driver_name}} nie powinien być używany z przywilejami root'a.", "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "", "These changes will take effect upon a minikube delete and then a minikube start": "", @@ -568,6 +689,7 @@ "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "", "This control plane is not running! (state={{.state}})": "", "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "", "This will start the mount daemon and automatically mount files into minikube.": "", @@ -576,15 +698,16 @@ "To connect to this cluster, use: --context={{.name}}": "", "To connect to this cluster, use: kubectl --context={{.name}}": "Aby połączyć się z klastrem użyj: kubectl --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "Aby połaczyć się z klastrem użyj: kubectl --context={{.profile_name}}", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'": "Aby wyłączyć tę notyfikację, użyj: 'minikube config set WantUpdateNotification false'", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", "To start minikube with Hyper-V, Powershell must be in your PATH`": "", "To start minikube with HyperV Powershell must be in your PATH`": "Aby uruchomić minikube z HyperV Powershell musi znajdować się w zmiennej PATH", - "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "", "Troubleshooting Commands:": "", "Try 'minikube delete' to force new SSL certificates to be installed": "", @@ -597,6 +720,7 @@ "Unable to find control plane": "", "Unable to generate docs": "", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", "Unable to get current user": "", @@ -604,9 +728,11 @@ "Unable to get machine status": "", "Unable to get runtime": "", "Unable to kill mount process: {{.error}}": "", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images: {{.error}}": "", "Unable to load config: {{.error}}": "", "Unable to load host": "", + "Unable to load profile: {{.error}}": "", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "", "Unable to parse default Kubernetes version from constants: {{.error}}": "", "Unable to parse memory '{{.memory}}': {{.error}}": "", @@ -622,11 +748,13 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "", "Unmounting {{.path}} ...": "", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "", "Unpausing node {{.name}} ... ": "", "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "", "Update server returned an empty list": "", "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", @@ -643,18 +771,24 @@ "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", "Use 'kubect get po -A' to find the correct and namespace name": "", "Use -A to specify all namespaces": "", + "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using image repository {{.name}}": "", - "Using podman 2 is not supported yet. your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk.": "", + "Using image {{.registry}}{{.image}}": "", + "Using image {{.registry}}{{.image}} (global image repository)": "", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "", "Using the {{.driver}} driver based on existing profile": "", "Using the {{.driver}} driver based on user configuration": "", "VM driver is one of: %v": "Sterownik wirtualnej maszyny to jeden z: %v", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "Zweryfikuj czy zmienne HTTP_PROXY i HTTPS_PROXY są ustawione poprawnie", "Verify the IP address of the running cluster in kubeconfig.": "Weryfikacja adresu IP działającego klastra w kubeconfig", @@ -678,28 +812,40 @@ "Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "", "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "Musisz podać nazwę serwisu", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "Twoje środowisko nie wspiera wirtualizacji KVM. Upewnij się, że qemu-kvm jest zainstalowane i uruchom 'virt-host-validate' aby rozwiązać problem.", "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "", "Your minikube vm is not running, try minikube start.": "", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "", - "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields: \\n\\n": "", + "cancel any existing scheduled stop requests": "", + "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "", + "containers paused status: {{.paused}}": "", "dashboard service is not running: {{.error}}": "", "delete ctx": "", "deleting node": "", @@ -707,12 +853,12 @@ "dry-run mode. Validates configuration, but does not mutate system state": "", "dry-run validation complete!": "", "enable failed": "", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "", "error getting primary control plane": "", "error getting ssh port": "", + "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "", "error stopping tunnel": "", "error: --output must be 'yaml' or 'json'": "", @@ -722,36 +868,43 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", - "if true, will embed the certs in kubeconfig.": "", + "fish completion.": "", + "if true, will embed the certs in kubeconfig.": "Jeśli ta opcja będzie miała wartoś true, zakodowane w base64 certyfikaty zostaną osadzone w pliku konfiguracyjnym kubeconfig zamiast ścieżek do plików z certyfikatami", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "", "initialization failed, will try again: {{.error}}": "", + "invalid kubernetes version": "Nieprawidłowa wersja Kubernetesa", "keep the kube-context active after cluster is stopped. Defaults to false.": "", "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "", - "kubectl and minikube configuration will be stored in {{.home_folder}}": "konfiguracja minikube i kubectl będzie przechowywana w katalogu {{.home_dir}}", + "kubectl and minikube configuration will be stored in {{.home_folder}}": "konfiguracja minikube i kubectl będzie przechowywana w katalogu {{.home_folder}}", "kubectl not found in PATH, but is required for the dashboard. Installation guide: https://kubernetes.io/docs/tasks/tools/install-kubectl/": "kubectl nie zostało odnalezione w zmiennej środowiskowej ${PATH}. Instrukcja instalacji: https://kubernetes.io/docs/tasks/tools/install-kubectl/", "kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "", "kubectl proxy": "", "libmachine failed": "", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "Ładowanie profilu", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "", - "minikube is exiting due to an error. If the above message is not useful, open an issue:": "", "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", - "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", + "minikube is not meant for production use. You are opening non-local traffic": "minikube nie jest przeznaczony do użycia w środowisku produkcyjnym. Otwierasz klaster na ruch nielokalny", + "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "uzyskanie dostępu do Google Container Registry poprzez minikube nie powiodło się. Możliwe, że musisz skonfigurować ustawienia proxy HTTP w minikube", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", - "minikube profile was successfully set to {{.profile_name}}": "", - "minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "", - "minikube quickly sets up a local Kubernetes cluster": "", - "minikube skips various validations when --force is supplied; this may lead to unexpected behavior": "", + "minikube profile was successfully set to {{.profile_name}}": "profil minikube został z powodzeniem zmieniony na: {{.profile_name}}", + "minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "minikube dostarcza lokalne klastry Kubernetesa zoptymalizowane do celów rozwoju oprogramowania oraz zarządza nimi", + "minikube quickly sets up a local Kubernetes cluster": "minikube szybko inicjalizuje lokalny klaster Kubernetesa", + "minikube skips various validations when --force is supplied; this may lead to unexpected behavior": "użycie flagi --force sprawia, że minikube pomija pewne walidacje, co może skutkować niespodziewanym zachowaniem", "minikube status --output OUTPUT. json, text": "", "minikube {{.version}} is available! Download it: {{.url}}": "minikube {{.version}} jest dostępne! Pobierz je z: {{.url}}", "mkcmp is used to compare performance of two minikube binaries": "", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "", + "mount could not connect": "", "mount failed": "Montowanie się nie powiodło", "namespaces to pause": "", "namespaces to unpause": "", - "none driver does not support multi-node clusters": "", - "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", + "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", + "none driver does not support multi-node clusters": "sterownik none nie wspiera klastrów składających się z więcej niż jednego węzła", + "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "Niewystarczająca ilośc argumentów ({{.ArgCount}}). \\nużycie: minikube config set PROPERTY_NAME PROPERTY_VALUE", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "", "preload extraction failed: \\\"No space left on device\\\"": "", @@ -759,33 +912,39 @@ "provisioning host for node": "", "reload cached images.": "", "reloads images previously added using the 'cache add' subcommand": "", - "retrieving node": "", + "retrieving node": "przywracanie węzła", + "scheduled stop is not supported on the none driver, skipping scheduling": "", "service {{.namespace_name}}/{{.service_name}} has no node port": "", - "stat failed": "", + "stat failed": "wykonanie komendy stat nie powiodło się", "status json failure": "", "status text failure": "", "toom any arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", "tunnel creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP. for a detailed example see https://minikube.sigs.k8s.io/docs/tasks/loadbalancer": "", "unable to bind flags": "", - "unable to delete minikube config folder": "", - "unpause Kubernetes": "", - "unset failed": "", - "unsets PROPERTY_NAME from the minikube config file. Can be overwritten by flags or environmental variables": "", - "unsets an individual value in a minikube config file": "", + "unable to daemonize: {{.err}}": "", + "unable to delete minikube config folder": "Usuwanie katalogu z plikami konfiguracyjnymi minikube nie powiodło się", + "unpause Kubernetes": "Wznów działanie Kubernetesa", + "unset failed": "Usuwanie wartości nie powiodło się", + "unsets PROPERTY_NAME from the minikube config file. Can be overwritten by flags or environmental variables": "Usuwa wartość o nazwie PROPERTY_NAME z globalnej konfiguracji minikube. Wartość może zostać nadpisana za pomocą flag lub zmiennych środowiskowych", + "unsets an individual value in a minikube config file": "Usuwa pojedynczą wartość w globalnej konfiguracji minikube", "unsupported driver: {{.name}}": "nie wspierany sterownik: {{.name}}", - "unsupported or missing driver: {{.name}}": "", + "unsupported or missing driver: {{.name}}": "nie wspierany lub brakujący sterownik: {{.name}}", "update config": "", - "usage: minikube addons configure ADDON_NAME": "", - "usage: minikube addons disable ADDON_NAME": "", - "usage: minikube addons enable ADDON_NAME": "", - "usage: minikube addons list": "", - "usage: minikube addons open ADDON_NAME": "", - "usage: minikube config unset PROPERTY_NAME": "", - "usage: minikube delete": "", - "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "", + "usage: minikube addons configure ADDON_NAME": "użycie: minikube addons configure ADDON_NAME", + "usage: minikube addons disable ADDON_NAME": "użycie: minikube addons disable ADDON_NAME", + "usage: minikube addons enable ADDON_NAME": "użycie: minikube addons enable ADDON_NAME", + "usage: minikube addons images ADDON_NAME": "użycie: minikube addons images ADDON_NAME", + "usage: minikube addons list": "użycie: minikube addons list", + "usage: minikube addons open ADDON_NAME": "użycie: minikube addons open ADDON_NAME", + "usage: minikube config unset PROPERTY_NAME": "użycie: minikube config unset PROPERTY_NAME", + "usage: minikube delete": "użycie: minikube delete", + "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "użycie: minikube profile [MINIKUBE_PROFILE_NAME]", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "", "version yaml failure": "", - "zsh completion failed": "", + "zsh completion failed": "autouzupełnianie zsh nie powiodło się", + "zsh completion.": "autouzupełnianie zsh", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.addonName}} was successfully enabled": "{{.addonName}} został aktywowany pomyślnie", @@ -794,17 +953,20 @@ "{{.driver_name}} couldn't proceed because {{.driver_name}} service is not healthy.": "", "{{.driver_name}} has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB": "", - "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "sterownik {{.driver}} ma tylko {{.size}}MiB dostępnej przestrzeni dyskowej, to mniej niż wymagane {{.req}}MiB dla Kubernetesa", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", "{{.name}} cluster does not exist": "Klaster {{.name}} nie istnieje", + "{{.name}} doesn't have images.": "{{.name}} nie ma obrazów.", + "{{.name}} has following images:": "{{.name}} ma następujące obrazy:", "{{.name}} has no available configuration options": "{{.name}} nie posiada opcji konfiguracji", - "{{.name}} is already running": "", + "{{.name}} is already running": "{{.name}} został już wcześniej uruchomiony", "{{.name}} was successfully configured": "{{.name}} skonfigurowano pomyślnie", - "{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "", - "{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "", - "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "", - "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", + "{{.n}} is nearly out of disk space, which may cause deployments to fail! ({{.p}}% of capacity)": "{{.n}} prawie nie ma wolnej przestrzeni dyskowej, co może powodować, że wdrożenia nie powiodą się ({{.p}}% zużycia przestrzeni dyskowej)", + "{{.n}} is out of disk space! (/var is at {{.p}}% of capacity)": "{{.n}} nie ma wolnej przestrzeni dyskowej! (/var jest w {{.p}}% pełny)", + "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "Czas odpowiedzi od {{.ocibin}} jest niespotykanie długi, rozważ ponowne uruchomienie {{.ocibin}}", + "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "{{.path}} jest w wersji {{.client_version}}, co może być niekompatybilne z Kubernetesem w wersji {{.cluster_version}}.", "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.prefix}}minikube {{.version}} na {{.platform}}", + "{{.profile}} profile is not valid: {{.err}}": "{{.profile}} profil nie jest poprawny: {{.err}}", "{{.type}} is not yet a supported filesystem. We will try anyways!": "{{.type}} nie jest wspierany przez system plików. I tak spróbujemy!", - "{{.url}} is not accessible: {{.error}}": "" -} + "{{.url}} is not accessible: {{.error}}": "{{.url}} nie jest osiągalny: {{.error}}" +} \ No newline at end of file diff --git a/translations/strings.txt b/translations/strings.txt index fdd7706dd4..3256057b22 100644 --- a/translations/strings.txt +++ b/translations/strings.txt @@ -14,7 +14,16 @@ "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", "- Restart your {{.driver_name}} service": "", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "", "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "", + "==\u003e Last Start \u003c==": "", + "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "", + "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "", + "A firewall is interfering with minikube's ability to make outgoing HTTPS requests. You may need to change the value of the HTTPS_PROXY environment variable.": "", + "A firewall is likely blocking minikube from reaching the internet. You may need to configure minikube to use a proxy.": "", "A set of apiserver IP Addresses which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "", @@ -23,6 +32,7 @@ "Add SSH identity key to SSH authentication agent": "", "Add an image to local cache.": "", "Add host key to SSH known_hosts file": "", + "Add image to cache for all running minikube clusters": "", "Add machine IP to NO_PROXY environment variable": "", "Add, delete, or push a local image into minikube": "", "Add, remove, or list additional nodes": "", @@ -37,36 +47,61 @@ "All existing scheduled stops cancelled": "", "Allow user prompts for more information": "", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "", - "Amount of RAM to allocate to Kubernetes (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", "Amount of time to wait for a service in seconds": "", "Amount of time to wait for service in seconds": "", + "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "", + "Another minikube instance is downloading dependencies... ": "", + "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "", + "At least needs control plane nodes to enable addon": "", "Automatically selected the {{.driver}} driver": "", "Automatically selected the {{.driver}} driver. Other choices: {{.alternates}}": "", "Available Commands": "", "Basic Commands:": "", "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "", "Bind Address: {{.Address}}": "", + "Booting up control plane ...": "", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "", + "Build a container image, using the container runtime.": "", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", + "Cache image from docker daemon": "", + "Cache image from remote registry": "", + "Cannot find directory {{.path}} for copy": "", "Cannot find directory {{.path}} for mount": "", "Cannot use both --output and --format options": "", "Check if you have unnecessary pods running by running 'kubectl get po -A": "", + "Check output of 'journalctl -xeu kubelet', try passing --extra-config=kubelet.cgroup-driver=systemd to minikube start": "", + "Check that libvirt is setup properly": "", "Check that minikube is running and that you have specified the correct namespace (-n flag) if required.": "", - "Cluster was created without any CNI, adding node to it might cause broken network.": "", + "Check that the provided apiserver flags are valid, and that SELinux is disabled": "", + "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --driver=none": "", + "Choose a smaller value for --memory, such as 2000": "", + "ChromeOS is missing the kernel support necessary for running Kubernetes": "", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "", + "Configure a default route on this Linux host, or use another --driver that does not require it": "", + "Configure an external network switch following the official documentation, then add `--hyperv-virtual-switch=\u003cswitch-name\u003e` to `minikube start`": "", "Configure environment to use minikube's Docker daemon": "", "Configure environment to use minikube's Podman service": "", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "", + "Configuring RBAC rules ...": "", "Configuring local host environment ...": "", "Configuring {{.name}} (Container Networking Interface) ...": "", + "Confirm that you have a working internet connection and that your VM has not run out of resources by using: 'minikube logs'": "", + "Confirm that you have supplied the correct value to --hyperv-virtual-switch using the 'Get-VMSwitch' command": "", "Connect to LoadBalancer services": "", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", "Could not process error from failed deletion": "", "Could not process errors from failed deletion": "", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "", "Creating mount {{.name}} ...": "", "Creating {{.driver_name}} {{.machine_type}} (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB) ...": "", @@ -82,8 +117,10 @@ "Deletes a node from a cluster.": "", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "", "Deleting container \"{{.name}}\" ...": "", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", "Deleting node {{.name}} from cluster {{.cluster}}": "", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "", + "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "", "Disables the addon w/ADDON_NAME within minikube (example: minikube addons disable dashboard). For a list of available addons use: minikube addons list ": "", "Disables the filesystem mounts provided by the hypervisors": "", "Disk size allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g).": "", @@ -96,7 +133,9 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", + "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "", "Docs have been saved at - {{.path}}": "", "Documentation: {{.url}}": "", "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "", @@ -104,24 +143,34 @@ "Downloading Kubernetes {{.version}} preload ...": "", "Downloading VM boot image ...": "", "Downloading driver {{.driver}}:": "", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "ERROR creating `registry-creds-acr` secret": "", "ERROR creating `registry-creds-dpr` secret": "", "ERROR creating `registry-creds-ecr` secret: {{.error}}": "", "ERROR creating `registry-creds-gcr` secret: {{.error}}": "", + "Either systemctl is not installed, or Docker is broken. Run 'sudo systemctl start docker' and 'journalctl -u docker'": "", "Enable addons. see `minikube addons list` for a list of valid addon names.": "", "Enable experimental NVIDIA GPU support in minikube": "", "Enable host resolver for NAT DNS requests (virtualbox driver only)": "", "Enable or disable a minikube addon": "", "Enable proxy for NAT DNS requests (virtualbox driver only)": "", "Enabled addons: {{.addons}}": "", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "", "Enabling dashboard ...": "", + "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "", + "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --driver": "", + "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", + "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", + "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "", + "Environment variables to pass to the build. (format: key=value)": "", + "Error code docs have been saved at - {{.path}}": "", "Error creating minikube directory": "", "Error creating view template": "", "Error detecting shell": "", @@ -153,8 +202,11 @@ "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": "", + "Failed to build image": "", "Failed to cache and load images": "", "Failed to cache binaries": "", "Failed to cache images": "", @@ -162,7 +214,11 @@ "Failed to cache kubectl": "", "Failed to change permissions for {{.minikube_dir_path}}: {{.error}}": "", "Failed to check main repository and mirrors for images": "", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "", "Failed to delete images": "", "Failed to delete images from config": "", @@ -173,15 +229,22 @@ "Failed to get service URL: {{.error}}": "", "Failed to kill mount process: {{.error}}": "", "Failed to list cached images": "", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "", + "Failed to remove image": "", "Failed to save config {{.profile}}": "", + "Failed to save dir": "", + "Failed to save stdin": "", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "", "Failed to setup certs": "", + "Failed to start container runtime": "", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "", "Failed to update cluster": "", "Failed to update config": "", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "", "File permissions used for the mount": "", "Filter to use only VM Drivers": "", @@ -190,14 +253,21 @@ "For improved {{.driver}} performance, {{.fix}}": "", "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "", "Force minikube to perform possibly dangerous operations": "", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "", "Get or list the current profiles (clusters)": "", "Gets the logs of the running instance, used for debugging minikube, not user code.": "", "Gets the status of a local Kubernetes cluster": "", @@ -209,51 +279,76 @@ "Go template format string for the status output. The format for Go templates can be found here: https://golang.org/pkg/text/template/\nFor the list accessible variables for the template, see the struct values here: https://godoc.org/k8s.io/minikube/cmd/minikube/cmd#Status": "", "Group ID: {{.groupID}}": "", "Hide the hypervisor signature from the guest in minikube (kvm2 driver only)": "", + "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, only download and cache files for later use - don't install or start anything.": "", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", + "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", + "Kubernetes requires at least 2 CPU's to start": "", "Kubernetes {{.new}} is now available. If you would like to upgrade, specify: --kubernetes-version={{.prefix}}{{.new}}": "", "Kubernetes {{.version}} is not supported by this release of minikube": "", "Launching proxy ...": "", "List all available images from the local cache.": "", "List existing minikube nodes.": "", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "", "List nodes.": "", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "", "List of ports that should be exposed (docker and podman driver only)": "", "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "", "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", "Lists all minikube profiles.": "", "Lists all valid default values for PROPERTY_NAME": "", "Lists all valid minikube profiles and detects all possible invalid profiles.": "", "Lists the URLs for the services in your local cluster": "", + "Load a image into minikube": "", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "", "Locations to fetch the minikube ISO from.": "", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", "Log into the minikube environment (for debugging)": "", + "Manage images": "", "Message Size: {{.size}}": "", "Modify persistent configuration values": "", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "", "Most users should use the newer 'docker' driver instead, which does not require root!": "", "Mount type: {{.name}}": "", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", @@ -265,9 +360,11 @@ "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "", "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", + "No minikube profile was found. ": "", "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "No such addon {{.name}}": "", "Node {{.name}} failed to start, deleting and trying again.": "", "Node {{.name}} was successfully deleted.": "", "Node {{.nodeName}} does not exist.": "", @@ -275,7 +372,7 @@ "None of the known repositories in your location are accessible. Using {{.image_repository_name}} as fallback.": "", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'yaml' or 'json'.": "", @@ -290,23 +387,34 @@ "Operations on nodes": "", "Options: {{.options}}": "", "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "", + "Path to the Dockerfile to use (optional)": "", "Pause": "", "Paused {{.count}} containers": "", "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "", + "Please attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "", "Please free up disk or prune images.": "", "Please increse Desktop's disk size.": "", + "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", + "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", + "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", "Populates the specified folder with documentation in markdown about minikube": "", + "PowerShell is running in constrained mode, which is incompatible with Hyper-V scripting.": "", "Powering off \"{{.profile_name}}\" via SSH ...": "", "Preparing Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}} ...": "", "Print current and latest version number": "", @@ -317,22 +425,37 @@ "Problems detected in {{.name}}:": "", "Profile \"{{.cluster}}\" not found. Run \"minikube profile list\" to view all profiles.": "", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "", + "Pull the remote image (no caching)": "", "Pulling base image ...": "", + "Push the new image (requires tag)": "", + "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "", + "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "", + "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", + "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "", "Related issues:": "", + "Remove one or more images": "", + "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "", "Removing {{.directory}} ...": "", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "", "Requested memory allocation ({{.requested}}MB) is less than the recommended minimum {{.recommend}}MB. Deployments may fail.": "", "Requested memory allocation {{.requested}}MB is more than your system limit {{.system_limit}}MB.": "", "Requested memory allocation {{.requested}}MiB is less than the usable minimum of {{.minimum_memory}}MB": "", + "Reset Docker to factory defaults": "", + "Restart Docker": "", + "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", "Restarting the {{.name}} service may improve performance.": "", "Retrieve the ssh host key of the specified node": "", @@ -346,10 +469,24 @@ "Returns logs to debug a local Kubernetes cluster": "", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", "Returns the value of PROPERTY_NAME from the minikube config file. Can be overwritten at runtime by flags or environmental variables.": "", + "Right-click the PowerShell icon and select Run as Administrator to open PowerShell in elevated mode.": "", + "Run 'kubectl describe pod coredns -n kube-system' and check for a firewall or DNS conflict": "", + "Run 'minikube delete' to delete the stale VM, or and ensure that minikube is running as the same user you are issuing this command with": "", + "Run 'sudo sysctl fs.protected_regular=0', or try a driver which does not require root, such as '--driver=docker'": "", "Run a kubectl binary matching the cluster version": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run minikube from the C: drive.": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", + "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", + "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", + "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", + "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", + "Select a valid value for --dnsdomain": "", "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "", @@ -365,20 +502,28 @@ "Show a list of global command-line options (applies to all commands).": "", "Show only log entries which point to known problems": "", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", - "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e:\u003cport\u003e, \u003chostname\u003e:\u003cport\u003e or \u003cnetwork\u003e/\u003cnetmask\u003e": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", + "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", + "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "", "Starting node {{.name}} in cluster {{.cluster}}": "", @@ -400,7 +545,10 @@ "Successfully stopped node {{.name}}": "", "Suggestion: {{.advice}}": "", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", "The 'none' driver is designed for experts who need to integrate with an existing VM": "", "The '{{.addonName}}' addon is enabled": "", @@ -409,14 +557,22 @@ "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}}, 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)": "", "The KVM QEMU connection URI. (kvm2 driver only)": "", - "The KVM network name. (kvm2 driver only)": "", + "The KVM default network name. (kvm2 driver only)": "", + "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", + "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", + "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", + "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "", "The argument to pass the minikube mount command on start.": "", "The authoritative apiserver hostname for apiserver certificates and connectivity. This can be used if you want to make the apiserver available from outside the machine": "", "The base image to use for docker/podman drivers. Intended for local development.": "", + "The certificate hostname provided appears to be invalid (may be a minikube bug, try 'minikube delete')": "", "The cluster dns domain name used in the Kubernetes cluster": "", "The cluster {{.cluster}} already exists which means the --nodes parameter will be ignored. Use \"minikube node add\" to add nodes to an existing cluster.": "", "The control plane for \"{{.name}}\" is paused!": "", @@ -428,10 +584,15 @@ "The docker-env command is only compatible with the \"docker\" runtime, but this cluster was configured to use the \"{{.runtime}}\" runtime.": "", "The driver '{{.driver}}' is not supported on {{.os}}/{{.arch}}": "", "The existing \"{{.name}}\" cluster was created using the \"{{.old}}\" driver, which is incompatible with requested \"{{.new}}\" driver.": "", + "The existing node configuration appears to be corrupt. Run 'minikube delete'": "", "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "", + "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", + "The machine-driver specified is failing to start. Try running 'docker-machine-driver-\u003ctype\u003e version'": "", + "The minikube VM is offline. Please run 'minikube start' to start it again.": "", "The minikube {{.driver_name}} container exited unexpectedly.": "", "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The named space to activate after start": "", @@ -449,6 +610,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -463,6 +626,8 @@ "This addon does not have an endpoint defined for the 'addons open' command.\nYou can add one by annotating a service with the label {{.labelName}}:{{.addonName}}": "", "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "", "This control plane is not running! (state={{.state}})": "", + "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "", "This will start the mount daemon and automatically mount files into minikube.": "", @@ -470,13 +635,18 @@ "Tip: To remove this root owned cluster, run: sudo {{.cmd}}": "", "To connect to this cluster, use: --context={{.name}}": "", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", + "To start minikube with Hyper-V, Powershell must be in your PATH`": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "", "Troubleshooting Commands:": "", + "Try 'minikube delete' to force new SSL certificates to be installed": "", + "Try 'minikube delete', and disable any conflicting VPN or firewall software": "", "Trying to delete invalid profile {{.profile}}": "", "Unable to bind flags": "", "Unable to create dedicated network, this might result in cluster IP change after restart: {{.error}}": "", @@ -485,6 +655,7 @@ "Unable to find control plane": "", "Unable to generate docs": "", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", "Unable to get current user": "", @@ -492,9 +663,11 @@ "Unable to get machine status": "", "Unable to get runtime": "", "Unable to kill mount process: {{.error}}": "", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images: {{.error}}": "", "Unable to load config: {{.error}}": "", "Unable to load host": "", + "Unable to load profile: {{.error}}": "", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "", "Unable to parse default Kubernetes version from constants: {{.error}}": "", "Unable to parse memory '{{.memory}}': {{.error}}": "", @@ -509,13 +682,17 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "", "Unmounting {{.path}} ...": "", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "", "Unpausing node {{.name}} ... ": "", + "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "", "Update server returned an empty list": "", "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", + "Upgrade to QEMU v3.1.0+, run 'virt-host-validate', or ensure that you are not running in a nested VM environment.": "", "Usage": "", "Usage: minikube completion SHELL": "", "Usage: minikube delete": "", @@ -526,46 +703,78 @@ "Usage: minikube node start [name]": "", "Usage: minikube node stop [name]": "", "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "", + "Use 'kubect get po -A' to find the correct and namespace name": "", "Use -A to specify all namespaces": "", "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", + "Use VirtualBox to remove the conflicting VM and/or network interfaces": "", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using image repository {{.name}}": "", + "Using image {{.registry}}{{.image}}": "", + "Using image {{.registry}}{{.image}} (global image repository)": "", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "", "Using the {{.driver}} driver based on existing profile": "", "Using the {{.driver}} driver based on user configuration": "", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", + "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "", "Verifying Kubernetes components...": "", "Verifying dashboard health ...": "", "Verifying proxy health ...": "", "Verifying {{.addon_name}} addon...": "", "Version: {{.version}}": "", + "VirtualBox and Hyper-V are having a conflict. Use '--driver=hyperv' or disable Hyper-V using: 'bcdedit /set hypervisorlaunchtype off'": "", + "VirtualBox cannot create a network, probably because it conflicts with an existing network that minikube no longer knows about. Try running 'minikube delete'": "", + "VirtualBox is broken. Disable real-time anti-virus software, reboot, and reinstall VirtualBox if the problem continues.": "", + "VirtualBox is broken. Reinstall VirtualBox, reboot, and run 'minikube delete'.": "", + "VirtualBox is unable to find its network interface. Try upgrading to the latest release and rebooting.": "", + "Virtualization support is disabled on your computer. If you are running minikube within a VM, try '--driver=docker'. Otherwise, consult your systems BIOS manual for how to enable virtualization.": "", "Wait failed: {{.error}}": "", "Want kubectl {{.version}}? Try 'minikube kubectl -- get pods -A'": "", "Where to root the NFS Shares, defaults to /nfsshares (hyperkit driver only)": "", "Whether to use external switch over Default Switch if virtual switch not explicitly specified. (hyperv driver only)": "", "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "", + "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", + "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "", + "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", + "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", + "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "", + "Your minikube vm is not running, try minikube start.": "", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "", "cancel any existing scheduled stop requests": "", "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "", + "containers paused status: {{.paused}}": "", "dashboard service is not running: {{.error}}": "", "delete ctx": "", "deleting node": "", @@ -573,13 +782,12 @@ "dry-run mode. Validates configuration, but does not mutate system state": "", "dry-run validation complete!": "", "enable failed": "", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "", "error getting primary control plane": "", "error getting ssh port": "", "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "", "error stopping tunnel": "", "error: --output must be 'yaml' or 'json'": "", @@ -589,18 +797,25 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", + "fish completion.": "", "if true, will embed the certs in kubeconfig.": "", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "", "initialization failed, will try again: {{.error}}": "", + "invalid kubernetes version": "", "keep the kube-context active after cluster is stopped. Defaults to false.": "", + "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "", "kubectl and minikube configuration will be stored in {{.home_folder}}": "", "kubectl not found. If you need it, try: 'minikube kubectl -- get pods -A'": "", "kubectl proxy": "", "libmachine failed": "", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "", - "minikube is exiting due to an error. If the above message is not useful, open an issue:": "", + "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", + "minikube is not meant for production use. You are opening non-local traffic": "", + "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", "minikube profile was successfully set to {{.profile_name}}": "", "minikube provisions and manages local Kubernetes clusters optimized for development workflows.": "", @@ -610,12 +825,14 @@ "minikube {{.version}} is available! Download it: {{.url}}": "", "mkcmp is used to compare performance of two minikube binaries": "", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "", + "mount could not connect": "", "mount failed": "", "namespaces to pause": "", "namespaces to unpause": "", "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", "none driver does not support multi-node clusters": "", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "", "preload extraction failed: \\\"No space left on device\\\"": "", @@ -643,14 +860,18 @@ "usage: minikube addons configure ADDON_NAME": "", "usage: minikube addons disable ADDON_NAME": "", "usage: minikube addons enable ADDON_NAME": "", + "usage: minikube addons images ADDON_NAME": "", "usage: minikube addons list": "", "usage: minikube addons open ADDON_NAME": "", "usage: minikube config unset PROPERTY_NAME": "", "usage: minikube delete": "", "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "", "version yaml failure": "", "zsh completion failed": "", + "zsh completion.": "", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.count}} nodes stopped.": "", @@ -660,6 +881,8 @@ "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB": "", "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", + "{{.name}} doesn't have images.": "", + "{{.name}} has following images:": "", "{{.name}} has no available configuration options": "", "{{.name}} is already running": "", "{{.name}} was successfully configured": "", @@ -668,6 +891,7 @@ "{{.ocibin}} is taking an unsually long time to respond, consider restarting {{.ocibin}}": "", "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", "{{.prefix}}minikube {{.version}} on {{.platform}}": "", + "{{.profile}} profile is not valid: {{.err}}": "", "{{.type}} is not yet a supported filesystem. We will try anyways!": "", "{{.url}} is not accessible: {{.error}}": "" } \ No newline at end of file diff --git a/translations/translations.go b/translations/translations.go new file mode 100644 index 0000000000..2407a74dc2 --- /dev/null +++ b/translations/translations.go @@ -0,0 +1,23 @@ +/* +Copyright 2021 The Kubernetes Authors All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package translations + +import "embed" + +// Translations contains all translation JSON files. +//go:embed *.json +var Translations embed.FS diff --git a/translations/zh-CN.json b/translations/zh-CN.json index 6427c7c2e6..a0fa529346 100644 --- a/translations/zh-CN.json +++ b/translations/zh-CN.json @@ -13,6 +13,7 @@ "'none' driver does not support 'minikube mount' command": "'none' 驱动不支持 'minikube mount' 命令", "'none' driver does not support 'minikube podman-env' command": "'none' 驱动不支持 'minikube podman-env' 命令", "'none' driver does not support 'minikube ssh' command": "'none' 驱动不支持 'minikube ssh' 命令", + "'none' driver does not support 'minikube ssh-host' command": "", "'{{.driver}}' driver reported an issue: {{.error}}": "'{{.driver}}' 驱动程序报告了一个问题: {{.error}}", "- Delete and recreate minikube cluster\n\t\tminikube delete\n\t\tminikube start --driver={{.driver_name}}": "", "- Docs https://docs.docker.com/docker-for-mac/#resources": "", @@ -20,6 +21,12 @@ "- Ensure your {{.driver_name}} daemon has access to enough CPU/memory resources.": "- 确保你的 {{.driver_name}} 守护程序有权访问足够的 CPU 和内存资源。", "- Prune unused {{.driver_name}} images, volumes, networks and abandoned containers.\n\n\t\t\t\t{{.driver_name}} system prune --volumes": "", "- Restart your {{.driver_name}} service": "- 重启你的 {{.driver_name}} 服务", + "- {{.logPath}}": "", + "--kvm-numa-count range is 1-8": "", + "--network flag is only valid with the docker/podman and KVM drivers, it will be ignored": "", + "\u003ctarget file absolute path\u003e must be an absolute Path. Relative Path is not allowed (example: \"/home/docker/copied.txt\")": "", + "==\u003e Audit \u003c==": "", + "==\u003e Last Start \u003c==": "", "A VPN or firewall is interfering with HTTP access to the minikube VM. Alternatively, try a different VM driver: https://minikube.sigs.k8s.io/docs/start/": "VPN 或者防火墙正在干扰对 minikube 虚拟机的 HTTP 访问。或者,您可以使用其它的虚拟机驱动:https://minikube.sigs.k8s.io/docs/start/", "A firewall is blocking Docker the minikube VM from reaching the image repository. You may need to select --image-repository, or use a proxy.": "防火墙正在阻止 minikube 虚拟机中的 Docker 访问镜像仓库。您可能需要选择 --image-repository 或使用代理", "A firewall is blocking Docker the minikube VM from reaching the internet. You may need to configure it to use a proxy.": "防火墙正在阻止 minikube 虚拟机中的 Docker 访问互联网。您可能需要对其进行配置为使用代理", @@ -32,8 +39,12 @@ "A set of apiserver names which are used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "一组在为 kubernetes 生成的证书中使用的 apiserver 名称。如果您希望将此 apiserver 设置为可从机器外部访问,则可以使用这组 apiserver 名称", "A set of key=value pairs that describe configuration that may be passed to different components.\nThe key should be '.' separated, and the first part before the dot is the component to apply the configuration to.\nValid components are: kubelet, kubeadm, apiserver, controller-manager, etcd, proxy, scheduler\nValid kubeadm parameters:": "一组用于描述可传递给不同组件的配置的键值对。\n其中键应以英文句点“.”分隔,英文句点前面的第一个部分是应用该配置的组件。\n有效组件包括:kubelet、kubeadm、apiserver、controller-manager、etcd、proxy、scheduler\n有效 kubeadm 参数包括:", "A set of key=value pairs that describe feature gates for alpha/experimental features.": "一组用于描述 alpha 版功能/实验性功能的功能限制的键值对。", - "Access the kubernetes dashboard running within the minikube cluster": "访问在 minikube 集群中运行的 kubernetes dashboard", + "Access the Kubernetes dashboard running within the minikube cluster": "访问在 minikube 集群中运行的 kubernetes dashboard", + "Access to ports below 1024 may fail on Windows with OpenSSH clients older than v8.1. For more information, see: https://minikube.sigs.k8s.io/docs/handbook/accessing/#access-to-ports-1024-on-windows-requires-root-permission": "", + "Add SSH identity key to SSH authentication agent": "", "Add an image to local cache.": "将 image 添加到本地缓存。", + "Add host key to SSH known_hosts file": "", + "Add image to cache for all running minikube clusters": "", "Add machine IP to NO_PROXY environment variable": "将机器IP添加到环境变量 NO_PROXY 中", "Add or delete an image from the local cache.": "在本地缓存中添加或删除 image。", "Add, delete, or push a local image into minikube": "", @@ -44,7 +55,9 @@ "Adds a node to the given cluster config, and starts it.": "将节点添加到给定的集群配置中,然后启动它", "Adds a node to the given cluster.": "将节点添加到给定的集群", "Advanced Commands:": "高级命令:", + "After the addon is enabled, please run \"minikube tunnel\" and your ingress resources would be available at \"127.0.0.1\"": "", "Aliases": "别名", + "All existing scheduled stops cancelled": "", "Allow user prompts for more information": "允许用户提示以获取更多信息", "Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to \\\"auto\\\" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers": "用于从中拉取 docker 镜像的备选镜像存储库。如果您对 gcr.io 的访问受到限制,则可以使用该镜像存储库。将镜像存储库设置为“auto”可让 minikube 为您选择一个存储库。对于中国大陆用户,您可以使用本地 gcr.io 镜像,例如 registry.cn-hangzhou.aliyuncs.com/google_containers", "Amount of RAM allocated to the minikube VM (format: \u003cnumber\u003e[\u003cunit\u003e], where unit = b, k, m or g)": "为 minikube 虚拟机分配的 RAM 容量(格式:\u003c数字\u003e[\u003c单位\u003e],其中单位 = b、k、m 或 g)", @@ -54,7 +67,9 @@ "Amount of time to wait for service in seconds": "等待服务的时间(单位秒)", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --driver to switch to it.": "", "Another hypervisor, such as VirtualBox, is conflicting with KVM. Please stop the other hypervisor, or use --vm-driver to switch to it.": "另外一个管理程序与 KVM 产生了冲突,如 VirtualBox。请停止其他的管理程序", + "Another minikube instance is downloading dependencies... ": "", "Another program is using a file required by minikube. If you are using Hyper-V, try stopping the minikube VM from within the Hyper-V manager": "", + "At least needs control plane nodes to enable addon": "", "Automatically selected the '{{.driver}}' driver": "自动选择 '{{.driver}}' 驱动", "Automatically selected the '{{.driver}}' driver (alternates: {{.alternates}})": "自动选择 '{{.driver}}' 驱动(可选项:{{.alternates}})", "Automatically selected the {{.driver}} driver": "自动选择 {{.driver}} 驱动", @@ -64,8 +79,15 @@ "Because you are using a Docker driver on {{.operating_system}}, the terminal needs to be open to run it.": "", "Bind Address: {{.Address}}": "绑定地址:{{.Address}}", "Block until the apiserver is servicing API requests": "阻塞直到 apiserver 为 API 请求提供服务", + "Booting up control plane ...": "", "Both driver={{.driver}} and vm-driver={{.vmd}} have been set.\n\n Since vm-driver is deprecated, minikube will default to driver={{.driver}}.\n\n If vm-driver is set in the global config, please run \"minikube config unset vm-driver\" to resolve this warning.\n\t\t\t": "", + "Bridge CNI is incompatible with multi-node clusters, use a different CNI": "", + "Build a container image in minikube": "", + "Build a container image, using the container runtime.": "", "CNI plug-in to use. Valid options: auto, bridge, calico, cilium, flannel, kindnet, or path to a CNI manifest (default: auto)": "", + "Cache image from docker daemon": "", + "Cache image from remote registry": "", + "Cannot find directory {{.path}} for copy": "", "Cannot find directory {{.path}} for mount": "找不到用来挂载的 {{.path}} 目录", "Cannot use both --output and --format options": "不能同时使用 --output 和 --format 选项", "Check if you have unnecessary pods running by running 'kubectl get po -A": "", @@ -81,6 +103,7 @@ "Check your firewall rules for interference, and run 'virt-host-validate' to check for KVM configuration issues. If you are running minikube within a VM, consider using --vm-driver=none": "检查您的防火墙规则是否存在干扰,然后运行 'virt-host-validate' 以检查 KVM 配置问题,如果在虚拟机中运行minikube,请考虑使用 --vm-driver=none", "Choose a smaller value for --memory, such as 2000": "为 --memory 选择一个更小的值,例如 2000", "ChromeOS is missing the kernel support necessary for running Kubernetes": "ChromeOS 缺少运行 Kubernetes 所需的内核支持", + "Cluster was created without any CNI, adding a node to it might cause broken networking.": "", "Configuration and Management Commands:": "配置和管理命令:", "Configure a default route on this Linux host, or use another --driver that does not require it": "为当前 Linux 主机配置一个默认的路由, 或者使用另一个不需要他的 --driver", "Configure a default route on this Linux host, or use another --vm-driver that does not require it": "为当前 Linux 主机配置一个默认的路由, 或者使用另一个不需要他的 --vm-driver", @@ -88,6 +111,7 @@ "Configure environment to use minikube's Docker daemon": "配置环境以使用 minikube's Docker daemon", "Configure environment to use minikube's Podman service": "配置环境以使用 minikube's Podman service", "Configures the addon w/ADDON_NAME within minikube (example: minikube addons configure registry-creds). For a list of available addons use: minikube addons list": "在 minikube 中配置插件 w/ADDON_NAME(例如:minikube addons configure registry-creds)。查看相关可用的插件列表,请使用:minikube addons list", + "Configuring RBAC rules ...": "", "Configuring environment for Kubernetes {{.k8sVersion}} on {{.runtime}} {{.runtimeVersion}}": "开始为Kubernetes {{.k8sVersion}},{{.runtime}} {{.runtimeVersion}} 配置环境变量", "Configuring local host environment ...": "开始配置本地主机环境...", "Configuring {{.name}} (Container Networking Interface) ...": "", @@ -96,11 +120,16 @@ "Connect to LoadBalancer services": "连接到 LoadBalancer 服务", "Consider creating a cluster with larger memory size using `minikube start --memory SIZE_MB` ": "", "Consider increasing Docker Desktop's memory size.": "", + "Continuously listing/getting the status with optional interval duration.": "", + "Control Plane could not update, try minikube delete --all --purge": "", + "Copy the specified file into minikube": "", + "Copy the specified file into minikube, it will be saved at path \u003ctarget file absolute path\u003e in your minikube.\\nExample Command : \\\"minikube cp a.txt /home/docker/b.txt\\\"\\n \\\"minikube cp a.txt minikube-m02:/home/docker/b.txt\\\"\\n": "", "Could not determine a Google Cloud project, which might be ok.": "", "Could not find any GCP credentials. Either run `gcloud auth application-default login` or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to the path of your credentials file.": "", "Could not get profile flag": "无法获取配置文件标志", "Could not process error from failed deletion": "无法处理删除失败的错误", "Could not process errors from failed deletion": "无法处理删除失败的错误", + "Could not resolve IP address": "", "Country code of the image mirror to be used. Leave empty to use the global one. For Chinese mainland users, set it to cn.": "需要使用的镜像镜像的国家/地区代码。留空以使用全球代码。对于中国大陆用户,请将其设置为 cn。", "Created a new profile : {{.profile_name}}": "创建了新的配置文件:{{.profile_name}}", "Creating Kubernetes in {{.driver_name}} container with (CPUs={{.number_of_cpus}}), Memory={{.memory_size}}MB ({{.host_memory_size}}MB available) ...": "正在 {{.driver_name}} 容器中 创建 Kubernetes,(CPUs={{.number_of_cpus}}), 内存={{.memory_size}}MB ({{.host_memory_size}}MB 可用", @@ -123,6 +152,7 @@ "Deletes a node from a cluster.": "从集群中删除节点。", "Deleting \"{{.profile_name}}\" in {{.driver_name}} ...": "正在删除 {{.driver_name}} 中的“{{.profile_name}}”…", "Deleting container \"{{.name}}\" ...": "正在删除容器 \"{{.name}}\" ...", + "Deleting existing cluster {{.name}} with different driver {{.driver_name}} due to --delete-on-failure flag set by the user. ": "", "Deleting node {{.name}} from cluster {{.cluster}}": "正在从集群 {{.cluster}} 中删除节点 {{.name}}", "Disable checking for the availability of hardware virtualization before the vm is started (virtualbox driver only)": "禁用在启动虚拟机之前检查硬件虚拟化的可用性(仅限 virtualbox 驱动程序)", "Disable dynamic memory in your VM manager, or pass in a larger --memory value": "禁用虚拟机管理器中的动态内存,或者使用 --memory 传入更大的值", @@ -142,21 +172,21 @@ "Docker Desktop is configured for Windows containers, but Linux containers are required for minikube": "", "Docker Desktop only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "Docker Desktop only has {{.size}}MiB available, you may encounter application deployment failures.": "", + "Docker container exited prematurely after it was created, consider investigating Docker's performance/health.": "", "Docker has less than 2 CPUs available, but Kubernetes requires at least 2 to be available": "", "Docker inside the VM is unavailable. Try running 'minikube delete' to reset the VM.": "虚拟机中的 Docker 不可用,尝试运行 'minikube delete' 来重置虚拟机。", "Docs have been saved at - {{.path}}": "文档已保存在 - {{.path}}", "Documentation: {{.url}}": "文档:{{.url}}", "Done! kubectl is now configured to use \"{{.name}}\"": "完成!kubectl 已经配置至 \"{{.name}}\"", - "Done! kubectl is now configured to use \"{{.name}}\" by default": "", + "Done! kubectl is now configured to use \"{{.name}}\" cluster and \"{{.ns}}\" namespace by default": "", "Done! kubectl is now configured to use {{.name}}": "完成!kubectl已经配置至{{.name}}", "Download complete!": "下载完成!", "Downloading Kubernetes {{.version}} preload ...": "", "Downloading VM boot image ...": "正在下载 VM boot image...", "Downloading driver {{.driver}}:": "正在下载驱动 {{.driver}}:", "Downloading {{.name}} {{.version}}": "正在下载 {{.name}} {{.version}}", - "Due to issues with CRI-O post v1.17.3, we need to restart your cluster.": "", "Due to networking limitations of driver {{.driver_name}} on {{.os_name}}, {{.addon_name}} addon is not supported.\nAlternatively to use this addon you can use a vm-based driver:\n\n\t'minikube start --vm=true'\n\nTo track the update on this work in progress feature please check:\nhttps://github.com/kubernetes/minikube/issues/7332": "", - "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not supported. Try using a different driver.": "", + "Due to networking limitations of driver {{.driver_name}}, {{.addon_name}} addon is not fully supported. Try using a different driver.": "", "ERROR creating `registry-creds-acr` secret": "", "ERROR creating `registry-creds-dpr` secret": "创建 `registry-creds-dpr` secret 时出错", "ERROR creating `registry-creds-ecr` secret: {{.error}}": "创建 `registry-creds-ecr` secret 时出错:{{.error}}", @@ -172,7 +202,7 @@ "Enable the default CNI plugin (/etc/cni/net.d/k8s.conf). Used in conjunction with \\\"--network-plugin=cni\\\".": "启用默认 CNI 插件 (/etc/cni/net.d/k8s.conf)。与“--network-plugin=cni”结合使用。", "Enabled addons: {{.addons}}": "", "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list": "启动 minikube 插件 w/ADDON_NAME(例如:minikube addons enable dashboard)。查看相关可用的插件列表,请使用:minikube addons list", - "Enables the addon w/ADDON_NAME within minikube (example: minikube addons enable dashboard). For a list of available addons use: minikube addons list ": "", + "Enables the addon w/ADDON_NAME within minikube. For a list of available addons use: minikube addons list ": "", "Enabling '{{.name}}' returned an error: {{.error}}": "", "Enabling dashboard ...": "正在开启 dashboard ...", "Ensure that CRI-O is installed and healthy: Run 'sudo systemctl start crio' and 'journalctl -u crio'. Alternatively, use --container-runtime=docker": "确保 CRI-O 已安装且正常运行:执行 'sudo systemctl start crio' and 'journalctl -u crio'。或者使用 --container-runtime=docker", @@ -180,10 +210,15 @@ "Ensure that Docker is installed and healthy: Run 'sudo systemctl start docker' and 'journalctl -u docker'. Alternatively, select another value for --vm-driver": "确保 Docker 已安装且正常运行: 执行 'sudo systemctl start docker' and 'journalctl -u docker'。或者为 --vm-driver 指定另外的值", "Ensure that the required 'pids' cgroup is enabled on your host: grep pids /proc/cgroups": "", "Ensure that the user listed in /etc/libvirt/qemu.conf has access to your home directory": "确保 /etc/libvirt/qemu.conf 中列出的用户具备访问您 home 目录的权限", + "Ensure that you are a member of the appropriate libvirt group (remember to relogin for group changes to take effect!)": "", "Ensure that your value for HTTPS_PROXY points to an HTTPS proxy rather than an HTTP proxy": "确保您配置的 HTTPS_PROXY 指向了 HTTPS 代理而不是 HTTP 代理", + "Ensure the tmp directory path is writable to the current user.": "", + "Ensure you have at least 20GB of free disk space.": "", "Ensure your {{.driver_name}} is running and is healthy.": "", "Environment variables to pass to the Docker daemon. (format: key=value)": "传递给 Docker 守护进程的环境变量。(格式:键值对)", + "Environment variables to pass to the build. (format: key=value)": "", "Error checking driver version: {{.error}}": "检查驱动程序版本时出错:{{.error}}", + "Error code docs have been saved at - {{.path}}": "", "Error converting status to json": "转换状态为 json 时出错", "Error creating list template": "创建 list template 时出错", "Error creating minikube directory": "创建 minikube 目录时出错", @@ -234,6 +269,7 @@ "Error unsetting shell variables": "取消设置 shell 变量时出错", "Error while setting kubectl current context : {{.error}}": "设置 kubectl 上下文时出错 :{{.error}}", "Error while setting kubectl current context: {{.error}}": "设置 kubectl 上下文时出错:{{.error}}", + "Error with ssh-add": "", "Error writing mount pid": "写入 mount pid 时出错", "Error: You have selected Kubernetes v{{.new}}, but the existing cluster for your profile is running Kubernetes v{{.old}}. Non-destructive downgrades are not supported, but you can proceed by performing one of the following options:\n\n* Recreate the cluster using Kubernetes v{{.new}}: Run \"minikube delete {{.profile}}\", then \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Create a second cluster with Kubernetes v{{.new}}: Run \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\"\n* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run \"minikube start {{.profile}} --kubernetes-version={{.old}}\"": "错误:您已选择 Kubernetes v{{.new}},但您的配置文件的现有集群正在运行 Kubernetes v{{.old}}。非破坏性降级不受支持,但若要继续操作,您可以执行以下选项之一:\n\n* 使用 Kubernetes v{{.new}} 重新创建现有集群:运行“minikube delete {{.profile}}”,然后运行“minikube start {{.profile}} --kubernetes-version={{.new}}”\n* 使用 Kubernetes v{{.new}} 再创建一个集群:运行“minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}”\n* 通过 Kubernetes v{{.old}} 或更高版本重复使用现有集群:运行“minikube start {{.profile}} --kubernetes-version={{.old}}”", "Error: You have selected Kubernetes v{{.new}}, but the existing cluster for your profile is running Kubernetes v{{.old}}. Non-destructive downgrades are not supported, but you can proceed by performing one of the following options:\n* Recreate the cluster using Kubernetes v{{.new}}: Run \"minikube delete {{.profile}}\", then \"minikube start {{.profile}} --kubernetes-version={{.new}}\"\n* Create a second cluster with Kubernetes v{{.new}}: Run \"minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}\"\n* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run \"minikube start {{.profile}} --kubernetes-version={{.old}}": "错误:您已选择 Kubernetes v{{.new}},但您的配置文件的现有集群正在运行 Kubernetes v{{.old}}。非破坏性降级不受支持,但若要继续操作,您可以执行以下选项之一:\n* 使用 Kubernetes v{{.new}} 重新创建现有集群:运行“minikube delete {{.profile}}”,然后运行“minikube start {{.profile}} --kubernetes-version={{.new}}”\n* 使用 Kubernetes v{{.new}} 再创建一个集群:运行“minikube start -p \u003cnew name\u003e --kubernetes-version={{.new}}”\n* 通过 Kubernetes v{{.old}} 或更高版本重复使用现有集群:运行“minikube start {{.profile}} --kubernetes-version={{.old}}”", @@ -245,8 +281,11 @@ "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": "", + "Failed to build image": "", "Failed to cache ISO": "缓存ISO 时失败", "Failed to cache and load images": "缓存以及导入镜像失败", "Failed to cache binaries": "缓存二进制文件失败", @@ -257,7 +296,11 @@ "Failed to check if machine exists": "无法检测机器是否存在", "Failed to check main repository and mirrors for images": "", "Failed to check main repository and mirrors for images for images": "无法检测主仓库和镜像仓库中的镜像", + "Failed to configure metallb IP {{.profile}}": "", + "Failed to create file": "", + "Failed to create runtime": "", "Failed to delete cluster {{.name}}, proceeding with retry anyway.": "", + "Failed to delete cluster {{.name}}.": "", "Failed to delete cluster: {{.error}}": "未能删除集群:{{.error}}", "Failed to delete cluster: {{.error}}__1": "未能删除集群:{{.error}}", "Failed to delete images": "删除镜像时失败", @@ -272,19 +315,26 @@ "Failed to get service URL: {{.error}}": "获取 service URL 失败:{{.error}}", "Failed to kill mount process: {{.error}}": "未能终止装载进程:{{.error}}", "Failed to list cached images": "无法列出缓存镜像", + "Failed to list images": "", + "Failed to load image": "", + "Failed to persist images": "", + "Failed to pull image": "", "Failed to reload cached images": "重新加载缓存镜像失败", + "Failed to remove image": "", "Failed to remove profile": "无法删除配置文件", "Failed to save config": "无法保存配置", "Failed to save config {{.profile}}": "", + "Failed to save dir": "", + "Failed to save stdin": "", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}": "未能设置 NO_PROXY 环境变量。请使用“export NO_PROXY=$NO_PROXY,{{.ip}}”", "Failed to set NO_PROXY Env. Please use `export NO_PROXY=$NO_PROXY,{{.ip}}`.": "未能设置 NO_PROXY 环境变量。请使用“export NO_PROXY=$NO_PROXY,{{.ip}}”。", "Failed to setup certs": "设置 certs 失败", "Failed to setup kubeconfig": "设置 kubeconfig 失败", + "Failed to start container runtime": "", "Failed to start {{.driver}} {{.driver_type}}. Running \"{{.cmd}}\" may fix it: {{.error}}": "", "Failed to stop node {{.name}}": "", "Failed to update cluster": "更新 cluster 失败", "Failed to update config": "更新 config 失败", - "Failed to verify '{{.driver_name}} info' will try again ...": "", "Failed unmount: {{.error}}": "unmount 失败:{{.error}}", "File permissions used for the mount": "用于 mount 的文件权限", "Filter to use only VM Drivers": "", @@ -296,15 +346,22 @@ "For more information see: https://minikube.sigs.k8s.io/docs/drivers/{{.driver}}": "", "For more information, see:": "如需了解详情,请参阅:", "For more information, see: https://minikube.sigs.k8s.io/docs/reference/drivers/none/": "", + "For more information, see: {{.url}}": "", "Force environment to be configured for a specified shell: [fish, cmd, powershell, tcsh, bash, zsh], default is auto-detect": "强制为指定的 shell 配置环境:[fish, cmd, powershell, tcsh, bash, zsh],默认为 auto-detect", "Force minikube to perform possibly dangerous operations": "强制 minikube 执行可能有风险的操作", "Format to print stdout in. Options include: [text,json]": "", + "Found docker, but the docker service isn't running. Try restarting the docker service.": "", + "Found driver(s) but none were healthy. See above for suggestions how to fix installed drivers.": "", "Found network options:": "找到的网络选项:", "Found {{.number}} invalid profile(s) !": "找到 {{.number}} 个无效的配置文件!", "Found {{.number}} invalid profile(s) ! ": "", "Generate command completion for a shell": "", + "Generate command completion for bash.": "", + "Generate command completion for fish .": "", + "Generate command completion for zsh.": "", "Generate unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Generate unable to parse memory '{{.memory}}': {{.error}}": "", + "Generating certificates and keys ...": "", "Get or list the current profiles (clusters)": "", "Gets the kubernetes URL(s) for the specified service in your local cluster": "获取本地集群中指定服务的 kubernetes URL", "Gets the kubernetes URL(s) for the specified service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "获取本地集群中指定服务的 kubernetes URL。如果有多个 URL,他们将一次打印一个", @@ -324,31 +381,45 @@ "Hyperkit is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --vm-driver": "Hyperkit 已损坏。升级到最新的 hyperkit 版本以及/或者 Docker 桌面版。或者,你可以通过 --vm-driver 切换其他选项", "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --driver": "", "Hyperkit networking is broken. Upgrade to the latest hyperkit version and/or Docker for Desktop. Alternatively, you may choose an alternate --vm-driver": "Hyperkit 的网络挂了。升级到最新的 hyperkit 版本以及/或者 Docker 桌面版。或者,你可以通过 --vm-driver 切换其他选项", + "IP Address to use to expose ports (docker and podman driver only)": "", + "IP address (ssh driver only)": "", + "If present, writes to the provided file instead of stdout.": "", "If set, automatically updates drivers to the latest version. Defaults to true.": "如果设置了,将自动更新驱动到最新版本。默认为 true。", "If set, delete the current cluster if start fails and try again. Defaults to false.": "", "If set, download tarball of preloaded images if available to improve start time. Defaults to true.": "", - "If set, force the container runtime to use sytemd as cgroup manager. Currently available for docker and crio. Defaults to false.": "", + "If set, force the container runtime to use systemd as cgroup manager. Defaults to false.": "", "If set, install addons. Defaults to true.": "", "If set, pause all namespaces": "", "If set, unpause all namespaces": "", - "If the above advice does not help, please let us know: ": "", + "If the above advice does not help, please let us know:": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --driver=none.": "", "If true, cache docker images for the current bootstrapper and load them into the machine. Always false with --vm-driver=none.": "如果为 true,请缓存当前引导程序的 docker 镜像并将其加载到机器中。在 --vm-driver=none 情况下始终为 false。", "If true, only download and cache files for later use - don't install or start anything.": "如果为 true,仅会下载和缓存文件以备后用 - 不会安装或启动任何项。", + "If true, pods might get deleted and restarted on addon enable": "", + "If true, returns list of profiles faster by skipping validating the status of the cluster.": "", "If true, the added node will be marked for work. Defaults to true.": "", "If true, the node added will also be a control plane in addition to a worker.": "", + "If true, will perform potentially dangerous operations. Use with discretion.": "", "If you are running minikube within a VM, consider using --driver=none:": "", "If you are still interested to make {{.driver_name}} driver work. The following suggestions might help you get passed this issue:": "", "If you don't want your credentials mounted into a specific pod, add a label with the `gcp-auth-skip-secret` key to your pod configuration.": "", + "If you want existing pods to be mounted with credentials, either recreate them or rerun addons enable with --refresh.": "", + "Ignoring empty custom image {{.name}}": "", + "Ignoring invalid pair entry {{.pair}}": "", + "Ignoring unknown custom image {{.name}}": "", + "Ignoring unknown custom registry {{.name}}": "", "Images Commands:": "", + "Images used by this addon. Separated by commas.": "", "In order to use the fall back image, you need to log in to the github packages registry": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "", "Insecure Docker registries to pass to the Docker daemon. The default service CIDR range will automatically be added.": "传递给 Docker 守护进程的不安全 Docker 注册表。系统会自动添加默认服务 CIDR 范围。", "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.": "", "Kill the mount process spawned by minikube start": "", "Kubelet network plug-in to use (default: auto)": "", "Kubernetes requires at least 2 CPU's to start": "", @@ -359,14 +430,19 @@ "Launching proxy ...": "", "List all available images from the local cache.": "", "List existing minikube nodes.": "", + "List image names the addon w/ADDON_NAME used. For a list of available addons use: minikube addons list": "", + "List images": "", "List nodes.": "", "List of guest VSock ports that should be exposed as sockets on the host (hyperkit driver only)": "应在主机上公开为套接字的访客 VSock 端口列表(仅限 hyperkit 驱动程序)", "List of ports that should be exposed (docker and podman driver only)": "", + "Listening to 0.0.0.0 on external docker host {{.host}}. Please be advised": "", + "Listening to {{.listenAddr}}. This is not recommended and can cause a security vulnerability. Use at your own risk": "", "Lists all available minikube addons as well as their current statuses (enabled/disabled)": "", "Lists all minikube profiles.": "", "Lists all valid default values for PROPERTY_NAME": "", "Lists all valid minikube profiles and detects all possible invalid profiles.": "", "Lists the URLs for the services in your local cluster": "", + "Load a image into minikube": "", "Local folders to share with Guest via NFS mounts (hyperkit driver only)": "通过 NFS 装载与访客共享的本地文件夹(仅限 hyperkit 驱动程序)", "Local proxy ignored: not passing {{.name}}={{.value}} to docker env.": "", "Location of the VPNKit socket used for networking. If empty, disables Hyperkit VPNKitSock, if 'auto' uses Docker for Mac VPNKit connection, otherwise uses the specified VSock (hyperkit driver only)": "用于网络连接的 VPNKit 套接字的位置。如果为空,则停用 Hyperkit VPNKitSock;如果为“auto”,则将 Docker 用于 Mac VPNKit 连接;否则使用指定的 VSock(仅限 hyperkit 驱动程序)", @@ -374,17 +450,18 @@ "Locations to fetch the minikube ISO from.": "", "Log into or run a command on a machine with SSH; similar to 'docker-machine ssh'.": "", "Log into the minikube environment (for debugging)": "", + "Manage images": "", "Message Size: {{.size}}": "", "Minikube is a CLI tool that provisions and manages single-node Kubernetes clusters optimized for development workflows.": "Minikube 是一个命令行工具,它提供和管理针对开发工作流程优化的单节点 Kubernetes 集群。", "Modify minikube config": "修改 minikube 配置", "Modify minikube's kubernetes addons": "修改 minikube 的 kubernetes 插件", "Modify persistent configuration values": "", + "More information: https://docs.docker.com/engine/install/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities": "", "Most users should use the newer 'docker' driver instead, which does not require root!": "", "Mount type: {{.name}}": "", "Mounting host path {{.sourcePath}} into VM as {{.destinationPath}} ...": "", "Mounts the specified directory into minikube": "将指定的目录挂载到 minikube", "Mounts the specified directory into minikube.": "将指定的目录挂载到 minikube。", - "Multi-node clusters are currently experimental and might exhibit unintended behavior.": "", "Multiple errors deleting profiles": "删除配置文件时出现多个错误", "Multiple minikube profiles were found -": "发现了多个 minikube 配置文件 -", "Multiple minikube profiles were found - ": "", @@ -392,9 +469,11 @@ "NIC Type used for nat network. One of Am79C970A, Am79C973, 82540EM, 82543GC, 82545EM, or virtio (virtualbox driver only)": "", "NOTE: This process must stay alive for the mount to be accessible ...": "", "Networking and Connectivity Commands:": "网络和连接命令:", + "No IP address provided. Try specifying --ssh-ip-address, or see https://minikube.sigs.k8s.io/docs/drivers/ssh/": "", "No changes required for the \"{{.context}}\" context": "", - "No minikube profile was found. You can create one using `minikube start`.": "", + "No minikube profile was found. ": "", "No possible driver was detected. Try specifying --driver, or see https://minikube.sigs.k8s.io/docs/start/": "", + "No such addon {{.name}}": "", "Node {{.name}} failed to start, deleting and trying again.": "", "Node {{.name}} was successfully deleted.": "", "Node {{.nodeName}} does not exist.": "", @@ -403,8 +482,8 @@ "None of the known repositories is accessible. Consider specifying an alternative image repository with --image-repository flag": "已知存储库都无法访问。请考虑使用 --image-repository 标志指定备选镜像存储库", "Noticed you have an activated docker-env on {{.driver_name}} driver in this terminal:": "", "Noticed you have an activated podman-env on {{.driver_name}} driver in this terminal:": "", - "Number of CPUs allocated to Kubernetes.": "", "Number of CPUs allocated to the minikube VM": "分配给 minikube 虚拟机的 CPU 的数量", + "Number of extra disks created and attached to the minikube VM (currently only implemented for hyperkit driver)": "", "Number of lines back to go within the log": "", "OS release is {{.pretty_name}}": "", "One of 'yaml' or 'json'.": "", @@ -419,7 +498,9 @@ "Operations on nodes": "", "Options: {{.options}}": "", "Output format. Accepted values: [json]": "", - "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash-completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Outputs minikube shell completion for the given shell (bash, zsh or fish)\n\n\tThis depends on the bash-completion binary. Example installation instructions:\n\tOS X:\n\t\t$ brew install bash-completion\n\t\t$ source $(brew --prefix)/etc/bash_completion\n\t\t$ minikube completion bash \u003e ~/.minikube-completion # for bash users\n\t\t$ minikube completion zsh \u003e ~/.minikube-completion # for zsh users\n\t\t$ source ~/.minikube-completion\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\tUbuntu:\n\t\t$ apt-get install bash-completion\n\t\t$ source /etc/bash_completion\n\t\t$ source \u003c(minikube completion bash) # for bash users\n\t\t$ source \u003c(minikube completion zsh) # for zsh users\n\t\t$ minikube completion fish \u003e ~/.config/fish/completions/minikube.fish # for fish users\n\n\tAdditionally, you may want to output the completion to a file and source in your .bashrc\n\n\tNote for zsh users: [1] zsh completions are only supported in versions of zsh \u003e= 5.2\n\tNote for fish users: [2] please refer to this docs for more details https://fishshell.com/docs/current/#tab-completion\n": "", + "Overwrite image even if same image:tag name exists": "", + "Path to the Dockerfile to use (optional)": "", "Pause": "暂停", "Paused kubelet and {{.count}} containers": "已暂停 kubelet 和 {{.count}} 个容器", "Paused kubelet and {{.count}} containers in: {{.namespaces}}": "已暂停 {{.namespaces}} 中的 kubelet 和 {{.count}} 个容器", @@ -427,6 +508,7 @@ "Paused {{.count}} containers in: {{.namespaces}}": "", "Pausing node {{.name}} ... ": "", "Permissions: {{.octalMode}} ({{.writtenMode}})": "权限: {{.octalMode}} ({{.writtenMode}})", + "Please attach the following file to the GitHub issue:": "", "Please create a cluster with bigger disk size: `minikube start --disk SIZE_MB` ": "", "Please either authenticate to the registry or use --base-image flag to use a different registry.": "", "Please enter a value:": "请输入一个值:", @@ -435,10 +517,14 @@ "Please install the minikube hyperkit VM driver, or select an alternative --driver": "", "Please install the minikube kvm2 VM driver, or select an alternative --driver": "", "Please make sure the service you are looking for is deployed or is in the correct namespace.": "", + "Please provide a path or url to build": "", + "Please provide an image in your local daemon to load into minikube via \u003cminikube image load IMAGE_NAME\u003e": "", "Please re-eval your docker-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} docker-env'\n\n\t": "", "Please re-eval your podman-env, To ensure your environment variables have updated ports:\n\n\t'minikube -p {{.profile_name}} podman-env'\n\n\t": "", "Please see {{.documentation_url}} for more details": "", "Please specify the directory to be mounted: \n\tminikube mount \u003csource directory\u003e:\u003ctarget directory\u003e (example: \"/host-home:/vm-home\")": "", + "Please specify the path to copy: \n\tminikube cp \u003csource file path\u003e \u003ctarget file absolute path\u003e (example: \"minikube cp a/b.txt /copied.txt\")": "", + "Please try purging minikube using `minikube delete --all --purge`": "", "Please upgrade the '{{.driver_executable}}'. {{.documentation_url}}": "请升级“{{.driver_executable}}”。{{.documentation_url}}", "Please visit the following link for documentation around this: \n\thttps://help.github.com/en/packages/using-github-packages-with-your-projects-ecosystem/configuring-docker-for-use-with-github-packages#authenticating-to-github-packages\n": "", "Populates the specified folder with documentation in markdown about minikube": "", @@ -455,25 +541,32 @@ "Profile gets or sets the current minikube profile": "获取或设置当前的 minikube 配置文件", "Profile name \"{{.profilename}}\" is minikube keyword. To delete profile use command minikube delete -p \u003cprofile name\u003e": "配置文件名称 \"{{.profilename}}\" 是 minikube 的一个关键字。使用 minikube delete -p \u003cprofile name\u003e 命令 删除配置文件", "Profile name \"{{.profilename}}\" is reserved keyword. To delete this profile, run: \"{{.cmd}}\"": "", + "Profile name '{{.name}}' is duplicated with machine name '{{.machine}}' in profile '{{.profile}}'": "", "Profile name '{{.name}}' is not valid": "", "Profile name '{{.profilename}}' is not valid": "", + "Profile name should be unique": "", "Provide VM UUID to restore MAC address (hyperkit driver only)": "提供虚拟机 UUID 以恢复 MAC 地址(仅限 hyperkit 驱动程序)", + "Pull the remote image (no caching)": "", "Pulling base image ...": "", "Pulling images ...": "拉取镜像 ...", + "Push the new image (requires tag)": "", "Reboot to complete VirtualBox installation, verify that VirtualBox is not blocked by your system, and/or use another hypervisor": "重启以完成 VirtualBox 安装,检查 VirtualBox 未被您的操作系统禁用,或者使用其他的管理程序。", "Rebuild libvirt with virt-network support": "", "Received {{.name}} signal": "收到 {{.name}} 信号", "Reconfiguring existing host ...": "重新配置现有主机", - "Registry addon on with {{.driver}} uses {{.port}} please use that instead of default 5000": "", + "Registries used by this addon. Separated by commas.": "", + "Registry addon with {{.driver}} driver uses port {{.port}} please use that instead of default port 5000": "", "Registry mirrors to pass to the Docker daemon": "传递给 Docker 守护进程的注册表镜像", "Reinstall VirtualBox and reboot. Alternatively, try the kvm2 driver: https://minikube.sigs.k8s.io/docs/reference/drivers/kvm2/": "", "Reinstall VirtualBox and verify that it is not blocked: System Preferences -\u003e Security \u0026 Privacy -\u003e General -\u003e Some system software was blocked from loading": "", "Related issue: {{.url}}": "", "Related issues:": "相关问题:", "Relaunching Kubernetes using {{.bootstrapper}} ...": "正在使用 {{.bootstrapper}} 重新启动 Kubernetes…", + "Remove one or more images": "", "Remove the invalid --docker-opt or --insecure-registry flag if one was provided": "", "Removed all traces of the \"{{.name}}\" cluster.": "", "Removing {{.directory}} ...": "正在移除 {{.directory}}…", + "Requested cpu count {{.requested_cpus}} is greater than the available cpus of {{.avail_cpus}}": "", "Requested cpu count {{.requested_cpus}} is less than the minimum allowed of {{.minimum_cpus}}": "请求的 CPU 数量 {{.requested_cpus}} 小于允许的最小值 {{.minimum_cpus}}", "Requested disk size {{.requested_size}} is less than minimum of {{.minimum_size}}": "请求的磁盘大小 {{.requested_size}} 小于最小值 {{.minimum_size}}", "Requested memory allocation ({{.memory}}MB) is less than the default memory allocation of {{.default_memorysize}}MB. Beware that minikube might not work correctly or crash unexpectedly.": "请求的内存分配 ({{.memory}}MB) 小于默认内存分配 {{.default_memorysize}}MB。请注意 minikube 可能无法正常运行或可能会意外崩溃。", @@ -486,11 +579,16 @@ "Restart Docker, Ensure docker is running and then run: 'minikube delete' and then 'minikube start' again": "", "Restarting existing {{.driver_name}} {{.machine_type}} for \"{{.cluster}}\" ...": "", "Restarting the {{.name}} service may improve performance.": "", + "Retrieve the ssh host key of the specified node": "", + "Retrieve the ssh host key of the specified node.": "", "Retrieve the ssh identity key path of the specified cluster": "检索指定集群的 ssh 密钥路径", "Retrieve the ssh identity key path of the specified cluster.": "检索指定集群的 ssh 密钥路径。", + "Retrieve the ssh identity key path of the specified node": "", + "Retrieve the ssh identity key path of the specified node, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster": "检索正在运行的群集的 IP 地址", - "Retrieves the IP address of the running cluster, and writes it to STDOUT.": "", "Retrieves the IP address of the running cluster, checks it\n\t\t\twith IP in kubeconfig, and corrects kubeconfig if incorrect.": "", + "Retrieves the IP address of the specified node": "", + "Retrieves the IP address of the specified node, and writes it to STDOUT.": "", "Returns a URL to connect to a service": "", "Returns logs to debug a local Kubernetes cluster": "", "Returns the Kubernetes URL for a service in your local cluster. In the case of multiple URLs they will be printed one at a time.": "", @@ -502,21 +600,27 @@ "Run a kubectl binary matching the cluster version": "", "Run kubectl": "运行 kubectl", "Run minikube from the C: drive.": "", - "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nExamples:\nminikube kubectl -- --help\nminikube kubectl -- get pods --namespace kube-system": "", + "Run the Kubernetes client, download it if necessary. Remember -- after kubectl!\n\nThis will run the Kubernetes client (kubectl) with the same version as the cluster\n\nNormally it will download a binary matching the host operating system and architecture,\nbut optionally you can also run it directly on the control plane over the ssh connection.\nThis can be useful if you cannot run kubectl locally for some reason, like unsupported\nhost. Please be aware that when using --ssh all paths will apply to the remote machine.": "", "Run: 'Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-Tools-All'": "", "Run: 'chmod 600 $HOME/.kube/config'": "执行 'chmod 600 $HOME/.kube/config'", "Run: 'kubectl delete clusterrolebinding kubernetes-dashboard'": "", + "Run: 'minikube delete --all' to clean up all the abandoned networks.": "", "Run: 'sudo chown $USER $HOME/.kube/config \u0026\u0026 chmod 600 $HOME/.kube/config'": "", "Run: 'sudo mkdir /sys/fs/cgroup/systemd \u0026\u0026 sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd'": "", "Running on localhost (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", - "See details at https://github.com/kubernetes/minikube/issues/8861": "", + "Running remotely (CPUs={{.number_of_cpus}}, Memory={{.memory_size}}MB, Disk={{.disk_size}}MB) ...": "", + "SSH key (ssh driver only)": "", + "SSH port (ssh driver only)": "", + "SSH user (ssh driver only)": "", "Select a valid value for --dnsdomain": "", "Selecting '{{.driver}}' driver from existing profile (alternates: {{.alternates}})": "从现有配置文件中选择 '{{.driver}}' 驱动程序 (可选:{{.alternates}})", "Selecting '{{.driver}}' driver from user configuration (alternates: {{.alternates}})": "从用户配置中选择 {{.driver}}' 驱动程序(可选:{{.alternates}})", + "Send trace events. Options include: [gcp]": "", "Service '{{.service}}' was not found in '{{.namespace}}' namespace.\nYou may select another namespace by using 'minikube service {{.service}} -n \u003cnamespace\u003e'. Or list out all the services using 'minikube service list'": "", "Set failed": "", "Set flag to delete all profiles": "设置标志以删除所有配置文件", "Set flag to stop all profiles (clusters)": "", + "Set flag to stop cluster after a set amount of time (e.g. --schedule=5m)": "", "Set this flag to delete the '.minikube' folder from your user directory.": "设置这个标志来删除您用户目录下的 '.minikube' 文件夹。", "Sets an individual value in a minikube config file": "", "Sets the PROPERTY_NAME config value to PROPERTY_VALUE\n\tThese values can be overwritten by flags or environment variables at runtime.": "", @@ -528,21 +632,28 @@ "Show a list of global command-line options (applies to all commands).": "显示全局命令行选项列表 (应用于所有命令)。", "Show only log entries which point to known problems": "", "Show only the most recent journal entries, and continuously print new entries as they are appended to the journal.": "", + "Simulate numa node count in minikube, supported numa node count range is 1-8 (kvm2 driver only)": "", "Skipped switching kubectl context for {{.profile_name}} because --keep-context was set.": "", "Some dashboard features require the metrics-server addon. To enable all features please run:\n\n\tminikube{{.profileArg}} addons enable metrics-server\t\n\n": "", "Sorry, Kubernetes {{.k8sVersion}} requires conntrack to be installed in root's path": "", "Sorry, completion support is not yet implemented for {{.name}}": "", "Sorry, please set the --output flag to one of the following valid options: [text,json]": "", + "Sorry, the IP provided with the --listen-address flag is invalid: {{.listenAddr}}.": "", + "Sorry, the address provided with the --insecure-registry flag is invalid: {{.addr}}. Expected formats are: \u003cip\u003e[:\u003cport\u003e], \u003chostname\u003e[:\u003cport\u003e] or \u003cnetwork\u003e/\u003cnetmask\u003e": "", "Sorry, the kubeadm.{{.parameter_name}} parameter is currently not supported by --extra-config": "抱歉,--extra-config 目前不支持 kubeadm.{{.parameter_name}} 参数", "Sorry, the url provided with the --registry-mirror flag is invalid: {{.url}}": "抱歉,通过 --registry-mirror 标志提供的网址无效:{{.url}}", "Sorry, {{.driver}} does not allow mounts to be changed after container creation (previous mount: '{{.old}}', new mount: '{{.new}})'": "", + "Source {{.path}} can not be empty": "", "Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}": "", "Specify --kubernetes-version in v\u003cmajor\u003e.\u003cminor.\u003cbuild\u003e form. example: 'v1.1.14'": "", "Specify an alternate --host-only-cidr value, such as 172.16.0.1/24": "", "Specify arbitrary flags to pass to the Docker daemon. (format: key=value)": "指定要传递给 Docker 守护进程的任意标志。(格式:key=value)", + "Specify arbitrary flags to pass to the build. (format: key=value)": "", "Specify the 9p version that the mount should use": "", "Specify the ip that the mount should be setup on": "", "Specify the mount filesystem type (supported types: 9p)": "", + "Specify the port that the mount should be setup on, where 0 means any free port.": "", + "Specifying extra disks is currently only supported for the following drivers: {{.supported_drivers}}. If you can contribute to add this feature, please create a PR.": "", "StartHost failed, but will try again: {{.error}}": "", "Starting control plane node {{.name}} in cluster {{.cluster}}": "", "Starting node {{.name}} in cluster {{.cluster}}": "", @@ -569,8 +680,10 @@ "Suggestion: {{.advice}}": "建议:{{.advice}}", "Suggestion: {{.fix}}": "建议:{{.fix}}", "System only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", + "Tag to apply to the new image (optional)": "", "Target directory {{.path}} must be an absolute path": "", - "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo -E minikube start --driver={{.driver_name}}'.": "", + "Target {{.path}} can not be empty": "", + "Test docs have been saved at - {{.path}}": "", "The \"{{.driver_name}}\" driver requires root privileges. Please run minikube using 'sudo minikube --vm-driver={{.driver_name}}": "“{{.driver_name}}”驱动程序需要根权限。请使用“sudo minikube --vm-driver={{.driver_name}}”运行 minikube", "The \"{{.driver_name}}\" driver should not be used with root privileges.": "", "The \"{{.name}}\" cluster has been deleted.": "“{{.name}}”集群已删除。", @@ -585,15 +698,18 @@ "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}}, 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 驱动程序)", - "The Docker service within '{{.name}}' is not active": "", "The KVM QEMU connection URI. (kvm2 driver only)": "KVM QEMU 连接 URI。(仅限 kvm2 驱动程序)", + "The KVM default network name. (kvm2 driver only)": "", "The KVM driver is unable to resurrect this old VM. Please run `minikube delete` to delete it and try again.": "", "The KVM network name. (kvm2 driver only)": "KVM 网络名称。(仅限 kvm2 驱动程序)", "The VM driver crashed. Run 'minikube start --alsologtostderr -v=8' to see the VM driver error message": "", "The VM driver exited with an error, and may be corrupt. Run 'minikube start' with --alsologtostderr -v=8 to see the error": "", "The VM that minikube is configured for no longer exists. Run 'minikube delete'": "", + "The \\\"{{.name}}\\\" container runtime requires CNI": "", "The apiserver listening port": "apiserver 侦听端口", "The apiserver name which is used in the generated certificate for kubernetes. This can be used if you want to make the apiserver available from outside the machine": "在为 kubernetes 生成的证书中使用的 apiserver 名称。如果您希望将此 apiserver 设置为可从机器外部访问,则可以使用这组 apiserver 名称", "The argument to pass the minikube mount command on start": "用于在启动时传递 minikube 装载命令的参数", @@ -619,6 +735,7 @@ "The heapster addon is depreciated. please try to disable metrics-server instead": "", "The hyperv virtual switch name. Defaults to first found. (hyperv driver only)": "hyperv 虚拟交换机名称。默认为找到的第一个 hyperv 虚拟交换机。(仅限 hyperv 驱动程序)", "The hypervisor does not appear to be configured properly. Run 'minikube start --alsologtostderr -v=1' and inspect the error code": "管理程序似乎配置的不正确。执行 'minikube start --alsologtostderr -v=1' 并且检查错误代码", + "The image '{{.imageName}}' was not found; unable to add it to cache.": "", "The initial time interval for each check that wait performs in seconds": "", "The kubeadm binary within the Docker container is not executable": "", "The kubernetes version that the minikube VM will use (ex: v1.2.3)": "minikube 虚拟机将使用的 kubernetes 版本(例如 v1.2.3)", @@ -627,8 +744,11 @@ "The minikube {{.driver_name}} container exited unexpectedly.": "", "The minimum required version for podman is \"{{.minVersion}}\". your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk. To install latest version please see https://podman.io/getting-started/installation.html": "", "The name of the network plugin": "网络插件的名称", + "The named space to activate after start": "", "The node to check status for. Defaults to control plane. Leave blank with default format for status on all nodes.": "", + "The node to get IP. Defaults to the primary control plane.": "", "The node to get logs from. Defaults to the primary control plane.": "", + "The node to get ssh-key path. Defaults to the primary control plane.": "", "The node to ssh into. Defaults to the primary control plane.": "", "The node {{.name}} has ran out of available PIDs.": "", "The node {{.name}} has ran out of disk space.": "", @@ -639,6 +759,8 @@ "The number of nodes to spin up. Defaults to 1.": "", "The output format. One of 'json', 'table'": "输出的格式。'json' 或者 'table'", "The path on the file system where the docs in markdown need to be saved": "", + "The path on the file system where the error code docs in markdown need to be saved": "", + "The path on the file system where the testing docs in markdown need to be saved": "", "The podman service within '{{.cluster}}' is not active": "", "The podman-env command is incompatible with multi-node clusters. Use the 'registry' add-on: https://minikube.sigs.k8s.io/docs/handbook/registry/": "", "The requested memory allocation of {{.requested}}MiB does not leave room for system overhead (total system memory: {{.system_limit}}MiB). You may face stability issues.": "", @@ -648,7 +770,6 @@ "The time interval for each check that wait performs in seconds": "", "The value passed to --format is invalid": "", "The value passed to --format is invalid: {{.error}}": "", - "The vmwarefusion driver is deprecated and support for it will be removed in a future release.\n\t\t\tPlease consider switching to the new vmware unified driver, which is intended to replace the vmwarefusion driver.\n\t\t\tSee https://minikube.sigs.k8s.io/docs/reference/drivers/vmware/ for more information.\n\t\t\tTo disable this message, run [minikube config set ShowDriverDeprecationNotification false]": "", "The {{.driver_name}} driver should not be used with root privileges.": "不应以根权限使用 {{.driver_name}} 驱动程序。", "There's a new version for '{{.driver_executable}}'. Please consider upgrading. {{.documentation_url}}": "“{{.driver_executable}}”有一个新版本。请考虑升级。{{.documentation_url}}", "These --extra-config parameters are invalid: {{.invalid_extra_opts}}": "", @@ -657,6 +778,7 @@ "This can also be done automatically by setting the env var CHANGE_MINIKUBE_NONE_USER=true": "此操作还可通过设置环境变量 CHANGE_MINIKUBE_NONE_USER=true 自动完成", "This control plane is not running! (state={{.state}})": "", "This driver does not yet work on your architecture. Maybe try --driver=none": "", + "This is a known issue with BTRFS storage driver, there is a workaround, please checkout the issue on GitHub": "", "This is unusual - you may want to investigate using \"{{.command}}\"": "", "This will keep the existing kubectl context and will create a minikube context.": "这将保留现有 kubectl 上下文并创建 minikube 上下文。", "This will start the mount daemon and automatically mount files into minikube": "这将启动装载守护进程并将文件自动装载到 minikube 中", @@ -668,13 +790,14 @@ "To connect to this cluster, use: kubectl --context={{.name}}": "如需连接到此集群,请使用 kubectl --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.name}}__1": "如需连接到此集群,请使用 kubectl --context={{.name}}", "To connect to this cluster, use: kubectl --context={{.profile_name}}": "", + "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'": "", "To disable this notice, run: 'minikube config set WantUpdateNotification false'\\n": "", + "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\\n": "", "To pull new external images, you may need to configure a proxy: https://minikube.sigs.k8s.io/docs/reference/networking/proxy/": "", "To see addons list for other profiles use: `minikube addons -p name list`": "", - "To set your Google Cloud project, run: \n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", + "To set your Google Cloud project, run:\n\n\t\tgcloud config set project \u003cproject name\u003e\n\nor set the GOOGLE_CLOUD_PROJECT environment variable.": "", "To start a cluster, run: \"{{.command}}\"": "", "To start minikube with Hyper-V, Powershell must be in your PATH`": "", - "To track progress on multi-node clusters, see https://github.com/kubernetes/minikube/issues/7538.": "", "To use kubectl or minikube commands as your own user, you may need to relocate them. For example, to overwrite your own settings, run:": "如需以您自己的用户身份使用 kubectl 或 minikube 命令,您可能需要重新定位该命令。例如,如需覆盖您的自定义设置,请运行:", "Troubleshooting Commands:": "故障排除命令ƒ", "Try 'minikube delete' to force new SSL certificates to be installed": "", @@ -688,6 +811,7 @@ "Unable to find control plane": "", "Unable to generate docs": "", "Unable to generate the documentation. Please ensure that the path specified is a directory, exists \u0026 you have permission to write to it.": "", + "Unable to get CPU info: {{.err}}": "", "Unable to get bootstrapper: {{.error}}": "无法获取引导程序:{{.error}}", "Unable to get command runner": "", "Unable to get control plane status: {{.error}}": "", @@ -697,10 +821,12 @@ "Unable to get runtime": "", "Unable to get the status of the {{.name}} cluster.": "无法获取 {{.name}} 集群状态。", "Unable to kill mount process: {{.error}}": "", + "Unable to list profiles: {{.error}}": "", "Unable to load cached images from config file.": "无法从配置文件中加载缓存的镜像。", "Unable to load cached images: {{.error}}": "", "Unable to load config: {{.error}}": "无法加载配置:{{.error}}", "Unable to load host": "", + "Unable to load profile: {{.error}}": "", "Unable to parse \"{{.kubernetes_version}}\": {{.error}}": "无法解析“{{.kubernetes_version}}”:{{.error}}", "Unable to parse default Kubernetes version from constants: {{.error}}": "无法从常量中解析默认的 Kubernetes 版本号: {{.error}}", "Unable to parse memory '{{.memory}}': {{.error}}": "", @@ -718,11 +844,13 @@ "Unfortunately, could not download the base image {{.image_name}} ": "", "Uninstalling Kubernetes {{.kubernetes_version}} using {{.bootstrapper_name}} ...": "正在使用 {{.bootstrapper_name}} 卸载 Kubernetes {{.kubernetes_version}}…", "Unmounting {{.path}} ...": "", + "Unpause": "", "Unpaused {{.count}} containers": "", "Unpaused {{.count}} containers in: {{.namespaces}}": "", "Unpausing node {{.name}} ... ": "", "Unset the KUBECONFIG environment variable, or verify that it does not point to an empty or otherwise invalid path": "", "Unset variables instead of setting them": "", + "Update Docker to the latest minor version, this version is unsupported": "", "Update kubeconfig in case of an IP or port change": "", "Update server returned an empty list": "", "Updating the running {{.driver_name}} \"{{.cluster}}\" {{.machine_type}} ...": "", @@ -741,13 +869,18 @@ "Use \"{{.CommandPath}} [command] --help\" for more information about a command.": "使用 \"{{.CommandPath}} [command] --help\" 可以获取有关命令的更多信息", "Use 'kubect get po -A' to find the correct and namespace name": "使用 'kubect get po -A' 来查询正确的命名空间名称", "Use -A to specify all namespaces": "使用 -A 指定所有 namespaces", + "Use SSH connection instead of HTTPS (port 2376)": "", + "Use SSH for running kubernetes client on the node": "", "Use VirtualBox to remove the conflicting VM and/or network interfaces": "使用 VirtualBox 删除有冲突的 虚拟机 和/或 网络接口", "Use native Golang SSH client (default true). Set to 'false' to use the command line 'ssh' command when accessing the docker machine. Useful for the machine drivers when they will not start with 'Waiting for SSH'.": "", "User ID: {{.userID}}": "用户 ID: {{.userID}}", + "User name '{{.username}}' is not valid": "", + "User name must be 60 chars or less.": "", "Userspace file server is shutdown": "", "Userspace file server: ": "", "Using image repository {{.name}}": "正在使用镜像存储库 {{.name}}", - "Using podman 2 is not supported yet. your version is \"{{.currentVersion}}\". minikube might not work. use at your own risk.": "", + "Using image {{.registry}}{{.image}}": "", + "Using image {{.registry}}{{.image}} (global image repository)": "", "Using the '{{.runtime}}' runtime with the 'none' driver is an untested configuration!": "同时使用 'none' 驱动以及 '{{.runtime}}' 运行时是未经测试过的配置!", "Using the running {{.driver_name}} \"{{.profile_name}}\" VM ...": "使用正在运行的 {{.driver_name}} \"{{.profile_name}}\" 虚拟机", "Using the {{.driver}} driver based on existing profile": "根据现有的配置文件使用 {{.driver}} 驱动程序", @@ -756,6 +889,7 @@ "VM is unable to access {{.repository}}, you may need to configure a proxy or set --image-repository": "虚拟机无权访问 {{.repository}},或许您需要配置代理或者设置 --image-repository", "VM may be unable to resolve external DNS records": "虚拟机可能无法解析外部 DNS 记录", "Valid components are: {{.valid_extra_opts}}": "", + "Validate your KVM networks. Run: virt-host-validate and then virsh net-list --all": "", "Validation unable to parse disk size '{{.diskSize}}': {{.error}}": "", "Verify that your HTTP_PROXY and HTTPS_PROXY environment variables are set correctly.": "验证是否正确设置了 HTTP_PROXY 和 HTTPS_PROXY 环境变量。", "Verify the IP address of the running cluster in kubeconfig.": "在 kubeconfig 中验证正在运行的集群 IP 地址。", @@ -783,29 +917,41 @@ "With --network-plugin=cni, you will need to provide your own CNI. See --cni flag as a user-friendly alternative": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}).": "", "You appear to be using a proxy, but your NO_PROXY environment does not include the minikube IP ({{.ip_address}}). Please see {{.documentation_url}} for more details": "您似乎正在使用代理,但您的 NO_PROXY 环境不包含 minikube IP ({{.ip_address}})。如需了解详情,请参阅 {{.documentation_url}}", + "You are trying to run a windows .exe binary inside WSL. For better integration please use a Linux binary instead (Download at https://minikube.sigs.k8s.io/docs/start/.). Otherwise if you still want to do this, you can do it using --force": "", + "You are trying to run amd64 binary on M1 system. Please consider running darwin/arm64 binary instead (Download at {{.url}}.)": "", "You can delete them using the following command(s): ": "", "You can force an unsupported Kubernetes version via the --force flag": "", + "You cannot add or remove extra disks for an existing minikube cluster. Please first delete the cluster.": "", "You cannot change the CPUs for an existing minikube cluster. Please first delete the cluster.": "", - "You cannot change the Disk size for an exiting minikube cluster. Please first delete the cluster.": "", - "You cannot change the memory size for an exiting minikube cluster. Please first delete the cluster.": "", + "You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.": "", + "You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.": "", + "You have chosen to disable the CNI but the \\\"{{.name}}\\\" container runtime requires CNI": "", + "You have selected \"virtualbox\" driver, but there are better options !\nFor better performance and support consider using a different driver: {{.drivers}}\n\nTo turn off this warning run:\n\n\t$ minikube config set WantVirtualBoxDriverWarning false\n\n\nTo learn more about on minikube drivers checkout https://minikube.sigs.k8s.io/docs/drivers/\nTo see benchmarks checkout https://minikube.sigs.k8s.io/docs/benchmarks/cpuusage/\n\n": "", "You may need to manually remove the \"{{.name}}\" VM from your hypervisor": "您可能需要从管理程序中手动移除“{{.name}}”虚拟机", "You may need to stop the Hyper-V Manager and run `minikube delete` again.": "", + "You might be using an amd64 version of minikube on a M1 Mac, use the arm64 version of minikube instead": "", "You must specify a service name": "", "Your GCP credentials will now be mounted into every pod created in the {{.name}} cluster.": "", + "Your cgroup does not allow setting memory.": "", "Your host does not support KVM virtualization. Ensure that qemu-kvm is installed, and run 'virt-host-validate' to debug the problem": "", "Your host does not support virtualization. If you are running minikube within a VM, try '--driver=docker'. Otherwise, enable virtualization in your BIOS": "", "Your host is failing to route packets to the minikube VM. If you have VPN software, try turning it off or configuring it so that it does not re-route traffic to the VM IP. If not, check your VM environment routing options.": "", "Your minikube config refers to an unsupported driver. Erase ~/.minikube, and try again.": "", "Your minikube vm is not running, try minikube start.": "", "[WARNING] For full functionality, the 'csi-hostpath-driver' addon requires the 'volumesnapshots' addon to be enabled.\n\nYou can enable 'volumesnapshots' addon by running: 'minikube addons enable volumesnapshots'\n": "", + "\\\"minikube cache\\\" will be deprecated in upcoming versions, please switch to \\\"minikube image load\\\"": "", "addon '{{.name}}' is currently not enabled.\nTo enable this addon run:\nminikube addons enable {{.name}}": "", "addon '{{.name}}' is not a valid addon packaged with minikube.\nTo see the list of available addons run:\nminikube addons list": "", "addon enable failed": "启用插件失败", "addons modifies minikube addons files using subcommands like \"minikube addons enable dashboard\"": "插件使用诸如 \"minikube addons enable dashboard\" 的子命令修改 minikube 的插件文件", + "auto-pause addon is an alpha feature and still in early development. Please file issues to help us make it better.": "", "bash completion failed": "", + "bash completion.": "", "call with cleanup=true to remove old tunnels": "", - "config modifies minikube config files using subcommands like \"minikube config set driver kvm\"\nConfigurable fields: \\n\\n": "", + "cancel any existing scheduled stop requests": "", + "config modifies minikube config files using subcommands like \"minikube config set driver kvm2\"\nConfigurable fields: \\n\\n": "", "config view failed": "", + "containers paused status: {{.paused}}": "", "dashboard service is not running: {{.error}}": "", "delete ctx": "", "deleting node": "", @@ -813,12 +959,12 @@ "dry-run mode. Validates configuration, but does not mutate system state": "", "dry-run validation complete!": "", "enable failed": "开启失败", - "enable metrics-server addon instead of heapster addon because heapster is deprecated": "", "error creating clientset": "", "error getting primary control plane": "", "error getting ssh port": "", + "error initializing tracing: {{.Error}}": "", "error parsing the input ip address for mount": "", - "error provisioning host": "", + "error provisioning guest": "", "error starting tunnel": "", "error stopping tunnel": "", "error: --output must be 'yaml' or 'json'": "", @@ -828,9 +974,11 @@ "failed to save config": "", "failed to start node": "", "fish completion failed": "", + "fish completion.": "", "if true, will embed the certs in kubeconfig.": "", "if you want to create a profile you can by this command: minikube start -p {{.profile_name}}": "", "initialization failed, will try again: {{.error}}": "", + "invalid kubernetes version": "", "keep the kube-context active after cluster is stopped. Defaults to false.": "", "kubeadm detected a TCP port conflict with another process: probably another local Kubernetes installation. Run lsof -p\u003cport\u003e to find the process and kill it": "kubeadm 检测一个到与其他进程的 TCP 端口冲突:或许是另外的本地安装的 Kubernetes 导致。执行 lsof -p\u003cport\u003e 查找并杀死这些进程", "kubectl and minikube configuration will be stored in {{.home_folder}}": "kubectl 和 minikube 配置将存储在 {{.home_folder}} 中", @@ -838,11 +986,14 @@ "kubectl proxy": "", "libmachine failed": "", "list displays all valid default settings for PROPERTY_NAME\nAcceptable fields: \\n\\n": "", + "list versions of all components included with minikube. (the cluster must be running)": "", + "loading profile": "", "max time to wait per Kubernetes core services to be healthy.": "每个 Kubernetes 核心服务保持健康所需的最长时间。", "max time to wait per Kubernetes or host to be healthy.": "", "minikube addons list --output OUTPUT. json, list": "", "minikube is exiting due to an error. If the above message is not useful, open an issue:": "由于出错 minikube 正在退出。如果以上信息没有帮助,请提交问题反馈:", "minikube is missing files relating to your guest environment. This can be fixed by running 'minikube delete'": "", + "minikube is not meant for production use. You are opening non-local traffic": "", "minikube is unable to access the Google Container Registry. You may need to configure it to use a HTTP proxy.": "", "minikube is unable to connect to the VM: {{.error}}\n\n\tThis is likely due to one of two reasons:\n\n\t- VPN or firewall interference\n\t- {{.hypervisor}} network configuration issue\n\n\tSuggested workarounds:\n\n\t- Disable your local VPN or firewall software\n\t- Configure your local VPN or firewall to allow access to {{.ip}}\n\t- Restart or reinstall {{.hypervisor}}\n\t- Use an alternative --vm-driver\n\t- Use --force to override this connectivity check\n\t": "", "minikube is unable to connect to the VM: {{.error}}\n\nThis is likely due to one of two reasons:\n\n- VPN or firewall interference\n- {{.hypervisor}} network configuration issue\n\nSuggested workarounds:\n\n- Disable your local VPN or firewall software\n- Configure your local VPN or firewall to allow access to {{.ip}}\n- Restart or reinstall {{.hypervisor}}\n- Use an alternative --vm-driver": "minikube 无法连接到虚拟机:{{.error}}\n\n可能是由于以下两个原因之一导致:\n\n-VPN 或防火墙冲突\n- {{.hypervisor}} 网络配置问题\n建议的方案:\n\n- 禁用本地的 VPN 或者防火墙软件\n- 配置本地 VPN 或防火墙软件,放行 {{.ip}}\n- 重启或者重装 {{.hypervisor}}\n- 使用另外的 --vm-driver", @@ -854,11 +1005,14 @@ "minikube {{.version}} is available! Download it: {{.url}}": "", "mkcmp is used to compare performance of two minikube binaries": "mkcmp 用于对比两个 minikube 二进制的性能", "mount argument \"{{.value}}\" must be in form: \u003csource directory\u003e:\u003ctarget directory\u003e": "", + "mount could not connect": "", "mount failed": "", "namespaces to pause": "", "namespaces to unpause": "", + "network to run minikube with. Now it is used by docker/podman and KVM drivers. If left empty, minikube will create a new network.": "", "none driver does not support multi-node clusters": "", "not enough arguments ({{.ArgCount}}).\\nusage: minikube config set PROPERTY_NAME PROPERTY_VALUE": "", + "numa node is only supported on k8s v1.18 and later": "", "output layout (EXPERIMENTAL, JSON only): 'nodes' or 'cluster'": "", "pause Kubernetes": "", "pause containers": "暂停容器", @@ -868,6 +1022,7 @@ "reload cached images.": "重新加载缓存的镜像", "reloads images previously added using the 'cache add' subcommand": "重新加载之前通过子命令 'cache add' 添加的镜像", "retrieving node": "", + "scheduled stop is not supported on the none driver, skipping scheduling": "", "service {{.namespace_name}}/{{.service_name}} has no node port": "", "stat failed": "", "status json failure": "", @@ -876,6 +1031,7 @@ "tunnel creates a route to services deployed with type LoadBalancer and sets their Ingress to their ClusterIP. for a detailed example see https://minikube.sigs.k8s.io/docs/tasks/loadbalancer": "", "tunnel makes services of type LoadBalancer accessible on localhost": "隧道使本地主机上可以访问 LoadBalancer 类型的服务", "unable to bind flags": "", + "unable to daemonize: {{.err}}": "", "unable to delete minikube config folder": "无法删除 minikube 配置目录", "unpause Kubernetes": "恢复 Kubernetes", "unset failed": "", @@ -886,14 +1042,18 @@ "usage: minikube addons configure ADDON_NAME": "", "usage: minikube addons disable ADDON_NAME": "", "usage: minikube addons enable ADDON_NAME": "", + "usage: minikube addons images ADDON_NAME": "", "usage: minikube addons list": "", "usage: minikube addons open ADDON_NAME": "", "usage: minikube config unset PROPERTY_NAME": "", "usage: minikube delete": "", "usage: minikube profile [MINIKUBE_PROFILE_NAME]": "", + "using metrics-server addon, heapster is deprecated": "", "version json failure": "", "version yaml failure": "", "zsh completion failed": "", + "zsh completion.": "", + "{{ .name }}: Suggestion: {{ .suggestion}}": "", "{{ .name }}: {{ .rejection }}": "", "{{.Driver}} is currently using the {{.StorageDriver}} storage driver, consider switching to overlay2 for better performance": "", "{{.count}} nodes stopped.": "", @@ -905,6 +1065,8 @@ "{{.driver}} does not appear to be installed, but is specified by an existing profile. Please run 'minikube delete' or install {{.driver}}": "似乎并未安装 {{.driver}},但已被当前的配置文件指定。请执行 'minikube delete' 或者安装 {{.driver}}", "{{.driver}} only has {{.size}}MiB available, less than the required {{.req}}MiB for Kubernetes": "", "{{.extra_option_component_name}}.{{.key}}={{.value}}": "", + "{{.name}} doesn't have images.": "", + "{{.name}} has following images:": "", "{{.name}} has no available configuration options": "", "{{.name}} is already running": "", "{{.name}} was successfully configured": "", @@ -914,6 +1076,7 @@ "{{.path}} is version {{.client_version}}, and is incompatible with Kubernetes {{.cluster_version}}. You will need to update {{.path}} or use 'minikube kubectl' to connect with this cluster": "{{.path}} 的版本是 {{.client_version}},且与 Kubernetes {{.cluster_version}} 不兼容。您需要更新 {{.path}} 或者使用 'minikube kubectl' 连接到这个集群", "{{.path}} is version {{.client_version}}, which may have incompatibilites with Kubernetes {{.cluster_version}}.": "", "{{.prefix}}minikube {{.version}} on {{.platform}}": "{{.platform}} 上的 {{.prefix}}minikube {{.version}}", + "{{.profile}} profile is not valid: {{.err}}": "", "{{.type}} is not yet a supported filesystem. We will try anyways!": "", "{{.url}} is not accessible: {{.error}}": "" -} +} \ No newline at end of file