etcdctlv3: implement the 'etcdctl status' command

This commit is contained in:
mqliang 2016-04-03 13:47:25 +08:00
parent f3ca17ea03
commit d80af00785
3 changed files with 84 additions and 0 deletions

View File

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

View File

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

View File

@ -68,6 +68,7 @@ func init() {
command.NewCompactionCommand(),
command.NewAlarmCommand(),
command.NewDefragCommand(),
command.NewStatusCommand(),
command.NewWatchCommand(),
command.NewVersionCommand(),
command.NewLeaseCommand(),