member_commands.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. package command
  2. import (
  3. "fmt"
  4. "net/http"
  5. "os"
  6. "strings"
  7. "github.com/coreos/etcd/Godeps/_workspace/src/github.com/codegangsta/cli"
  8. "github.com/coreos/etcd/client"
  9. )
  10. func NewMemberCommand() cli.Command {
  11. return cli.Command{
  12. Name: "member",
  13. Subcommands: []cli.Command{
  14. cli.Command{
  15. Name: "list",
  16. Usage: "enumerate existing cluster members",
  17. Action: actionMemberList,
  18. },
  19. cli.Command{
  20. Name: "add",
  21. Usage: "add a new member to the etcd cluster",
  22. Action: actionMemberAdd,
  23. },
  24. cli.Command{
  25. Name: "remove",
  26. Usage: "remove an existing member from the etcd cluster",
  27. Action: actionMemberRemove,
  28. },
  29. },
  30. }
  31. }
  32. func mustNewMembersAPI(c *cli.Context) client.MembersAPI {
  33. peers := getPeersFlagValue(c)
  34. for i, p := range peers {
  35. if !strings.HasPrefix(p, "http") && !strings.HasPrefix(p, "https") {
  36. peers[i] = fmt.Sprintf("http://%s", p)
  37. }
  38. }
  39. mAPI, err := client.NewMembersAPI(&http.Transport{}, peers, client.DefaultRequestTimeout)
  40. if err != nil {
  41. fmt.Fprintln(os.Stderr, err.Error())
  42. os.Exit(1)
  43. }
  44. return mAPI
  45. }
  46. func actionMemberList(c *cli.Context) {
  47. if len(c.Args()) != 0 {
  48. fmt.Fprintln(os.Stderr, "No arguments accepted")
  49. os.Exit(1)
  50. }
  51. mAPI := mustNewMembersAPI(c)
  52. members, err := mAPI.List()
  53. if err != nil {
  54. fmt.Fprintln(os.Stderr, err.Error())
  55. os.Exit(1)
  56. }
  57. for _, m := range members {
  58. fmt.Printf("%s: name=%s peerURLs=%s clientURLs=%s\n", m.ID, m.Name, strings.Join(m.PeerURLs, ","), strings.Join(m.ClientURLs, ","))
  59. }
  60. }
  61. func actionMemberAdd(c *cli.Context) {
  62. args := c.Args()
  63. if len(args) != 1 {
  64. fmt.Fprintln(os.Stderr, "Provide a single member peerURL")
  65. os.Exit(1)
  66. }
  67. mAPI := mustNewMembersAPI(c)
  68. url := args[0]
  69. m, err := mAPI.Add(url)
  70. if err != nil {
  71. fmt.Fprintln(os.Stderr, err.Error())
  72. os.Exit(1)
  73. }
  74. fmt.Printf("Added member to cluster with ID %s", m.ID)
  75. }
  76. func actionMemberRemove(c *cli.Context) {
  77. args := c.Args()
  78. if len(args) != 1 {
  79. fmt.Fprintln(os.Stderr, "Provide a single member ID")
  80. os.Exit(1)
  81. }
  82. mAPI := mustNewMembersAPI(c)
  83. mID := args[0]
  84. if err := mAPI.Remove(mID); err != nil {
  85. fmt.Fprintln(os.Stderr, err.Error())
  86. os.Exit(1)
  87. }
  88. fmt.Printf("Removed member %s from cluster\n", mID)
  89. }