kubeadm: simplify minimum Kubernetes version bumps

Replaced hardcoded "v0.12.0" strings with MinimumControlPlaneVersion and
MinimumKubeletVersion global variables.

This should help with a regular release version bumps.
This commit is contained in:
Ed Bartosh 2018-12-11 12:23:32 +02:00
parent af07603178
commit b40018da7b
16 changed files with 114 additions and 103 deletions

View File

@ -17,6 +17,8 @@ limitations under the License.
package alpha package alpha
import ( import (
"fmt"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"k8s.io/apimachinery/pkg/util/version" "k8s.io/apimachinery/pkg/util/version"
@ -38,13 +40,13 @@ var (
"kubelet --version" or respects the --kubelet-version parameter. "kubelet --version" or respects the --kubelet-version parameter.
` + cmdutil.AlphaDisclaimer) ` + cmdutil.AlphaDisclaimer)
kubeletConfigDownloadExample = normalizer.Examples(` kubeletConfigDownloadExample = normalizer.Examples(fmt.Sprintf(`
# Downloads the kubelet configuration from the ConfigMap in the cluster. Autodetects the kubelet version. # Downloads the kubelet configuration from the ConfigMap in the cluster. Autodetects the kubelet version.
kubeadm alpha phase kubelet config download kubeadm alpha phase kubelet config download
# Downloads the kubelet configuration from the ConfigMap in the cluster. Uses a specific desired kubelet version. # Downloads the kubelet configuration from the ConfigMap in the cluster. Uses a specific desired kubelet version.
kubeadm alpha phase kubelet config download --kubelet-version v1.12.0 kubeadm alpha phase kubelet config download --kubelet-version %s
`) `, constants.MinimumKubeletVersion))
kubeletConfigEnableDynamicLongDesc = normalizer.LongDesc(` kubeletConfigEnableDynamicLongDesc = normalizer.LongDesc(`
Enables or updates dynamic kubelet configuration for a Node, against the kubelet-config-1.X ConfigMap in the cluster, Enables or updates dynamic kubelet configuration for a Node, against the kubelet-config-1.X ConfigMap in the cluster,
@ -55,13 +57,13 @@ var (
` + cmdutil.AlphaDisclaimer) ` + cmdutil.AlphaDisclaimer)
kubeletConfigEnableDynamicExample = normalizer.Examples(` kubeletConfigEnableDynamicExample = normalizer.Examples(fmt.Sprintf(`
# Enables dynamic kubelet configuration for a Node. # Enables dynamic kubelet configuration for a Node.
kubeadm alpha phase kubelet enable-dynamic-config --node-name node-1 --kubelet-version v1.12.0 kubeadm alpha phase kubelet enable-dynamic-config --node-name node-1 --kubelet-version %s
WARNING: This feature is still experimental, and disabled by default. Enable only if you know what you are doing, as it WARNING: This feature is still experimental, and disabled by default. Enable only if you know what you are doing, as it
may have surprising side-effects at this stage. may have surprising side-effects at this stage.
`) `, constants.MinimumKubeletVersion))
) )
// newCmdKubeletUtility returns command for `kubeadm phase kubelet` // newCmdKubeletUtility returns command for `kubeadm phase kubelet`

View File

