diff --git a/etcdctlv3/command/member_command.go b/etcdctlv3/command/member_command.go index 418575101..eaa1e8b4f 100644 --- a/etcdctlv3/command/member_command.go +++ b/etcdctlv3/command/member_command.go @@ -16,11 +16,9 @@ package command import ( "fmt" - "os" "strconv" "strings" - "github.com/coreos/etcd/Godeps/_workspace/src/github.com/olekukonko/tablewriter" "github.com/coreos/etcd/Godeps/_workspace/src/github.com/spf13/cobra" "github.com/coreos/etcd/Godeps/_workspace/src/golang.org/x/net/context" ) @@ -168,24 +166,5 @@ func memberListCommandFunc(cmd *cobra.Command, args []string) { ExitWithError(ExitError, err) } - table := tablewriter.NewWriter(os.Stdout) - table.SetHeader([]string{"ID", "Status", "Name", "Peer Addrs", "Client Addrs", "Is Leader"}) - - for _, m := range resp.Members { - status := "started" - if len(m.Name) == 0 { - status = "unstarted" - } - - table.Append([]string{ - fmt.Sprintf("%x", m.ID), - status, - m.Name, - strings.Join(m.PeerURLs, ","), - strings.Join(m.ClientURLs, ","), - fmt.Sprint(m.IsLeader), - }) - } - - table.Render() + display.MemberList(*resp) } diff --git a/etcdctlv3/command/printer.go b/etcdctlv3/command/printer.go index 1bf44a070..df0abc3b9 100644 --- a/etcdctlv3/command/printer.go +++ b/etcdctlv3/command/printer.go @@ -16,12 +16,15 @@ package command import ( "encoding/json" + "errors" "fmt" "os" + "strings" v3 "github.com/coreos/etcd/clientv3" pb "github.com/coreos/etcd/etcdserver/etcdserverpb" spb "github.com/coreos/etcd/storage/storagepb" + "github.com/olekukonko/tablewriter" ) type printer interface { @@ -30,6 +33,8 @@ type printer interface { Put(v3.PutResponse) Txn(v3.TxnResponse) Watch(v3.WatchResponse) + + MemberList(v3.MemberListResponse) } func NewPrinter(printerType string, isHex bool) printer { @@ -91,6 +96,29 @@ func (s *simplePrinter) Watch(resp v3.WatchResponse) { } } +func (s *simplePrinter) MemberList(resp v3.MemberListResponse) { + table := tablewriter.NewWriter(os.Stdout) + table.SetHeader([]string{"ID", "Status", "Name", "Peer Addrs", "Client Addrs", "Is Leader"}) + + for _, m := range resp.Members { + status := "started" + if len(m.Name) == 0 { + status = "unstarted" + } + + table.Append([]string{ + fmt.Sprintf("%x", m.ID), + status, + m.Name, + strings.Join(m.PeerURLs, ","), + strings.Join(m.ClientURLs, ","), + fmt.Sprint(m.IsLeader), + }) + } + + table.Render() +} + type jsonPrinter struct{} func (p *jsonPrinter) Del(r v3.DeleteResponse) { printJSON(r) } @@ -99,9 +127,10 @@ func (p *jsonPrinter) Get(r v3.GetResponse) { printJSON(kv) } } -func (p *jsonPrinter) Put(r v3.PutResponse) { printJSON(r) } -func (p *jsonPrinter) Txn(r v3.TxnResponse) { printJSON(r) } -func (p *jsonPrinter) Watch(r v3.WatchResponse) { printJSON(r) } +func (p *jsonPrinter) Put(r v3.PutResponse) { printJSON(r) } +func (p *jsonPrinter) Txn(r v3.TxnResponse) { printJSON(r) } +func (p *jsonPrinter) Watch(r v3.WatchResponse) { printJSON(r) } +func (p *jsonPrinter) MemberList(r v3.MemberListResponse) { printJSON(r) } func printJSON(v interface{}) { b, err := json.Marshal(v) @@ -121,21 +150,29 @@ type pbMarshal interface { func (p *pbPrinter) Del(r v3.DeleteResponse) { printPB((*pb.DeleteRangeResponse)(&r)) } + func (p *pbPrinter) Get(r v3.GetResponse) { printPB((*pb.RangeResponse)(&r)) } + func (p *pbPrinter) Put(r v3.PutResponse) { printPB((*pb.PutResponse)(&r)) } + func (p *pbPrinter) Txn(r v3.TxnResponse) { printPB((*pb.TxnResponse)(&r)) } + func (p *pbPrinter) Watch(r v3.WatchResponse) { for _, ev := range r.Events { printPB((*spb.Event)(ev)) } } +func (pb *pbPrinter) MemberList(r v3.MemberListResponse) { + ExitWithError(ExitBadFeature, errors.New("only support simple or json as output format")) +} + func printPB(m pbMarshal) { b, err := m.Marshal() if err != nil {