From d80af007859b607bfd88c81bdaa101f51730a740 Mon Sep 17 00:00:00 2001 From: mqliang Date: Sun, 3 Apr 2016 13:47:25 +0800 Subject: [PATCH] etcdctlv3: implement the 'etcdctl status' command --- etcdctl/ctlv3/command/printer.go | 22 +++++++++ etcdctl/ctlv3/command/status_command.go | 61 +++++++++++++++++++++++++ etcdctl/ctlv3/ctl.go | 1 + 3 files changed, 84 insertions(+) create mode 100644 etcdctl/ctlv3/command/status_command.go diff --git a/etcdctl/ctlv3/command/printer.go b/etcdctl/ctlv3/command/printer.go index 7c8b1966e..46ad513e5 100644 --- a/etcdctl/ctlv3/command/printer.go +++ b/etcdctl/ctlv3/command/printer.go @@ -36,6 +36,8 @@ type printer interface { MemberList(v3.MemberListResponse) + MemberStatus([]statusInfo) + Alarm(v3.AlarmResponse) } @@ -127,6 +129,21 @@ func (s *simplePrinter) MemberList(resp v3.MemberListResponse) { table.Render() } +func (s *simplePrinter) MemberStatus(statusList []statusInfo) { + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"endpoint", "ID", "version"}) + + for _, status := range statusList { + table.Append([]string{ + fmt.Sprint(status.ep), + fmt.Sprintf("%x", status.resp.Header.MemberId), + fmt.Sprint(status.resp.Version), + }) + } + + table.Render() +} + type jsonPrinter struct{} func (p *jsonPrinter) Del(r v3.DeleteResponse) { printJSON(r) } @@ -140,6 +157,7 @@ func (p *jsonPrinter) Txn(r v3.TxnResponse) { printJSON(r) } func (p *jsonPrinter) Watch(r v3.WatchResponse) { printJSON(r) } func (p *jsonPrinter) Alarm(r v3.AlarmResponse) { printJSON(r) } func (p *jsonPrinter) MemberList(r v3.MemberListResponse) { printJSON(r) } +func (p *jsonPrinter) MemberStatus(r []statusInfo) { printJSON(r) } func printJSON(v interface{}) { b, err := json.Marshal(v) @@ -186,6 +204,10 @@ func (pb *pbPrinter) MemberList(r v3.MemberListResponse) { ExitWithError(ExitBadFeature, errors.New("only support simple or json as output format")) } +func (pb *pbPrinter) MemberStatus(r []statusInfo) { + ExitWithError(ExitBadFeature, errors.New("only support simple or json as output format")) +} + func printPB(m pbMarshal) { b, err := m.Marshal() if err != nil { diff --git a/etcdctl/ctlv3/command/status_command.go b/etcdctl/ctlv3/command/status_command.go new file mode 100644 index 000000000..c35fcb4ec --- /dev/null +++ b/etcdctl/ctlv3/command/status_command.go @@ -0,0 +1,61 @@ +// Copyright 2016 CoreOS, 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, +// 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 command + +import ( + "fmt" + "os" + + v3 "github.com/coreos/etcd/clientv3" + "github.com/spf13/cobra" +) + +// NewStatusCommand returns the cobra command for "Status". +func NewStatusCommand() *cobra.Command { + return &cobra.Command{ + Use: "status", + Short: "status prints out the statuses of the members with given endpoints.", + Run: statusCommandFunc, + } +} + +type statusInfo struct { + ep string + resp *v3.StatusResponse +} + +func statusCommandFunc(cmd *cobra.Command, args []string) { + c := mustClientFromCmd(cmd) + + statusList := []statusInfo{} + var err error + for _, ep := range c.Endpoints() { + ctx, cancel := commandCtx(cmd) + resp, serr := c.Status(ctx, ep) + cancel() + if serr != nil { + err = serr + fmt.Fprintf(os.Stderr, "Failed to get the status of endpoint %s (%v)", ep, serr) + continue + } + statusList = append(statusList, statusInfo{ep: ep, resp: resp}) + } + + display.MemberStatus(statusList) + + if err != nil { + os.Exit(ExitError) + } +} diff --git a/etcdctl/ctlv3/ctl.go b/etcdctl/ctlv3/ctl.go index d787f4221..d3e5894f7 100644 --- a/etcdctl/ctlv3/ctl.go +++ b/etcdctl/ctlv3/ctl.go @@ -68,6 +68,7 @@ func init() { command.NewCompactionCommand(), command.NewAlarmCommand(), command.NewDefragCommand(), + command.NewStatusCommand(), command.NewWatchCommand(), command.NewVersionCommand(), command.NewLeaseCommand(),