diff --git a/agent/config/builder.go b/agent/config/builder.go index 43d89655e5..980c163155 100644 --- a/agent/config/builder.go +++ b/agent/config/builder.go @@ -438,28 +438,6 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) { } } - // expand addresses in start join lan configuration - startJoinLAN := make([]string, len(c.StartJoinAddrsLAN)) - - for _, configStartJoinAddrsLAN := range c.StartJoinAddrsLAN { - startJoinAddrs := b.expandOptionalAddrs("start_join", &configStartJoinAddrsLAN) - - if startJoinAddrs != nil { - startJoinLAN = append(startJoinLAN, startJoinAddrs...) - } - } - - // expand addresses in retry join lan configuration - retryJoinLan := make([]string, len(c.RetryJoinLAN)) - - for _, retryJoinLanElement := range c.RetryJoinLAN { - retryJoinAddrs := b.expandOptionalAddrs("retry_join", &retryJoinLanElement) - - if retryJoinAddrs != nil { - retryJoinLan = append(retryJoinLan, retryJoinAddrs...) - } - } - // expand dns recursors uniq := map[string]bool{} dnsRecursors := []string{} @@ -708,10 +686,10 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) { RejoinAfterLeave: b.boolVal(c.RejoinAfterLeave), RetryJoinIntervalLAN: b.durationVal("retry_interval", c.RetryJoinIntervalLAN), RetryJoinIntervalWAN: b.durationVal("retry_interval_wan", c.RetryJoinIntervalWAN), - RetryJoinLAN: retryJoinLan, + RetryJoinLAN: b.expandAllOptionalAddrs("retry_join", c.RetryJoinLAN), RetryJoinMaxAttemptsLAN: b.intVal(c.RetryJoinMaxAttemptsLAN), RetryJoinMaxAttemptsWAN: b.intVal(c.RetryJoinMaxAttemptsWAN), - RetryJoinWAN: c.RetryJoinWAN, + RetryJoinWAN: b.expandAllOptionalAddrs("retry_join_wan", c.RetryJoinWAN), SegmentName: b.stringVal(c.SegmentName), Segments: segments, SerfAdvertiseAddrLAN: serfAdvertiseAddrLAN, @@ -726,8 +704,8 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) { Services: services, SessionTTLMin: b.durationVal("session_ttl_min", c.SessionTTLMin), SkipLeaveOnInt: skipLeaveOnInt, - StartJoinAddrsLAN: startJoinLAN, - StartJoinAddrsWAN: c.StartJoinAddrsWAN, + StartJoinAddrsLAN: b.expandAllOptionalAddrs("start_join", c.StartJoinAddrsLAN), + StartJoinAddrsWAN: b.expandAllOptionalAddrs("start_join_wan", c.StartJoinAddrsWAN), SyslogFacility: b.stringVal(c.SyslogFacility), TLSCipherSuites: b.tlsCipherSuites("tls_cipher_suites", c.TLSCipherSuites), TLSMinVersion: b.stringVal(c.TLSMinVersion), @@ -1180,6 +1158,17 @@ func (b *Builder) expandOptionalAddrs(name string, s *string) []string { } } +func (b *Builder) expandAllOptionalAddrs(name string, addrs []string) []string { + out := make([]string, 0, len(addrs)) + for _, a := range addrs { + expanded := b.expandOptionalAddrs(name, &a) + if expanded != nil { + out = append(out, expanded...) + } + } + return out +} + // expandIPs expands the go-sockaddr template in s and returns a list of // *net.IPAddr. If one of the expanded addresses is a unix socket // address an error is set and nil is returned. diff --git a/agent/config/runtime_test.go b/agent/config/runtime_test.go index 78e7d577b1..d7cc2e18cd 100644 --- a/agent/config/runtime_test.go +++ b/agent/config/runtime_test.go @@ -1121,6 +1121,46 @@ func TestConfigFlagsAndEdgecases(t *testing.T) { rt.DataDir = dataDir }, }, + { + desc: "start_join address template", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "start_join": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, + hcl: []string{`start_join = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, + patch: func(rt *RuntimeConfig) { + rt.StartJoinAddrsLAN = []string{"1.2.3.4", "4.3.2.1"} + rt.DataDir = dataDir + }, + }, + { + desc: "start_join_wan address template", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "start_join_wan": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, + hcl: []string{`start_join_wan = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, + patch: func(rt *RuntimeConfig) { + rt.StartJoinAddrsWAN = []string{"1.2.3.4", "4.3.2.1"} + rt.DataDir = dataDir + }, + }, + { + desc: "retry_join address template", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "retry_join": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, + hcl: []string{`retry_join = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, + patch: func(rt *RuntimeConfig) { + rt.RetryJoinLAN = []string{"1.2.3.4", "4.3.2.1"} + rt.DataDir = dataDir + }, + }, + { + desc: "retry_join_wan address template", + args: []string{`-data-dir=` + dataDir}, + json: []string{`{ "retry_join_wan": ["{{ printf \"1.2.3.4 4.3.2.1\" }}"] }`}, + hcl: []string{`retry_join_wan = ["{{ printf \"1.2.3.4 4.3.2.1\" }}"]`}, + patch: func(rt *RuntimeConfig) { + rt.RetryJoinWAN = []string{"1.2.3.4", "4.3.2.1"} + rt.DataDir = dataDir + }, + }, // ------------------------------------------------------------ // precedence rules