diff --git a/cmd/kubeadm/app/util/version.go b/cmd/kubeadm/app/util/version.go index 8f2bf7d44ef..240575dd563 100644 --- a/cmd/kubeadm/app/util/version.go +++ b/cmd/kubeadm/app/util/version.go @@ -26,7 +26,7 @@ import ( var ( kubeReleaseBucketURL = "https://storage.googleapis.com/kubernetes-release/release" - kubeReleaseRegex = regexp.MustCompile(`^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)([-0-9a-zA-Z_\.+]*)?$`) + kubeReleaseRegex = regexp.MustCompile(`^v?(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)([-0-9a-zA-Z_\.+]*)?$`) kubeReleaseLabelRegex = regexp.MustCompile(`^[[:lower:]]+(-[-\w_\.]+)?$`) ) @@ -49,7 +49,10 @@ var ( // latest-1.0 (and similarly 1.1, 1.2, 1.3, ...) func KubernetesReleaseVersion(version string) (string, error) { if kubeReleaseRegex.MatchString(version) { - return version, nil + if strings.HasPrefix(version, "v") { + return version, nil + } + return "v" + version, nil } else if kubeReleaseLabelRegex.MatchString(version) { url := fmt.Sprintf("%s/%s.txt", kubeReleaseBucketURL, version) resp, err := http.Get(url) diff --git a/cmd/kubeadm/app/util/version_test.go b/cmd/kubeadm/app/util/version_test.go index 418f7b0dc1f..5f3325af0d0 100644 --- a/cmd/kubeadm/app/util/version_test.go +++ b/cmd/kubeadm/app/util/version_test.go @@ -45,6 +45,7 @@ func TestValidVersion(t *testing.T) { "v1.6.0-alpha.0.536+d60d9f3269288f", "v1.5.0-alpha.0.1078+1044b6822497da-pull", "v1.5.0-alpha.1.822+49b9e32fad9f32-pull-gke-gci", + "v1.6.1_coreos.0", } for _, s := range validVersions { ver, err := KubernetesReleaseVersion(s) @@ -61,8 +62,9 @@ func TestValidVersion(t *testing.T) { func TestInvalidVersion(t *testing.T) { invalidVersions := []string{ "v1.3", - "1.4.0", - "1.4.5+git", + "1.4", + "b1.4.0", + "c1.4.5+git", "something1.2", } for _, s := range invalidVersions { @@ -77,6 +79,24 @@ func TestInvalidVersion(t *testing.T) { } } +func TestValidConvenientForUserVersion(t *testing.T) { + validVersions := []string{ + "1.4.0", + "1.4.5+git", + "1.6.1_coreos.0", + } + for _, s := range validVersions { + ver, err := KubernetesReleaseVersion(s) + t.Log("Valid: ", s, ver, err) + if err != nil { + t.Errorf("KubernetesReleaseVersion unexpected error for version %q: %v", s, err) + } + if ver != "v"+s { + t.Errorf("KubernetesReleaseVersion should return semantic version string. %q vs. %q", s, ver) + } + } +} + func TestVersionFromNetwork(t *testing.T) { type T struct { Content string