Skip to content

Commit 5753ca0

Browse files
authored
Merge pull request #16865 from JudahNour/makeErrorBetter
--kubernetes-version add support for checking github k8s versions and exit nicely on error
2 parents 2dfea50 + e527c94 commit 5753ca0

File tree

4 files changed

+48
-0
lines changed

4 files changed

+48
-0
lines changed

cmd/minikube/cmd/config/kubernetes_version.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ limitations under the License.
1717
package config
1818

1919
import (
20+
"context"
21+
"net/http"
22+
23+
"github.com/google/go-github/v53/github"
2024
"golang.org/x/mod/semver"
2125
"k8s.io/minikube/pkg/minikube/constants"
2226
)
@@ -34,3 +38,17 @@ func supportedKubernetesVersions() (releases []string) {
3438
}
3539
return releases
3640
}
41+
42+
// IsInGitHubKubernetesVersions checks whether ver is in the GitHub list of K8s versions
43+
func IsInGitHubKubernetesVersions(ver string) (bool, error) {
44+
ghc := github.NewClient(nil)
45+
46+
_, resp, err := ghc.Repositories.GetReleaseByTag(context.Background(), "kubernetes", "kubernetes", ver)
47+
if err != nil {
48+
if resp != nil && resp.StatusCode == http.StatusNotFound {
49+
return false, nil
50+
}
51+
return false, err
52+
}
53+
return true, nil
54+
}

cmd/minikube/cmd/start.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1729,6 +1729,22 @@ func validateKubernetesVersion(old *config.ClusterConfig) {
17291729
}
17301730
if nvs.GT(newestVersion) {
17311731
out.WarningT("Specified Kubernetes version {{.specified}} is newer than the newest supported version: {{.newest}}. Use `minikube config defaults kubernetes-version` for details.", out.V{"specified": nvs, "newest": constants.NewestKubernetesVersion})
1732+
if contains(constants.ValidKubernetesVersions, kubernetesVer) {
1733+
out.Styled(style.Check, "Kubernetes version {{.specified}} found in version list", out.V{"specified": nvs})
1734+
} else {
1735+
out.WarningT("Specified Kubernetes version {{.specified}} not found in Kubernetes version list", out.V{"specified": nvs})
1736+
out.Styled(style.Verifying, "Searching the internet for Kubernetes version...")
1737+
found, err := cmdcfg.IsInGitHubKubernetesVersions(kubernetesVer)
1738+
if err != nil && !viper.GetBool(force) {
1739+
exit.Error(reason.KubernetesNotConnect, "error fetching Kubernetes version list from GitHub", err)
1740+
}
1741+
if found {
1742+
out.Styled(style.Check, "Kubernetes version {{.specified}} found in GitHub version list", out.V{"specified": nvs})
1743+
} else if !viper.GetBool(force) {
1744+
out.WarningT("Kubernetes version not found in GitHub version list. You can force a Kubernetes version via the --force flag")
1745+
exitIfNotForced(reason.KubernetesTooNew, "Kubernetes version {{.version}} is not supported by this release of minikube", out.V{"version": nvs})
1746+
}
1747+
}
17321748
}
17331749
if nvs.LT(oldestVersion) {
17341750
out.WarningT("Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}. Use `minikube config defaults kubernetes-version` for details.", out.V{"specified": nvs, "oldest": constants.OldestKubernetesVersion})
@@ -1995,3 +2011,14 @@ func startNerdctld() {
19952011
exit.Error(reason.StartNerdctld, fmt.Sprintf("Failed to set up DOCKER_HOST: %s", out.Output()), err)
19962012
}
19972013
}
2014+
2015+
// contains checks whether the parameter slice contains the parameter string
2016+
func contains(sl []string, s string) bool {
2017+
for _, k := range sl {
2018+
if s == k {
2019+
return true
2020+
}
2021+
2022+
}
2023+
return false
2024+
}

hack/update/go_github_version/update_go_github_version.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ func generateSchema() map[string]update.Item {
6767
"hack/update/kubeadm_constants/update_kubeadm_constants.go",
6868
"hack/update/kubernetes_versions_list/update_kubernetes_versions_list.go",
6969
"pkg/perf/monitor/github.go",
70+
"cmd/minikube/cmd/config/kubernetes_version.go",
7071
}
7172

7273
schema := make(map[string]update.Item)

pkg/minikube/reason/reason.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,8 @@ var (
475475
KubernetesTooOld = Kind{ID: "K8S_OLD_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported}
476476
// a too new Kubernetes version was specified for minikube to use
477477
KubernetesTooNew = Kind{ID: "K8S_NEW_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported}
478+
// error fetching GitHub Kubernetes version list
479+
KubernetesNotConnect = Kind{ID: "K8S_FAIL_CONNECT", ExitCode: ExInternetError}
478480
// minikube was unable to safely downgrade installed Kubernetes version
479481
KubernetesDowngrade = Kind{
480482
ID: "K8S_DOWNGRADE_UNSUPPORTED",

0 commit comments

Comments
 (0)