diff --git a/etcdctl/command/member_commands.go b/etcdctl/command/member_commands.go new file mode 100644 index 000000000..0c8f6573e --- /dev/null +++ b/etcdctl/command/member_commands.go @@ -0,0 +1,102 @@ +package command + +import ( + "fmt" + "net/http" + "os" + "strings" + + "github.com/coreos/etcd/Godeps/_workspace/src/github.com/codegangsta/cli" + "github.com/coreos/etcd/client" +) + +func NewMemberCommand() cli.Command { + return cli.Command{ + Name: "member", + Subcommands: []cli.Command{ + cli.Command{ + Name: "list", + Usage: "enumerate existing cluster members", + Action: actionMemberList, + }, + cli.Command{ + Name: "add", + Usage: "add a new member to the etcd cluster", + Action: actionMemberAdd, + }, + cli.Command{ + Name: "remove", + Usage: "remove an existing member from the etcd cluster", + Action: actionMemberRemove, + }, + }, + } +} + +func actionMemberList(c *cli.Context) { + if len(c.Args()) != 0 { + fmt.Fprintln(os.Stderr, "No arguments accepted") + os.Exit(1) + } + + mAPI, err := client.NewMembersAPI(&http.Transport{}, "http://127.0.0.1:4001", client.DefaultRequestTimeout) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + members, err := mAPI.List() + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + for _, m := range members { + fmt.Printf("%s: name=%s peerURLs=%s clientURLs=%s\n", m.ID, m.Name, strings.Join(m.PeerURLs, ","), strings.Join(m.ClientURLs, ",")) + } +} + +func actionMemberAdd(c *cli.Context) { + args := c.Args() + if len(args) != 1 { + fmt.Fprintln(os.Stderr, "Provide a single member peerURL") + os.Exit(1) + } + + mAPI, err := client.NewMembersAPI(&http.Transport{}, "http://127.0.0.1:4001", client.DefaultRequestTimeout) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + url := args[0] + m, err := mAPI.Add(url) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + fmt.Printf("Added member to cluster with ID %s", m.ID) +} + +func actionMemberRemove(c *cli.Context) { + args := c.Args() + if len(args) != 1 { + fmt.Fprintln(os.Stderr, "Provide a single member ID") + os.Exit(1) + } + + mAPI, err := client.NewMembersAPI(&http.Transport{}, "http://127.0.0.1:4001", client.DefaultRequestTimeout) + if err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + mID := args[0] + if err := mAPI.Remove(mID); err != nil { + fmt.Fprintln(os.Stderr, err.Error()) + os.Exit(1) + } + + fmt.Printf("Removed member %s from cluster\n", mID) +} diff --git a/etcdctl/main.go b/etcdctl/main.go index 0bdaf2cad..073a306a7 100644 --- a/etcdctl/main.go +++ b/etcdctl/main.go @@ -33,6 +33,8 @@ func main() { command.NewUpdateDirCommand(), command.NewWatchCommand(), command.NewExecWatchCommand(), + command.NewMemberCommand(), } + app.Run(os.Args) }