github.com/jmitchell/nomad@v0.1.3-0.20151007230021-7ab84c2862d8/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  }