small pixel drawing of a pufferfish cascade

command/ls/members/members.go

package members

import (
	"bytes"
	"flag"
	"fmt"
	"os"
	"strings"
	"text/tabwriter"

	"git.j3s.sh/cascade/api"
)

const usage = `cascade ls members [options]

  this command lists the members of the cascade serf
  cluster.

options:

  -api
    address of the api to target (default = 127.0.0.1:8500)

  -l | -details
    show more details (default = nil)
`

type Flags struct {
	apiAddr string
	details bool
}

var membersFlags Flags

func Run(args []string) {
	flags := flag.NewFlagSet("agent", flag.ContinueOnError)
	flags.Usage = func() { fmt.Printf(usage) }
	flags.StringVar(&membersFlags.apiAddr, "api", "", "")
	flags.BoolVar(&membersFlags.details, "l", false, "")
	flags.BoolVar(&membersFlags.details, "details", false, "")
	flags.Parse(args)

	cfg := api.DefaultConfig()
	client, err := api.NewClient(cfg)
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
	members, err := client.Agent().Members()
	if err != nil {
		fmt.Println(err)
		os.Exit(1)
	}

	if membersFlags.details {
		var b bytes.Buffer
		tw := tabwriter.NewWriter(&b, 0, 2, 2, ' ', 0)
		fmt.Fprintf(tw, "node\taddr\tstatus\ttags\n")
		for _, m := range members {
			fmt.Fprintf(tw, "%s\t", m.Name)
			fmt.Fprintf(tw, "%s:%d\t", m.Addr, m.Port)
			fmt.Fprintf(tw, "%s\t", m.StatusPretty())
			fmt.Fprintf(tw, "%s\t", printTags(m.Tags))
			fmt.Fprintln(tw)
		}
		if err := tw.Flush(); err != nil {
			fmt.Printf("error flushing tabwriter: %s", err)
			os.Exit(1)
		}
		fmt.Print(b.String())
	} else {
		for _, m := range members {
			fmt.Println(m.Name)
		}
	}
}

func printTags(tags map[string]string) string {
	var results []string
	for k, v := range tags {
		results = append(results, fmt.Sprintf("%s=%s", k, v))
	}
	return strings.Join(results, ",")
}