config: move testing shims to BuilderOpts

And remove the devMode field from builder.

This change helps make the Builder state more explicit by moving inputs to the BuilderOps struct,
leaving only fields that can change during Builder.Build on the Builder struct.
This commit is contained in:
Daniel Nephin 2020-11-20 18:29:57 -05:00
parent fcbdfa393e
commit 8e783fb37b
4 changed files with 24 additions and 26 deletions

View File

@ -92,8 +92,7 @@ func Load(opts BuilderOpts, extraHead Source, overrides ...Source) (*RuntimeConf
// since not all pre-conditions have to be satisfied when performing // since not all pre-conditions have to be satisfied when performing
// syntactical tests. // syntactical tests.
type Builder struct { type Builder struct {
// devMode stores the value of the -dev flag, and enables development mode. opts BuilderOpts
devMode *bool
// Head, Sources, and Tail are used to manage the order of the // Head, Sources, and Tail are used to manage the order of the
// config sources, as described in the comments above. // config sources, as described in the comments above.
@ -105,15 +104,6 @@ type Builder struct {
// parsing the configuration. // parsing the configuration.
Warnings []string Warnings []string
// hostname is a shim for testing, allowing tests to specify a replacement
// for os.Hostname.
hostname func() (string, error)
// getPrivateIPv4 and getPublicIPv6 are shims for testing, allowing tests to
// specify a replacement for ipaddr.GetPrivateIPv4 and ipaddr.GetPublicIPv6.
getPrivateIPv4 func() ([]*net.IPAddr, error)
getPublicIPv6 func() ([]*net.IPAddr, error)
// err contains the first error that occurred during // err contains the first error that occurred during
// building the runtime configuration. // building the runtime configuration.
err error err error
@ -135,8 +125,8 @@ func NewBuilder(opts BuilderOpts) (*Builder, error) {
} }
b := &Builder{ b := &Builder{
devMode: opts.DevMode, opts: opts,
Head: []Source{DefaultSource(), DefaultEnterpriseSource()}, Head: []Source{DefaultSource(), DefaultEnterpriseSource()},
} }
if b.boolVal(opts.DevMode) { if b.boolVal(opts.DevMode) {
@ -467,14 +457,14 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) {
switch { switch {
case ipaddr.IsAnyV4(advertiseAddr): case ipaddr.IsAnyV4(advertiseAddr):
addrtyp = "private IPv4" addrtyp = "private IPv4"
detect = b.getPrivateIPv4 detect = b.opts.getPrivateIPv4
if detect == nil { if detect == nil {
detect = ipaddr.GetPrivateIPv4 detect = ipaddr.GetPrivateIPv4
} }
case ipaddr.IsAnyV6(advertiseAddr): case ipaddr.IsAnyV6(advertiseAddr):
addrtyp = "public IPv6" addrtyp = "public IPv6"
detect = b.getPublicIPv6 detect = b.opts.getPublicIPv6
if detect == nil { if detect == nil {
detect = ipaddr.GetPublicIPv6 detect = ipaddr.GetPublicIPv6
} }
@ -994,7 +984,7 @@ func (b *Builder) Build() (rt RuntimeConfig, err error) {
DataDir: dataDir, DataDir: dataDir,
Datacenter: datacenter, Datacenter: datacenter,
DefaultQueryTime: b.durationVal("default_query_time", c.DefaultQueryTime), DefaultQueryTime: b.durationVal("default_query_time", c.DefaultQueryTime),
DevMode: b.boolVal(b.devMode), DevMode: b.boolVal(b.opts.DevMode),
DisableAnonymousSignature: b.boolVal(c.DisableAnonymousSignature), DisableAnonymousSignature: b.boolVal(c.DisableAnonymousSignature),
DisableCoordinates: b.boolVal(c.DisableCoordinates), DisableCoordinates: b.boolVal(c.DisableCoordinates),
DisableHostNodeID: b.boolVal(c.DisableHostNodeID), DisableHostNodeID: b.boolVal(c.DisableHostNodeID),
@ -1900,7 +1890,7 @@ func (b *Builder) tlsCipherSuites(name string, v *string) []uint16 {
func (b *Builder) nodeName(v *string) string { func (b *Builder) nodeName(v *string) string {
nodeName := b.stringVal(v) nodeName := b.stringVal(v)
if nodeName == "" { if nodeName == "" {
fn := b.hostname fn := b.opts.hostname
if fn == nil { if fn == nil {
fn = os.Hostname fn = os.Hostname
} }

View File

@ -172,13 +172,13 @@ func TestBuilder_BuildAndValidate_NodeName(t *testing.T) {
} }
func patchBuilderShims(b *Builder) { func patchBuilderShims(b *Builder) {
b.hostname = func() (string, error) { b.opts.hostname = func() (string, error) {
return "thehostname", nil return "thehostname", nil
} }
b.getPrivateIPv4 = func() ([]*net.IPAddr, error) { b.opts.getPrivateIPv4 = func() ([]*net.IPAddr, error) {
return []*net.IPAddr{ipAddr("10.0.0.1")}, nil return []*net.IPAddr{ipAddr("10.0.0.1")}, nil
} }
b.getPublicIPv6 = func() ([]*net.IPAddr, error) { b.opts.getPublicIPv6 = func() ([]*net.IPAddr, error) {
return []*net.IPAddr{ipAddr("dead:beef::1")}, nil return []*net.IPAddr{ipAddr("dead:beef::1")}, nil
} }
} }

View File

@ -3,6 +3,7 @@ package config
import ( import (
"flag" "flag"
"fmt" "fmt"
"net"
"time" "time"
) )
@ -26,6 +27,15 @@ type BuilderOpts struct {
// HCL contains an arbitrary config in hcl format. // HCL contains an arbitrary config in hcl format.
HCL []string HCL []string
// hostname is a shim for testing, allowing tests to specify a replacement
// for os.Hostname.
hostname func() (string, error)
// getPrivateIPv4 and getPublicIPv6 are shims for testing, allowing tests to
// specify a replacement for ipaddr.GetPrivateIPv4 and ipaddr.GetPublicIPv6.
getPrivateIPv4 func() ([]*net.IPAddr, error)
getPublicIPv6 func() ([]*net.IPAddr, error)
} }
// AddFlags adds the command line flags for the agent. // AddFlags adds the command line flags for the agent.

View File

@ -4886,13 +4886,13 @@ func testConfig(t *testing.T, tests []configTest, dataDir string) {
patchBuilderShims(b) patchBuilderShims(b)
if tt.hostname != nil { if tt.hostname != nil {
b.hostname = tt.hostname b.opts.hostname = tt.hostname
} }
if tt.privatev4 != nil { if tt.privatev4 != nil {
b.getPrivateIPv4 = tt.privatev4 b.opts.getPrivateIPv4 = tt.privatev4
} }
if tt.publicv6 != nil { if tt.publicv6 != nil {
b.getPublicIPv6 = tt.publicv6 b.opts.getPublicIPv6 = tt.publicv6
} }
// read the source fragements // read the source fragements
@ -4937,9 +4937,7 @@ func testConfig(t *testing.T, tests []configTest, dataDir string) {
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
x.hostname = b.hostname patchBuilderShims(x)
x.getPrivateIPv4 = func() ([]*net.IPAddr, error) { return []*net.IPAddr{ipAddr("10.0.0.1")}, nil }
x.getPublicIPv6 = func() ([]*net.IPAddr, error) { return []*net.IPAddr{ipAddr("dead:beef::1")}, nil }
expected, err := x.Build() expected, err := x.Build()
if err != nil { if err != nil {
t.Fatalf("build default failed: %s", err) t.Fatalf("build default failed: %s", err)