agent: Adding support for -join flag. Fixes #33.

This commit is contained in:
Armon Dadgar 2014-04-11 16:59:16 -07:00
parent 6fd3f81c48
commit a8d9fefdfe
3 changed files with 46 additions and 0 deletions

View File

@ -58,6 +58,9 @@ func (c *Command) readConfig() *Config {
cmdFlags.IntVar(&cmdConfig.Protocol, "protocol", -1, "protocol version")
cmdFlags.Var((*AppendSliceValue)(&cmdConfig.StartJoin), "join",
"address of agent to join on startup")
if err := cmdFlags.Parse(c.args); err != nil {
return nil
}
@ -200,6 +203,22 @@ func (c *Command) setupAgent(config *Config, logOutput io.Writer, logWriter *log
return nil
}
// startupJoin is invoked to handle any joins specified to take place at start time
func (c *Command) startupJoin(config *Config) error {
if len(config.StartJoin) == 0 {
return nil
}
c.Ui.Output("Joining cluster...")
n, err := c.agent.JoinLAN(config.StartJoin)
if err != nil {
return err
}
c.Ui.Info(fmt.Sprintf("Join completed. Synced with %d initial agents", n))
return nil
}
func (c *Command) Run(args []string) int {
c.Ui = &cli.PrefixedUi{
OutputPrefix: "==> ",
@ -262,6 +281,12 @@ func (c *Command) Run(args []string) int {
defer c.httpServer.Shutdown()
}
// Join startup nodes if specified
if err := c.startupJoin(config); err != nil {
c.Ui.Error(err.Error())
return 1
}
// Register the services
for _, service := range config.Services {
ns := service.NodeService()
@ -447,6 +472,8 @@ Options:
order.
-data-dir=path Path to a data directory to store agent state
-dc=east-aws Datacenter of the agent
-join=1.2.3.4 Address of an agent to join at start time.
Can be specified multiple times.
-log-level=info Log level of the agent.
-node=hostname Name of this node. Must be unique in the cluster
-protocol=N Sets the protocol version. Defaults to latest.

View File

@ -119,6 +119,11 @@ type Config struct {
// Must be provided to serve TLS connections.
KeyFile string `mapstructure:"key_file"`
// StartJoin is a list of addresses to attempt to join when the
// agent starts. If Serf is unable to communicate with any of these
// addresses, then the agent will error and exit.
StartJoin []string `mapstructure:"start_join"`
// AEInterval controls the anti-entropy interval. This is how often
// the agent attempts to reconcile it's local state with the server'
// representation of our state. Defaults to every 60s.
@ -396,6 +401,12 @@ func MergeConfig(a, b *Config) *Config {
if b.Ports.Server != 0 {
result.Ports.Server = b.Ports.Server
}
// Copy the start join addresses
result.StartJoin = make([]string, 0, len(a.StartJoin)+len(b.StartJoin))
result.StartJoin = append(result.StartJoin, a.StartJoin...)
result.StartJoin = append(result.StartJoin, b.StartJoin...)
return &result
}

View File

@ -66,6 +66,11 @@ The options below are all specified on the command-line.
it relies on proper configuration. Nodes in the same datacenter should be on a single
LAN.
* `-join` - Address of another agent to join upon starting up. This can be
specified multiple times to specify multiple agents to join. If Consul is
unable to join with any of the specified addresses, agent startup will
fail. By default, the agent won't join any nodes when it starts up.
* `-log-level` - The level of logging to show after the Consul agent has
started. This defaults to "info". The available log levels are "trace",
"debug", "info", "warn", "err". This is the log level that will be shown
@ -190,6 +195,9 @@ definitions support being updated during a reload.
gracefully leave, but setting this to true disables that. Defaults to false.
Interrupts are usually from a Control-C from a shell.
* `start_join` - An array of strings specifying addresses of nodes to
join upon startup.
* `statsite_addr` - This provides the address of a statsite instance. If provided
Consul will stream various telemetry information to that instance for aggregation.
This can be used to capture various runtime information.