From 1e3bb6b21d60973f6e2a1791583b48bad2fef71c Mon Sep 17 00:00:00 2001 From: Chelsea Holland Komlo Date: Wed, 18 Apr 2018 18:09:46 -0400 Subject: [PATCH] add go-discover --- command/agent/retry_join.go | 17 +++++++- command/agent/retry_join_test.go | 70 ++++++++++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/command/agent/retry_join.go b/command/agent/retry_join.go index 42f9b2ca9..bff8af279 100644 --- a/command/agent/retry_join.go +++ b/command/agent/retry_join.go @@ -2,6 +2,7 @@ package agent import ( "log" + "strings" "time" ) @@ -33,7 +34,21 @@ func (r *retryJoiner) RetryJoin(config *Config) { r.logger.Printf("[INFO] agent: Joining cluster...") for { - addrs := config.Server.RetryJoin + var addrs []string + + for _, addr := range config.Server.RetryJoin { + switch { + case strings.Contains(addr, "provider"): + servers, err := r.discover.Addrs(addr, r.logger) + if err != nil { + r.logger.Printf("[ERR] agent: Join error %s", err) + } else { + addrs = append(addrs, servers...) + } + default: + addrs = append(addrs, addr) + } + } n, err := r.join(addrs) if err == nil { diff --git a/command/agent/retry_join_test.go b/command/agent/retry_join_test.go index 97408e7e3..c5d635de7 100644 --- a/command/agent/retry_join_test.go +++ b/command/agent/retry_join_test.go @@ -5,7 +5,6 @@ import ( "io/ioutil" "log" "os" - "strings" "testing" "github.com/hashicorp/nomad/testutil" @@ -67,14 +66,14 @@ func TestRetryJoin_Integration(t *testing.T) { type MockDiscover struct{} func (m *MockDiscover) Addrs(s string, l *log.Logger) ([]string, error) { - return strings.Split(s, " "), nil + return []string{s}, nil } func (m *MockDiscover) Help() string { return "" } func (m *MockDiscover) Names() []string { return []string{""} } -func TestRetryJoin_Unit(t *testing.T) { +func TestRetryJoin_NonCloud(t *testing.T) { t.Parallel() require := require.New(t) @@ -105,3 +104,68 @@ func TestRetryJoin_Unit(t *testing.T) { require.Equal(1, len(output)) require.Equal("127.0.0.1", output[0]) } + +func TestRetryJoin_Cloud(t *testing.T) { + t.Parallel() + require := require.New(t) + + newConfig := &Config{ + Server: &ServerConfig{ + RetryMaxAttempts: 1, + RetryJoin: []string{"provider=aws, tag_value=foo"}, + Enabled: true, + }, + } + + var output []string + + mockJoin := func(s []string) (int, error) { + output = s + return 0, nil + } + + joiner := retryJoiner{ + discover: &MockDiscover{}, + join: mockJoin, + logger: log.New(ioutil.Discard, "", 0), + errCh: make(chan struct{}), + } + + joiner.RetryJoin(newConfig) + + require.Equal(1, len(output)) + require.Equal("provider=aws, tag_value=foo", output[0]) +} + +func TestRetryJoin_MixedProvider(t *testing.T) { + t.Parallel() + require := require.New(t) + + newConfig := &Config{ + Server: &ServerConfig{ + RetryMaxAttempts: 1, + RetryJoin: []string{"provider=aws, tag_value=foo", "127.0.0.1"}, + Enabled: true, + }, + } + + var output []string + + mockJoin := func(s []string) (int, error) { + output = s + return 0, nil + } + + joiner := retryJoiner{ + discover: &MockDiscover{}, + join: mockJoin, + logger: log.New(ioutil.Discard, "", 0), + errCh: make(chan struct{}), + } + + joiner.RetryJoin(newConfig) + + require.Equal(2, len(output)) + require.Equal("provider=aws, tag_value=foo", output[0]) + require.Equal("127.0.0.1", output[1]) +}