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