Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Don't allow enabling addon on a paused cluster #15868

Merged
merged 8 commits into from
Jul 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions cmd/minikube/cmd/config/disable.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,10 @@ var addonsDisableCmd = &cobra.Command{
if len(args) != 1 {
exit.Message(reason.Usage, "usage: minikube addons disable ADDON_NAME")
}

err := addons.VerifyNotPaused(ClusterFlagValue(), false)
if err != nil {
exit.Error(reason.InternalAddonDisablePaused, "disable failed", err)
}
addon := args[0]
if addon == "heapster" {
exit.Message(reason.AddonUnsupported, "The heapster addon is depreciated. please try to disable metrics-server instead")
Expand All @@ -46,7 +49,7 @@ var addonsDisableCmd = &cobra.Command{
exit.Message(reason.AddonUnsupported, `"'{{.minikube_addon}}' is not a valid minikube addon`, out.V{"minikube_addon": addon})
}
if validAddon.IsEnabled(cc) {
err := addons.SetAndSave(ClusterFlagValue(), addon, "false")
err = addons.SetAndSave(ClusterFlagValue(), addon, "false")
if err != nil {
exit.Error(reason.InternalAddonDisable, "disable failed", err)
}
Expand Down
4 changes: 4 additions & 0 deletions cmd/minikube/cmd/config/enable.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,10 @@ var addonsEnableCmd = &cobra.Command{
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")
}

err = addons.VerifyNotPaused(ClusterFlagValue(), true)
if err != nil {
exit.Error(reason.InternalAddonEnablePaused, "enabled failed", err)
}
addon := args[0]
isDeprecated, replacement, msg := addons.Deprecations(addon)
if isDeprecated && replacement == "" {
Expand Down
63 changes: 63 additions & 0 deletions pkg/addons/addons.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,16 +29,19 @@ import (
"time"

"github.com/blang/semver/v4"
"github.com/docker/machine/libmachine/state"
"github.com/pkg/errors"
"github.com/spf13/viper"

"k8s.io/klog/v2"
"k8s.io/minikube/pkg/drivers/kic/oci"
"k8s.io/minikube/pkg/kapi"
"k8s.io/minikube/pkg/minikube/assets"
"k8s.io/minikube/pkg/minikube/cluster"
"k8s.io/minikube/pkg/minikube/command"
"k8s.io/minikube/pkg/minikube/config"
"k8s.io/minikube/pkg/minikube/constants"
"k8s.io/minikube/pkg/minikube/cruntime"
"k8s.io/minikube/pkg/minikube/driver"
"k8s.io/minikube/pkg/minikube/exit"
"k8s.io/minikube/pkg/minikube/machine"
Expand Down Expand Up @@ -585,3 +588,63 @@ func UpdateConfigToDisable(cc *config.ClusterConfig) {
}
}
}

// VerifyNotPaused verifies the cluster is not paused before enable/disable an addon.
func VerifyNotPaused(profile string, enable bool) error {
klog.Info("checking whether the cluster is paused")

cc, err := config.Load(profile)
if err != nil {
return errors.Wrap(err, "loading profile")
}

api, err := machine.NewAPIClient()
if err != nil {
return errors.Wrap(err, "machine client")
}
defer api.Close()

cp, err := config.PrimaryControlPlane(cc)
if err != nil {
return errors.Wrap(err, "control plane")
}

host, err := machine.LoadHost(api, config.MachineName(*cc, cp))
if err != nil {
return errors.Wrap(err, "get host")
}

s, err := host.Driver.GetState()
if err != nil {
return errors.Wrap(err, "get state")
}
if s != state.Running {
// can't check the status of pods on a non-running cluster
return nil
}

runner, err := machine.CommandRunner(host)
if err != nil {
return errors.Wrap(err, "command runner")
}

crName := cc.KubernetesConfig.ContainerRuntime
cr, err := cruntime.New(cruntime.Config{Type: crName, Runner: runner})
if err != nil {
return errors.Wrap(err, "container runtime")
}
runtimePaused, err := cluster.CheckIfPaused(cr, []string{"kube-system"})
if err != nil {
return errors.Wrap(err, "check paused")
}
if !runtimePaused {
return nil
}
action := "disable"
if enable {
action = "enable"
}
msg := fmt.Sprintf("Can't %s addon on a paused cluster, please unpause the cluster first.", action)
out.Styled(style.Shrug, msg)
return errors.New(msg)
}
5 changes: 5 additions & 0 deletions pkg/minikube/reason/reason.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@ var (
InternalAddonDisable = Kind{ID: "MK_ADDON_DISABLE", ExitCode: ExProgramError}
// minikube could not enable an addon, e.g. dashboard addon
InternalAddonEnable = Kind{ID: "MK_ADDON_ENABLE", ExitCode: ExProgramError}
// minikube could not enable an addon on a paused cluster
InternalAddonEnablePaused = Kind{ID: "MK_ADDON_ENABLE_PAUSED", ExitCode: ExProgramConflict}
// minikube could not disable an addon on a paused cluster
InternalAddonDisablePaused = Kind{ID: "MK_ADDON_DISABLE_PAUSED", ExitCode: ExProgramConflict}

// minikube failed to update internal configuration, such as the cached images config map
InternalAddConfig = Kind{ID: "MK_ADD_CONFIG", ExitCode: ExProgramError}
// minikube failed to create a cluster bootstrapper
Expand Down
Loading