github.com/ranjib/nomad@v0.1.1-0.20160225204057-97751b02f70b/command/server_members.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "sort" 6 "strings" 7 8 "github.com/hashicorp/nomad/api" 9 "github.com/ryanuber/columnize" 10 ) 11 12 type ServerMembersCommand struct { 13 Meta 14 } 15 16 func (c *ServerMembersCommand) Help() string { 17 helpText := ` 18 Usage: nomad server-members [options] 19 20 Display a list of the known servers and their status. 21 22 General Options: 23 24 ` + generalOptionsUsage() + ` 25 26 Agent Members Options: 27 28 -detailed 29 Show detailed information about each member. This dumps 30 a raw set of tags which shows more information than the 31 default output format. 32 ` 33 return strings.TrimSpace(helpText) 34 } 35 36 func (c *ServerMembersCommand) Synopsis() string { 37 return "Display a list of known servers and their status" 38 } 39 40 func (c *ServerMembersCommand) Run(args []string) int { 41 var detailed bool 42 43 flags := c.Meta.FlagSet("server-members", FlagSetClient) 44 flags.Usage = func() { c.Ui.Output(c.Help()) } 45 flags.BoolVar(&detailed, "detailed", false, "Show detailed output") 46 47 if err := flags.Parse(args); err != nil { 48 return 1 49 } 50 51 // Check for extra arguments 52 args = flags.Args() 53 if len(args) != 0 { 54 c.Ui.Error(c.Help()) 55 return 1 56 } 57 58 // Get the HTTP client 59 client, err := c.Meta.Client() 60 if err != nil { 61 c.Ui.Error(fmt.Sprintf("Error initializing client: %s", err)) 62 return 1 63 } 64 65 // Query the members 66 mem, err := client.Agent().Members() 67 if err != nil { 68 c.Ui.Error(fmt.Sprintf("Error querying servers: %s", err)) 69 return 1 70 } 71 72 // Sort the members 73 sort.Sort(api.AgentMembersNameSort(mem)) 74 75 // Format the list 76 var out []string 77 if detailed { 78 out = detailedOutput(mem) 79 } else { 80 out = standardOutput(mem) 81 } 82 83 // Dump the list 84 c.Ui.Output(columnize.SimpleFormat(out)) 85 return 0 86 } 87 88 func standardOutput(mem []*api.AgentMember) []string { 89 // Format the members list 90 members := make([]string, len(mem)+1) 91 members[0] = "Name|Address|Port|Status|Protocol|Build|Datacenter|Region" 92 for i, member := range mem { 93 members[i+1] = fmt.Sprintf("%s|%s|%d|%s|%d|%s|%s|%s", 94 member.Name, 95 member.Addr, 96 member.Port, 97 member.Status, 98 member.ProtocolCur, 99 member.Tags["build"], 100 member.Tags["dc"], 101 member.Tags["region"]) 102 } 103 return members 104 } 105 106 func detailedOutput(mem []*api.AgentMember) []string { 107 // Format the members list 108 members := make([]string, len(mem)+1) 109 members[0] = "Name|Address|Port|Tags" 110 for i, member := range mem { 111 // Format the tags 112 tagPairs := make([]string, 0, len(member.Tags)) 113 for k, v := range member.Tags { 114 tagPairs = append(tagPairs, fmt.Sprintf("%s=%s", k, v)) 115 } 116 tags := strings.Join(tagPairs, ",") 117 118 members[i+1] = fmt.Sprintf("%s|%s|%d|%s", 119 member.Name, 120 member.Addr, 121 member.Port, 122 tags) 123 } 124 return members 125 }