etcdctlv3: member list now supports json

This commit is contained in:
Xiang Li 2016-03-17 15:12:45 -07:00
parent c37cd1f0a1
commit 56d7899c20
2 changed files with 41 additions and 25 deletions

View File

@ -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)
}

View File

@ -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 {