Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. Weโ€™ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

--kubernetes-version add support for checking github k8s versions and exit nicely on error #16865

Merged
merged 14 commits into from
Aug 17, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions cmd/minikube/cmd/config/kubernetes_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ limitations under the License.
package config

import (
"context"
"net/http"

"github.com/google/go-github/v53/github"
JudahNour marked this conversation as resolved.
Show resolved Hide resolved
"golang.org/x/mod/semver"
"k8s.io/minikube/pkg/minikube/constants"
)
Expand All @@ -34,3 +38,17 @@ func supportedKubernetesVersions() (releases []string) {
}
return releases
}

// IsInGitHubKubernetesVersions checks whether ver is in the GitHub list of K8s versions
func IsInGitHubKubernetesVersions(ver string) (bool, error) {
ghc := github.NewClient(nil)

_, resp, err := ghc.Repositories.GetReleaseByTag(context.Background(), "kubernetes", "kubernetes", ver)
if err != nil {
if resp != nil && resp.StatusCode == http.StatusNotFound {
return false, nil
}
return false, err
}
return true, nil
}
27 changes: 27 additions & 0 deletions cmd/minikube/cmd/start.go
Original file line number Diff line number Diff line change
Expand Up @@ -1771,6 +1771,22 @@ func validateKubernetesVersion(old *config.ClusterConfig) {
}
if nvs.GT(newestVersion) {
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})
if contains(constants.ValidKubernetesVersions, kubernetesVer) {
JudahNour marked this conversation as resolved.
Show resolved Hide resolved
out.Styled(style.Check, "Kubernetes version {{.specified}} found in version list", out.V{"specified": nvs})
} else {
out.WarningT("Specified Kubernetes version {{.specified}} not found in Kubernetes version list", out.V{"specified": nvs})
out.Styled(style.Verifying, "Searching the internet for Kubernetes version...")
found, err := cmdcfg.IsInGitHubKubernetesVersions(kubernetesVer)
if err != nil && !viper.GetBool(force) {
exit.Error(reason.KubernetesNotConnect, "error fetching Kubernetes version list from GitHub", err)
}
if found {
out.Styled(style.Check, "Kubernetes version {{.specified}} found in GitHub version list", out.V{"specified": nvs})
} else if !viper.GetBool(force) {
out.WarningT("Kubernetes version not found in GitHub version list. You can force a Kubernetes version via the --force flag")
exitIfNotForced(reason.KubernetesTooNew, "Kubernetes version {{.version}} is not supported by this release of minikube", out.V{"version": nvs})
}
}
}
if nvs.LT(oldestVersion) {
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})
Expand Down Expand Up @@ -2007,3 +2023,14 @@ func isTwoDigitSemver(ver string) bool {
majorMinorOnly := regexp.MustCompile(`^(?P<major>0|[1-9]\d*)\.(?P<minor>0|[1-9]\d*)$`)
return majorMinorOnly.MatchString(ver)
}

// contains checks whether the parameter slice contains the parameter string
func contains(sl []string, s string) bool {
for _, k := range sl {
if s == k {
return true
}

}
return false
}
1 change: 1 addition & 0 deletions hack/update/go_github_version/update_go_github_version.go
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ func generateSchema() map[string]update.Item {
"hack/update/kubeadm_constants/update_kubeadm_constants.go",
"hack/update/kubernetes_versions_list/update_kubernetes_versions_list.go",
"pkg/perf/monitor/github.go",
"cmd/minikube/cmd/config/kubernetes_version.go",
}

schema := make(map[string]update.Item)
Expand Down
2 changes: 2 additions & 0 deletions pkg/minikube/reason/reason.go
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,8 @@ var (
KubernetesTooOld = Kind{ID: "K8S_OLD_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported}
// a too new Kubernetes version was specified for minikube to use
KubernetesTooNew = Kind{ID: "K8S_NEW_UNSUPPORTED", ExitCode: ExControlPlaneUnsupported}
// error fetching GitHub Kubernetes version list
KubernetesNotConnect = Kind{ID: "K8S_FAIL_CONNECT"}
JudahNour marked this conversation as resolved.
Show resolved Hide resolved
// minikube was unable to safely downgrade installed Kubernetes version
KubernetesDowngrade = Kind{
ID: "K8S_DOWNGRADE_UNSUPPORTED",
Expand Down