From 5e52c083fee5d2eb76e677f89b1c5f308a17c4a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CForest-L?= Date: Tue, 18 Aug 2020 09:51:20 +0800 Subject: [PATCH] add node delete MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: “Forest-L --- cmd/delete_node.go | 22 +++++ pkg/delete/delete.go | 190 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 211 insertions(+), 1 deletion(-) create mode 100644 cmd/delete_node.go diff --git a/cmd/delete_node.go b/cmd/delete_node.go new file mode 100644 index 00000000..c2038d44 --- /dev/null +++ b/cmd/delete_node.go @@ -0,0 +1,22 @@ +package cmd + +import ( + "github.com/kubesphere/kubekey/pkg/delete" + "github.com/kubesphere/kubekey/pkg/util" + "github.com/spf13/cobra" + "strings" +) + +var deleteNodeCmd = &cobra.Command{ + Use: "node", + Short: "delete a node", + Run: func(cmd *cobra.Command, args []string) { + logger := util.InitLogger(opt.Verbose) + delete.ResetNode(opt.ClusterCfgFile, logger, opt.Verbose, strings.Join(args, "")) + }, +} + +func init() { + deleteCmd.AddCommand(deleteNodeCmd) + deleteNodeCmd.Flags().StringVarP(&opt.ClusterCfgFile, "config", "f", "", "Path to a config") +} diff --git a/pkg/delete/delete.go b/pkg/delete/delete.go index f74d0110..819ec011 100644 --- a/pkg/delete/delete.go +++ b/pkg/delete/delete.go @@ -26,7 +26,11 @@ import ( "github.com/pkg/errors" log "github.com/sirupsen/logrus" "os" + "os/exec" + "path/filepath" + "strconv" "strings" + "unicode" ) func ResetCluster(clusterCfgFile string, logger *log.Logger, verbose bool) error { @@ -38,6 +42,74 @@ func ResetCluster(clusterCfgFile string, logger *log.Logger, verbose bool) error return Execute(executor.NewExecutor(&cfg.Spec, logger, verbose, false, true)) } +func ResetNode(clusterCfgFile string, logger *log.Logger, verbose bool, nodeName string) error { + if "" == nodeName { + return errors.New("Node name does not exist") + } + fp, _ := filepath.Abs(clusterCfgFile) + cmd0 := fmt.Sprintf("cat %s | grep %s | wc -l", fp, nodeName) + nodeNameNum, err0 := exec.Command("/bin/sh", "-c", cmd0).CombinedOutput() + if err0 != nil { + errors.Wrap(err0,"Failed to get node num") + } + if string(nodeNameNum) == "0\n"{ + fmt.Sprintf("Please check the node name in the config-sample.yaml") + os.Exit(0) + } + if string(nodeNameNum) == "2\n" { + cmd := fmt.Sprintf("sed -i /%s/d %s", nodeName, fp) + _ = exec.Command("/bin/sh", "-c", cmd).Run() + cfg, _ := config.ParseClusterCfg(clusterCfgFile, "","",false,logger) + return Execute1(executor.NewExecutor(&cfg.Spec, logger, verbose, false,true)) + } + if string(nodeNameNum) == "1\n" { + cmd := fmt.Sprintf("sed -i /%s/d %s", nodeName, fp) + _ = exec.Command("/bin/sh", "-c", cmd).Run() + cfg, err := config.ParseClusterCfg(clusterCfgFile, "","",false, logger) + if err != nil{ + errors.Wrap(err, "Failed to download cluster config") + } + mgr, err1 := executor.NewExecutor(&cfg.Spec, logger, verbose, false, true).CreateManager() + if err1 != nil{ + errors.Wrap(err1, "Failed to get cluster config") + } + var newNodeName []string + for i := 0; i 0; i-- { + if !unicode.IsDigit(rune(nodename[i])) { + num, _ := strconv.Atoi(nodename[i+1:]) + name := nodename[:i+1] + return name, num + break + } + } + return "", 0 +} var clusterFiles = []string{ "/usr/local/bin/etcd", @@ -134,3 +307,18 @@ func Confirm(reader *bufio.Reader) (string, error) { } } } + +func Confirm1(reader *bufio.Reader) (string, error) { + for { + fmt.Printf("Are you sure to delete this node? [yes/no]: ") + input, err := reader.ReadString('\n') + if err != nil { + return "", err + } + input = strings.TrimSpace(input) + + if input != "" && (input == "yes" || input == "no") { + return input, nil + } + } +}