1package command 2 3import ( 4 "flag" 5 "fmt" 6 "github.com/mitchellh/cli" 7 "strings" 8) 9 10// JoinCommand is a Command implementation that tells a running Serf 11// agent to join another. 12type JoinCommand struct { 13 Ui cli.Ui 14} 15 16func (c *JoinCommand) Help() string { 17 helpText := ` 18Usage: serf join [options] address ... 19 20 Tells a running Serf agent (with "serf agent") to join the cluster 21 by specifying at least one existing member. 22 23Options: 24 25 -replay Replay past user events. 26 -rpc-addr=127.0.0.1:7373 RPC address of the Serf agent. 27 -rpc-auth="" RPC auth token of the Serf agent. 28` 29 return strings.TrimSpace(helpText) 30} 31 32func (c *JoinCommand) Run(args []string) int { 33 var replayEvents bool 34 35 cmdFlags := flag.NewFlagSet("join", flag.ContinueOnError) 36 cmdFlags.Usage = func() { c.Ui.Output(c.Help()) } 37 cmdFlags.BoolVar(&replayEvents, "replay", false, "replay") 38 rpcAddr := RPCAddrFlag(cmdFlags) 39 rpcAuth := RPCAuthFlag(cmdFlags) 40 if err := cmdFlags.Parse(args); err != nil { 41 return 1 42 } 43 44 addrs := cmdFlags.Args() 45 if len(addrs) == 0 { 46 c.Ui.Error("At least one address to join must be specified.") 47 c.Ui.Error("") 48 c.Ui.Error(c.Help()) 49 return 1 50 } 51 52 client, err := RPCClient(*rpcAddr, *rpcAuth) 53 if err != nil { 54 c.Ui.Error(fmt.Sprintf("Error connecting to Serf agent: %s", err)) 55 return 1 56 } 57 defer client.Close() 58 59 n, err := client.Join(addrs, replayEvents) 60 if err != nil { 61 c.Ui.Error(fmt.Sprintf("Error joining the cluster: %s", err)) 62 return 1 63 } 64 65 c.Ui.Output(fmt.Sprintf( 66 "Successfully joined cluster by contacting %d nodes.", n)) 67 return 0 68} 69 70func (c *JoinCommand) Synopsis() string { 71 return "Tell Serf agent to join cluster" 72} 73