Skip to content

Commit af05322

Browse files
committed
force: Remove viper force checks outside cmd
Add run.CommandOptions.Force option and use it to replace calls to viper.GetBool("force") outside the cmd package, and call to viper.GetBool(force) in the cmd package.
1 parent 93c5f6a commit af05322

File tree

9 files changed

+115
-113
lines changed

9 files changed

+115
-113
lines changed

cmd/minikube/cmd/flags/flags.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
const (
2727
Interactive = "interactive"
2828
DownloadOnly = "download-only"
29+
Force = "force"
2930
)
3031

3132
// CommandOptions returns minikube runtime options from command line flags.
@@ -36,5 +37,6 @@ func CommandOptions() *run.CommandOptions {
3637
NonInteractive: !viper.GetBool(Interactive),
3738
DownloadOnly: viper.GetBool(DownloadOnly),
3839
ProfileName: viper.GetString(config.ProfileName),
40+
Force: viper.GetBool(Force),
3941
}
4042
}

cmd/minikube/cmd/start.go

Lines changed: 56 additions & 59 deletions
Large diffs are not rendered by default.

cmd/minikube/cmd/start_flags.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ const (
105105
dnsProxy = "dns-proxy"
106106
hostDNSResolver = "host-dns-resolver"
107107
waitComponents = "wait"
108-
force = "force"
109108
dryRun = "dry-run"
110109
waitTimeout = "wait-timeout"
111110
nativeSSH = "native-ssh"
@@ -159,7 +158,7 @@ func initMinikubeFlags() {
159158
// e.g. iso-url => $ENVPREFIX_ISO_URL
160159
viper.SetEnvKeyReplacer(strings.NewReplacer("-", "_"))
161160
viper.AutomaticEnv()
162-
startCmd.Flags().Bool(force, false, "Force minikube to perform possibly dangerous operations")
161+
startCmd.Flags().Bool(flags.Force, false, "Force minikube to perform possibly dangerous operations")
163162
startCmd.Flags().Bool(flags.Interactive, true, "Allow user prompts for more information")
164163
startCmd.Flags().Bool(dryRun, false, "dry-run mode. Validates configuration, but does not mutate system state")
165164

@@ -317,7 +316,7 @@ func ClusterFlagValue() string {
317316
func generateClusterConfig(cmd *cobra.Command, existing *config.ClusterConfig, k8sVersion string, rtime string, drvName string, options *run.CommandOptions) (config.ClusterConfig, config.Node, error) {
318317
var cc config.ClusterConfig
319318
if existing != nil {
320-
cc = updateExistingConfigFromFlags(cmd, existing)
319+
cc = updateExistingConfigFromFlags(cmd, existing, options)
321320

322321
// identify appropriate cni then configure cruntime accordingly
323322
if _, err := cni.New(&cc); err != nil {
@@ -382,7 +381,7 @@ func getCPUCount(drvName string) int {
382381
return si.CPUs
383382
}
384383

385-
func getMemorySize(cmd *cobra.Command, drvName string) int {
384+
func getMemorySize(cmd *cobra.Command, drvName string, options *run.CommandOptions) int {
386385
sysLimit, containerLimit, err := memoryLimits(drvName)
387386
if err != nil {
388387
klog.Warningf("Unable to query memory limits: %+v", err)
@@ -406,7 +405,7 @@ func getMemorySize(cmd *cobra.Command, drvName string) int {
406405
exit.Message(reason.Usage, "{{.driver_name}} has only {{.container_limit}}MB memory but you specified {{.specified_memory}}MB", out.V{"container_limit": containerLimit, "specified_memory": mem, "driver_name": driver.FullName(drvName)})
407406
}
408407
} else {
409-
validateRequestedMemorySize(mem, drvName)
408+
validateRequestedMemorySize(mem, drvName, options)
410409
klog.Infof("Using suggested %dMB memory alloc based on sys=%dMB, container=%dMB", mem, sysLimit, containerLimit)
411410
}
412411

@@ -576,7 +575,7 @@ func generateNewConfigFromFlags(cmd *cobra.Command, k8sVersion string, rtime str
576575
KicBaseImage: viper.GetString(kicBaseImage),
577576
Network: getNetwork(drvName, options),
578577
Subnet: viper.GetString(subnet),
579-
Memory: getMemorySize(cmd, drvName),
578+
Memory: getMemorySize(cmd, drvName, options),
580579
CPUs: getCPUCount(drvName),
581580
DiskSize: getDiskSize(),
582581
Driver: drvName,
@@ -749,7 +748,7 @@ func checkNumaCount(k8sVersion string) {
749748
}
750749

751750
// upgradeExistingConfig upgrades legacy configuration files
752-
func upgradeExistingConfig(cmd *cobra.Command, cc *config.ClusterConfig) {
751+
func upgradeExistingConfig(cmd *cobra.Command, cc *config.ClusterConfig, options *run.CommandOptions) {
753752
if cc == nil {
754753
return
755754
}
@@ -772,7 +771,7 @@ func upgradeExistingConfig(cmd *cobra.Command, cc *config.ClusterConfig) {
772771

773772
if cc.Memory == 0 && !driver.IsKIC(cc.Driver) {
774773
klog.Info("Existing config file was missing memory. (could be an old minikube config), will use the default value")
775-
memInMB := getMemorySize(cmd, cc.Driver)
774+
memInMB := getMemorySize(cmd, cc.Driver, options)
776775
cc.Memory = memInMB
777776
}
778777

@@ -783,8 +782,8 @@ func upgradeExistingConfig(cmd *cobra.Command, cc *config.ClusterConfig) {
783782

784783
// updateExistingConfigFromFlags will update the existing config from the flags - used on a second start
785784
// skipping updating existing docker env, docker opt, InsecureRegistry, registryMirror, extra-config, apiserver-ips
786-
func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterConfig) config.ClusterConfig { //nolint to suppress cyclomatic complexity 45 of func `updateExistingConfigFromFlags` is high (> 30)
787-
validateFlags(cmd, existing.Driver)
785+
func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterConfig, options *run.CommandOptions) config.ClusterConfig { //nolint to suppress cyclomatic complexity 45 of func `updateExistingConfigFromFlags` is high (> 30)
786+
validateFlags(cmd, existing.Driver, options)
788787

789788
cc := *existing
790789

@@ -802,7 +801,7 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC
802801
updateIntFromFlag(cmd, &cc.APIServerPort, apiServerPort)
803802
}
804803

805-
if cmd.Flags().Changed(memory) && getMemorySize(cmd, cc.Driver) != cc.Memory {
804+
if cmd.Flags().Changed(memory) && getMemorySize(cmd, cc.Driver, options) != cc.Memory {
806805
out.WarningT("You cannot change the memory size for an existing minikube cluster. Please first delete the cluster.")
807806
}
808807

@@ -811,7 +810,7 @@ func updateExistingConfigFromFlags(cmd *cobra.Command, existing *config.ClusterC
811810
}
812811

813812
// validate the memory size in case user changed their system memory limits (example change docker desktop or upgraded memory.)
814-
validateRequestedMemorySize(cc.Memory, cc.Driver)
813+
validateRequestedMemorySize(cc.Memory, cc.Driver, options)
815814

816815
if cmd.Flags().Changed(humanReadableDiskSize) && getDiskSize() != existing.DiskSize {
817816
out.WarningT("You cannot change the disk size for an existing minikube cluster. Please first delete the cluster.")

pkg/minikube/machine/cluster_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func TestCreateHost(t *testing.T) {
8585
t.Fatal("Machine already exists.")
8686
}
8787

88-
_, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
88+
_, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
8989
if err != nil {
9090
t.Fatalf("Error creating host: %v", err)
9191
}
@@ -129,7 +129,7 @@ func TestStartHostExists(t *testing.T) {
129129
api := tests.NewMockAPI(t)
130130

131131
// Create an initial host.
132-
ih, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
132+
ih, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
133133
if err != nil {
134134
t.Fatalf("Error creating host: %v", err)
135135
}
@@ -147,7 +147,7 @@ func TestStartHostExists(t *testing.T) {
147147
mc.Name = ih.Name
148148

149149
// This should pass without calling Create because the host exists already.
150-
h, _, err := StartHost(api, &mc, &(mc.Nodes[0]))
150+
h, _, err := StartHost(api, &mc, &(mc.Nodes[0]), &run.CommandOptions{})
151151
if err != nil {
152152
t.Fatalf("Error starting host: %v", err)
153153
}
@@ -169,7 +169,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) {
169169
api := tests.NewMockAPI(t)
170170
// Create an incomplete host with machine does not exist error(i.e. User Interrupt Cancel)
171171
api.NotExistError = true
172-
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"})
172+
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: "minikube"}, &run.CommandOptions{})
173173
if err != nil {
174174
t.Fatalf("Error creating host: %v", err)
175175
}
@@ -183,7 +183,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) {
183183
n := config.Node{Name: h.Name}
184184

185185
// This should pass with creating host, while machine does not exist.
186-
h, _, err = StartHost(api, &mc, &n)
186+
h, _, err = StartHost(api, &mc, &n, &run.CommandOptions{})
187187
if err != nil {
188188
if err != constants.ErrMachineMissing {
189189
t.Fatalf("Error starting host: %v", err)
@@ -196,7 +196,7 @@ func TestStartHostErrMachineNotExist(t *testing.T) {
196196
n.Name = h.Name
197197

198198
// Second call. This should pass without calling Create because the host exists already.
199-
h, _, err = StartHost(api, &mc, &n)
199+
h, _, err = StartHost(api, &mc, &n, &run.CommandOptions{})
200200
if err != nil {
201201
t.Fatalf("Error starting host: %v", err)
202202
}
@@ -218,7 +218,7 @@ func TestStartStoppedHost(t *testing.T) {
218218
RegisterMockDriver(t)
219219
api := tests.NewMockAPI(t)
220220
// Create an initial host.
221-
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
221+
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
222222
if err != nil {
223223
t.Fatalf("Error creating host: %v", err)
224224
}
@@ -231,7 +231,7 @@ func TestStartStoppedHost(t *testing.T) {
231231
mc := defaultClusterConfig
232232
mc.Name = h.Name
233233
n := config.Node{Name: h.Name}
234-
h, _, err = StartHost(api, &mc, &n)
234+
h, _, err = StartHost(api, &mc, &n, &run.CommandOptions{})
235235
if err != nil {
236236
t.Fatal("Error starting host.")
237237
}
@@ -261,7 +261,7 @@ func TestStartHost(t *testing.T) {
261261
md := &tests.MockDetector{Provisioner: &tests.MockProvisioner{}}
262262
provision.SetDetector(md)
263263

264-
h, _, err := StartHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
264+
h, _, err := StartHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
265265
if err != nil {
266266
t.Fatal("Error starting host.")
267267
}
@@ -300,7 +300,7 @@ func TestStartHostConfig(t *testing.T) {
300300
DockerOpt: []string{"param=value"},
301301
}
302302

303-
h, _, err := StartHost(api, &cfg, &config.Node{Name: options.ProfileName})
303+
h, _, err := StartHost(api, &cfg, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
304304
if err != nil {
305305
t.Fatal("Error starting host.")
306306
}
@@ -333,7 +333,7 @@ func TestStopHost(t *testing.T) {
333333
options := &run.CommandOptions{ProfileName: constants.DefaultClusterName}
334334
RegisterMockDriver(t)
335335
api := tests.NewMockAPI(t)
336-
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
336+
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
337337
if err != nil {
338338
t.Errorf("createHost failed: %v", err)
339339
}
@@ -355,7 +355,7 @@ func TestDeleteHost(t *testing.T) {
355355
options := &run.CommandOptions{ProfileName: constants.DefaultClusterName}
356356
RegisterMockDriver(t)
357357
api := tests.NewMockAPI(t)
358-
if _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}); err != nil {
358+
if _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{}); err != nil {
359359
t.Errorf("createHost failed: %v", err)
360360
}
361361

@@ -373,7 +373,7 @@ func TestDeleteHostErrorDeletingVM(t *testing.T) {
373373
options := &run.CommandOptions{ProfileName: constants.DefaultClusterName}
374374
RegisterMockDriver(t)
375375
api := tests.NewMockAPI(t)
376-
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
376+
h, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
377377
if err != nil {
378378
t.Errorf("createHost failed: %v", err)
379379
}
@@ -393,7 +393,7 @@ func TestDeleteHostErrorDeletingFiles(t *testing.T) {
393393
RegisterMockDriver(t)
394394
api := tests.NewMockAPI(t)
395395
api.RemoveError = true
396-
if _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}); err != nil {
396+
if _, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{}); err != nil {
397397
t.Errorf("createHost failed: %v", err)
398398
}
399399

@@ -410,7 +410,7 @@ func TestDeleteHostErrMachineNotExist(t *testing.T) {
410410
api := tests.NewMockAPI(t)
411411
// Create an incomplete host with machine does not exist error(i.e. User Interrupt Cancel)
412412
api.NotExistError = true
413-
_, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName})
413+
_, err := createHost(api, &defaultClusterConfig, &config.Node{Name: options.ProfileName}, &run.CommandOptions{})
414414
if err != nil {
415415
t.Errorf("createHost failed: %v", err)
416416
}
@@ -444,7 +444,7 @@ func TestStatus(t *testing.T) {
444444

445445
checkState(state.None.String(), m)
446446

447-
if _, err := createHost(api, &cc, &config.Node{Name: options.ProfileName}); err != nil {
447+
if _, err := createHost(api, &cc, &config.Node{Name: options.ProfileName}, &run.CommandOptions{}); err != nil {
448448
t.Errorf("createHost failed: %v", err)
449449
}
450450

pkg/minikube/machine/fix.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"k8s.io/minikube/pkg/minikube/driver"
3535
"k8s.io/minikube/pkg/minikube/out"
3636
"k8s.io/minikube/pkg/minikube/out/register"
37+
"k8s.io/minikube/pkg/minikube/run"
3738
"k8s.io/minikube/pkg/minikube/style"
3839
)
3940

@@ -49,7 +50,7 @@ const (
4950
)
5051

5152
// fixHost fixes up a previously configured VM so that it is ready to run Kubernetes
52-
func fixHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node) (*host.Host, error) {
53+
func fixHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node, options *run.CommandOptions) (*host.Host, error) {
5354
start := time.Now()
5455
klog.Infof("fixHost starting: %s", n.Name)
5556
defer func() {
@@ -60,14 +61,14 @@ func fixHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node) (*hos
6061
if err != nil {
6162
return h, errors.Wrap(err, "error loading existing host. Please try running [minikube delete], then run [minikube start] again")
6263
}
63-
defer postStartValidations(h, cc.Driver)
64+
defer postStartValidations(h, cc.Driver, options)
6465

6566
driverName := h.Driver.DriverName()
6667

6768
// check if need to re-run docker-env
6869
maybeWarnAboutEvalEnv(driverName, cc.Name)
6970

70-
h, err = recreateIfNeeded(api, cc, n, h)
71+
h, err = recreateIfNeeded(api, cc, n, h, options)
7172
if err != nil {
7273
return h, err
7374
}
@@ -103,7 +104,7 @@ func fixHost(api libmachine.API, cc *config.ClusterConfig, n *config.Node) (*hos
103104
return h, nil
104105
}
105106

106-
func recreateIfNeeded(api libmachine.API, cc *config.ClusterConfig, n *config.Node, h *host.Host) (*host.Host, error) {
107+
func recreateIfNeeded(api libmachine.API, cc *config.ClusterConfig, n *config.Node, h *host.Host, options *run.CommandOptions) (*host.Host, error) {
107108
machineName := config.MachineName(*cc, *n)
108109
machineType := driver.MachineType(cc.Driver)
109110
recreated := false
@@ -124,7 +125,7 @@ func recreateIfNeeded(api libmachine.API, cc *config.ClusterConfig, n *config.No
124125
klog.Infof("Sleeping 1 second for extra luck!")
125126
time.Sleep(1 * time.Second)
126127

127-
h, err = createHost(api, cc, n)
128+
h, err = createHost(api, cc, n, options)
128129
if err != nil {
129130
return nil, errors.Wrap(err, "recreate")
130131
}

pkg/minikube/machine/start.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ import (
3535
"github.com/docker/machine/libmachine/host"
3636
"github.com/juju/mutex/v2"
3737
"github.com/pkg/errors"
38-
"github.com/spf13/viper"
3938
"k8s.io/klog/v2"
4039
"k8s.io/minikube/pkg/drivers/kic/oci"
4140
"k8s.io/minikube/pkg/minikube/command"
@@ -49,6 +48,7 @@ import (
4948
"k8s.io/minikube/pkg/minikube/proxy"
5049
"k8s.io/minikube/pkg/minikube/reason"
5150
"k8s.io/minikube/pkg/minikube/registry"
51+
"k8s.io/minikube/pkg/minikube/run"
5252
"k8s.io/minikube/pkg/minikube/style"
5353
"k8s.io/minikube/pkg/minikube/vmpath"
5454
"k8s.io/minikube/pkg/util"
@@ -70,7 +70,7 @@ var requiredDirectories = []string{
7070
}
7171

7272
// StartHost starts a host VM.
73-
func StartHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (*host.Host, bool, error) {
73+
func StartHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node, options *run.CommandOptions) (*host.Host, bool, error) {
7474
machineName := config.MachineName(*cfg, *n)
7575

7676
// Prevent machine-driver boot races, as well as our own certificate race
@@ -91,10 +91,10 @@ func StartHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (*
9191
var h *host.Host
9292
if !exists {
9393
klog.Infof("Provisioning new machine with config: %+v %+v", cfg, n)
94-
h, err = createHost(api, cfg, n)
94+
h, err = createHost(api, cfg, n, options)
9595
} else {
9696
klog.Infoln("Skipping create...Using existing machine configuration")
97-
h, err = fixHost(api, cfg, n)
97+
h, err = fixHost(api, cfg, n, options)
9898
}
9999
if err != nil {
100100
return h, exists, err
@@ -121,7 +121,7 @@ func engineOptions(cfg config.ClusterConfig) *engine.Options {
121121
return &o
122122
}
123123

124-
func createHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (*host.Host, error) {
124+
func createHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node, options *run.CommandOptions) (*host.Host, error) {
125125
klog.Infof("createHost starting for %q (driver=%q)", n.Name, cfg.Driver)
126126
start := time.Now()
127127
defer func() {
@@ -149,7 +149,7 @@ func createHost(api libmachine.API, cfg *config.ClusterConfig, n *config.Node) (
149149
if err != nil {
150150
return nil, errors.Wrap(err, "new host")
151151
}
152-
defer postStartValidations(h, cfg.Driver)
152+
defer postStartValidations(h, cfg.Driver, options)
153153

154154
h.HostOptions.AuthOptions.CertDir = localpath.MiniPath()
155155
h.HostOptions.AuthOptions.StorePath = localpath.MiniPath()
@@ -201,7 +201,7 @@ func timedCreateHost(h *host.Host, api libmachine.API, t time.Duration) error {
201201

202202
// postStartValidations are validations against the host after it is created
203203
// TODO: Add validations for VM drivers as well, see issue #9035
204-
func postStartValidations(h *host.Host, drvName string) {
204+
func postStartValidations(h *host.Host, drvName string, options *run.CommandOptions) {
205205
if !driver.IsKIC(drvName) {
206206
return
207207
}
@@ -225,7 +225,7 @@ func postStartValidations(h *host.Host, drvName string) {
225225
return
226226
}
227227

228-
if viper.GetBool("force") {
228+
if options.Force {
229229
return
230230
}
231231

0 commit comments

Comments
 (0)