Skip to content

Commit a6c749f

Browse files
authored
Merge pull request #5798 from nanikjava/f-fix-2570
Make Kubernetes version sticky for a cluster instead of auto-upgrading
2 parents 92b646d + f680d1b commit a6c749f

File tree

3 files changed

+108
-9
lines changed

3 files changed

+108
-9
lines changed

cmd/minikube/cmd/start.go

+19-7
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ func initMinikubeFlags() {
180180

181181
// initKubernetesFlags inits the commandline flags for kubernetes related options
182182
func initKubernetesFlags() {
183-
startCmd.Flags().String(kubernetesVersion, constants.DefaultKubernetesVersion, "The kubernetes version that the minikube VM will use (ex: v1.2.3)")
183+
startCmd.Flags().String(kubernetesVersion, "", "The kubernetes version that the minikube VM will use (ex: v1.2.3)")
184184
startCmd.Flags().Var(&extraOptions, "extra-config",
185185
`A set of key=value pairs that describe configuration that may be passed to different components.
186186
The key should be '.' separated, and the first part before the dot is the component to apply the configuration to.
@@ -1120,15 +1120,20 @@ func tryRegistry(r command.Runner) {
11201120

11211121
// getKubernetesVersion ensures that the requested version is reasonable
11221122
func getKubernetesVersion(old *cfg.MachineConfig) (string, bool) {
1123-
rawVersion := viper.GetString(kubernetesVersion)
1123+
paramVersion := viper.GetString(kubernetesVersion)
11241124
isUpgrade := false
1125-
if rawVersion == "" {
1126-
rawVersion = constants.DefaultKubernetesVersion
1125+
1126+
if paramVersion == "" { // if the user did not specify any version then ...
1127+
if old != nil { // .. use the old version from config
1128+
paramVersion = old.KubernetesConfig.KubernetesVersion
1129+
} else { // .. otherwise use the default version
1130+
paramVersion = constants.DefaultKubernetesVersion
1131+
}
11271132
}
11281133

1129-
nvs, err := semver.Make(strings.TrimPrefix(rawVersion, version.VersionPrefix))
1134+
nvs, err := semver.Make(strings.TrimPrefix(paramVersion, version.VersionPrefix))
11301135
if err != nil {
1131-
exit.WithCodeT(exit.Data, `Unable to parse "{{.kubernetes_version}}": {{.error}}`, out.V{"kubernetes_version": rawVersion, "error": err})
1136+
exit.WithCodeT(exit.Data, `Unable to parse "{{.kubernetes_version}}": {{.error}}`, out.V{"kubernetes_version": paramVersion, "error": err})
11321137
}
11331138
nv := version.VersionPrefix + nvs.String()
11341139

@@ -1140,6 +1145,10 @@ func getKubernetesVersion(old *cfg.MachineConfig) (string, bool) {
11401145
if err != nil {
11411146
exit.WithCodeT(exit.Data, "Unable to parse oldest Kubernetes version from constants: {{.error}}", out.V{"error": err})
11421147
}
1148+
defaultVersion, err := semver.Make(strings.TrimPrefix(constants.DefaultKubernetesVersion, version.VersionPrefix))
1149+
if err != nil {
1150+
exit.WithCodeT(exit.Data, "Unable to parse default Kubernetes version from constants: {{.error}}", out.V{"error": err})
1151+
}
11431152

11441153
if nvs.LT(oldestVersion) {
11451154
out.WarningT("Specified Kubernetes version {{.specified}} is less than the oldest supported version: {{.oldest}}", out.V{"specified": nvs, "oldest": constants.OldestKubernetesVersion})
@@ -1168,8 +1177,11 @@ func getKubernetesVersion(old *cfg.MachineConfig) (string, bool) {
11681177
* Reuse the existing cluster with Kubernetes v{{.old}} or newer: Run "minikube start {{.profile}} --kubernetes-version={{.old}}"`, out.V{"new": nvs, "old": ovs, "profile": profileArg})
11691178

11701179
}
1180+
if defaultVersion.GT(nvs) {
1181+
out.T(out.ThumbsUp, "Kubernetes {{.new}} is now available. If you would like to upgrade, specify: --kubernetes-version={{.new}}", out.V{"new": defaultVersion})
1182+
}
1183+
11711184
if nvs.GT(ovs) {
1172-
out.T(out.ThumbsUp, "Upgrading from Kubernetes {{.old}} to {{.new}}", out.V{"old": ovs, "new": nvs})
11731185
isUpgrade = true
11741186
}
11751187
return nv, isUpgrade

cmd/minikube/cmd/start_test.go

+55
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,64 @@ import (
2222

2323
"github.com/spf13/cobra"
2424
"github.com/spf13/viper"
25+
cfg "k8s.io/minikube/pkg/minikube/config"
2526
"k8s.io/minikube/pkg/minikube/constants"
2627
)
2728

29+
func TestGetKuberneterVersion(t *testing.T) {
30+
var tests = []struct {
31+
description string
32+
expectedVersion string
33+
paramVersion string
34+
upgrade bool
35+
cfg *cfg.MachineConfig
36+
}{
37+
{
38+
description: "kubernetes-version not given, no config",
39+
expectedVersion: constants.DefaultKubernetesVersion,
40+
paramVersion: "",
41+
upgrade: false,
42+
},
43+
{
44+
description: "kubernetes-version not given, config available",
45+
expectedVersion: "v1.15.0",
46+
paramVersion: "",
47+
upgrade: false,
48+
cfg: &cfg.MachineConfig{KubernetesConfig: cfg.KubernetesConfig{KubernetesVersion: "v1.15.0"}},
49+
},
50+
{
51+
description: "kubernetes-version given, no config",
52+
expectedVersion: "v1.15.0",
53+
paramVersion: "v1.15.0",
54+
upgrade: false,
55+
},
56+
{
57+
description: "kubernetes-version given, config available",
58+
expectedVersion: "v1.16.0",
59+
paramVersion: "v1.16.0",
60+
upgrade: true,
61+
cfg: &cfg.MachineConfig{KubernetesConfig: cfg.KubernetesConfig{KubernetesVersion: "v1.15.0"}},
62+
},
63+
}
64+
65+
for _, test := range tests {
66+
t.Run(test.description, func(t *testing.T) {
67+
viper.SetDefault(kubernetesVersion, test.paramVersion)
68+
version, upgrade := getKubernetesVersion(test.cfg)
69+
70+
// check whether we are getting the expected version
71+
if version != test.expectedVersion {
72+
t.Fatalf("test failed because the expected version %s is not returned", test.expectedVersion)
73+
}
74+
75+
// check whether the upgrade flag is correct
76+
if test.upgrade != upgrade {
77+
t.Fatalf("test failed expected upgrade is %t", test.upgrade)
78+
}
79+
})
80+
}
81+
}
82+
2883
func TestGenerateCfgFromFlagsHTTPProxyHandling(t *testing.T) {
2984
viper.SetDefault(memory, defaultMemorySize)
3085
viper.SetDefault(humanReadableDiskSize, defaultDiskSize)

test/integration/version_upgrade_test.go

+34-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package integration
1818

1919
import (
2020
"context"
21+
"encoding/json"
2122
"fmt"
2223
"io/ioutil"
2324
"os"
@@ -28,6 +29,7 @@ import (
2829
"time"
2930

3031
"github.com/docker/machine/libmachine/state"
32+
3133
"k8s.io/minikube/pkg/minikube/constants"
3234
"k8s.io/minikube/pkg/util/retry"
3335

@@ -66,13 +68,13 @@ func TestVersionUpgrade(t *testing.T) {
6668

6769
args := append([]string{"start", "-p", profile, fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...)
6870
rr := &RunResult{}
69-
releaseStart := func() error {
71+
r := func() error {
7072
rr, err = Run(t, exec.CommandContext(ctx, tf.Name(), args...))
7173
return err
7274
}
7375

7476
// Retry to allow flakiness for the previous release
75-
if err := retry.Expo(releaseStart, 1*time.Second, 30*time.Minute, 3); err != nil {
77+
if err := retry.Expo(r, 1*time.Second, 30*time.Minute, 3); err != nil {
7678
t.Fatalf("release start failed: %v", err)
7779
}
7880

@@ -96,4 +98,34 @@ func TestVersionUpgrade(t *testing.T) {
9698
if err != nil {
9799
t.Errorf("%s failed: %v", rr.Args, err)
98100
}
101+
102+
s, err := Run(t, exec.CommandContext(ctx, "kubectl", "--context", profile, "version", "--output=json"))
103+
if err != nil {
104+
t.Fatalf("error running kubectl: %v", err)
105+
}
106+
cv := struct {
107+
ServerVersion struct {
108+
GitVersion string `json:"gitVersion"`
109+
} `json:"serverVersion"`
110+
}{}
111+
err = json.Unmarshal(s.Stdout.Bytes(), &cv)
112+
113+
if err != nil {
114+
t.Fatalf("error traversing json output: %v", err)
115+
}
116+
117+
if cv.ServerVersion.GitVersion != constants.NewestKubernetesVersion {
118+
t.Fatalf("expected server version %s is not the same with latest version %s", cv.ServerVersion.GitVersion, constants.NewestKubernetesVersion)
119+
}
120+
121+
args = append([]string{"start", "-p", profile, fmt.Sprintf("--kubernetes-version=%s", constants.OldestKubernetesVersion), "--alsologtostderr", "-v=1"}, StartArgs()...)
122+
rr = &RunResult{}
123+
r = func() error {
124+
rr, err = Run(t, exec.CommandContext(ctx, tf.Name(), args...))
125+
return err
126+
}
127+
128+
if err := retry.Expo(r, 1*time.Second, 30*time.Minute, 3); err == nil {
129+
t.Fatalf("downgrading kubernetes should not be allowed: %v", err)
130+
}
99131
}

0 commit comments

Comments
 (0)