From a41f2e229cc12510d0aad3802e2354b217e77cea Mon Sep 17 00:00:00 2001 From: Huachao Huang Date: Wed, 22 Feb 2017 14:53:51 +0800 Subject: [PATCH 1/3] pdctl/command: add scheduler command Add command to show, add and remove schedulers. --- pdctl/command/global.go | 22 +++++++ pdctl/command/scheduler.go | 125 +++++++++++++++++++++++++++++++++++++ pdctl/ctl.go | 1 + 3 files changed, 148 insertions(+) create mode 100644 pdctl/command/scheduler.go diff --git a/pdctl/command/global.go b/pdctl/command/global.go index f65aee3ea649..9540433976a2 100644 --- a/pdctl/command/global.go +++ b/pdctl/command/global.go @@ -14,6 +14,8 @@ package command import ( + "bytes" + "encoding/json" "fmt" "io" "io/ioutil" @@ -139,6 +141,26 @@ func validPDAddr(pd string) error { return nil } +func postJSON(cmd *cobra.Command, prefix string, input map[string]interface{}) { + data, err := json.Marshal(input) + if err != nil { + fmt.Println(err) + return + } + + url := getAddressFromCmd(cmd, prefix) + r, err := http.Post(url, "application/json", bytes.NewBuffer(data)) + if err != nil { + fmt.Println(err) + return + } + defer r.Body.Close() + + if r.StatusCode != http.StatusOK { + printResponseError(r) + } +} + // UsageTemplate will used to generate a help information const UsageTemplate = `Usage:{{if .Runnable}} {{if .HasAvailableFlags}}{{appendIfNotPresent .UseLine ""}}{{else}}{{.UseLine}}{{end}}{{end}}{{if .HasAvailableSubCommands}} diff --git a/pdctl/command/scheduler.go b/pdctl/command/scheduler.go new file mode 100644 index 000000000000..0d9ce3d269f0 --- /dev/null +++ b/pdctl/command/scheduler.go @@ -0,0 +1,125 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed 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, +// See the License for the specific language governing permissions and +// limitations under the License. + +package command + +import ( + "fmt" + "net/http" + "strconv" + + "github.com/spf13/cobra" +) + +var ( + schedulersPrefix = "pd/api/v1/schedulers" +) + +// NewSchedulerCommand returns a scheduler command. +func NewSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "scheduler", + Short: "show schedulers", + Run: showSchedulerCommandFunc, + } + c.AddCommand(NewAddSchedulerCommand()) + c.AddCommand(NewRemoveSchedulerCommand()) + return c +} + +func showSchedulerCommandFunc(cmd *cobra.Command, args []string) { + if len(args) != 0 { + fmt.Println(cmd.UsageString()) + return + } + + r, err := doRequest(cmd, schedulersPrefix, http.MethodGet) + if err != nil { + fmt.Println(err) + return + } + fmt.Println(r) +} + +// NewAddSchedulerCommand returns a command to add scheduler. +func NewAddSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "add ", + Short: "add a scheduler", + } + c.AddCommand(NewGrantLeaderSchedulerCommand()) + c.AddCommand(NewEvictLeaderSchedulerCommand()) + return c +} + +// NewGrantLeaderSchedulerCommand returns a command to add a grant-leader-scheduler. +func NewGrantLeaderSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "grant-leader-scheduler ", + Short: "add a scheduler to grant leader to a store", + Run: addSchedulerCommandFunc, + } + return c +} + +// NewEvictLeaderSchedulerCommand returns a command to add a evict-leader-scheduler. +func NewEvictLeaderSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "evict-leader-scheduler ", + Short: "add a scheduler to evict leader from a store", + Run: addSchedulerCommandFunc, + } + return c +} + +func addSchedulerCommandFunc(cmd *cobra.Command, args []string) { + if len(args) != 1 { + fmt.Println(cmd.UsageString()) + return + } + + storeID, err := strconv.ParseUint(args[0], 10, 64) + if err != nil { + fmt.Println(err) + return + } + + input := make(map[string]interface{}) + input["name"] = cmd.Name() + input["store_id"] = storeID + postJSON(cmd, schedulersPrefix, input) +} + +// NewRemoveSchedulerCommand returns a command to remove scheduler. +func NewRemoveSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "remove ", + Short: "remove a scheduler", + Run: removeSchedulerCommandFunc, + } + return c +} + +func removeSchedulerCommandFunc(cmd *cobra.Command, args []string) { + if len(args) != 1 { + fmt.Println(cmd.Usage()) + return + } + + prefix := schedulersPrefix + "/" + args[0] + _, err := doRequest(cmd, prefix, http.MethodDelete) + if err != nil { + fmt.Println(err) + return + } +} diff --git a/pdctl/ctl.go b/pdctl/ctl.go index 9df4d829f78e..52ab447c9e47 100644 --- a/pdctl/ctl.go +++ b/pdctl/ctl.go @@ -43,6 +43,7 @@ func init() { command.NewMemberCommand(), command.NewExitCommand(), command.NewLabelCommand(), + command.NewSchedulerCommand(), ) cobra.EnablePrefixMatching = true } From c7ccfd966d0e95fa11d4dd2dfd11b5ffe384a970 Mon Sep 17 00:00:00 2001 From: Huachao Huang Date: Wed, 22 Feb 2017 16:12:01 +0800 Subject: [PATCH 2/3] add shuffle leader/region schedulers --- pdctl/command/scheduler.go | 39 +++++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/pdctl/command/scheduler.go b/pdctl/command/scheduler.go index 0d9ce3d269f0..fa8f1d801276 100644 --- a/pdctl/command/scheduler.go +++ b/pdctl/command/scheduler.go @@ -59,6 +59,8 @@ func NewAddSchedulerCommand() *cobra.Command { } c.AddCommand(NewGrantLeaderSchedulerCommand()) c.AddCommand(NewEvictLeaderSchedulerCommand()) + c.AddCommand(NewShuffleLeaderSchedulerCommand()) + c.AddCommand(NewShuffleRegionSchedulerCommand()) return c } @@ -67,7 +69,7 @@ func NewGrantLeaderSchedulerCommand() *cobra.Command { c := &cobra.Command{ Use: "grant-leader-scheduler ", Short: "add a scheduler to grant leader to a store", - Run: addSchedulerCommandFunc, + Run: addSchedulerForStoreCommandFunc, } return c } @@ -77,12 +79,12 @@ func NewEvictLeaderSchedulerCommand() *cobra.Command { c := &cobra.Command{ Use: "evict-leader-scheduler ", Short: "add a scheduler to evict leader from a store", - Run: addSchedulerCommandFunc, + Run: addSchedulerForStoreCommandFunc, } return c } -func addSchedulerCommandFunc(cmd *cobra.Command, args []string) { +func addSchedulerForStoreCommandFunc(cmd *cobra.Command, args []string) { if len(args) != 1 { fmt.Println(cmd.UsageString()) return @@ -100,6 +102,37 @@ func addSchedulerCommandFunc(cmd *cobra.Command, args []string) { postJSON(cmd, schedulersPrefix, input) } +// NewShuffleLeaderSchedulerCommand returns a command to add a shuffle-leader-scheduler. +func NewShuffleLeaderSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "shuffle-leader-scheduler", + Short: "add a scheduler to shuffle leaders between stores", + Run: addSchedulerCommandFunc, + } + return c +} + +// NewShuffleRegionSchedulerCommand returns a command to add a shuffle-region-scheduler. +func NewShuffleRegionSchedulerCommand() *cobra.Command { + c := &cobra.Command{ + Use: "shuffle-region-scheduler", + Short: "add a scheduler to shuffle regions between stores", + Run: addSchedulerCommandFunc, + } + return c +} + +func addSchedulerCommandFunc(cmd *cobra.Command, args []string) { + if len(args) != 0 { + fmt.Println(cmd.UsageString()) + return + } + + input := make(map[string]interface{}) + input["name"] = cmd.Name() + postJSON(cmd, schedulersPrefix, input) +} + // NewRemoveSchedulerCommand returns a command to remove scheduler. func NewRemoveSchedulerCommand() *cobra.Command { c := &cobra.Command{ From f6d6b4209ec97df617d69b0711abd664a229382b Mon Sep 17 00:00:00 2001 From: Huachao Huang Date: Wed, 22 Feb 2017 17:42:21 +0800 Subject: [PATCH 3/3] address comment --- pdctl/command/scheduler.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pdctl/command/scheduler.go b/pdctl/command/scheduler.go index fa8f1d801276..a8c34fcf43b2 100644 --- a/pdctl/command/scheduler.go +++ b/pdctl/command/scheduler.go @@ -1,4 +1,4 @@ -// Copyright 2016 PingCAP, Inc. +// Copyright 2017 PingCAP, Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -149,8 +149,8 @@ func removeSchedulerCommandFunc(cmd *cobra.Command, args []string) { return } - prefix := schedulersPrefix + "/" + args[0] - _, err := doRequest(cmd, prefix, http.MethodDelete) + path := schedulersPrefix + "/" + args[0] + _, err := doRequest(cmd, path, http.MethodDelete) if err != nil { fmt.Println(err) return