@ -18,6 +18,7 @@ package cmd
import ( import (
"bytes" "bytes"
"fmt"
"io" "io"
"io/ioutil" "io/ioutil"
"os" "os"
@ -41,11 +42,12 @@ import (
const ( const (
defaultNumberOfImages = 8 defaultNumberOfImages = 8
// dummyKubernetesVersion is just used for unit testing, in order to not make
// kubeadm lookup dl.k8s.io to resolve what the latest stable release is
dummyKubernetesVersion = "v1.12.0"
) )
// dummyKubernetesVersion is just used for unit testing, in order to not make
// kubeadm lookup dl.k8s.io to resolve what the latest stable release is
var dummyKubernetesVersion = constants.MinimumControlPlaneVersion.String()
func TestNewCmdConfigImagesList(t *testing.T) { func TestNewCmdConfigImagesList(t *testing.T) {
var output bytes.Buffer var output bytes.Buffer
mockK8sVersion := dummyKubernetesVersion mockK8sVersion := dummyKubernetesVersion
@ -83,11 +85,11 @@ func TestImagesListRunWithCustomConfigPath(t *testing.T) {
expectedImageSubstrings: []string{ expectedImageSubstrings: []string{
"coredns", "coredns",
}, },
configContents: []byte(dedent.Dedent(` configContents: []byte(dedent.Dedent(fmt.Sprintf(`
apiVersion: kubeadm.k8s.io/v1beta1 apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration kind: ClusterConfiguration
kubernetesVersion: v1.12.0 kubernetesVersion: %s
`)), `, constants.MinimumControlPlaneVersion))),
}, },
} }

View File

@ -32,6 +32,7 @@ import (
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
"k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/tools/clientcmd"
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
) )
const ( const (
@ -175,7 +176,7 @@ func TestRunCreateToken(t *testing.T) {
ClusterConfiguration: kubeadmapiv1beta1.ClusterConfiguration{ ClusterConfiguration: kubeadmapiv1beta1.ClusterConfiguration{
// KubernetesVersion is not used, but we set this explicitly to avoid // KubernetesVersion is not used, but we set this explicitly to avoid
// the lookup of the version from the internet when executing ConfigFileAndDefaultsToInternalConfig // the lookup of the version from the internet when executing ConfigFileAndDefaultsToInternalConfig
KubernetesVersion: "v1.12.0", KubernetesVersion: constants.MinimumControlPlaneVersion.String(),
}, },
BootstrapTokens: []kubeadmapiv1beta1.BootstrapToken{ BootstrapTokens: []kubeadmapiv1beta1.BootstrapToken{
{ {

View File

@ -35,7 +35,7 @@ go_test(
srcs = ["features_test.go"], srcs = ["features_test.go"],
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//staging/src/k8s.io/apimachinery/pkg/util/version:go_default_library", "//cmd/kubeadm/app/constants:go_default_library",
"//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library",
], ],
) )

View File

@ -20,12 +20,10 @@ import (
"reflect" "reflect"
"testing" "testing"
"k8s.io/apimachinery/pkg/util/version"
utilfeature "k8s.io/apiserver/pkg/util/feature" utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
) )
var TestMinVersion = version.MustParseSemantic("v1.12.0-alpha.1")
func TestKnownFeatures(t *testing.T) { func TestKnownFeatures(t *testing.T) {
var someFeatures = FeatureList{ var someFeatures = FeatureList{
"feature2": {FeatureSpec: utilfeature.FeatureSpec{Default: true, PreRelease: utilfeature.Alpha}}, "feature2": {FeatureSpec: utilfeature.FeatureSpec{Default: true, PreRelease: utilfeature.Alpha}},
@ -130,7 +128,7 @@ func TestNewFeatureGate(t *testing.T) {
func TestValidateVersion(t *testing.T) { func TestValidateVersion(t *testing.T) {
var someFeatures = FeatureList{ var someFeatures = FeatureList{
"feature1": {FeatureSpec: utilfeature.FeatureSpec{Default: false, PreRelease: utilfeature.Beta}}, "feature1": {FeatureSpec: utilfeature.FeatureSpec{Default: false, PreRelease: utilfeature.Beta}},
"feature2": {FeatureSpec: utilfeature.FeatureSpec{Default: true, PreRelease: utilfeature.Alpha}, MinimumVersion: TestMinVersion}, "feature2": {FeatureSpec: utilfeature.FeatureSpec{Default: true, PreRelease: utilfeature.Alpha}, MinimumVersion: constants.MinimumControlPlaneVersion.WithPreRelease("alpha.1")},
} }
var tests = []struct { var tests = []struct {
@ -144,7 +142,7 @@ func TestValidateVersion(t *testing.T) {
}, },
{ //min version but correct value given { //min version but correct value given
requestedFeatures: map[string]bool{"feature2": true}, requestedFeatures: map[string]bool{"feature2": true},
requestedVersion: "v1.12.0", requestedVersion: constants.MinimumControlPlaneVersion.String(),
expectedError: false, expectedError: false,
}, },
{ //min version and incorrect value given { //min version and incorrect value given

View File

@ -12,6 +12,7 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/util:go_default_library", "//cmd/kubeadm/app/util:go_default_library",
"//cmd/kubeadm/app/util/config:go_default_library", "//cmd/kubeadm/app/util/config:go_default_library",
"//pkg/apis/core:go_default_library", "//pkg/apis/core:go_default_library",

View File

@ -27,6 +27,7 @@ import (
clientsetfake "k8s.io/client-go/kubernetes/fake" clientsetfake "k8s.io/client-go/kubernetes/fake"
core "k8s.io/client-go/testing" core "k8s.io/client-go/testing"
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util" kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config" configutil "k8s.io/kubernetes/cmd/kubeadm/app/util/config"
api "k8s.io/kubernetes/pkg/apis/core" api "k8s.io/kubernetes/pkg/apis/core"
@ -183,7 +184,7 @@ func TestEnsureProxyAddon(t *testing.T) {
PodSubnet: "5.6.7.8/24", PodSubnet: "5.6.7.8/24",
}, },
ImageRepository: "someRepo", ImageRepository: "someRepo",
KubernetesVersion: "v1.12.0", KubernetesVersion: constants.MinimumControlPlaneVersion.String(),
}, },
} }

View File

@ -40,6 +40,8 @@ const (
etcdDataDir = "/var/lib/etcd" etcdDataDir = "/var/lib/etcd"
) )
var cpVersion = kubeadmconstants.MinimumControlPlaneVersion.WithPreRelease("beta.2").String()
func TestGetStaticPodSpecs(t *testing.T) { func TestGetStaticPodSpecs(t *testing.T) {
// Creates a Master Configuration // Creates a Master Configuration
@ -574,10 +576,10 @@ func TestGetControllerManagerCommand(t *testing.T) {
expected []string expected []string
}{ }{
{ {
name: "custom certs dir for v1.12.0-beta.2", name: "custom certs dir for " + cpVersion,
cfg: &kubeadmapi.ClusterConfiguration{ cfg: &kubeadmapi.ClusterConfiguration{
CertificatesDir: testCertsDir, CertificatesDir: testCertsDir,
KubernetesVersion: "v1.12.0-beta.2", KubernetesVersion: cpVersion,
}, },
expected: []string{ expected: []string{
"kube-controller-manager", "kube-controller-manager",
@ -597,11 +599,11 @@ func TestGetControllerManagerCommand(t *testing.T) {
}, },
}, },
{ {
name: "custom cluster-cidr for v1.12.0-beta.2", name: "custom cluster-cidr for " + cpVersion,
cfg: &kubeadmapi.ClusterConfiguration{ cfg: &kubeadmapi.ClusterConfiguration{
Networking: kubeadmapi.Networking{PodSubnet: "10.0.1.15/16"}, Networking: kubeadmapi.Networking{PodSubnet: "10.0.1.15/16"},
CertificatesDir: testCertsDir, CertificatesDir: testCertsDir,
KubernetesVersion: "v1.12.0-beta.2", KubernetesVersion: cpVersion,
}, },
expected: []string{ expected: []string{
"kube-controller-manager", "kube-controller-manager",
@ -624,14 +626,14 @@ func TestGetControllerManagerCommand(t *testing.T) {
}, },
}, },
{ {
name: "custom extra-args for v1.12.0-beta.2", name: "custom extra-args for " + cpVersion,
cfg: &kubeadmapi.ClusterConfiguration{ cfg: &kubeadmapi.ClusterConfiguration{
Networking: kubeadmapi.Networking{PodSubnet: "10.0.1.15/16"}, Networking: kubeadmapi.Networking{PodSubnet: "10.0.1.15/16"},
ControllerManager: kubeadmapi.ControlPlaneComponent{ ControllerManager: kubeadmapi.ControlPlaneComponent{
ExtraArgs: map[string]string{"node-cidr-mask-size": "20"}, ExtraArgs: map[string]string{"node-cidr-mask-size": "20"},
}, },
CertificatesDir: testCertsDir, CertificatesDir: testCertsDir,
KubernetesVersion: "v1.12.0-beta.2", KubernetesVersion: cpVersion,
}, },
expected: []string{ expected: []string{
"kube-controller-manager", "kube-controller-manager",
@ -654,11 +656,11 @@ func TestGetControllerManagerCommand(t *testing.T) {
}, },
}, },
{ {
name: "custom IPv6 networking for v1.12.0-beta.2", name: "custom IPv6 networking for " + cpVersion,
cfg: &kubeadmapi.ClusterConfiguration{ cfg: &kubeadmapi.ClusterConfiguration{
Networking: kubeadmapi.Networking{PodSubnet: "2001:db8::/64"}, Networking: kubeadmapi.Networking{PodSubnet: "2001:db8::/64"},
CertificatesDir: testCertsDir, CertificatesDir: testCertsDir,
KubernetesVersion: "v1.12.0-beta.2", KubernetesVersion: cpVersion,
}, },
expected: []string{ expected: []string{
"kube-controller-manager", "kube-controller-manager",
@ -872,11 +874,11 @@ func TestGetControllerManagerCommandExternalCA(t *testing.T) {
expectedArgFunc func(dir string) []string expectedArgFunc func(dir string) []string
}{ }{
{ {
name: "caKeyPresent-false for v1.12.0-beta.2", name: "caKeyPresent-false for " + cpVersion,
cfg: &kubeadmapi.InitConfiguration{ cfg: &kubeadmapi.InitConfiguration{
LocalAPIEndpoint: kubeadmapi.APIEndpoint{AdvertiseAddress: "1.2.3.4"}, LocalAPIEndpoint: kubeadmapi.APIEndpoint{AdvertiseAddress: "1.2.3.4"},
ClusterConfiguration: kubeadmapi.ClusterConfiguration{ ClusterConfiguration: kubeadmapi.ClusterConfiguration{
KubernetesVersion: "v1.12.0-beta.2", KubernetesVersion: cpVersion,
Networking: kubeadmapi.Networking{ServiceSubnet: "10.96.0.0/12", DNSDomain: "cluster.local"}, Networking: kubeadmapi.Networking{ServiceSubnet: "10.96.0.0/12", DNSDomain: "cluster.local"},
}, },
}, },
@ -901,11 +903,11 @@ func TestGetControllerManagerCommandExternalCA(t *testing.T) {
}, },
}, },
{ {
name: "caKeyPresent true for v1.12.0-beta.2", name: "caKeyPresent true for " + cpVersion,
cfg: &kubeadmapi.InitConfiguration{ cfg: &kubeadmapi.InitConfiguration{
LocalAPIEndpoint: kubeadmapi.APIEndpoint{AdvertiseAddress: "1.2.3.4"}, LocalAPIEndpoint: kubeadmapi.APIEndpoint{AdvertiseAddress: "1.2.3.4"},
ClusterConfiguration: kubeadmapi.ClusterConfiguration{ ClusterConfiguration: kubeadmapi.ClusterConfiguration{
KubernetesVersion: "v1.12.0-beta.2", KubernetesVersion: cpVersion,
Networking: kubeadmapi.Networking{ServiceSubnet: "10.96.0.0/12", DNSDomain: "cluster.local"}, Networking: kubeadmapi.Networking{ServiceSubnet: "10.96.0.0/12", DNSDomain: "cluster.local"},
}, },
}, },

View File

@ -429,7 +429,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
stablePatchVersion: "v1.10.5", stablePatchVersion: "v1.10.5",
stableVersion: "v1.10.5", stableVersion: "v1.10.5",
latestDevBranchVersion: "v1.11.0-beta.1", latestDevBranchVersion: "v1.11.0-beta.1",
latestVersion: "v1.12.0-alpha.0", latestVersion: constants.MinimumControlPlaneVersion.WithPreRelease("alpha.0").String(),
}, },
beforeDNSType: kubeadmapi.CoreDNS, beforeDNSType: kubeadmapi.CoreDNS,
beforeDNSVersion: "1.0.6", beforeDNSVersion: "1.0.6",
@ -470,7 +470,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
stablePatchVersion: "v1.10.5", stablePatchVersion: "v1.10.5",
stableVersion: "v1.10.5", stableVersion: "v1.10.5",
latestDevBranchVersion: "v1.11.0-rc.1", latestDevBranchVersion: "v1.11.0-rc.1",
latestVersion: "v1.12.0-alpha.1", latestVersion: constants.MinimumControlPlaneVersion.WithPreRelease("alpha.1").String(),
}, },
beforeDNSType: kubeadmapi.CoreDNS, beforeDNSType: kubeadmapi.CoreDNS,
beforeDNSVersion: "1.0.6", beforeDNSVersion: "1.0.6",
@ -511,7 +511,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
stablePatchVersion: "v1.10.5", stablePatchVersion: "v1.10.5",
stableVersion: "v1.10.5", stableVersion: "v1.10.5",
latestDevBranchVersion: "v1.11.6-rc.1", latestDevBranchVersion: "v1.11.6-rc.1",
latestVersion: "v1.12.1-alpha.0", latestVersion: constants.MinimumControlPlaneVersion.WithPatch(1).WithPreRelease("alpha.0").String(),
}, },
beforeDNSType: kubeadmapi.CoreDNS, beforeDNSType: kubeadmapi.CoreDNS,
beforeDNSVersion: "1.0.6", beforeDNSVersion: "1.0.6",
@ -552,7 +552,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
stablePatchVersion: "v1.10.5", stablePatchVersion: "v1.10.5",
stableVersion: "v1.10.5", stableVersion: "v1.10.5",
latestDevBranchVersion: "v1.11.0-rc.1", latestDevBranchVersion: "v1.11.0-rc.1",
latestVersion: "v1.12.0-alpha.2", latestVersion: constants.MinimumControlPlaneVersion.WithPreRelease("alpha.2").String(),
}, },
beforeDNSType: kubeadmapi.CoreDNS, beforeDNSType: kubeadmapi.CoreDNS,
beforeDNSVersion: "1.0.6", beforeDNSVersion: "1.0.6",
@ -591,8 +591,8 @@ func TestGetAvailableUpgrades(t *testing.T) {
EtcdVersion: "3.1.12", EtcdVersion: "3.1.12",
}, },
After: ClusterState{ After: ClusterState{
KubeVersion: "v1.12.0-alpha.2", KubeVersion: constants.MinimumControlPlaneVersion.WithPreRelease("alpha.2").String(),
KubeadmVersion: "v1.12.0-alpha.2", KubeadmVersion: constants.MinimumControlPlaneVersion.WithPreRelease("alpha.2").String(),
DNSType: kubeadmapi.CoreDNS, DNSType: kubeadmapi.CoreDNS,
DNSVersion: "1.2.6", DNSVersion: "1.2.6",
EtcdVersion: "3.2.24", EtcdVersion: "3.2.24",
@ -625,7 +625,7 @@ func TestGetAvailableUpgrades(t *testing.T) {
clusterVersion: "v1.11.1", clusterVersion: "v1.11.1",
kubeletVersion: "v1.11.0", kubeletVersion: "v1.11.0",
kubeadmVersion: "v1.11.1", kubeadmVersion: "v1.11.1",
}, "v1.12.1"), }, constants.MinimumControlPlaneVersion.WithPatch(1).String()),
etcdClient: etcdClient, etcdClient: etcdClient,
beforeDNSType: kubeadmapi.CoreDNS, beforeDNSType: kubeadmapi.CoreDNS,
beforeDNSVersion: "1.0.6", beforeDNSVersion: "1.0.6",
@ -644,8 +644,8 @@ func TestGetAvailableUpgrades(t *testing.T) {
EtcdVersion: "3.1.12", EtcdVersion: "3.1.12",
}, },
After: ClusterState{ After: ClusterState{
KubeVersion: "v1.12.1", KubeVersion: constants.MinimumControlPlaneVersion.WithPatch(1).String(),
KubeadmVersion: "v1.12.1", KubeadmVersion: constants.MinimumControlPlaneVersion.WithPatch(1).String(),
DNSType: kubeadmapi.CoreDNS, DNSType: kubeadmapi.CoreDNS,
DNSVersion: "1.2.6", DNSVersion: "1.2.6",
EtcdVersion: "3.2.24", EtcdVersion: "3.2.24",
@ -658,10 +658,10 @@ func TestGetAvailableUpgrades(t *testing.T) {
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.11.2", clusterVersion: "v1.11.2",
kubeletVersion: "v1.11.2", // the kubelet are on the same version as the control plane kubeletVersion: "v1.11.2", // the kubelet are on the same version as the control plane
kubeadmVersion: "v1.12.0", kubeadmVersion: constants.MinimumControlPlaneVersion.String(),
stablePatchVersion: "v1.12.0", stablePatchVersion: constants.MinimumControlPlaneVersion.String(),
stableVersion: "v1.12.0", stableVersion: constants.MinimumControlPlaneVersion.String(),
}, },
etcdClient: etcdClient, etcdClient: etcdClient,
beforeDNSType: kubeadmapi.KubeDNS, beforeDNSType: kubeadmapi.KubeDNS,
@ -675,14 +675,14 @@ func TestGetAvailableUpgrades(t *testing.T) {
KubeletVersions: map[string]uint16{ KubeletVersions: map[string]uint16{
"v1.11.2": 1, "v1.11.2": 1,
}, },
KubeadmVersion: "v1.12.0", KubeadmVersion: constants.MinimumControlPlaneVersion.String(),
DNSType: kubeadmapi.KubeDNS, DNSType: kubeadmapi.KubeDNS,
DNSVersion: "1.14.7", DNSVersion: "1.14.7",
EtcdVersion: "3.1.12", EtcdVersion: "3.1.12",
}, },
After: ClusterState{ After: ClusterState{
KubeVersion: "v1.12.0", KubeVersion: constants.MinimumControlPlaneVersion.String(),
KubeadmVersion: "v1.12.0", KubeadmVersion: constants.MinimumControlPlaneVersion.String(),
DNSType: kubeadmapi.CoreDNS, DNSType: kubeadmapi.CoreDNS,
DNSVersion: "1.2.6", DNSVersion: "1.2.6",
EtcdVersion: "3.2.24", EtcdVersion: "3.2.24",
@ -695,10 +695,10 @@ func TestGetAvailableUpgrades(t *testing.T) {
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.11.2", clusterVersion: "v1.11.2",
kubeletVersion: "v1.11.2", // the kubelet are on the same version as the control plane kubeletVersion: "v1.11.2", // the kubelet are on the same version as the control plane
kubeadmVersion: "v1.12.0", kubeadmVersion: constants.MinimumControlPlaneVersion.String(),
stablePatchVersion: "v1.12.0", stablePatchVersion: constants.MinimumControlPlaneVersion.String(),
stableVersion: "v1.12.0", stableVersion: constants.MinimumControlPlaneVersion.String(),
}, },
etcdClient: etcdClient, etcdClient: etcdClient,
beforeDNSType: kubeadmapi.KubeDNS, beforeDNSType: kubeadmapi.KubeDNS,
@ -712,14 +712,14 @@ func TestGetAvailableUpgrades(t *testing.T) {
KubeletVersions: map[string]uint16{ KubeletVersions: map[string]uint16{
"v1.11.2": 1, "v1.11.2": 1,
}, },
KubeadmVersion: "v1.12.0", KubeadmVersion: constants.MinimumControlPlaneVersion.String(),
DNSType: kubeadmapi.KubeDNS, DNSType: kubeadmapi.KubeDNS,
DNSVersion: "1.14.7", DNSVersion: "1.14.7",
EtcdVersion: "3.1.12", EtcdVersion: "3.1.12",
}, },
After: ClusterState{ After: ClusterState{
KubeVersion: "v1.12.0", KubeVersion: constants.MinimumControlPlaneVersion.String(),
KubeadmVersion: "v1.12.0", KubeadmVersion: constants.MinimumControlPlaneVersion.String(),
DNSType: kubeadmapi.KubeDNS, DNSType: kubeadmapi.KubeDNS,
DNSVersion: "1.14.13", DNSVersion: "1.14.13",
EtcdVersion: "3.2.24", EtcdVersion: "3.2.24",
@ -860,7 +860,7 @@ func TestGetBranchFromVersion(t *testing.T) {
expectedVersion: "1.9", expectedVersion: "1.9",
}, },
{ {
version: "v1.12.5", version: constants.MinimumControlPlaneVersion.WithPatch(5).String(),
expectedVersion: "1.12", expectedVersion: "1.12",
}, },
{ {

View File

@ -20,6 +20,7 @@ import (
"testing" "testing"
"k8s.io/apimachinery/pkg/util/version" "k8s.io/apimachinery/pkg/util/version"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
) )
func TestEnforceVersionPolicies(t *testing.T) { func TestEnforceVersionPolicies(t *testing.T) {
@ -34,17 +35,17 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "minor upgrade", name: "minor upgrade",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeadmVersion: "v1.12.5", kubeadmVersion: constants.MinimumControlPlaneVersion.WithPatch(5).String(),
}, },
newK8sVersion: "v1.12.5", newK8sVersion: constants.MinimumControlPlaneVersion.WithPatch(5).String(),
}, },
{ {
name: "major upgrade", name: "major upgrade",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.2", kubeletVersion: constants.MinimumControlPlaneVersion.WithPatch(2).String(),
kubeadmVersion: "v1.13.1", kubeadmVersion: "v1.13.1",
}, },
newK8sVersion: "v1.13.0", newK8sVersion: "v1.13.0",
@ -52,20 +53,20 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "downgrade", name: "downgrade",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.String(),
kubeadmVersion: "v1.12.3", kubeadmVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
}, },
newK8sVersion: "v1.12.2", newK8sVersion: constants.MinimumControlPlaneVersion.WithPatch(2).String(),
}, },
{ {
name: "same version upgrade", name: "same version upgrade",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.12.3", kubeadmVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
}, },
newK8sVersion: "v1.12.3", newK8sVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
}, },
{ {
name: "new version must be higher than v1.10.0", name: "new version must be higher than v1.10.0",
@ -96,26 +97,26 @@ func TestEnforceVersionPolicies(t *testing.T) {
kubeletVersion: "v1.14.3", kubeletVersion: "v1.14.3",
kubeadmVersion: "v1.14.0", kubeadmVersion: "v1.14.0",
}, },
newK8sVersion: "v1.12.3", newK8sVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
expectedMandatoryErrs: 1, // can't downgrade two minor versions expectedMandatoryErrs: 1, // can't downgrade two minor versions
expectedSkippableErrs: 1, // can't upgrade old k8s with newer kubeadm expectedSkippableErrs: 1, // can't upgrade old k8s with newer kubeadm
}, },
{ {
name: "kubeadm version must be higher than the new kube version. However, patch version skews may be forced", name: "kubeadm version must be higher than the new kube version. However, patch version skews may be forced",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.12.3", kubeadmVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
}, },
newK8sVersion: "v1.12.5", newK8sVersion: constants.MinimumControlPlaneVersion.WithPatch(5).String(),
expectedSkippableErrs: 1, expectedSkippableErrs: 1,
}, },
{ {
name: "kubeadm version must be higher than the new kube version. Trying to upgrade k8s to a higher minor version than kubeadm itself should never be supported", name: "kubeadm version must be higher than the new kube version. Trying to upgrade k8s to a higher minor version than kubeadm itself should never be supported",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.12.3", kubeadmVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
}, },
newK8sVersion: "v1.13.0", newK8sVersion: "v1.13.0",
expectedMandatoryErrs: 1, expectedMandatoryErrs: 1,
@ -123,7 +124,7 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "the maximum skew between the cluster version and the kubelet versions should be one minor version. This may be forced through though.", name: "the maximum skew between the cluster version and the kubelet versions should be one minor version. This may be forced through though.",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.11.8", kubeletVersion: "v1.11.8",
kubeadmVersion: "v1.13.0", kubeadmVersion: "v1.13.0",
}, },
@ -133,8 +134,8 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "experimental upgrades supported if the flag is set", name: "experimental upgrades supported if the flag is set",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.13.0-beta.1", kubeadmVersion: "v1.13.0-beta.1",
}, },
newK8sVersion: "v1.13.0-beta.1", newK8sVersion: "v1.13.0-beta.1",
@ -143,8 +144,8 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "release candidate upgrades supported if the flag is set", name: "release candidate upgrades supported if the flag is set",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.13.0-rc.1", kubeadmVersion: "v1.13.0-rc.1",
}, },
newK8sVersion: "v1.13.0-rc.1", newK8sVersion: "v1.13.0-rc.1",
@ -153,8 +154,8 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "release candidate upgrades supported if the flag is set", name: "release candidate upgrades supported if the flag is set",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.13.0-rc.1", kubeadmVersion: "v1.13.0-rc.1",
}, },
newK8sVersion: "v1.13.0-rc.1", newK8sVersion: "v1.13.0-rc.1",
@ -163,8 +164,8 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "the user should not be able to upgrade to an experimental version if they haven't opted into that", name: "the user should not be able to upgrade to an experimental version if they haven't opted into that",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.13.0-beta.1", kubeadmVersion: "v1.13.0-beta.1",
}, },
newK8sVersion: "v1.13.0-beta.1", newK8sVersion: "v1.13.0-beta.1",
@ -174,8 +175,8 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "the user should not be able to upgrade to an release candidate version if they haven't opted into that", name: "the user should not be able to upgrade to an release candidate version if they haven't opted into that",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.13.0-rc.1", kubeadmVersion: "v1.13.0-rc.1",
}, },
newK8sVersion: "v1.13.0-rc.1", newK8sVersion: "v1.13.0-rc.1",
@ -184,11 +185,11 @@ func TestEnforceVersionPolicies(t *testing.T) {
{ {
name: "the user can't use a newer minor version of kubeadm to upgrade an older version of kubeadm", name: "the user can't use a newer minor version of kubeadm to upgrade an older version of kubeadm",
vg: &fakeVersionGetter{ vg: &fakeVersionGetter{
clusterVersion: "v1.12.3", clusterVersion: constants.MinimumControlPlaneVersion.WithPatch(3).String(),
kubeletVersion: "v1.12.3", kubeletVersion: constants.MinimumKubeletVersion.WithPatch(3).String(),
kubeadmVersion: "v1.13.0", kubeadmVersion: "v1.13.0",
}, },
newK8sVersion: "v1.12.6", newK8sVersion: constants.MinimumControlPlaneVersion.WithPatch(6).String(),
expectedSkippableErrs: 1, // can't upgrade old k8s with newer kubeadm expectedSkippableErrs: 1, // can't upgrade old k8s with newer kubeadm
}, },
} }

