github.com/pingcap/tiflow@v0.0.0-20240520035814-5bf52d54e205/dm/ctl/master/offline_member.go (about) 1 // Copyright 2020 PingCAP, Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package master 15 16 import ( 17 "context" 18 "os" 19 20 "github.com/pingcap/errors" 21 "github.com/pingcap/tiflow/dm/ctl/common" 22 "github.com/pingcap/tiflow/dm/pb" 23 "github.com/spf13/cobra" 24 ) 25 26 // NewOfflineMemberCmd creates an OfflineWorker command. 27 func NewOfflineMemberCmd() *cobra.Command { 28 cmd := &cobra.Command{ 29 Use: "offline-member <--master/--worker> <--name master-name/worker-name>", 30 Short: "Offlines member which has been closed", 31 RunE: offlineMemberFunc, 32 } 33 cmd.Flags().BoolP("master", "m", false, "to offline a master") 34 cmd.Flags().BoolP("worker", "w", false, "to offline a worker") 35 cmd.Flags().StringP("name", "n", "", "specify member name for choosing type") 36 return cmd 37 } 38 39 func convertOfflineMemberType(cmd *cobra.Command) (string, error) { 40 master, err := cmd.Flags().GetBool("master") 41 if err != nil { 42 return "", err 43 } 44 worker, err := cmd.Flags().GetBool("worker") 45 if err != nil { 46 return "", err 47 } 48 if (master && worker) || (!master && !worker) { 49 return "", errors.New("should specify either --master or --worker") 50 } 51 if master { 52 return common.Master, nil 53 } 54 return common.Worker, nil 55 } 56 57 // offlineMemberFunc does offline member request. 58 func offlineMemberFunc(cmd *cobra.Command, _ []string) error { 59 if len(cmd.Flags().Args()) > 0 { 60 cmd.SetOut(os.Stdout) 61 common.PrintCmdUsage(cmd) 62 return errors.New("please check output to see error") 63 } 64 65 offlineType, err := convertOfflineMemberType(cmd) 66 if err != nil { 67 common.PrintLinesf("get offline type failed") 68 return err 69 } 70 name, err := cmd.Flags().GetString("name") 71 if err != nil { 72 common.PrintLinesf("get offline name failed") 73 return err 74 } else if name == "" { 75 common.PrintLinesf("a member name must be specified") 76 return errors.New("please check output to see error") 77 } 78 ctx, cancel := context.WithCancel(context.Background()) 79 defer cancel() 80 81 resp := &pb.OfflineMemberResponse{} 82 err = common.SendRequest( 83 ctx, 84 "OfflineMember", 85 &pb.OfflineMemberRequest{ 86 Type: offlineType, 87 Name: name, 88 }, 89 &resp, 90 ) 91 92 if err != nil { 93 return err 94 } 95 if !resp.Result { 96 common.PrintLinesf("offline member failed:\n%v", resp.Msg) 97 return errors.New("please check output to see error") 98 } 99 common.PrettyPrintResponse(resp) 100 return nil 101 }