Skip to content

Commit a4a1ba5

Browse files
authored
Merge pull request #15868 from norshtein/addon
Don't allow enabling addon on a paused cluster
2 parents 2483eaa + c7ac4a1 commit a4a1ba5

File tree

4 files changed

+77
-2
lines changed

4 files changed

+77
-2
lines changed

cmd/minikube/cmd/config/disable.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ var addonsDisableCmd = &cobra.Command{
3535
if len(args) != 1 {
3636
exit.Message(reason.Usage, "usage: minikube addons disable ADDON_NAME")
3737
}
38-
38+
err := addons.VerifyNotPaused(ClusterFlagValue(), false)
39+
if err != nil {
40+
exit.Error(reason.InternalAddonDisablePaused, "disable failed", err)
41+
}
3942
addon := args[0]
4043
if addon == "heapster" {
4144
exit.Message(reason.AddonUnsupported, "The heapster addon is depreciated. please try to disable metrics-server instead")
@@ -46,7 +49,7 @@ var addonsDisableCmd = &cobra.Command{
4649
exit.Message(reason.AddonUnsupported, `"'{{.minikube_addon}}' is not a valid minikube addon`, out.V{"minikube_addon": addon})
4750
}
4851
if validAddon.IsEnabled(cc) {
49-
err := addons.SetAndSave(ClusterFlagValue(), addon, "false")
52+
err = addons.SetAndSave(ClusterFlagValue(), addon, "false")
5053
if err != nil {
5154
exit.Error(reason.InternalAddonDisable, "disable failed", err)
5255
}

cmd/minikube/cmd/config/enable.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ var addonsEnableCmd = &cobra.Command{
4848
exit.Message(reason.Usage, "You cannot enable addons on a cluster without Kubernetes, to enable Kubernetes on your cluster, run: minikube start --kubernetes-version=stable")
4949
}
5050

51+
err = addons.VerifyNotPaused(ClusterFlagValue(), true)
52+
if err != nil {
53+
exit.Error(reason.InternalAddonEnablePaused, "enabled failed", err)
54+
}
5155
addon := args[0]
5256
isDeprecated, replacement, msg := addons.Deprecations(addon)
5357
if isDeprecated && replacement == "" {

pkg/addons/addons.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,19 @@ import (
2929
"time"
3030

3131
"github.com/blang/semver/v4"
32+
"github.com/docker/machine/libmachine/state"
3233
"github.com/pkg/errors"
3334
"github.com/spf13/viper"
3435

3536
"k8s.io/klog/v2"
3637
"k8s.io/minikube/pkg/drivers/kic/oci"
3738
"k8s.io/minikube/pkg/kapi"
3839
"k8s.io/minikube/pkg/minikube/assets"
40+
"k8s.io/minikube/pkg/minikube/cluster"
3941
"k8s.io/minikube/pkg/minikube/command"
4042
"k8s.io/minikube/pkg/minikube/config"
4143
"k8s.io/minikube/pkg/minikube/constants"
44+
"k8s.io/minikube/pkg/minikube/cruntime"
4245
"k8s.io/minikube/pkg/minikube/driver"
4346
"k8s.io/minikube/pkg/minikube/exit"
4447
"k8s.io/minikube/pkg/minikube/machine"
@@ -585,3 +588,63 @@ func UpdateConfigToDisable(cc *config.ClusterConfig) {
585588
}
586589
}
587590
}
591+
592+
// VerifyNotPaused verifies the cluster is not paused before enable/disable an addon.
593+
func VerifyNotPaused(profile string, enable bool) error {
594+
klog.Info("checking whether the cluster is paused")
595+
596+
cc, err := config.Load(profile)
597+
if err != nil {
598+
return errors.Wrap(err, "loading profile")
599+
}
600+
601+
api, err := machine.NewAPIClient()
602+
if err != nil {
603+
return errors.Wrap(err, "machine client")
604+
}
605+
defer api.Close()
606+
607+
cp, err := config.PrimaryControlPlane(cc)
608+
if err != nil {
609+
return errors.Wrap(err, "control plane")
610+
}
611+
612+
host, err := machine.LoadHost(api, config.MachineName(*cc, cp))
613+
if err != nil {
614+
return errors.Wrap(err, "get host")
615+
}
616+
617+
s, err := host.Driver.GetState()
618+
if err != nil {
619+
return errors.Wrap(err, "get state")
620+
}
621+
if s != state.Running {
622+
// can't check the status of pods on a non-running cluster
623+
return nil
624+
}
625+
626+
runner, err := machine.CommandRunner(host)
627+
if err != nil {
628+
return errors.Wrap(err, "command runner")
629+
}
630+
631+
crName := cc.KubernetesConfig.ContainerRuntime
632+
cr, err := cruntime.New(cruntime.Config{Type: crName, Runner: runner})
633+
if err != nil {
634+
return errors.Wrap(err, "container runtime")
635+
}
636+
runtimePaused, err := cluster.CheckIfPaused(cr, []string{"kube-system"})
637+
if err != nil {
638+
return errors.Wrap(err, "check paused")
639+
}
640+
if !runtimePaused {
641+
return nil
642+
}
643+
action := "disable"
644+
if enable {
645+
action = "enable"
646+
}
647+
msg := fmt.Sprintf("Can't %s addon on a paused cluster, please unpause the cluster first.", action)
648+
out.Styled(style.Shrug, msg)
649+
return errors.New(msg)
650+
}

pkg/minikube/reason/reason.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ var (
8585
InternalAddonDisable = Kind{ID: "MK_ADDON_DISABLE", ExitCode: ExProgramError}
8686
// minikube could not enable an addon, e.g. dashboard addon
8787
InternalAddonEnable = Kind{ID: "MK_ADDON_ENABLE", ExitCode: ExProgramError}
88+
// minikube could not enable an addon on a paused cluster
89+
InternalAddonEnablePaused = Kind{ID: "MK_ADDON_ENABLE_PAUSED", ExitCode: ExProgramConflict}
90+
// minikube could not disable an addon on a paused cluster
91+
InternalAddonDisablePaused = Kind{ID: "MK_ADDON_DISABLE_PAUSED", ExitCode: ExProgramConflict}
92+
8893
// minikube failed to update internal configuration, such as the cached images config map
8994
InternalAddConfig = Kind{ID: "MK_ADD_CONFIG", ExitCode: ExProgramError}
9095
// minikube failed to create a cluster bootstrapper

0 commit comments

Comments
 (0)