Przeglądaj źródła

etcdctlv3: implement the 'etcdctl status' command

mqliang 9 lat temu
rodzic
commit
d80af00785

+ 22 - 0
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 {

+ 61 - 0
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)
+	}
+}

+ 1 - 0
etcdctl/ctlv3/ctl.go

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