View File

@ -431,7 +431,7 @@ func TestStaticPodControlPlane(t *testing.T) {
} }
defer os.RemoveAll(tmpEtcdDataDir) defer os.RemoveAll(tmpEtcdDataDir)
oldcfg, err := getConfig("v1.12.0", tempCertsDir, tmpEtcdDataDir) oldcfg, err := getConfig(constants.MinimumControlPlaneVersion.String(), tempCertsDir, tmpEtcdDataDir)
if err != nil { if err != nil {
t.Fatalf("couldn't create config: %v", err) t.Fatalf("couldn't create config: %v", err)
} }

View File

@ -46,6 +46,7 @@ go_test(
deps = [ deps = [
"//cmd/kubeadm/app/apis/kubeadm:go_default_library", "//cmd/kubeadm/app/apis/kubeadm:go_default_library",
"//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library", "//cmd/kubeadm/app/apis/kubeadm/v1beta1:go_default_library",
"//cmd/kubeadm/app/constants:go_default_library",
"//cmd/kubeadm/app/util/runtime:go_default_library", "//cmd/kubeadm/app/util/runtime:go_default_library",
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
"//vendor/github.com/pkg/errors:go_default_library", "//vendor/github.com/pkg/errors:go_default_library",

View File

@ -31,6 +31,7 @@ import (
"k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/sets"
kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm" kubeadmapi "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm"
kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1" kubeadmapiv1beta1 "k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta1"
"k8s.io/kubernetes/cmd/kubeadm/app/constants"
utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime" utilruntime "k8s.io/kubernetes/cmd/kubeadm/app/util/runtime"
"k8s.io/utils/exec" "k8s.io/utils/exec"
fakeexec "k8s.io/utils/exec/testing" fakeexec "k8s.io/utils/exec/testing"
@ -647,13 +648,13 @@ func TestKubeletVersionCheck(t *testing.T) {
expectErrors bool expectErrors bool
expectWarnings bool expectWarnings bool
}{ }{
{"v1.13.2", "", false, false}, // check minimally supported version when there is no information about control plane {"v1.13.2", "", false, false}, // check minimally supported version when there is no information about control plane
{"v1.11.3", "v1.11.8", true, false}, // too old kubelet (older than kubeadmconstants.MinimumKubeletVersion), should fail. {"v1.11.3", "v1.11.8", true, false}, // too old kubelet (older than kubeadmconstants.MinimumKubeletVersion), should fail.
{"v1.12.0", "v1.12.5", false, false}, // kubelet within same major.minor as control plane {"v" + constants.MinimumKubeletVersion.String(), constants.MinimumControlPlaneVersion.WithPatch(5).String(), false, false}, // kubelet within same major.minor as control plane
{"v1.12.5", "v1.12.1", false, false}, // kubelet is newer, but still within same major.minor as control plane {"v" + constants.MinimumKubeletVersion.WithPatch(5).String(), constants.MinimumControlPlaneVersion.WithPatch(1).String(), false, false}, // kubelet is newer, but still within same major.minor as control plane
{"v1.12.0", "v1.13.1", false, false}, // kubelet is lower than control plane, but newer than minimally supported {"v" + constants.MinimumKubeletVersion.String(), "v1.13.1", false, false}, // kubelet is lower than control plane, but newer than minimally supported
{"v1.13.0-alpha.1", "v1.12.1", true, false}, // kubelet is newer (development build) than control plane, should fail. {"v1.13.0-alpha.1", constants.MinimumControlPlaneVersion.WithPatch(1).String(), true, false}, // kubelet is newer (development build) than control plane, should fail.
{"v1.13.0", "v1.12.5", true, false}, // kubelet is newer (release) than control plane, should fail. {"v1.13.0", constants.MinimumControlPlaneVersion.WithPatch(5).String(), true, false}, // kubelet is newer (release) than control plane, should fail.
} }
for _, tc := range cases { for _, tc := range cases {

View File

@ -34,7 +34,7 @@ import (
"k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient" "k8s.io/kubernetes/cmd/kubeadm/app/util/apiclient"
) )
var k8sVersionString = "v1.12.0" var k8sVersionString = kubeadmconstants.MinimumControlPlaneVersion.String()
var k8sVersion = version.MustParseGeneric(k8sVersionString) var k8sVersion = version.MustParseGeneric(k8sVersionString)
var nodeName = "mynode" var nodeName = "mynode"
var cfgFiles = map[string][]byte{ var cfgFiles = map[string][]byte{

View File

@ -102,7 +102,7 @@ func TestCmdInitKubernetesVersion(t *testing.T) {
}, },
{ {
name: "valid version is accepted", name: "valid version is accepted",
args: "--kubernetes-version=1.12.0", args: "--kubernetes-version=1.13.0",
expected: true, expected: true,
}, },
} }

View File

@ -17,6 +17,7 @@ limitations under the License.
package test package test
import ( import (
"fmt"
"html/template" "html/template"
"io/ioutil" "io/ioutil"
"os" "os"
@ -54,7 +55,7 @@ func SetupInitConfigurationFile(t *testing.T, tmpdir string, cfg *kubeadmapi.Ini
t.Fatalf("Couldn't create cfgDir") t.Fatalf("Couldn't create cfgDir")
} }
cfgTemplate := template.Must(template.New("init").Parse(dedent.Dedent(` cfgTemplate := template.Must(template.New("init").Parse(dedent.Dedent(fmt.Sprintf(`
apiVersion: kubeadm.k8s.io/v1beta1 apiVersion: kubeadm.k8s.io/v1beta1
kind: InitConfiguration kind: InitConfiguration
apiEndpoint: apiEndpoint:
@ -66,8 +67,8 @@ func SetupInitConfigurationFile(t *testing.T, tmpdir string, cfg *kubeadmapi.Ini
apiVersion: kubeadm.k8s.io/v1beta1 apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration kind: ClusterConfiguration
certificatesDir: {{.CertificatesDir}} certificatesDir: {{.CertificatesDir}}
kubernetesVersion: v1.12.0 kubernetesVersion: %s
`))) `, kubeadmconstants.MinimumControlPlaneVersion))))
f, err := os.Create(cfgPath) f, err := os.Create(cfgPath)
if err != nil { if err != nil {