operator/cmd/cluster/uninstall.go (98 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cluster
import (
"fmt"
"github.com/apache/dubbo-kubernetes/dubboctl/pkg/cli"
"github.com/apache/dubbo-kubernetes/operator/pkg/render"
"github.com/apache/dubbo-kubernetes/operator/pkg/uninstall"
"github.com/apache/dubbo-kubernetes/operator/pkg/util/clog"
"github.com/apache/dubbo-kubernetes/operator/pkg/util/progress"
"github.com/apache/dubbo-kubernetes/pkg/kube"
"github.com/spf13/cobra"
"os"
)
type uninstallArgs struct {
// filenames is an array of paths to input DubboOperator CR files.
// TODO
// filenames string
// sets is a string with the format "path=value".
sets []string
// manifestPath is a path to a charts and profiles directory in the local filesystem with a release tgz.
manifestPath string
// purge results in deletion of all Dubbo resources.
purge bool
// skipConfirmation determines whether the user is prompted for confirmation.
// If set to true, the user is not prompted, and a "Yes" response is assumed in all cases.
skipConfirmation bool
}
func addUninstallFlags(cmd *cobra.Command, args *uninstallArgs) {
// cmd.PersistentFlags().StringVarP(&args.filenames, "filenames", "f", "", "The filename of the DubboOperator CR.")
cmd.PersistentFlags().StringArrayVarP(&args.sets, "set", "s", nil, `Override dubboOperator values, such as selecting profiles, etc.`)
cmd.PersistentFlags().BoolVar(&args.purge, "purge", false, `Remove all dubbo related source code.`)
cmd.PersistentFlags().BoolVarP(&args.skipConfirmation, "skip-confirmation", "y", false, `The skipConfirmation determines whether the user is prompted for confirmation.`)
}
// UninstallCmd command uninstalls Dubbo from a cluster
func UninstallCmd(ctx cli.Context) *cobra.Command {
rootArgs := &RootArgs{}
uiArgs := &uninstallArgs{}
uicmd := &cobra.Command{
Use: "uninstall",
Short: "Uninstall Dubbo related resources",
Long: "The uninstall command will uninstall the dubbo cluster",
Example: ` # Uninstall all control planes and shared resources
dubboctl uninstall --purge`,
Args: func(cmd *cobra.Command, args []string) error {
if !uiArgs.purge {
return fmt.Errorf("at least one of the --purge flags must be set")
}
if len(args) > 0 {
return fmt.Errorf("dubboctl uninstall does not take arguments")
}
return nil
},
RunE: func(cmd *cobra.Command, args []string) error {
return Uninstall(cmd, ctx, rootArgs, uiArgs)
},
}
AddFlags(uicmd, rootArgs)
addUninstallFlags(uicmd, uiArgs)
return uicmd
}
// Uninstall uninstalls by deleting specified manifests.
func Uninstall(cmd *cobra.Command, ctx cli.Context, rootArgs *RootArgs, uiArgs *uninstallArgs) error {
cl := clog.NewConsoleLogger(cmd.OutOrStdout(), cmd.ErrOrStderr())
var kubeClient kube.CLIClient
var err error
kubeClient, err = ctx.CLIClientWithRevision("")
if err != nil {
return err
}
pl := progress.NewLog()
if uiArgs.purge {
cl.LogAndPrint("Purge uninstall will purge all Dubbo resources, ignoring the specified revision or operator file")
}
setFlags := applyFlagAliases(uiArgs.sets)
files := []string{}
vals, err := render.MergeInputs(files, setFlags)
if err != nil {
return err
}
objectsList, err := uninstall.GetRemovedResources(
kubeClient,
vals.GetPathString("metadata.name"),
vals.GetPathString("metadata.namespace"),
uiArgs.purge,
)
if err != nil {
return err
}
preCheck(cmd, uiArgs, cl, rootArgs.DryRun)
if err := uninstall.DeleteObjectsList(kubeClient, rootArgs.DryRun, cl, objectsList); err != nil {
return err
}
pl.SetState(progress.StateUninstallComplete)
return nil
}
// preCheck checks for potential major changes.
func preCheck(cmd *cobra.Command, uiArgs *uninstallArgs, _ *clog.ConsoleLogger, dryRun bool) {
needConfirmation, message := false, ""
if uiArgs.purge {
needConfirmation = true
message += "All Dubbo resources will be pruned from the cluster.\n"
}
if dryRun || uiArgs.skipConfirmation {
return
}
message += "Do you want to proceed? (y/N)"
if needConfirmation && !OptionDeterminate(message, cmd.OutOrStdout()) {
cmd.Print("Canceled Completed.\n")
os.Exit(1)
}
}