2017-09-25 18:40:42 +00:00
package config
import (
"bytes"
"crypto/tls"
"encoding/base64"
2017-09-27 18:47:40 +00:00
"encoding/json"
2017-09-25 18:40:42 +00:00
"errors"
"flag"
"fmt"
"io/ioutil"
"net"
"os"
"path/filepath"
"reflect"
"strconv"
"strings"
"testing"
"time"
"github.com/hashicorp/consul/agent/structs"
2018-06-14 12:52:48 +00:00
"github.com/hashicorp/consul/lib"
2019-03-27 12:54:56 +00:00
"github.com/hashicorp/consul/sdk/testutil"
2017-09-25 18:40:42 +00:00
"github.com/hashicorp/consul/types"
"github.com/pascaldekloe/goe/verify"
2018-06-14 12:52:48 +00:00
"github.com/stretchr/testify/require"
2017-09-25 18:40:42 +00:00
)
type configTest struct {
desc string
2017-10-20 09:46:16 +00:00
args [ ] string
2017-09-25 18:40:42 +00:00
pre , post func ( )
json , jsontail [ ] string
hcl , hcltail [ ] string
2018-05-05 18:10:24 +00:00
skipformat bool
2017-09-25 18:40:42 +00:00
privatev4 func ( ) ( [ ] * net . IPAddr , error )
publicv6 func ( ) ( [ ] * net . IPAddr , error )
patch func ( rt * RuntimeConfig )
err string
warns [ ] string
hostname func ( ) ( string , error )
}
// TestConfigFlagsAndEdgecases tests the command line flags and
// edgecases for the config parsing. It provides a test structure which
// checks for warnings on deprecated fields and flags. These tests
// should check one option at a time if possible and should use generic
// values, e.g. 'a' or 1 instead of 'servicex' or 3306.
func TestConfigFlagsAndEdgecases ( t * testing . T ) {
dataDir := testutil . TempDir ( t , "consul" )
defer os . RemoveAll ( dataDir )
tests := [ ] configTest {
// ------------------------------------------------------------
// cmd line flags
//
{
desc : "-advertise" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -advertise=1.2.3.4 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.2.3.4:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.2.3.4" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
} ,
} ,
{
desc : "-advertise-wan" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -advertise-wan=1.2.3.4 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "10.0.0.1" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
} ,
} ,
{
desc : "-advertise and -advertise-wan" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -advertise=1.2.3.4 ` ,
` -advertise-wan=5.6.7.8 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrWAN = ipAddr ( "5.6.7.8" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.2.3.4:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "5.6.7.8:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.2.3.4" ,
"wan" : "5.6.7.8" ,
}
rt . DataDir = dataDir
} ,
} ,
{
desc : "-bind" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -bind=1.2.3.4 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . BindAddr = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrLAN = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.2.3.4:8300" )
rt . RPCBindAddr = tcpAddr ( "1.2.3.4:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . SerfBindAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . SerfBindAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.2.3.4" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
} ,
} ,
{
desc : "-bootstrap" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -bootstrap ` ,
` -server ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Bootstrap = true
rt . ServerMode = true
rt . LeaveOnTerm = false
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
warns : [ ] string { "bootstrap = true: do not enable unless necessary" } ,
} ,
{
desc : "-bootstrap-expect" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -bootstrap-expect=3 ` ,
` -server ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . BootstrapExpect = 3
rt . ServerMode = true
rt . LeaveOnTerm = false
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
warns : [ ] string { "bootstrap_expect > 0: expecting 3 servers" } ,
} ,
{
desc : "-client" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -client=1.2.3.4 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "1.2.3.4" ) }
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "1.2.3.4:8600" ) , udpAddr ( "1.2.3.4:8600" ) }
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "1.2.3.4:8500" ) }
rt . DataDir = dataDir
} ,
} ,
2017-10-31 22:30:01 +00:00
{
desc : "-config-dir" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
` -config-dir ` , filepath . Join ( dataDir , "conf.d" ) ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.d/conf.json" ) , [ ] byte ( ` { "datacenter":"a"} ` ) )
} ,
} ,
{
desc : "-config-file json" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
` -config-file ` , filepath . Join ( dataDir , "conf.json" ) ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.json" ) , [ ] byte ( ` { "datacenter":"a"} ` ) )
} ,
} ,
{
desc : "-config-file hcl and json" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
` -config-file ` , filepath . Join ( dataDir , "conf.hcl" ) ,
` -config-file ` , filepath . Join ( dataDir , "conf.json" ) ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "b"
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.hcl" ) , [ ] byte ( ` datacenter = "a" ` ) )
writeFile ( filepath . Join ( dataDir , "conf.json" ) , [ ] byte ( ` { "datacenter":"b"} ` ) )
} ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "-data-dir empty" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` ,
} ,
err : "data_dir cannot be empty" ,
} ,
{
desc : "-data-dir non-directory" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir=runtime_test.go ` ,
} ,
err : ` data_dir "runtime_test.go" is not a directory ` ,
} ,
{
desc : "-datacenter" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
} ,
{
desc : "-datacenter empty" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter= ` ,
` -data-dir= ` + dataDir ,
} ,
err : "datacenter cannot be empty" ,
} ,
{
desc : "-dev" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -dev ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "127.0.0.1" )
rt . AdvertiseAddrWAN = ipAddr ( "127.0.0.1" )
rt . BindAddr = ipAddr ( "127.0.0.1" )
2018-05-04 20:33:05 +00:00
rt . ConnectEnabled = true
2017-09-25 18:40:42 +00:00
rt . DevMode = true
rt . DisableAnonymousSignature = true
rt . DisableKeyringFile = true
rt . EnableDebug = true
rt . EnableUI = true
rt . LeaveOnTerm = false
rt . LogLevel = "DEBUG"
rt . RPCAdvertiseAddr = tcpAddr ( "127.0.0.1:8300" )
rt . RPCBindAddr = tcpAddr ( "127.0.0.1:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "127.0.0.1:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "127.0.0.1:8302" )
rt . SerfBindAddrLAN = tcpAddr ( "127.0.0.1:8301" )
rt . SerfBindAddrWAN = tcpAddr ( "127.0.0.1:8302" )
rt . ServerMode = true
rt . SkipLeaveOnInt = true
rt . TaggedAddresses = map [ string ] string { "lan" : "127.0.0.1" , "wan" : "127.0.0.1" }
rt . ConsulCoordinateUpdatePeriod = 100 * time . Millisecond
rt . ConsulRaftElectionTimeout = 52 * time . Millisecond
rt . ConsulRaftHeartbeatTimeout = 35 * time . Millisecond
rt . ConsulRaftLeaderLeaseTimeout = 20 * time . Millisecond
2018-07-26 15:39:49 +00:00
rt . GossipLANGossipInterval = 100 * time . Millisecond
rt . GossipLANProbeInterval = 100 * time . Millisecond
rt . GossipLANProbeTimeout = 100 * time . Millisecond
rt . GossipLANSuspicionMult = 3
rt . GossipWANGossipInterval = 100 * time . Millisecond
rt . GossipWANProbeInterval = 100 * time . Millisecond
rt . GossipWANProbeTimeout = 100 * time . Millisecond
rt . GossipWANSuspicionMult = 3
2017-09-25 18:40:42 +00:00
rt . ConsulServerHealthInterval = 10 * time . Millisecond
2018-10-03 13:05:28 +00:00
rt . GRPCPort = 8502
rt . GRPCAddrs = [ ] net . Addr { tcpAddr ( "127.0.0.1:8502" ) }
2017-09-25 18:40:42 +00:00
} ,
} ,
{
desc : "-disable-host-node-id" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -disable-host-node-id ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DisableHostNodeID = true
rt . DataDir = dataDir
} ,
} ,
{
desc : "-disable-keyring-file" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -disable-keyring-file ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DisableKeyringFile = true
rt . DataDir = dataDir
} ,
} ,
{
desc : "-dns-port" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -dns-port=123 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DNSPort = 123
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "127.0.0.1:123" ) , udpAddr ( "127.0.0.1:123" ) }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-domain" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -domain=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DNSDomain = "a"
rt . DataDir = dataDir
} ,
} ,
{
desc : "-enable-script-checks" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -enable-script-checks ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
2018-10-11 12:22:11 +00:00
rt . EnableLocalScriptChecks = true
rt . EnableRemoteScriptChecks = true
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
desc : "-encrypt" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -encrypt=i0P+gFTkLPg0h53eNYjydg== ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . EncryptKey = "i0P+gFTkLPg0h53eNYjydg=="
rt . DataDir = dataDir
} ,
} ,
2017-11-11 02:06:07 +00:00
{
desc : "-config-format disabled, skip unknown files" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
` -config-dir ` , filepath . Join ( dataDir , "conf" ) ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf" , "valid.json" ) , [ ] byte ( ` { "datacenter":"a"} ` ) )
writeFile ( filepath . Join ( dataDir , "conf" , "invalid.skip" ) , [ ] byte ( ` NOPE ` ) )
} ,
} ,
2017-10-31 22:30:01 +00:00
{
desc : "-config-format=json" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
` -config-format=json ` ,
` -config-file ` , filepath . Join ( dataDir , "conf" ) ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf" ) , [ ] byte ( ` { "datacenter":"a"} ` ) )
} ,
} ,
{
desc : "-config-format=hcl" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
` -config-format=hcl ` ,
` -config-file ` , filepath . Join ( dataDir , "conf" ) ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf" ) , [ ] byte ( ` datacenter = "a" ` ) )
} ,
} ,
{
desc : "-config-format invalid" ,
args : [ ] string {
` -config-format=foobar ` ,
} ,
err : "-config-format must be either 'hcl' or 'json'" ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "-http-port" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -http-port=123 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . HTTPPort = 123
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "127.0.0.1:123" ) }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-join" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -join=a ` ,
` -join=b ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . StartJoinAddrsLAN = [ ] string { "a" , "b" }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-join-wan" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -join-wan=a ` ,
` -join-wan=b ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . StartJoinAddrsWAN = [ ] string { "a" , "b" }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-log-level" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -log-level=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . LogLevel = "a"
rt . DataDir = dataDir
} ,
} ,
{
desc : "-node" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -node=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . NodeName = "a"
rt . DataDir = dataDir
} ,
} ,
{
desc : "-node-id" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -node-id=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . NodeID = "a"
rt . DataDir = dataDir
} ,
} ,
{
desc : "-node-meta" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -node-meta=a:b ` ,
` -node-meta=c:d ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . NodeMeta = map [ string ] string { "a" : "b" , "c" : "d" }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-non-voting-server" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -non-voting-server ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . NonVotingServer = true
rt . DataDir = dataDir
} ,
} ,
{
desc : "-pid-file" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -pid-file=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . PidFile = "a"
rt . DataDir = dataDir
} ,
} ,
{
desc : "-protocol" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -protocol=1 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RPCProtocol = 1
rt . DataDir = dataDir
} ,
} ,
{
desc : "-raft-protocol" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -raft-protocol=1 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RaftProtocol = 1
rt . DataDir = dataDir
} ,
} ,
{
desc : "-recursor" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-10-20 13:36:52 +00:00
` -recursor=1.2.3.4 ` ,
` -recursor=5.6.7.8 ` ,
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
2017-10-20 13:36:52 +00:00
rt . DNSRecursors = [ ] string { "1.2.3.4" , "5.6.7.8" }
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
desc : "-rejoin" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -rejoin ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RejoinAfterLeave = true
rt . DataDir = dataDir
} ,
} ,
{
desc : "-retry-interval" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -retry-interval=5s ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RetryJoinIntervalLAN = 5 * time . Second
rt . DataDir = dataDir
} ,
} ,
{
desc : "-retry-interval-wan" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -retry-interval-wan=5s ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RetryJoinIntervalWAN = 5 * time . Second
rt . DataDir = dataDir
} ,
} ,
{
desc : "-retry-join" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -retry-join=a ` ,
` -retry-join=b ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RetryJoinLAN = [ ] string { "a" , "b" }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-retry-join-wan" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -retry-join-wan=a ` ,
` -retry-join-wan=b ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RetryJoinWAN = [ ] string { "a" , "b" }
rt . DataDir = dataDir
} ,
} ,
{
desc : "-retry-max" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -retry-max=1 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RetryJoinMaxAttemptsLAN = 1
rt . DataDir = dataDir
} ,
} ,
{
desc : "-retry-max-wan" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -retry-max-wan=1 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . RetryJoinMaxAttemptsWAN = 1
rt . DataDir = dataDir
} ,
} ,
{
desc : "-serf-lan-bind" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -serf-lan-bind=1.2.3.4 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . SerfBindAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . DataDir = dataDir
} ,
} ,
2018-07-06 18:05:06 +00:00
{
desc : "-serf-lan-port" ,
args : [ ] string {
` -serf-lan-port=123 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . SerfPortLAN = 123
rt . SerfAdvertiseAddrLAN = tcpAddr ( "10.0.0.1:123" )
rt . SerfBindAddrLAN = tcpAddr ( "0.0.0.0:123" )
rt . DataDir = dataDir
} ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "-serf-wan-bind" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -serf-wan-bind=1.2.3.4 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . SerfBindAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . DataDir = dataDir
} ,
} ,
2018-07-06 18:05:06 +00:00
{
desc : "-serf-wan-port" ,
args : [ ] string {
` -serf-wan-port=123 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . SerfPortWAN = 123
rt . SerfAdvertiseAddrWAN = tcpAddr ( "10.0.0.1:123" )
rt . SerfBindAddrWAN = tcpAddr ( "0.0.0.0:123" )
rt . DataDir = dataDir
} ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "-server" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -server ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . ServerMode = true
rt . LeaveOnTerm = false
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
} ,
2018-07-06 18:05:06 +00:00
{
desc : "-server-port" ,
args : [ ] string {
` -server-port=123 ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . ServerPort = 123
rt . RPCAdvertiseAddr = tcpAddr ( "10.0.0.1:123" )
rt . RPCBindAddr = tcpAddr ( "0.0.0.0:123" )
rt . DataDir = dataDir
} ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "-syslog" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -syslog ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . EnableSyslog = true
rt . DataDir = dataDir
} ,
} ,
{
desc : "-ui" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -ui ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . EnableUI = true
rt . DataDir = dataDir
} ,
} ,
{
desc : "-ui-dir" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -ui-dir=a ` ,
` -data-dir= ` + dataDir ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . UIDir = "a"
rt . DataDir = dataDir
} ,
} ,
// ------------------------------------------------------------
// ports and addresses
//
{
2017-10-20 09:46:16 +00:00
desc : "bind addr any v4" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr":"0.0.0.0" } ` } ,
hcl : [ ] string { ` bind_addr = "0.0.0.0" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "10.0.0.1" )
rt . AdvertiseAddrWAN = ipAddr ( "10.0.0.1" )
rt . BindAddr = ipAddr ( "0.0.0.0" )
rt . RPCAdvertiseAddr = tcpAddr ( "10.0.0.1:8300" )
rt . RPCBindAddr = tcpAddr ( "0.0.0.0:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "10.0.0.1:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "10.0.0.1:8302" )
rt . SerfBindAddrLAN = tcpAddr ( "0.0.0.0:8301" )
rt . SerfBindAddrWAN = tcpAddr ( "0.0.0.0:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "10.0.0.1" ,
"wan" : "10.0.0.1" ,
}
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "bind addr any v6" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr":"::" } ` } ,
hcl : [ ] string { ` bind_addr = "::" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "dead:beef::1" )
rt . AdvertiseAddrWAN = ipAddr ( "dead:beef::1" )
rt . BindAddr = ipAddr ( "::" )
rt . RPCAdvertiseAddr = tcpAddr ( "[dead:beef::1]:8300" )
rt . RPCBindAddr = tcpAddr ( "[::]:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "[dead:beef::1]:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "[dead:beef::1]:8302" )
rt . SerfBindAddrLAN = tcpAddr ( "[::]:8301" )
rt . SerfBindAddrWAN = tcpAddr ( "[::]:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "dead:beef::1" ,
"wan" : "dead:beef::1" ,
}
rt . DataDir = dataDir
} ,
publicv6 : func ( ) ( [ ] * net . IPAddr , error ) {
return [ ] * net . IPAddr { ipAddr ( "dead:beef::1" ) } , nil
} ,
} ,
2017-09-27 19:59:47 +00:00
{
2017-10-20 09:46:16 +00:00
desc : "bind addr any and advertise set should not detect" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr":"0.0.0.0", "advertise_addr": "1.2.3.4" } ` } ,
hcl : [ ] string { ` bind_addr = "0.0.0.0" advertise_addr = "1.2.3.4" ` } ,
2017-09-27 19:59:47 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . BindAddr = ipAddr ( "0.0.0.0" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.2.3.4:8300" )
rt . RPCBindAddr = tcpAddr ( "0.0.0.0:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . SerfBindAddrLAN = tcpAddr ( "0.0.0.0:8301" )
rt . SerfBindAddrWAN = tcpAddr ( "0.0.0.0:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.2.3.4" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
} ,
privatev4 : func ( ) ( [ ] * net . IPAddr , error ) {
return nil , fmt . Errorf ( "should not detect advertise_addr" )
} ,
} ,
2017-09-25 18:40:42 +00:00
{
2017-10-20 09:46:16 +00:00
desc : "client addr and ports == 0" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "0.0.0.0" ,
"ports" : { }
} ` } ,
hcl : [ ] string { `
client_addr = "0.0.0.0"
ports { }
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "0.0.0.0" ) }
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "0.0.0.0:8600" ) , udpAddr ( "0.0.0.0:8600" ) }
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "0.0.0.0:8500" ) }
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client addr and ports < 0" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "0.0.0.0" ,
2018-10-03 13:05:28 +00:00
"ports" : { "dns" : - 1 , "http" : - 2 , "https" : - 3 , "grpc" : - 4 }
2017-09-25 18:40:42 +00:00
} ` } ,
hcl : [ ] string { `
client_addr = "0.0.0.0"
2018-10-03 13:05:28 +00:00
ports { dns = - 1 http = - 2 https = - 3 grpc = - 4 }
2017-09-25 18:40:42 +00:00
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "0.0.0.0" ) }
rt . DNSPort = - 1
rt . DNSAddrs = nil
rt . HTTPPort = - 1
rt . HTTPAddrs = nil
2018-10-03 13:05:28 +00:00
// HTTPS and gRPC default to disabled so shouldn't be different from
// default rt.
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client addr and ports > 0" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "0.0.0.0" ,
2018-10-03 13:05:28 +00:00
"ports" : { "dns" : 1 , "http" : 2 , "https" : 3 , "grpc" : 4 }
2017-09-25 18:40:42 +00:00
} ` } ,
hcl : [ ] string { `
client_addr = "0.0.0.0"
2018-10-03 13:05:28 +00:00
ports { dns = 1 http = 2 https = 3 grpc = 4 }
2017-09-25 18:40:42 +00:00
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "0.0.0.0" ) }
rt . DNSPort = 1
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "0.0.0.0:1" ) , udpAddr ( "0.0.0.0:1" ) }
rt . HTTPPort = 2
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "0.0.0.0:2" ) }
rt . HTTPSPort = 3
rt . HTTPSAddrs = [ ] net . Addr { tcpAddr ( "0.0.0.0:3" ) }
2018-10-03 13:05:28 +00:00
rt . GRPCPort = 4
rt . GRPCAddrs = [ ] net . Addr { tcpAddr ( "0.0.0.0:4" ) }
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client addr, addresses and ports == 0" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "0.0.0.0" ,
2018-10-03 13:05:28 +00:00
"addresses" : { "dns" : "1.1.1.1" , "http" : "2.2.2.2" , "https" : "3.3.3.3" , "grpc" : "4.4.4.4" } ,
2017-09-25 18:40:42 +00:00
"ports" : { }
} ` } ,
hcl : [ ] string { `
client_addr = "0.0.0.0"
2018-10-03 13:05:28 +00:00
addresses = { dns = "1.1.1.1" http = "2.2.2.2" https = "3.3.3.3" grpc = "4.4.4.4" }
2017-09-25 18:40:42 +00:00
ports { }
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "0.0.0.0" ) }
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "1.1.1.1:8600" ) , udpAddr ( "1.1.1.1:8600" ) }
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "2.2.2.2:8500" ) }
2018-10-03 13:05:28 +00:00
// HTTPS and gRPC default to disabled so shouldn't be different from
// default rt.
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client addr, addresses and ports < 0" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "0.0.0.0" ,
2018-10-03 13:05:28 +00:00
"addresses" : { "dns" : "1.1.1.1" , "http" : "2.2.2.2" , "https" : "3.3.3.3" , "grpc" : "4.4.4.4" } ,
"ports" : { "dns" : - 1 , "http" : - 2 , "https" : - 3 , "grpc" : - 4 }
2017-09-25 18:40:42 +00:00
} ` } ,
hcl : [ ] string { `
client_addr = "0.0.0.0"
2018-10-03 13:05:28 +00:00
addresses = { dns = "1.1.1.1" http = "2.2.2.2" https = "3.3.3.3" grpc = "4.4.4.4" }
ports { dns = - 1 http = - 2 https = - 3 grpc = - 4 }
2017-09-25 18:40:42 +00:00
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "0.0.0.0" ) }
rt . DNSPort = - 1
rt . DNSAddrs = nil
rt . HTTPPort = - 1
rt . HTTPAddrs = nil
2018-10-03 13:05:28 +00:00
// HTTPS and gRPC default to disabled so shouldn't be different from
// default rt.
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client addr, addresses and ports" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "0.0.0.0" ,
2018-10-03 13:05:28 +00:00
"addresses" : { "dns" : "1.1.1.1" , "http" : "2.2.2.2" , "https" : "3.3.3.3" , "grpc" : "4.4.4.4" } ,
"ports" : { "dns" : 1 , "http" : 2 , "https" : 3 , "grpc" : 4 }
2017-09-25 18:40:42 +00:00
} ` } ,
hcl : [ ] string { `
client_addr = "0.0.0.0"
2018-10-03 13:05:28 +00:00
addresses = { dns = "1.1.1.1" http = "2.2.2.2" https = "3.3.3.3" grpc = "4.4.4.4" }
ports { dns = 1 http = 2 https = 3 grpc = 4 }
2017-09-25 18:40:42 +00:00
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "0.0.0.0" ) }
rt . DNSPort = 1
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "1.1.1.1:1" ) , udpAddr ( "1.1.1.1:1" ) }
rt . HTTPPort = 2
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "2.2.2.2:2" ) }
rt . HTTPSPort = 3
rt . HTTPSAddrs = [ ] net . Addr { tcpAddr ( "3.3.3.3:3" ) }
2018-10-03 13:05:28 +00:00
rt . GRPCPort = 4
rt . GRPCAddrs = [ ] net . Addr { tcpAddr ( "4.4.4.4:4" ) }
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client template and ports" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "{{ printf \"1.2.3.4 2001:db8::1\" }}" ,
2018-10-03 13:05:28 +00:00
"ports" : { "dns" : 1 , "http" : 2 , "https" : 3 , "grpc" : 4 }
2017-09-25 18:40:42 +00:00
} ` } ,
hcl : [ ] string { `
client_addr = "{{ printf \"1.2.3.4 2001:db8::1\" }}"
2018-10-03 13:05:28 +00:00
ports { dns = 1 http = 2 https = 3 grpc = 4 }
2017-09-25 18:40:42 +00:00
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "1.2.3.4" ) , ipAddr ( "2001:db8::1" ) }
rt . DNSPort = 1
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "1.2.3.4:1" ) , tcpAddr ( "[2001:db8::1]:1" ) , udpAddr ( "1.2.3.4:1" ) , udpAddr ( "[2001:db8::1]:1" ) }
rt . HTTPPort = 2
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "1.2.3.4:2" ) , tcpAddr ( "[2001:db8::1]:2" ) }
rt . HTTPSPort = 3
rt . HTTPSAddrs = [ ] net . Addr { tcpAddr ( "1.2.3.4:3" ) , tcpAddr ( "[2001:db8::1]:3" ) }
2018-10-03 13:05:28 +00:00
rt . GRPCPort = 4
rt . GRPCAddrs = [ ] net . Addr { tcpAddr ( "1.2.3.4:4" ) , tcpAddr ( "[2001:db8::1]:4" ) }
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "client, address template and ports" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string { ` {
"client_addr" : "{{ printf \"1.2.3.4 2001:db8::1\" }}" ,
"addresses" : {
"dns" : "{{ printf \"1.1.1.1 2001:db8::10 \" }}" ,
"http" : "{{ printf \"2.2.2.2 unix://http 2001:db8::20 \" }}" ,
2018-10-03 13:05:28 +00:00
"https" : "{{ printf \"3.3.3.3 unix://https 2001:db8::30 \" }}" ,
"grpc" : "{{ printf \"4.4.4.4 unix://grpc 2001:db8::40 \" }}"
2017-09-25 18:40:42 +00:00
} ,
2018-10-03 13:05:28 +00:00
"ports" : { "dns" : 1 , "http" : 2 , "https" : 3 , "grpc" : 4 }
2017-09-25 18:40:42 +00:00
} ` } ,
hcl : [ ] string { `
client_addr = "{{ printf \"1.2.3.4 2001:db8::1\" }}"
addresses = {
dns = "{{ printf \"1.1.1.1 2001:db8::10 \" }}"
http = "{{ printf \"2.2.2.2 unix://http 2001:db8::20 \" }}"
https = "{{ printf \"3.3.3.3 unix://https 2001:db8::30 \" }}"
2018-10-03 13:05:28 +00:00
grpc = "{{ printf \"4.4.4.4 unix://grpc 2001:db8::40 \" }}"
2017-09-25 18:40:42 +00:00
}
2018-10-03 13:05:28 +00:00
ports { dns = 1 http = 2 https = 3 grpc = 4 }
2017-09-25 18:40:42 +00:00
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . ClientAddrs = [ ] * net . IPAddr { ipAddr ( "1.2.3.4" ) , ipAddr ( "2001:db8::1" ) }
rt . DNSPort = 1
rt . DNSAddrs = [ ] net . Addr { tcpAddr ( "1.1.1.1:1" ) , tcpAddr ( "[2001:db8::10]:1" ) , udpAddr ( "1.1.1.1:1" ) , udpAddr ( "[2001:db8::10]:1" ) }
rt . HTTPPort = 2
rt . HTTPAddrs = [ ] net . Addr { tcpAddr ( "2.2.2.2:2" ) , unixAddr ( "unix://http" ) , tcpAddr ( "[2001:db8::20]:2" ) }
rt . HTTPSPort = 3
rt . HTTPSAddrs = [ ] net . Addr { tcpAddr ( "3.3.3.3:3" ) , unixAddr ( "unix://https" ) , tcpAddr ( "[2001:db8::30]:3" ) }
2018-10-03 13:05:28 +00:00
rt . GRPCPort = 4
rt . GRPCAddrs = [ ] net . Addr { tcpAddr ( "4.4.4.4:4" ) , unixAddr ( "unix://grpc" ) , tcpAddr ( "[2001:db8::40]:4" ) }
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address lan template" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "advertise_addr": " {{ printf \ "1.2.3.4\" }}" } ` } ,
hcl : [ ] string { ` advertise_addr = " {{ printf \ "1.2.3.4\" }}" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.2.3.4:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.2.3.4" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address wan template" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "advertise_addr_wan": " {{ printf \ "1.2.3.4\" }}" } ` } ,
hcl : [ ] string { ` advertise_addr_wan = " {{ printf \ "1.2.3.4\" }}" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . TaggedAddresses = map [ string ] string {
"lan" : "10.0.0.1" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address lan with ports" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-29 09:35:51 +00:00
json : [ ] string { ` {
"ports" : {
"server" : 1000 ,
"serf_lan" : 2000 ,
"serf_wan" : 3000
} ,
"advertise_addr" : "1.2.3.4"
} ` } ,
hcl : [ ] string { `
ports {
server = 1000
serf_lan = 2000
serf_wan = 3000
}
advertise_addr = "1.2.3.4"
` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
2017-09-29 09:35:51 +00:00
rt . AdvertiseAddrLAN = ipAddr ( "1.2.3.4" )
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.2.3.4:1000" )
rt . RPCBindAddr = tcpAddr ( "0.0.0.0:1000" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.2.3.4:2000" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:3000" )
rt . SerfBindAddrLAN = tcpAddr ( "0.0.0.0:2000" )
rt . SerfBindAddrWAN = tcpAddr ( "0.0.0.0:3000" )
rt . SerfPortLAN = 2000
rt . SerfPortWAN = 3000
rt . ServerPort = 1000
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.2.3.4" ,
"wan" : "1.2.3.4" ,
}
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address wan with ports" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-29 09:35:51 +00:00
json : [ ] string { ` {
"ports" : {
"server" : 1000 ,
"serf_lan" : 2000 ,
"serf_wan" : 3000
} ,
"advertise_addr_wan" : "1.2.3.4"
} ` } ,
hcl : [ ] string { `
ports {
server = 1000
serf_lan = 2000
serf_wan = 3000
}
advertise_addr_wan = "1.2.3.4"
` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
2017-09-29 09:35:51 +00:00
rt . AdvertiseAddrLAN = ipAddr ( "10.0.0.1" )
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . RPCAdvertiseAddr = tcpAddr ( "10.0.0.1:1000" )
rt . RPCBindAddr = tcpAddr ( "0.0.0.0:1000" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "10.0.0.1:2000" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "1.2.3.4:3000" )
rt . SerfBindAddrLAN = tcpAddr ( "0.0.0.0:2000" )
rt . SerfBindAddrWAN = tcpAddr ( "0.0.0.0:3000" )
rt . SerfPortLAN = 2000
rt . SerfPortWAN = 3000
rt . ServerPort = 1000
rt . TaggedAddresses = map [ string ] string {
"lan" : "10.0.0.1" ,
"wan" : "1.2.3.4" ,
}
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
2018-01-19 21:48:31 +00:00
{
2018-03-26 19:21:06 +00:00
desc : "allow disabling serf wan port" ,
2018-01-19 21:48:31 +00:00
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` {
"ports" : {
"serf_wan" : - 1
} ,
"advertise_addr_wan" : "1.2.3.4"
} ` } ,
hcl : [ ] string { `
ports {
serf_wan = - 1
}
advertise_addr_wan = "1.2.3.4"
` } ,
2018-03-27 14:44:41 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrWAN = ipAddr ( "1.2.3.4" )
rt . SerfAdvertiseAddrWAN = nil
rt . SerfBindAddrWAN = nil
rt . TaggedAddresses = map [ string ] string {
"lan" : "10.0.0.1" ,
"wan" : "1.2.3.4" ,
}
rt . DataDir = dataDir
rt . SerfPortWAN = - 1
} ,
2018-01-19 21:48:31 +00:00
} ,
2017-09-25 18:40:42 +00:00
{
2017-10-20 09:46:16 +00:00
desc : "serf bind address lan template" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "serf_lan": " {{ printf \ "1.2.3.4\" }}" } ` } ,
hcl : [ ] string { ` serf_lan = " {{ printf \ "1.2.3.4\" }}" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . SerfBindAddrLAN = tcpAddr ( "1.2.3.4:8301" )
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "serf bind address wan template" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "serf_wan": " {{ printf \ "1.2.3.4\" }}" } ` } ,
hcl : [ ] string { ` serf_wan = " {{ printf \ "1.2.3.4\" }}" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . SerfBindAddrWAN = tcpAddr ( "1.2.3.4:8302" )
rt . DataDir = dataDir
} ,
} ,
2017-10-20 13:36:52 +00:00
{
2017-10-20 09:46:16 +00:00
desc : "dns recursor templates with deduplication" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "recursors": [ " {{ printf \ "5.6.7.8:9999\" }}" , "{{ printf \"1.2.3.4\" }}" , "{{ printf \"5.6.7.8:9999\" }}" ] } ` } ,
hcl : [ ] string { ` recursors = [ " {{ printf \ "5.6.7.8:9999\" }}" , "{{ printf \"1.2.3.4\" }}" , "{{ printf \"5.6.7.8:9999\" }}" ] ` } ,
2017-10-20 13:36:52 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . DNSRecursors = [ ] string { "5.6.7.8:9999" , "1.2.3.4" }
rt . DataDir = dataDir
} ,
} ,
2018-05-10 13:30:24 +00:00
{
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
} ,
} ,
2017-09-25 18:40:42 +00:00
// ------------------------------------------------------------
// precedence rules
//
{
2017-10-20 09:46:16 +00:00
desc : "precedence: merge order" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
json : [ ] string {
` {
"bootstrap" : true ,
"bootstrap_expect" : 1 ,
"datacenter" : "a" ,
"start_join" : [ "a" , "b" ] ,
"node_meta" : { "a" : "b" }
} ` ,
` {
"bootstrap" : false ,
"bootstrap_expect" : 0 ,
"datacenter" : "b" ,
"start_join" : [ "c" , "d" ] ,
2017-12-14 00:06:01 +00:00
"node_meta" : { "a" : "c" }
2017-09-25 18:40:42 +00:00
} ` ,
} ,
hcl : [ ] string {
`
bootstrap = true
bootstrap_expect = 1
datacenter = "a"
start_join = [ "a" , "b" ]
node_meta = { "a" = "b" }
` ,
`
bootstrap = false
bootstrap_expect = 0
datacenter = "b"
start_join = [ "c" , "d" ]
2017-12-14 00:06:01 +00:00
node_meta = { "a" = "c" }
2017-09-25 18:40:42 +00:00
` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Bootstrap = false
rt . BootstrapExpect = 0
rt . Datacenter = "b"
rt . StartJoinAddrsLAN = [ ] string { "a" , "b" , "c" , "d" }
2017-12-14 00:06:01 +00:00
rt . NodeMeta = map [ string ] string { "a" : "c" }
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
desc : "precedence: flag before file" ,
json : [ ] string {
` {
"advertise_addr" : "1.2.3.4" ,
"advertise_addr_wan" : "5.6.7.8" ,
"bootstrap" : true ,
"bootstrap_expect" : 3 ,
"datacenter" : "a" ,
"node_meta" : { "a" : "b" } ,
2017-10-20 13:36:52 +00:00
"recursors" : [ "1.2.3.5" , "5.6.7.9" ] ,
2017-09-25 18:40:42 +00:00
"serf_lan" : "a" ,
"serf_wan" : "a" ,
"start_join" : [ "a" , "b" ]
} ` ,
} ,
hcl : [ ] string {
`
advertise_addr = "1.2.3.4"
advertise_addr_wan = "5.6.7.8"
bootstrap = true
bootstrap_expect = 3
datacenter = "a"
node_meta = { "a" = "b" }
2017-10-20 13:36:52 +00:00
recursors = [ "1.2.3.5" , "5.6.7.9" ]
2017-09-25 18:40:42 +00:00
serf_lan = "a"
serf_wan = "a"
start_join = [ "a" , "b" ]
` ,
} ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -advertise=1.1.1.1 ` ,
` -advertise-wan=2.2.2.2 ` ,
` -bootstrap=false ` ,
` -bootstrap-expect=0 ` ,
` -datacenter=b ` ,
` -data-dir= ` + dataDir ,
` -join ` , ` c ` , ` -join=d ` ,
2017-12-14 00:06:01 +00:00
` -node-meta=a:c ` ,
2017-10-20 13:36:52 +00:00
` -recursor ` , ` 1.2.3.6 ` , ` -recursor=5.6.7.10 ` ,
2017-09-25 18:40:42 +00:00
` -serf-lan-bind=3.3.3.3 ` ,
` -serf-wan-bind=4.4.4.4 ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . AdvertiseAddrLAN = ipAddr ( "1.1.1.1" )
rt . AdvertiseAddrWAN = ipAddr ( "2.2.2.2" )
rt . RPCAdvertiseAddr = tcpAddr ( "1.1.1.1:8300" )
rt . SerfAdvertiseAddrLAN = tcpAddr ( "1.1.1.1:8301" )
rt . SerfAdvertiseAddrWAN = tcpAddr ( "2.2.2.2:8302" )
rt . Datacenter = "b"
2017-10-20 13:36:52 +00:00
rt . DNSRecursors = [ ] string { "1.2.3.6" , "5.6.7.10" , "1.2.3.5" , "5.6.7.9" }
2017-12-14 00:06:01 +00:00
rt . NodeMeta = map [ string ] string { "a" : "c" }
2017-09-25 18:40:42 +00:00
rt . SerfBindAddrLAN = tcpAddr ( "3.3.3.3:8301" )
rt . SerfBindAddrWAN = tcpAddr ( "4.4.4.4:8302" )
rt . StartJoinAddrsLAN = [ ] string { "c" , "d" , "a" , "b" }
rt . TaggedAddresses = map [ string ] string {
"lan" : "1.1.1.1" ,
"wan" : "2.2.2.2" ,
}
rt . DataDir = dataDir
} ,
} ,
// ------------------------------------------------------------
// transformations
//
2017-11-10 21:50:45 +00:00
2017-09-25 18:40:42 +00:00
{
2017-10-20 09:46:16 +00:00
desc : "raft performance scaling" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "performance": { "raft_multiplier": 9} } ` } ,
hcl : [ ] string { ` performance = { raft_multiplier=9 } ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . ConsulRaftElectionTimeout = 9 * 1000 * time . Millisecond
rt . ConsulRaftHeartbeatTimeout = 9 * 1000 * time . Millisecond
rt . ConsulRaftLeaderLeaseTimeout = 9 * 500 * time . Millisecond
rt . DataDir = dataDir
} ,
} ,
// ------------------------------------------------------------
// validations
//
{
2017-10-20 09:46:16 +00:00
desc : "invalid input" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` this is not JSON ` } ,
hcl : [ ] string { ` *** 0123 this is not HCL ` } ,
err : "Error parsing" ,
2017-09-25 18:40:42 +00:00
} ,
{
2017-10-20 09:46:16 +00:00
desc : "datacenter is lower-cased" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "datacenter": "A" } ` } ,
hcl : [ ] string { ` datacenter = "A" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . Datacenter = "a"
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "acl_datacenter is lower-cased" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "acl_datacenter": "A" } ` } ,
hcl : [ ] string { ` acl_datacenter = "A" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
2018-10-19 16:04:07 +00:00
rt . ACLsEnabled = true
2017-09-25 18:40:42 +00:00
rt . ACLDatacenter = "a"
rt . DataDir = dataDir
2018-10-15 16:17:48 +00:00
rt . PrimaryDatacenter = "a"
2017-09-25 18:40:42 +00:00
} ,
2018-10-15 16:17:48 +00:00
warns : [ ] string { ` The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead. ` } ,
2017-09-25 18:40:42 +00:00
} ,
{
2017-10-20 09:46:16 +00:00
desc : "acl_replication_token enables acl replication" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "acl_replication_token": "a" } ` } ,
hcl : [ ] string { ` acl_replication_token = "a" ` } ,
2017-09-25 18:40:42 +00:00
patch : func ( rt * RuntimeConfig ) {
rt . ACLReplicationToken = "a"
2018-10-19 16:04:07 +00:00
rt . ACLTokenReplication = true
2017-09-25 18:40:42 +00:00
rt . DataDir = dataDir
} ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address detect fails v4" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "0.0.0.0"} ` } ,
hcl : [ ] string { ` bind_addr = "0.0.0.0" ` } ,
2017-09-25 18:40:42 +00:00
privatev4 : func ( ) ( [ ] * net . IPAddr , error ) {
return nil , errors . New ( "some error" )
} ,
err : "Error detecting private IPv4 address: some error" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address detect none v4" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "0.0.0.0"} ` } ,
hcl : [ ] string { ` bind_addr = "0.0.0.0" ` } ,
2017-09-25 18:40:42 +00:00
privatev4 : func ( ) ( [ ] * net . IPAddr , error ) {
return nil , nil
} ,
err : "No private IPv4 address found" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address detect multiple v4" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "0.0.0.0"} ` } ,
hcl : [ ] string { ` bind_addr = "0.0.0.0" ` } ,
2017-09-25 18:40:42 +00:00
privatev4 : func ( ) ( [ ] * net . IPAddr , error ) {
return [ ] * net . IPAddr { ipAddr ( "1.1.1.1" ) , ipAddr ( "2.2.2.2" ) } , nil
} ,
err : "Multiple private IPv4 addresses found. Please configure one" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address detect fails v6" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "::"} ` } ,
hcl : [ ] string { ` bind_addr = "::" ` } ,
2017-09-25 18:40:42 +00:00
publicv6 : func ( ) ( [ ] * net . IPAddr , error ) {
return nil , errors . New ( "some error" )
} ,
err : "Error detecting public IPv6 address: some error" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address detect none v6" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "::"} ` } ,
hcl : [ ] string { ` bind_addr = "::" ` } ,
2017-09-25 18:40:42 +00:00
publicv6 : func ( ) ( [ ] * net . IPAddr , error ) {
return nil , nil
} ,
err : "No public IPv6 address found" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "advertise address detect multiple v6" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "::"} ` } ,
hcl : [ ] string { ` bind_addr = "::" ` } ,
2017-09-25 18:40:42 +00:00
publicv6 : func ( ) ( [ ] * net . IPAddr , error ) {
return [ ] * net . IPAddr { ipAddr ( "dead:beef::1" ) , ipAddr ( "dead:beef::2" ) } , nil
} ,
err : "Multiple public IPv6 addresses found. Please configure one" ,
} ,
{
desc : "ae_interval invalid == 0" ,
2017-10-20 09:46:16 +00:00
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
jsontail : [ ] string { ` { "ae_interval": "0s" } ` } ,
hcltail : [ ] string { ` ae_interval = "0s" ` } ,
err : ` ae_interval cannot be 0s. Must be positive ` ,
} ,
{
desc : "ae_interval invalid < 0" ,
2017-10-20 09:46:16 +00:00
args : [ ] string { ` -data-dir= ` + dataDir } ,
2017-09-25 18:40:42 +00:00
jsontail : [ ] string { ` { "ae_interval": "-1s" } ` } ,
hcltail : [ ] string { ` ae_interval = "-1s" ` } ,
err : ` ae_interval cannot be -1s. Must be positive ` ,
} ,
{
desc : "acl_datacenter invalid" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
2018-10-15 16:17:48 +00:00
json : [ ] string { ` { "acl_datacenter": "%" } ` } ,
hcl : [ ] string { ` acl_datacenter = "%" ` } ,
err : ` acl_datacenter cannot be "%". Please use only [a-z0-9-_] ` ,
warns : [ ] string { ` The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead. ` } ,
2017-09-25 18:40:42 +00:00
} ,
{
desc : "autopilot.max_trailing_logs invalid" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "autopilot": { "max_trailing_logs": -1 } } ` } ,
hcl : [ ] string { ` autopilot = { max_trailing_logs = -1 } ` } ,
err : "autopilot.max_trailing_logs cannot be -1. Must be greater than or equal to zero" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "bind_addr cannot be empty" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "" } ` } ,
hcl : [ ] string { ` bind_addr = "" ` } ,
err : "bind_addr cannot be empty" ,
2017-09-25 18:40:42 +00:00
} ,
{
2017-10-20 09:46:16 +00:00
desc : "bind_addr does not allow multiple addresses" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "1.1.1.1 2.2.2.2" } ` } ,
hcl : [ ] string { ` bind_addr = "1.1.1.1 2.2.2.2" ` } ,
err : "bind_addr cannot contain multiple addresses" ,
2017-09-25 18:40:42 +00:00
} ,
{
2017-10-20 09:46:16 +00:00
desc : "bind_addr cannot be a unix socket" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "bind_addr": "unix:///foo" } ` } ,
hcl : [ ] string { ` bind_addr = "unix:///foo" ` } ,
err : "bind_addr cannot be a unix socket" ,
2017-09-25 18:40:42 +00:00
} ,
{
desc : "bootstrap without server" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap": true } ` } ,
hcl : [ ] string { ` bootstrap = true ` } ,
err : "'bootstrap = true' requires 'server = true'" ,
} ,
{
desc : "bootstrap-expect without server" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap_expect": 3 } ` } ,
hcl : [ ] string { ` bootstrap_expect = 3 ` } ,
err : "'bootstrap_expect > 0' requires 'server = true'" ,
} ,
{
desc : "bootstrap-expect invalid" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap_expect": -1 } ` } ,
hcl : [ ] string { ` bootstrap_expect = -1 ` } ,
err : "bootstrap_expect cannot be -1. Must be greater than or equal to zero" ,
} ,
{
desc : "bootstrap-expect and dev mode" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -dev ` ,
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap_expect": 3, "server": true } ` } ,
hcl : [ ] string { ` bootstrap_expect = 3 server = true ` } ,
err : "'bootstrap_expect > 0' not allowed in dev mode" ,
} ,
{
2017-10-05 14:27:39 +00:00
desc : "bootstrap-expect and bootstrap" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap": true, "bootstrap_expect": 3, "server": true } ` } ,
hcl : [ ] string { ` bootstrap = true bootstrap_expect = 3 server = true ` } ,
err : "'bootstrap_expect > 0' and 'bootstrap = true' are mutually exclusive" ,
} ,
{
2017-10-05 14:27:39 +00:00
desc : "bootstrap-expect=1 equals bootstrap" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap_expect": 1, "server": true } ` } ,
hcl : [ ] string { ` bootstrap_expect = 1 server = true ` } ,
patch : func ( rt * RuntimeConfig ) {
rt . Bootstrap = true
rt . BootstrapExpect = 0
rt . LeaveOnTerm = false
rt . ServerMode = true
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
warns : [ ] string { "BootstrapExpect is set to 1; this is the same as Bootstrap mode." , "bootstrap = true: do not enable unless necessary" } ,
} ,
{
desc : "bootstrap-expect=2 warning" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap_expect": 2, "server": true } ` } ,
hcl : [ ] string { ` bootstrap_expect = 2 server = true ` } ,
patch : func ( rt * RuntimeConfig ) {
rt . BootstrapExpect = 2
rt . LeaveOnTerm = false
rt . ServerMode = true
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
warns : [ ] string {
` bootstrap_expect = 2: A cluster with 2 servers will provide no failure tolerance. See https://www.consul.io/docs/internals/consensus.html#deployment-table ` ,
` bootstrap_expect > 0: expecting 2 servers ` ,
} ,
} ,
{
desc : "bootstrap-expect > 2 but even warning" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "bootstrap_expect": 4, "server": true } ` } ,
hcl : [ ] string { ` bootstrap_expect = 4 server = true ` } ,
patch : func ( rt * RuntimeConfig ) {
rt . BootstrapExpect = 4
rt . LeaveOnTerm = false
rt . ServerMode = true
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
warns : [ ] string {
` bootstrap_expect is even number: A cluster with an even number of servers does not achieve optimum fault tolerance. See https://www.consul.io/docs/internals/consensus.html#deployment-table ` ,
` bootstrap_expect > 0: expecting 4 servers ` ,
} ,
} ,
{
desc : "client mode sets LeaveOnTerm and SkipLeaveOnInt correctly" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "server": false } ` } ,
hcl : [ ] string { ` server = false ` } ,
patch : func ( rt * RuntimeConfig ) {
rt . LeaveOnTerm = true
rt . ServerMode = false
rt . SkipLeaveOnInt = false
rt . DataDir = dataDir
} ,
} ,
{
desc : "client does not allow socket" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "client_addr": "unix:///foo" } ` } ,
hcl : [ ] string { ` client_addr = "unix:///foo" ` } ,
err : "client_addr cannot be a unix socket" ,
} ,
{
2017-10-20 09:46:16 +00:00
desc : "datacenter invalid" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` { "datacenter": "%" } ` } ,
hcl : [ ] string { ` datacenter = "%" ` } ,
err : ` datacenter cannot be "%". Please use only [a-z0-9-_] ` ,
2017-09-25 18:40:42 +00:00
} ,
{
desc : "dns does not allow socket" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "addresses": { "dns": "unix:///foo" } } ` } ,
hcl : [ ] string { ` addresses = { dns = "unix:///foo" } ` } ,
err : "DNS address cannot be a unix socket" ,
} ,
{
2017-09-26 06:58:54 +00:00
desc : "ui and ui_dir" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -datacenter=a ` ,
` -data-dir= ` + dataDir ,
} ,
2017-09-26 06:58:54 +00:00
json : [ ] string { ` { "ui": true, "ui_dir": "a" } ` } ,
hcl : [ ] string { ` ui = true ui_dir = "a" ` } ,
2017-09-25 18:40:42 +00:00
err : "Both the ui and ui-dir flags were specified, please provide only one.\n" +
"If trying to use your own web UI resources, use the ui-dir flag.\n" +
"If using Consul version 0.7.0 or later, the web UI is included in the binary so use ui to enable it" ,
} ,
// test ANY address failures
// to avoid combinatory explosion for tests use 0.0.0.0, :: or [::] but not all of them
{
desc : "advertise_addr any" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "advertise_addr": "0.0.0.0" } ` } ,
hcl : [ ] string { ` advertise_addr = "0.0.0.0" ` } ,
err : "Advertise address cannot be 0.0.0.0, :: or [::]" ,
} ,
{
desc : "advertise_addr_wan any" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "advertise_addr_wan": "::" } ` } ,
hcl : [ ] string { ` advertise_addr_wan = "::" ` } ,
err : "Advertise WAN address cannot be 0.0.0.0, :: or [::]" ,
} ,
2017-10-20 18:00:45 +00:00
{
desc : "recursors any" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-10-20 18:00:45 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "recursors": ["::"] } ` } ,
hcl : [ ] string { ` recursors = ["::"] ` } ,
err : "DNS recursor address cannot be 0.0.0.0, :: or [::]" ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "dns_config.udp_answer_limit invalid" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "dns_config": { "udp_answer_limit": -1 } } ` } ,
hcl : [ ] string { ` dns_config = { udp_answer_limit = -1 } ` } ,
err : "dns_config.udp_answer_limit cannot be -1. Must be greater than or equal to zero" ,
} ,
2018-03-06 01:07:42 +00:00
{
desc : "dns_config.a_record_limit invalid" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "dns_config": { "a_record_limit": -1 } } ` } ,
hcl : [ ] string { ` dns_config = { a_record_limit = -1 } ` } ,
err : "dns_config.a_record_limit cannot be -1. Must be greater than or equal to zero" ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "performance.raft_multiplier < 0" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "performance": { "raft_multiplier": -1 } } ` } ,
hcl : [ ] string { ` performance = { raft_multiplier = -1 } ` } ,
err : ` performance.raft_multiplier cannot be -1. Must be between 1 and 10 ` ,
} ,
{
desc : "performance.raft_multiplier == 0" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "performance": { "raft_multiplier": 0 } } ` } ,
hcl : [ ] string { ` performance = { raft_multiplier = 0 } ` } ,
err : ` performance.raft_multiplier cannot be 0. Must be between 1 and 10 ` ,
} ,
{
desc : "performance.raft_multiplier > 10" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "performance": { "raft_multiplier": 20 } } ` } ,
hcl : [ ] string { ` performance = { raft_multiplier = 20 } ` } ,
err : ` performance.raft_multiplier cannot be 20. Must be between 1 and 10 ` ,
} ,
{
desc : "node_name invalid" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
` -node= ` ,
} ,
hostname : func ( ) ( string , error ) { return "" , nil } ,
err : "node_name cannot be empty" ,
} ,
{
desc : "node_meta key too long" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "dns_config": { "udp_answer_limit": 1 } } ` ,
` { "node_meta": { " ` + randomString ( 130 ) + ` ": "a" } } ` ,
} ,
hcl : [ ] string {
` dns_config = { udp_answer_limit = 1 } ` ,
` node_meta = { " ` + randomString ( 130 ) + ` " = "a" } ` ,
} ,
err : "Key is too long (limit: 128 characters)" ,
} ,
{
desc : "node_meta value too long" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "dns_config": { "udp_answer_limit": 1 } } ` ,
` { "node_meta": { "a": " ` + randomString ( 520 ) + ` " } } ` ,
} ,
hcl : [ ] string {
` dns_config = { udp_answer_limit = 1 } ` ,
` node_meta = { "a" = " ` + randomString ( 520 ) + ` " } ` ,
} ,
err : "Value is too long (limit: 512 characters)" ,
} ,
{
desc : "node_meta too many keys" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "dns_config": { "udp_answer_limit": 1 } } ` ,
` { "node_meta": { ` + metaPairs ( 70 , "json" ) + ` } } ` ,
} ,
hcl : [ ] string {
` dns_config = { udp_answer_limit = 1 } ` ,
` node_meta = { ` + metaPairs ( 70 , "hcl" ) + ` } ` ,
} ,
err : "Node metadata cannot contain more than 64 key/value pairs" ,
} ,
{
desc : "unique listeners dns vs http" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"client_addr" : "1.2.3.4" ,
"ports" : { "dns" : 1000 , "http" : 1000 }
} ` } ,
hcl : [ ] string { `
client_addr = "1.2.3.4"
ports = { dns = 1000 http = 1000 }
` } ,
err : "HTTP address 1.2.3.4:1000 already configured for DNS" ,
} ,
{
desc : "unique listeners dns vs https" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"client_addr" : "1.2.3.4" ,
"ports" : { "dns" : 1000 , "https" : 1000 }
} ` } ,
hcl : [ ] string { `
client_addr = "1.2.3.4"
ports = { dns = 1000 https = 1000 }
` } ,
err : "HTTPS address 1.2.3.4:1000 already configured for DNS" ,
} ,
{
desc : "unique listeners http vs https" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"client_addr" : "1.2.3.4" ,
"ports" : { "http" : 1000 , "https" : 1000 }
} ` } ,
hcl : [ ] string { `
client_addr = "1.2.3.4"
ports = { http = 1000 https = 1000 }
` } ,
err : "HTTPS address 1.2.3.4:1000 already configured for HTTP" ,
} ,
{
desc : "unique advertise addresses HTTP vs RPC" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"addresses" : { "http" : "10.0.0.1" } ,
"ports" : { "http" : 1000 , "server" : 1000 }
} ` } ,
hcl : [ ] string { `
addresses = { http = "10.0.0.1" }
ports = { http = 1000 server = 1000 }
` } ,
err : "RPC Advertise address 10.0.0.1:1000 already configured for HTTP" ,
} ,
{
desc : "unique advertise addresses RPC vs Serf LAN" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"ports" : { "server" : 1000 , "serf_lan" : 1000 }
} ` } ,
hcl : [ ] string { `
ports = { server = 1000 serf_lan = 1000 }
` } ,
err : "Serf Advertise LAN address 10.0.0.1:1000 already configured for RPC Advertise" ,
} ,
{
desc : "unique advertise addresses RPC vs Serf WAN" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"ports" : { "server" : 1000 , "serf_wan" : 1000 }
} ` } ,
hcl : [ ] string { `
ports = { server = 1000 serf_wan = 1000 }
` } ,
err : "Serf Advertise WAN address 10.0.0.1:1000 already configured for RPC Advertise" ,
} ,
2018-09-27 13:33:12 +00:00
{
desc : "sidecar_service can't have ID" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"service" : {
"name" : "web" ,
"port" : 1234 ,
"connect" : {
"sidecar_service" : {
"ID" : "random-sidecar-id"
}
}
}
} ` } ,
hcl : [ ] string { `
service {
name = "web"
port = 1234
connect {
sidecar_service {
ID = "random-sidecar-id"
}
}
}
` } ,
2018-10-09 16:57:26 +00:00
err : "sidecar_service can't specify an ID" ,
2018-09-27 13:33:12 +00:00
} ,
{
desc : "sidecar_service can't have nested sidecar" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"service" : {
"name" : "web" ,
"port" : 1234 ,
"connect" : {
"sidecar_service" : {
"connect" : {
"sidecar_service" : { }
}
}
}
}
} ` } ,
hcl : [ ] string { `
service {
name = "web"
port = 1234
connect {
sidecar_service {
connect {
sidecar_service {
}
}
}
}
}
` } ,
err : "sidecar_service can't have a nested sidecar_service" ,
} ,
{
desc : "sidecar_service can't have managed proxy" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"service" : {
"name" : "web" ,
"port" : 1234 ,
"connect" : {
"sidecar_service" : {
"connect" : {
"proxy" : { }
}
}
}
}
} ` } ,
hcl : [ ] string { `
service {
name = "web"
port = 1234
connect {
sidecar_service {
connect {
proxy {
}
}
}
}
}
` } ,
err : "sidecar_service can't have a managed proxy" ,
} ,
2017-09-25 18:40:42 +00:00
{
desc : "telemetry.prefix_filter cannot be empty" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"telemetry" : { "prefix_filter" : [ "" ] }
} ` } ,
hcl : [ ] string { `
telemetry = { prefix_filter = [ "" ] }
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
} ,
warns : [ ] string { "Cannot have empty filter rule in prefix_filter" } ,
} ,
{
desc : "telemetry.prefix_filter must start with + or -" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"telemetry" : { "prefix_filter" : [ "+foo" , "-bar" , "nix" ] }
} ` } ,
hcl : [ ] string { `
telemetry = { prefix_filter = [ "+foo" , "-bar" , "nix" ] }
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
2018-06-14 12:52:48 +00:00
rt . Telemetry . AllowedPrefixes = [ ] string { "foo" }
rt . Telemetry . BlockedPrefixes = [ ] string { "bar" }
2017-09-25 18:40:42 +00:00
} ,
warns : [ ] string { ` Filter rule must begin with either '+' or '-': "nix" ` } ,
} ,
{
desc : "encrypt has invalid key" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "encrypt": "this is not a valid key" } ` } ,
hcl : [ ] string { ` encrypt = "this is not a valid key" ` } ,
err : "encrypt has invalid key: illegal base64 data at input byte 4" ,
} ,
{
desc : "encrypt given but LAN keyring exists" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "encrypt": "i0P+gFTkLPg0h53eNYjydg==" } ` } ,
hcl : [ ] string { ` encrypt = "i0P+gFTkLPg0h53eNYjydg==" ` } ,
patch : func ( rt * RuntimeConfig ) {
rt . EncryptKey = "i0P+gFTkLPg0h53eNYjydg=="
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , SerfLANKeyring ) , [ ] byte ( "i0P+gFTkLPg0h53eNYjydg==" ) )
} ,
warns : [ ] string { ` WARNING: LAN keyring exists but -encrypt given, using keyring ` } ,
} ,
{
desc : "encrypt given but WAN keyring exists" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-25 18:40:42 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` { "encrypt": "i0P+gFTkLPg0h53eNYjydg==", "server": true } ` } ,
hcl : [ ] string { ` encrypt = "i0P+gFTkLPg0h53eNYjydg==" server = true ` } ,
patch : func ( rt * RuntimeConfig ) {
rt . EncryptKey = "i0P+gFTkLPg0h53eNYjydg=="
rt . ServerMode = true
rt . LeaveOnTerm = false
rt . SkipLeaveOnInt = true
rt . DataDir = dataDir
} ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , SerfWANKeyring ) , [ ] byte ( "i0P+gFTkLPg0h53eNYjydg==" ) )
} ,
warns : [ ] string { ` WARNING: WAN keyring exists but -encrypt given, using keyring ` } ,
} ,
2017-09-26 08:14:14 +00:00
{
desc : "multiple check files" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-26 08:14:14 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
2018-05-08 22:31:53 +00:00
` { "check": { "name": "a", "args": ["/bin/true"] } } ` ,
` { "check": { "name": "b", "args": ["/bin/false"] } } ` ,
2017-09-26 08:14:14 +00:00
} ,
hcl : [ ] string {
2018-05-08 22:31:53 +00:00
` check = { name = "a" args = ["/bin/true"] } ` ,
` check = { name = "b" args = ["/bin/false"] } ` ,
2017-09-26 08:14:14 +00:00
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Checks = [ ] * structs . CheckDefinition {
2018-05-08 22:31:53 +00:00
& structs . CheckDefinition { Name : "a" , ScriptArgs : [ ] string { "/bin/true" } } ,
& structs . CheckDefinition { Name : "b" , ScriptArgs : [ ] string { "/bin/false" } } ,
2017-09-26 08:14:14 +00:00
}
rt . DataDir = dataDir
} ,
} ,
2017-12-27 04:35:22 +00:00
{
desc : "grpc check" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
2018-02-03 01:29:34 +00:00
` { "check": { "name": "a", "grpc": "localhost:12345/foo", "grpc_use_tls": true } } ` ,
2017-12-27 04:35:22 +00:00
} ,
hcl : [ ] string {
2018-02-03 01:29:34 +00:00
` check = { name = "a" grpc = "localhost:12345/foo", grpc_use_tls = true } ` ,
2017-12-27 04:35:22 +00:00
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Checks = [ ] * structs . CheckDefinition {
2018-02-03 01:29:34 +00:00
& structs . CheckDefinition { Name : "a" , GRPC : "localhost:12345/foo" , GRPCUseTLS : true } ,
2017-12-27 04:35:22 +00:00
}
rt . DataDir = dataDir
} ,
} ,
2018-06-30 06:09:58 +00:00
{
desc : "alias check with no node" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "check": { "name": "a", "alias_service": "foo" } } ` ,
} ,
hcl : [ ] string {
` check = { name = "a", alias_service = "foo" } ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Checks = [ ] * structs . CheckDefinition {
& structs . CheckDefinition { Name : "a" , AliasService : "foo" } ,
}
rt . DataDir = dataDir
} ,
} ,
2017-09-26 08:14:14 +00:00
{
desc : "multiple service files" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-09-26 08:14:14 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "service": { "name": "a", "port": 80 } } ` ,
2018-09-07 14:30:47 +00:00
` { "service": { "name": "b", "port": 90, "meta": { "my": "value"}, "weights": { "passing": 13} } } ` ,
2017-09-26 08:14:14 +00:00
} ,
hcl : [ ] string {
` service = { name = "a" port = 80 } ` ,
2018-09-07 14:30:47 +00:00
` service = { name = "b" port = 90 meta= { my="value"}, weights= { passing=13}} ` ,
2017-09-26 08:14:14 +00:00
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Services = [ ] * structs . ServiceDefinition {
2018-09-07 14:30:47 +00:00
& structs . ServiceDefinition { Name : "a" , Port : 80 , Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} } ,
& structs . ServiceDefinition { Name : "b" , Port : 90 , Meta : map [ string ] string { "my" : "value" } , Weights : & structs . Weights {
Passing : 13 ,
Warning : 1 ,
} } ,
2017-09-26 08:14:14 +00:00
}
rt . DataDir = dataDir
} ,
} ,
2018-04-18 20:57:33 +00:00
{
2018-04-18 21:07:25 +00:00
desc : "service with wrong meta: too long key" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "service": { "name": "a", "port": 80, "meta": { " ` + randomString ( 520 ) + ` ": "metaValue" } } } ` ,
} ,
hcl : [ ] string {
` service = { name = "a" port = 80, meta= { ` + randomString ( 520 ) + ` ="metaValue"} } ` ,
} ,
err : ` Key is too long ` ,
} ,
{
desc : "service with wrong meta: too long value" ,
2018-04-18 20:57:33 +00:00
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "service": { "name": "a", "port": 80, "meta": { "a": " ` + randomString ( 520 ) + ` " } } } ` ,
} ,
hcl : [ ] string {
` service = { name = "a" port = 80, meta= { a=" ` + randomString ( 520 ) + ` "} } ` ,
} ,
err : ` Value is too long ` ,
} ,
{
desc : "service with wrong meta: too many meta" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "service": { "name": "a", "port": 80, "meta": { ` + metaPairs ( 70 , "json" ) + ` } } } ` ,
} ,
hcl : [ ] string {
` service = { name = "a" port = 80 meta= { ` + metaPairs ( 70 , "hcl" ) + ` } } ` ,
} ,
err : ` invalid meta for service a: Node metadata cannot contain more than 64 key ` ,
} ,
2017-10-10 23:40:59 +00:00
{
desc : "translated keys" ,
2017-10-20 09:46:16 +00:00
args : [ ] string {
2017-10-10 23:40:59 +00:00
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` {
"service" : {
"name" : "a" ,
"port" : 80 ,
2018-05-07 23:19:13 +00:00
"enable_tag_override" : true ,
2017-10-10 23:40:59 +00:00
"check" : {
2018-05-07 22:51:05 +00:00
"id" : "x" ,
2017-10-10 23:40:59 +00:00
"name" : "y" ,
"DockerContainerID" : "z" ,
"DeregisterCriticalServiceAfter" : "10s" ,
"ScriptArgs" : [ "a" , "b" ]
}
}
} ` ,
} ,
hcl : [ ] string {
` service = {
name = "a"
port = 80
2018-05-07 23:19:13 +00:00
enable_tag_override = true
2017-10-10 23:40:59 +00:00
check = {
2018-05-07 22:51:05 +00:00
id = "x"
2017-10-10 23:40:59 +00:00
name = "y"
DockerContainerID = "z"
DeregisterCriticalServiceAfter = "10s"
ScriptArgs = [ "a" , "b" ]
}
} ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . Services = [ ] * structs . ServiceDefinition {
& structs . ServiceDefinition {
Name : "a" ,
Port : 80 ,
EnableTagOverride : true ,
Checks : [ ] * structs . CheckType {
& structs . CheckType {
CheckID : types . CheckID ( "x" ) ,
Name : "y" ,
DockerContainerID : "z" ,
DeregisterCriticalServiceAfter : 10 * time . Second ,
ScriptArgs : [ ] string { "a" , "b" } ,
} ,
} ,
2018-09-07 14:30:47 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2017-10-10 23:40:59 +00:00
} ,
}
rt . DataDir = dataDir
} ,
} ,
2017-11-10 21:50:45 +00:00
{
desc : "ignore snapshot_agent sub-object" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "snapshot_agent": { "dont": "care" } } ` ,
} ,
hcl : [ ] string {
` snapshot_agent = { dont = "care" } ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
} ,
} ,
2018-06-12 12:25:08 +00:00
2018-05-05 18:10:24 +00:00
{
2018-09-12 16:07:47 +00:00
desc : "Service managed proxy 'upstreams'" ,
2018-05-05 18:10:24 +00:00
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
2018-09-12 16:07:47 +00:00
json : [ ] string {
` {
"service" : {
"name" : "web" ,
"port" : 8080 ,
"connect" : {
"proxy" : {
"upstreams" : [ {
"destination_name" : "db" ,
"local_bind_port" : 1234
} ]
}
}
}
} ` ,
} ,
2018-05-05 18:10:24 +00:00
hcl : [ ] string {
` service {
name = "web"
port = 8080
connect {
proxy {
2018-09-12 16:07:47 +00:00
upstreams {
destination_name = "db"
local_bind_port = 1234
2018-05-05 18:10:24 +00:00
}
}
}
} ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . Services = [ ] * structs . ServiceDefinition {
& structs . ServiceDefinition {
Name : "web" ,
Port : 8080 ,
2018-06-05 17:51:05 +00:00
Connect : & structs . ServiceConnect {
2018-05-05 18:10:24 +00:00
Proxy : & structs . ServiceDefinitionConnectProxy {
2018-09-12 16:07:47 +00:00
Upstreams : structs . Upstreams {
{
DestinationName : "db" ,
DestinationType : structs . UpstreamDestTypeService ,
LocalBindPort : 1234 ,
2018-05-05 18:10:24 +00:00
} ,
} ,
} ,
} ,
2018-09-07 14:30:47 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-05-05 18:10:24 +00:00
} ,
}
} ,
} ,
2018-09-12 16:07:47 +00:00
2018-05-05 18:10:24 +00:00
{
2018-09-12 16:07:47 +00:00
desc : "Multiple service managed proxy 'upstreams'" ,
2018-05-05 18:10:24 +00:00
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` {
"service" : {
"name" : "web" ,
"port" : 8080 ,
"connect" : {
"proxy" : {
2018-09-12 16:07:47 +00:00
"upstreams" : [ {
"destination_name" : "db" ,
"local_bind_port" : 1234
} , {
"destination_name" : "cache" ,
"local_bind_port" : 2345
} ]
2018-05-05 18:10:24 +00:00
}
}
}
} ` ,
} ,
2018-09-12 16:07:47 +00:00
hcl : [ ] string {
` service {
name = "web"
port = 8080
connect {
proxy {
upstreams = [
{
destination_name = "db"
local_bind_port = 1234
2018-05-05 18:10:24 +00:00
} ,
2018-09-12 16:07:47 +00:00
{
destination_name = "cache"
local_bind_port = 2345
2018-06-28 20:13:33 +00:00
}
2018-09-12 16:07:47 +00:00
]
}
}
} ` ,
2018-06-28 20:13:33 +00:00
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . Services = [ ] * structs . ServiceDefinition {
& structs . ServiceDefinition {
Name : "web" ,
Port : 8080 ,
Connect : & structs . ServiceConnect {
Proxy : & structs . ServiceDefinitionConnectProxy {
2018-09-12 16:07:47 +00:00
Upstreams : structs . Upstreams {
{
DestinationName : "db" ,
DestinationType : structs . UpstreamDestTypeService ,
LocalBindPort : 1234 ,
} ,
{
DestinationName : "cache" ,
DestinationType : structs . UpstreamDestTypeService ,
LocalBindPort : 2345 ,
2018-06-28 20:13:33 +00:00
} ,
} ,
} ,
} ,
2018-09-07 14:30:47 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-06-28 20:13:33 +00:00
} ,
}
} ,
} ,
2018-06-12 12:25:08 +00:00
{
desc : "enabling Connect allow_managed_root" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "connect": { "proxy": { "allow_managed_root": true } } } ` ,
} ,
hcl : [ ] string {
` connect { proxy { allow_managed_root = true } } ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . ConnectProxyAllowManagedRoot = true
} ,
} ,
2018-06-12 13:54:17 +00:00
{
desc : "enabling Connect allow_managed_api_registration" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string {
` { "connect": { "proxy": { "allow_managed_api_registration": true } } } ` ,
} ,
hcl : [ ] string {
` connect { proxy { allow_managed_api_registration = true } } ` ,
} ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . ConnectProxyAllowManagedAPIRegistration = true
} ,
} ,
2018-09-27 13:33:12 +00:00
{
// This tests that we correct added the nested paths to arrays of objects
// to the exceptions in patchSliceOfMaps in config.go (for single service)
desc : "service.connectsidecar_service with checks and upstreams" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"service" : {
"name" : "web" ,
"port" : 1234 ,
"connect" : {
"sidecar_service" : {
"port" : 2345 ,
"checks" : [
{
"TCP" : "127.0.0.1:2345" ,
"Interval" : "10s"
}
] ,
"proxy" : {
"upstreams" : [
{
"destination_name" : "db" ,
"local_bind_port" : 7000
}
]
}
}
}
}
} ` } ,
hcl : [ ] string { `
service {
name = "web"
port = 1234
connect {
sidecar_service {
port = 2345
checks = [
{
tcp = "127.0.0.1:2345"
interval = "10s"
}
]
proxy {
upstreams = [
{
destination_name = "db"
local_bind_port = 7000
} ,
]
}
}
}
}
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . Services = [ ] * structs . ServiceDefinition {
{
Name : "web" ,
Port : 1234 ,
Connect : & structs . ServiceConnect {
SidecarService : & structs . ServiceDefinition {
Port : 2345 ,
Checks : structs . CheckTypes {
{
TCP : "127.0.0.1:2345" ,
Interval : 10 * time . Second ,
} ,
} ,
Proxy : & structs . ConnectProxyConfig {
Upstreams : structs . Upstreams {
structs . Upstream {
DestinationType : "service" ,
DestinationName : "db" ,
LocalBindPort : 7000 ,
} ,
} ,
} ,
2018-10-04 13:08:12 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-09-27 13:33:12 +00:00
} ,
} ,
2018-10-04 13:08:12 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-09-27 13:33:12 +00:00
} ,
}
} ,
} ,
{
// This tests that we correct added the nested paths to arrays of objects
// to the exceptions in patchSliceOfMaps in config.go (for service*s*)
desc : "services.connect.sidecar_service with checks and upstreams" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"services" : [ {
"name" : "web" ,
"port" : 1234 ,
"connect" : {
"sidecar_service" : {
"port" : 2345 ,
"checks" : [
{
"TCP" : "127.0.0.1:2345" ,
"Interval" : "10s"
}
] ,
"proxy" : {
"upstreams" : [
{
"destination_name" : "db" ,
"local_bind_port" : 7000
}
]
}
}
}
} ]
} ` } ,
hcl : [ ] string { `
services = [ {
name = "web"
port = 1234
connect {
sidecar_service {
port = 2345
checks = [
{
tcp = "127.0.0.1:2345"
interval = "10s"
}
]
proxy {
upstreams = [
{
destination_name = "db"
local_bind_port = 7000
} ,
]
}
}
}
} ]
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . Services = [ ] * structs . ServiceDefinition {
{
Name : "web" ,
Port : 1234 ,
Connect : & structs . ServiceConnect {
SidecarService : & structs . ServiceDefinition {
Port : 2345 ,
Checks : structs . CheckTypes {
{
TCP : "127.0.0.1:2345" ,
Interval : 10 * time . Second ,
} ,
} ,
Proxy : & structs . ConnectProxyConfig {
Upstreams : structs . Upstreams {
structs . Upstream {
DestinationType : "service" ,
DestinationName : "db" ,
LocalBindPort : 7000 ,
} ,
} ,
} ,
2018-10-04 13:08:12 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-09-27 13:33:12 +00:00
} ,
} ,
2018-10-04 13:08:12 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-09-27 13:33:12 +00:00
} ,
}
} ,
} ,
2018-12-06 21:51:49 +00:00
{
// This tests checks that VerifyServerHostname implies VerifyOutgoing
desc : "verify_server_hostname implies verify_outgoing" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"verify_server_hostname" : true
} ` } ,
hcl : [ ] string { `
verify_server_hostname = true
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . VerifyServerHostname = true
rt . VerifyOutgoing = true
} ,
} ,
2019-01-08 16:09:22 +00:00
{
desc : "test connect vault provider configuration" ,
args : [ ] string {
` -data-dir= ` + dataDir ,
} ,
json : [ ] string { ` {
"connect" : {
"enabled" : true ,
"ca_provider" : "vault" ,
"ca_config" : {
"ca_file" : "/capath/ca.pem" ,
"ca_path" : "/capath/" ,
"cert_file" : "/certpath/cert.pem" ,
"key_file" : "/certpath/key.pem" ,
"tls_server_name" : "server.name" ,
"tls_skip_verify" : true ,
"token" : "abc" ,
"root_pki_path" : "consul-vault" ,
"intermediate_pki_path" : "connect-intermediate"
}
}
} ` } ,
hcl : [ ] string { `
connect {
enabled = true
ca_provider = "vault"
ca_config {
ca_file = "/capath/ca.pem"
ca_path = "/capath/"
cert_file = "/certpath/cert.pem"
key_file = "/certpath/key.pem"
tls_server_name = "server.name"
tls_skip_verify = true
token = "abc"
root_pki_path = "consul-vault"
intermediate_pki_path = "connect-intermediate"
}
}
` } ,
patch : func ( rt * RuntimeConfig ) {
rt . DataDir = dataDir
rt . ConnectEnabled = true
rt . ConnectCAProvider = "vault"
rt . ConnectCAConfig = map [ string ] interface { } {
"CAFile" : "/capath/ca.pem" ,
"CAPath" : "/capath/" ,
"CertFile" : "/certpath/cert.pem" ,
"KeyFile" : "/certpath/key.pem" ,
"TLSServerName" : "server.name" ,
"TLSSkipVerify" : true ,
"Token" : "abc" ,
"RootPKIPath" : "consul-vault" ,
"IntermediatePKIPath" : "connect-intermediate" ,
}
} ,
} ,
2019-04-30 14:13:59 +00:00
// ------------------------------------------------------------
// ConfigEntry Handling
//
{
desc : "ConfigEntry bootstrap doesn't parse" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` {
"config_entries" : {
"bootstrap" : [
{
"foo" : "bar"
}
]
}
} ` } ,
hcl : [ ] string { `
config_entries {
bootstrap {
foo = "bar"
}
} ` } ,
2019-04-30 22:19:19 +00:00
err : "config_entries.bootstrap[0]: Payload does not contain a Kind" ,
2019-04-30 14:13:59 +00:00
} ,
{
desc : "ConfigEntry bootstrap unknown kind" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` {
"config_entries" : {
"bootstrap" : [
{
"kind" : "foo" ,
"name" : "bar" ,
"baz" : 1
}
]
}
} ` } ,
hcl : [ ] string { `
config_entries {
bootstrap {
kind = "foo"
name = "bar"
baz = 1
}
} ` } ,
err : "config_entries.bootstrap[0]: invalid config entry kind: foo" ,
} ,
{
desc : "ConfigEntry bootstrap invalid" ,
args : [ ] string { ` -data-dir= ` + dataDir } ,
json : [ ] string { ` {
"config_entries" : {
"bootstrap" : [
{
"kind" : "proxy-defaults" ,
"name" : "invalid-name" ,
"config" : {
"foo" : "bar"
}
}
]
}
} ` } ,
hcl : [ ] string { `
config_entries {
bootstrap {
kind = "proxy-defaults"
name = "invalid-name"
config {
foo = "bar"
}
}
} ` } ,
err : "config_entries.bootstrap[0]: invalid name (\"invalid-name\"), only \"global\" is supported" ,
} ,
2017-09-25 18:40:42 +00:00
}
testConfig ( t , tests , dataDir )
}
func testConfig ( t * testing . T , tests [ ] configTest , dataDir string ) {
for _ , tt := range tests {
for pass , format := range [ ] string { "json" , "hcl" } {
2017-10-31 22:30:01 +00:00
// clean data dir before every test
cleanDir ( dataDir )
2017-09-25 18:40:42 +00:00
// when we test only flags then there are no JSON or HCL
// sources and we need to make only one pass over the
// tests.
flagsOnly := len ( tt . json ) == 0 && len ( tt . hcl ) == 0
if flagsOnly && pass > 0 {
continue
}
// json and hcl sources need to be in sync
// to make sure we're generating the same config
2018-05-05 18:10:24 +00:00
if len ( tt . json ) != len ( tt . hcl ) && ! tt . skipformat {
2017-09-25 18:40:42 +00:00
t . Fatal ( tt . desc , ": JSON and HCL test case out of sync" )
}
// select the source
srcs , tails := tt . json , tt . jsontail
if format == "hcl" {
srcs , tails = tt . hcl , tt . hcltail
}
2018-05-05 18:10:24 +00:00
// If we're skipping a format and the current format is empty,
// then skip it!
if tt . skipformat && len ( srcs ) == 0 {
continue
}
2017-09-25 18:40:42 +00:00
// build the description
var desc [ ] string
if ! flagsOnly {
desc = append ( desc , format )
}
if tt . desc != "" {
desc = append ( desc , tt . desc )
}
t . Run ( strings . Join ( desc , ":" ) , func ( t * testing . T ) {
// first parse the flags
2017-10-20 10:02:05 +00:00
flags := Flags { }
fs := flag . NewFlagSet ( "" , flag . ContinueOnError )
AddFlags ( fs , & flags )
err := fs . Parse ( tt . args )
2017-09-25 18:40:42 +00:00
if err != nil {
t . Fatalf ( "ParseFlags failed: %s" , err )
}
2017-10-20 10:02:05 +00:00
flags . Args = fs . Args ( )
2017-09-25 18:40:42 +00:00
2017-10-31 22:30:01 +00:00
if tt . pre != nil {
tt . pre ( )
}
defer func ( ) {
if tt . post != nil {
tt . post ( )
}
} ( )
2017-09-25 18:40:42 +00:00
// Then create a builder with the flags.
b , err := NewBuilder ( flags )
if err != nil {
t . Fatal ( "NewBuilder" , err )
}
// mock the hostname function unless a mock is provided
b . Hostname = tt . hostname
if b . Hostname == nil {
b . Hostname = func ( ) ( string , error ) { return "nodex" , nil }
}
// mock the ip address detection
privatev4 := tt . privatev4
if privatev4 == nil {
privatev4 = func ( ) ( [ ] * net . IPAddr , error ) {
return [ ] * net . IPAddr { ipAddr ( "10.0.0.1" ) } , nil
}
}
2017-09-27 19:59:47 +00:00
publicv6 := tt . publicv6
if publicv6 == nil {
publicv6 = func ( ) ( [ ] * net . IPAddr , error ) {
return [ ] * net . IPAddr { ipAddr ( "dead:beef::1" ) } , nil
}
}
2017-09-25 18:40:42 +00:00
b . GetPrivateIPv4 = privatev4
2017-09-27 19:59:47 +00:00
b . GetPublicIPv6 = publicv6
2017-09-25 18:40:42 +00:00
// read the source fragements
for i , data := range srcs {
b . Sources = append ( b . Sources , Source {
2017-10-31 22:30:01 +00:00
Name : fmt . Sprintf ( "src-%d.%s" , i , format ) ,
2017-09-25 18:40:42 +00:00
Format : format ,
Data : data ,
} )
}
for i , data := range tails {
b . Tail = append ( b . Tail , Source {
2017-10-31 22:30:01 +00:00
Name : fmt . Sprintf ( "tail-%d.%s" , i , format ) ,
2017-09-25 18:40:42 +00:00
Format : format ,
Data : data ,
} )
}
// build/merge the config fragments
rt , err := b . BuildAndValidate ( )
if err == nil && tt . err != "" {
t . Fatalf ( "got no error want %q" , tt . err )
}
if err != nil && tt . err == "" {
t . Fatalf ( "got error %s want nil" , err )
}
if err == nil && tt . err != "" {
t . Fatalf ( "got nil want error to contain %q" , tt . err )
}
if err != nil && tt . err != "" && ! strings . Contains ( err . Error ( ) , tt . err ) {
t . Fatalf ( "error %q does not contain %q" , err . Error ( ) , tt . err )
}
// check the warnings
if ! verify . Values ( t , "warnings" , b . Warnings , tt . warns ) {
t . FailNow ( )
}
// stop if we expected an error
if tt . err != "" {
return
}
// build a default configuration, then patch the fields we expect to change
// and compare it with the generated configuration. Since the expected
// runtime config has been validated we do not need to validate it again.
x , err := NewBuilder ( Flags { } )
if err != nil {
t . Fatal ( err )
}
x . Hostname = b . Hostname
2017-09-27 19:59:47 +00:00
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 }
2017-09-25 18:40:42 +00:00
patchedRT , err := x . Build ( )
if err != nil {
t . Fatalf ( "build default failed: %s" , err )
}
if tt . patch != nil {
tt . patch ( & patchedRT )
}
// if err := x.Validate(wantRT); err != nil {
// t.Fatalf("validate default failed: %s", err)
// }
if got , want := rt , patchedRT ; ! verify . Values ( t , "" , got , want ) {
t . FailNow ( )
}
} )
}
}
}
// TestFullConfig tests the conversion from a fully populated JSON or
// HCL config file to a RuntimeConfig structure. All fields must be set
// to a unique non-zero value.
//
// To aid populating the fields the following bash functions can be used
// to generate random strings and ints:
//
// random-int() { echo $RANDOM }
// random-string() { base64 /dev/urandom | tr -d '/+' | fold -w ${1:-32} | head -n 1 }
//
// To generate a random string of length 8 run the following command in
// a terminal:
//
// random-string 8
//
func TestFullConfig ( t * testing . T ) {
dataDir := testutil . TempDir ( t , "consul" )
defer os . RemoveAll ( dataDir )
2019-01-10 14:27:26 +00:00
cidr := func ( s string ) * net . IPNet {
_ , n , _ := net . ParseCIDR ( s )
return n
}
2017-09-25 18:40:42 +00:00
flagSrc := [ ] string { ` -dev ` }
src := map [ string ] string {
"json" : ` {
"acl_agent_master_token" : "furuQD0b" ,
"acl_agent_token" : "cOshLOQ2" ,
"acl_datacenter" : "m3urck3z" ,
"acl_default_policy" : "ArK3WIfE" ,
"acl_down_policy" : "vZXMfMP0" ,
"acl_enforce_version_8" : true ,
2018-10-19 16:04:07 +00:00
"acl_enable_key_list_policy" : true ,
2017-09-25 18:40:42 +00:00
"acl_master_token" : "C1Q1oIwh" ,
"acl_replication_token" : "LMmgy5dO" ,
"acl_token" : "O1El0wan" ,
"acl_ttl" : "18060s" ,
2018-10-19 16:04:07 +00:00
"acl" : {
"enabled" : true ,
"down_policy" : "03eb2aee" ,
"default_policy" : "72c2e7a0" ,
"enable_key_list_policy" : false ,
2019-02-27 19:28:31 +00:00
"enable_token_persistence" : true ,
2018-10-19 16:04:07 +00:00
"policy_ttl" : "1123s" ,
2019-04-15 20:43:19 +00:00
"role_ttl" : "9876s" ,
2018-10-19 16:04:07 +00:00
"token_ttl" : "3321s" ,
"enable_token_replication" : true ,
"tokens" : {
"master" : "8a19ac27" ,
"agent_master" : "64fd0e08" ,
"replication" : "5795983a" ,
"agent" : "bed2377c" ,
"default" : "418fdff1"
}
} ,
2017-09-25 18:40:42 +00:00
"addresses" : {
"dns" : "93.95.95.81" ,
"http" : "83.39.91.39" ,
2018-10-03 13:05:28 +00:00
"https" : "95.17.17.19" ,
"grpc" : "32.31.61.91"
2017-09-25 18:40:42 +00:00
} ,
"advertise_addr" : "17.99.29.16" ,
"advertise_addr_wan" : "78.63.37.19" ,
"autopilot" : {
"cleanup_dead_servers" : true ,
"disable_upgrade_migration" : true ,
"last_contact_threshold" : "12705s" ,
"max_trailing_logs" : 17849 ,
"redundancy_zone_tag" : "3IsufDJf" ,
"server_stabilization_time" : "23057s" ,
"upgrade_version_tag" : "W9pDwFAL"
} ,
"bind_addr" : "16.99.34.17" ,
"bootstrap" : true ,
"bootstrap_expect" : 53 ,
"ca_file" : "erA7T0PM" ,
"ca_path" : "mQEN1Mfp" ,
"cert_file" : "7s4QAzDk" ,
"check" : {
"id" : "fZaCAXww" ,
"name" : "OOM2eo0f" ,
"notes" : "zXzXI9Gt" ,
"service_id" : "L8G0QNmR" ,
"token" : "oo4BCTgJ" ,
"status" : "qLykAl5u" ,
2017-10-04 23:48:00 +00:00
"args" : [ "f3BemRjy" , "e5zgpef7" ] ,
2017-09-25 18:40:42 +00:00
"http" : "29B93haH" ,
"header" : {
"hBq0zn1q" : [ "2a9o9ZKP" , "vKwA5lR6" ] ,
"f3r6xFtM" : [ "RyuIdDWv" , "QbxEcIUM" ]
} ,
"method" : "Dou0nGT5" ,
"tcp" : "JY6fTTcw" ,
"interval" : "18714s" ,
"docker_container_id" : "qF66POS9" ,
"shell" : "sOnDy228" ,
"tls_skip_verify" : true ,
"timeout" : "5954s" ,
"ttl" : "30044s" ,
"deregister_critical_service_after" : "13209s"
} ,
"checks" : [
{
"id" : "uAjE6m9Z" ,
"name" : "QsZRGpYr" ,
"notes" : "VJ7Sk4BY" ,
"service_id" : "lSulPcyz" ,
"token" : "toO59sh8" ,
"status" : "9RlWsXMV" ,
2017-10-04 23:48:00 +00:00
"args" : [ "4BAJttck" , "4D2NPtTQ" ] ,
2017-09-25 18:40:42 +00:00
"http" : "dohLcyQ2" ,
"header" : {
"ZBfTin3L" : [ "1sDbEqYG" , "lJGASsWK" ] ,
"Ui0nU99X" : [ "LMccm3Qe" , "k5H5RggQ" ]
} ,
"method" : "aldrIQ4l" ,
"tcp" : "RJQND605" ,
"interval" : "22164s" ,
"docker_container_id" : "ipgdFtjd" ,
"shell" : "qAeOYy0M" ,
"tls_skip_verify" : true ,
"timeout" : "1813s" ,
"ttl" : "21743s" ,
"deregister_critical_service_after" : "14232s"
} ,
{
"id" : "Cqq95BhP" ,
"name" : "3qXpkS0i" ,
"notes" : "sb5qLTex" ,
"service_id" : "CmUUcRna" ,
"token" : "a3nQzHuy" ,
"status" : "irj26nf3" ,
2017-10-04 23:48:00 +00:00
"args" : [ "9s526ogY" , "gSlOHj1w" ] ,
2017-09-25 18:40:42 +00:00
"http" : "yzhgsQ7Y" ,
"header" : {
"zcqwA8dO" : [ "qb1zx0DL" , "sXCxPFsD" ] ,
"qxvdnSE9" : [ "6wBPUYdF" , "YYh8wtSZ" ]
} ,
"method" : "gLrztrNw" ,
"tcp" : "4jG5casb" ,
"interval" : "28767s" ,
"docker_container_id" : "THW6u7rL" ,
"shell" : "C1Zt3Zwh" ,
"tls_skip_verify" : true ,
"timeout" : "18506s" ,
"ttl" : "31006s" ,
"deregister_critical_service_after" : "2366s"
}
] ,
"check_update_interval" : "16507s" ,
"client_addr" : "93.83.18.19" ,
2019-04-26 18:25:03 +00:00
"config_entries" : {
2019-04-30 14:13:59 +00:00
"bootstrap" : [
{
"kind" : "proxy-defaults" ,
"name" : "global" ,
"config" : {
2019-04-26 18:25:03 +00:00
"foo" : "bar" ,
"bar" : 1.0
}
}
2019-04-30 14:13:59 +00:00
]
2019-04-26 18:25:03 +00:00
} ,
2018-04-16 15:00:20 +00:00
"connect" : {
2018-06-16 00:59:08 +00:00
"ca_provider" : "consul" ,
2018-04-25 18:34:08 +00:00
"ca_config" : {
2019-01-22 17:19:36 +00:00
"rotation_period" : "90h" ,
"leaf_cert_ttl" : "1h" ,
"csr_max_per_second" : 100 ,
"csr_max_concurrent" : 2
2018-04-25 18:34:08 +00:00
} ,
2018-04-16 15:00:20 +00:00
"enabled" : true ,
"proxy_defaults" : {
"exec_mode" : "script" ,
2018-04-27 05:16:21 +00:00
"daemon_command" : [ "consul" , "connect" , "proxy" ] ,
"script_command" : [ "proxyctl.sh" ] ,
2018-04-16 15:00:20 +00:00
"config" : {
"foo" : "bar" ,
"connect_timeout_ms" : 1000 ,
"pedantic_mode" : true
}
}
} ,
2018-07-26 15:39:49 +00:00
"gossip_lan" : {
"gossip_nodes" : 6 ,
"gossip_interval" : "25252s" ,
"retransmit_mult" : 1234 ,
"suspicion_mult" : 1235 ,
"probe_interval" : "101ms" ,
"probe_timeout" : "102ms"
} ,
"gossip_wan" : {
"gossip_nodes" : 2 ,
"gossip_interval" : "6966s" ,
"retransmit_mult" : 16384 ,
"suspicion_mult" : 16385 ,
"probe_interval" : "103ms" ,
"probe_timeout" : "104ms"
} ,
2017-09-25 18:40:42 +00:00
"data_dir" : "` + dataDir + `" ,
"datacenter" : "rzo029wg" ,
"disable_anonymous_signature" : true ,
"disable_coordinates" : true ,
"disable_host_node_id" : true ,
2018-07-26 12:53:39 +00:00
"disable_http_unprintable_char_filter" : true ,
2017-09-25 18:40:42 +00:00
"disable_keyring_file" : true ,
"disable_remote_exec" : true ,
"disable_update_check" : true ,
2017-10-11 00:04:52 +00:00
"discard_check_output" : true ,
2018-03-30 15:14:44 +00:00
"discovery_max_stale" : "5s" ,
2017-09-25 18:40:42 +00:00
"domain" : "7W1xXSqd" ,
"dns_config" : {
"allow_stale" : true ,
2018-03-06 01:07:42 +00:00
"a_record_limit" : 29907 ,
2017-09-25 18:40:42 +00:00
"disable_compression" : true ,
"enable_truncate" : true ,
"max_stale" : "29685s" ,
"node_ttl" : "7084s" ,
"only_passing" : true ,
"recursor_timeout" : "4427s" ,
"service_ttl" : {
"*" : "32030s"
} ,
2019-02-25 19:06:01 +00:00
"udp_answer_limit" : 29909 ,
"use_cache" : true ,
"cache_max_age" : "5m"
2017-09-25 18:40:42 +00:00
} ,
"enable_acl_replication" : true ,
2017-11-08 02:22:09 +00:00
"enable_agent_tls_for_checks" : true ,
2019-04-24 13:11:08 +00:00
"enable_central_service_config" : true ,
2017-09-25 18:40:42 +00:00
"enable_debug" : true ,
"enable_script_checks" : true ,
2018-10-11 12:22:11 +00:00
"enable_local_script_checks" : true ,
2017-09-25 18:40:42 +00:00
"enable_syslog" : true ,
"encrypt" : "A4wELWqH" ,
"encrypt_verify_incoming" : true ,
"encrypt_verify_outgoing" : true ,
"http_config" : {
"block_endpoints" : [ "RBvAFcGD" , "fWOWFznh" ] ,
2019-01-10 14:27:26 +00:00
"allow_write_http_from" : [ "127.0.0.1/8" , "22.33.44.55/32" , "0.0.0.0/0" ] ,
2017-09-25 18:40:42 +00:00
"response_headers" : {
"M6TKa9NP" : "xjuxjOzQ" ,
"JRCrHZed" : "rl0mTx81"
}
} ,
"key_file" : "IEkkwgIA" ,
"leave_on_terminate" : true ,
"limits" : {
"rpc_rate" : 12029.43 ,
"rpc_max_burst" : 44848
} ,
"log_level" : "k1zo9Spt" ,
"node_id" : "AsUIlw99" ,
"node_meta" : {
"5mgGQMBk" : "mJLtVMSG" ,
"A7ynFMJB" : "0Nx6RGab"
} ,
"node_name" : "otlLxGaI" ,
"non_voting_server" : true ,
"performance" : {
2017-10-10 22:19:50 +00:00
"leave_drain_time" : "8265s" ,
"raft_multiplier" : 5 ,
"rpc_hold_timeout" : "15707s"
2017-09-25 18:40:42 +00:00
} ,
"pid_file" : "43xN80Km" ,
"ports" : {
"dns" : 7001 ,
"http" : 7999 ,
"https" : 15127 ,
2018-06-06 20:35:44 +00:00
"server" : 3757 ,
2018-10-03 13:05:28 +00:00
"grpc" : 4881 ,
2018-06-06 20:35:44 +00:00
"proxy_min_port" : 2000 ,
2018-09-27 13:33:12 +00:00
"proxy_max_port" : 3000 ,
"sidecar_min_port" : 8888 ,
"sidecar_max_port" : 9999
2017-09-25 18:40:42 +00:00
} ,
"protocol" : 30793 ,
2018-10-15 16:17:48 +00:00
"primary_datacenter" : "ejtmd43d" ,
2017-09-25 18:40:42 +00:00
"raft_protocol" : 19016 ,
2018-05-10 15:27:18 +00:00
"raft_snapshot_threshold" : 16384 ,
2018-05-10 22:06:47 +00:00
"raft_snapshot_interval" : "30s" ,
2017-09-25 18:40:42 +00:00
"reconnect_timeout" : "23739s" ,
"reconnect_timeout_wan" : "26694s" ,
2017-10-20 13:36:52 +00:00
"recursors" : [ "63.38.39.58" , "92.49.18.18" ] ,
2017-09-25 18:40:42 +00:00
"rejoin_after_leave" : true ,
"retry_interval" : "8067s" ,
"retry_interval_wan" : "28866s" ,
"retry_join" : [ "pbsSFY7U" , "l0qLtWij" ] ,
"retry_join_wan" : [ "PFsR02Ye" , "rJdQIhER" ] ,
"retry_max" : 913 ,
"retry_max_wan" : 23160 ,
"segment" : "BC2NhTDi" ,
"segments" : [
{
"name" : "PExYMe2E" ,
"bind" : "36.73.36.19" ,
"port" : 38295 ,
"rpc_listener" : true ,
"advertise" : "63.39.19.18"
} ,
{
"name" : "UzCvJgup" ,
"bind" : "37.58.38.19" ,
"port" : 39292 ,
"rpc_listener" : true ,
"advertise" : "83.58.26.27"
}
] ,
"serf_lan" : "99.43.63.15" ,
"serf_wan" : "67.88.33.19" ,
"server" : true ,
"server_name" : "Oerr9n1G" ,
"service" : {
"id" : "dLOXpSCI" ,
"name" : "o1ynPkp0" ,
2018-04-24 14:39:43 +00:00
"meta" : {
"mymeta" : "data"
} ,
2017-09-25 18:40:42 +00:00
"tags" : [ "nkwshvM5" , "NTDWn3ek" ] ,
"address" : "cOlSOhbp" ,
"token" : "msy7iWER" ,
"port" : 24237 ,
2018-09-07 14:30:47 +00:00
"weights" : {
"passing" : 100 ,
"warning" : 1
} ,
2017-09-25 18:40:42 +00:00
"enable_tag_override" : true ,
"check" : {
2018-05-07 22:51:05 +00:00
"id" : "RMi85Dv8" ,
2017-09-25 18:40:42 +00:00
"name" : "iehanzuq" ,
"status" : "rCvn53TH" ,
"notes" : "fti5lfF3" ,
2017-10-04 23:48:00 +00:00
"args" : [ "16WRUmwS" , "QWk7j7ae" ] ,
2017-09-25 18:40:42 +00:00
"http" : "dl3Fgme3" ,
"header" : {
"rjm4DEd3" : [ "2m3m2Fls" ] ,
"l4HwQ112" : [ "fk56MNlo" , "dhLK56aZ" ]
} ,
"method" : "9afLm3Mj" ,
"tcp" : "fjiLFqVd" ,
"interval" : "23926s" ,
"docker_container_id" : "dO5TtRHk" ,
"shell" : "e6q2ttES" ,
"tls_skip_verify" : true ,
"timeout" : "38483s" ,
"ttl" : "10943s" ,
"deregister_critical_service_after" : "68787s"
} ,
"checks" : [
{
"id" : "Zv99e9Ka" ,
"name" : "sgV4F7Pk" ,
"notes" : "yP5nKbW0" ,
"status" : "7oLMEyfu" ,
2017-10-04 23:48:00 +00:00
"args" : [ "5wEZtZpv" , "0Ihyk8cS" ] ,
2017-09-25 18:40:42 +00:00
"http" : "KyDjGY9H" ,
"header" : {
"gv5qefTz" : [ "5Olo2pMG" , "PvvKWQU5" ] ,
"SHOVq1Vv" : [ "jntFhyym" , "GYJh32pp" ]
} ,
"method" : "T66MFBfR" ,
"tcp" : "bNnNfx2A" ,
"interval" : "22224s" ,
"docker_container_id" : "ipgdFtjd" ,
"shell" : "omVZq7Sz" ,
"tls_skip_verify" : true ,
"timeout" : "18913s" ,
"ttl" : "44743s" ,
"deregister_critical_service_after" : "8482s"
} ,
{
"id" : "G79O6Mpr" ,
"name" : "IEqrzrsd" ,
"notes" : "SVqApqeM" ,
"status" : "XXkVoZXt" ,
2017-10-04 23:48:00 +00:00
"args" : [ "wD05Bvao" , "rLYB7kQC" ] ,
2017-09-25 18:40:42 +00:00
"http" : "kyICZsn8" ,
"header" : {
"4ebP5vL4" : [ "G20SrL5Q" , "DwPKlMbo" ] ,
"p2UI34Qz" : [ "UsG1D0Qh" , "NHhRiB6s" ]
} ,
"method" : "ciYHWors" ,
"tcp" : "FfvCwlqH" ,
"interval" : "12356s" ,
"docker_container_id" : "HBndBU6R" ,
"shell" : "hVI33JjA" ,
"tls_skip_verify" : true ,
"timeout" : "38282s" ,
"ttl" : "1181s" ,
"deregister_critical_service_after" : "4992s"
}
2018-07-25 18:55:41 +00:00
] ,
"connect" : {
"native" : true
}
2017-09-25 18:40:42 +00:00
} ,
"services" : [
{
"id" : "wI1dzxS4" ,
"name" : "7IszXMQ1" ,
"tags" : [ "0Zwg8l6v" , "zebELdN5" ] ,
"address" : "9RhqPSPB" ,
"token" : "myjKJkWH" ,
"port" : 72219 ,
"enable_tag_override" : true ,
"check" : {
2018-05-07 22:51:05 +00:00
"id" : "qmfeO5if" ,
2017-09-25 18:40:42 +00:00
"name" : "atDGP7n5" ,
"status" : "pDQKEhWL" ,
"notes" : "Yt8EDLev" ,
2017-10-04 23:48:00 +00:00
"args" : [ "81EDZLPa" , "bPY5X8xd" ] ,
2017-09-25 18:40:42 +00:00
"http" : "qzHYvmJO" ,
"header" : {
"UkpmZ3a3" : [ "2dfzXuxZ" ] ,
"cVFpko4u" : [ "gGqdEB6k" , "9LsRo22u" ]
} ,
"method" : "X5DrovFc" ,
"tcp" : "ICbxkpSF" ,
"interval" : "24392s" ,
"docker_container_id" : "ZKXr68Yb" ,
"shell" : "CEfzx0Fo" ,
"tls_skip_verify" : true ,
"timeout" : "38333s" ,
"ttl" : "57201s" ,
"deregister_critical_service_after" : "44214s"
2018-09-27 13:33:12 +00:00
} ,
"connect" : {
"sidecar_service" : { }
2017-09-25 18:40:42 +00:00
}
} ,
{
"id" : "MRHVMZuD" ,
"name" : "6L6BVfgH" ,
"tags" : [ "7Ale4y6o" , "PMBW08hy" ] ,
"address" : "R6H6g8h0" ,
"token" : "ZgY8gjMI" ,
"port" : 38292 ,
2018-09-07 14:30:47 +00:00
"weights" : {
"passing" : 1979 ,
"warning" : 6
} ,
2017-09-25 18:40:42 +00:00
"enable_tag_override" : true ,
"checks" : [
{
"id" : "GTti9hCo" ,
"name" : "9OOS93ne" ,
"notes" : "CQy86DH0" ,
"status" : "P0SWDvrk" ,
2017-10-04 23:48:00 +00:00
"args" : [ "EXvkYIuG" , "BATOyt6h" ] ,
2017-09-25 18:40:42 +00:00
"http" : "u97ByEiW" ,
"header" : {
"MUlReo8L" : [ "AUZG7wHG" , "gsN0Dc2N" ] ,
"1UJXjVrT" : [ "OJgxzTfk" , "xZZrFsq7" ]
} ,
"method" : "5wkAxCUE" ,
"tcp" : "MN3oA9D2" ,
"interval" : "32718s" ,
"docker_container_id" : "cU15LMet" ,
"shell" : "nEz9qz2l" ,
"tls_skip_verify" : true ,
"timeout" : "34738s" ,
"ttl" : "22773s" ,
"deregister_critical_service_after" : "84282s"
} ,
{
"id" : "UHsDeLxG" ,
"name" : "PQSaPWlT" ,
"notes" : "jKChDOdl" ,
"status" : "5qFz6OZn" ,
2017-10-04 23:48:00 +00:00
"args" : [ "NMtYWlT9" , "vj74JXsm" ] ,
2017-09-25 18:40:42 +00:00
"http" : "1LBDJhw4" ,
"header" : {
"cXPmnv1M" : [ "imDqfaBx" , "NFxZ1bQe" ] ,
"vr7wY7CS" : [ "EtCoNPPL" , "9vAarJ5s" ]
} ,
"method" : "wzByP903" ,
"tcp" : "2exjZIGE" ,
"interval" : "5656s" ,
"docker_container_id" : "5tDBWpfA" ,
"shell" : "rlTpLM8s" ,
"tls_skip_verify" : true ,
"timeout" : "4868s" ,
"ttl" : "11222s" ,
"deregister_critical_service_after" : "68482s"
}
2018-04-16 15:00:20 +00:00
] ,
"connect" : {
"proxy" : {
"exec_mode" : "daemon" ,
2018-04-27 05:16:21 +00:00
"command" : [ "awesome-proxy" ] ,
2018-04-16 15:00:20 +00:00
"config" : {
"foo" : "qux"
}
}
}
2018-07-25 18:55:41 +00:00
} ,
{
"id" : "Kh81CPF6" ,
2018-09-12 16:07:47 +00:00
"kind" : "connect-proxy" ,
2018-07-25 18:55:41 +00:00
"name" : "Kh81CPF6-proxy" ,
"port" : 31471 ,
2018-09-12 16:07:47 +00:00
"proxy" : {
"config" : {
"cedGGtZf" : "pWrUNiWw"
} ,
"destination_service_id" : "6L6BVfgH-id" ,
"destination_service_name" : "6L6BVfgH" ,
"local_service_address" : "127.0.0.2" ,
"local_service_port" : 23759 ,
"upstreams" : [
{
"destination_name" : "KPtAj2cb" ,
"local_bind_port" : 4051 ,
"config" : {
"kzRnZOyd" : "nUNKoL8H"
}
} ,
{
"destination_name" : "KSd8HsRl" ,
"destination_namespace" : "9nakw0td" ,
"destination_type" : "prepared_query" ,
"local_bind_address" : "127.24.88.0" ,
"local_bind_port" : 11884
}
]
}
2017-09-25 18:40:42 +00:00
}
] ,
"session_ttl_min" : "26627s" ,
"skip_leave_on_interrupt" : true ,
"start_join" : [ "LR3hGDoG" , "MwVpZ4Up" ] ,
"start_join_wan" : [ "EbFSc3nA" , "kwXTh623" ] ,
"syslog_facility" : "hHv79Uia" ,
"tagged_addresses" : {
"7MYgHrYH" : "dALJAhLD" ,
"h6DdBy6K" : "ebrr9zZ8"
} ,
"telemetry" : {
"circonus_api_app" : "p4QOTe9j" ,
"circonus_api_token" : "E3j35V23" ,
"circonus_api_url" : "mEMjHpGg" ,
"circonus_broker_id" : "BHlxUhed" ,
"circonus_broker_select_tag" : "13xy1gHm" ,
"circonus_check_display_name" : "DRSlQR6n" ,
"circonus_check_force_metric_activation" : "Ua5FGVYf" ,
"circonus_check_id" : "kGorutad" ,
"circonus_check_instance_id" : "rwoOL6R4" ,
"circonus_check_search_tag" : "ovT4hT4f" ,
"circonus_check_tags" : "prvO4uBl" ,
"circonus_submission_interval" : "DolzaflP" ,
"circonus_submission_url" : "gTcbS93G" ,
"disable_hostname" : true ,
"dogstatsd_addr" : "0wSndumK" ,
"dogstatsd_tags" : [ "3N81zSUB" , "Xtj8AnXZ" ] ,
"filter_default" : true ,
"prefix_filter" : [ "+oJotS8XJ" , "-cazlEhGn" ] ,
2017-09-27 00:49:55 +00:00
"metrics_prefix" : "ftO6DySn" ,
2018-04-06 12:21:05 +00:00
"prometheus_retention_time" : "15s" ,
2017-09-25 18:40:42 +00:00
"statsd_address" : "drce87cy" ,
2017-09-27 00:49:55 +00:00
"statsite_address" : "HpFwKB8R"
2017-09-25 18:40:42 +00:00
} ,
2018-03-13 16:50:41 +00:00
"tls_cipher_suites" : "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384" ,
2017-09-25 18:40:42 +00:00
"tls_min_version" : "pAOWafkR" ,
"tls_prefer_server_cipher_suites" : true ,
"translate_wan_addrs" : true ,
2017-09-26 06:58:54 +00:00
"ui" : true ,
2017-09-25 18:40:42 +00:00
"ui_dir" : "11IFzAUn" ,
"unix_sockets" : {
"group" : "8pFodrV8" ,
"mode" : "E8sAwOv4" ,
"user" : "E0nB1DwA"
} ,
"verify_incoming" : true ,
"verify_incoming_https" : true ,
"verify_incoming_rpc" : true ,
"verify_outgoing" : true ,
"verify_server_hostname" : true ,
"watches" : [
{
"type" : "key" ,
"datacenter" : "GyE6jpeW" ,
"key" : "j9lF1Tve" ,
"handler" : "90N7S4LN"
2017-10-04 23:48:00 +00:00
} , {
"type" : "keyprefix" ,
"datacenter" : "fYrl3F5d" ,
"key" : "sl3Dffu7" ,
"args" : [ "dltjDJ2a" , "flEa7C2d" ]
2017-09-25 18:40:42 +00:00
}
]
} ` ,
"hcl" : `
acl_agent_master_token = "furuQD0b"
acl_agent_token = "cOshLOQ2"
acl_datacenter = "m3urck3z"
acl_default_policy = "ArK3WIfE"
acl_down_policy = "vZXMfMP0"
acl_enforce_version_8 = true
2019-02-27 19:28:31 +00:00
acl_enable_key_list_policy = true
2017-09-25 18:40:42 +00:00
acl_master_token = "C1Q1oIwh"
acl_replication_token = "LMmgy5dO"
acl_token = "O1El0wan"
acl_ttl = "18060s"
2018-10-19 16:04:07 +00:00
acl = {
enabled = true
down_policy = "03eb2aee"
default_policy = "72c2e7a0"
enable_key_list_policy = false
2019-02-27 19:28:31 +00:00
enable_token_persistence = true
2018-10-19 16:04:07 +00:00
policy_ttl = "1123s"
2019-04-15 20:43:19 +00:00
role_ttl = "9876s"
2018-10-19 16:04:07 +00:00
token_ttl = "3321s"
enable_token_replication = true
tokens = {
master = "8a19ac27" ,
agent_master = "64fd0e08" ,
replication = "5795983a" ,
agent = "bed2377c" ,
default = "418fdff1"
}
}
2017-09-25 18:40:42 +00:00
addresses = {
dns = "93.95.95.81"
http = "83.39.91.39"
https = "95.17.17.19"
2018-10-03 13:05:28 +00:00
grpc = "32.31.61.91"
2017-09-25 18:40:42 +00:00
}
advertise_addr = "17.99.29.16"
advertise_addr_wan = "78.63.37.19"
autopilot = {
cleanup_dead_servers = true
disable_upgrade_migration = true
last_contact_threshold = "12705s"
max_trailing_logs = 17849
redundancy_zone_tag = "3IsufDJf"
server_stabilization_time = "23057s"
upgrade_version_tag = "W9pDwFAL"
}
bind_addr = "16.99.34.17"
bootstrap = true
bootstrap_expect = 53
ca_file = "erA7T0PM"
ca_path = "mQEN1Mfp"
cert_file = "7s4QAzDk"
check = {
id = "fZaCAXww"
name = "OOM2eo0f"
notes = "zXzXI9Gt"
service_id = "L8G0QNmR"
token = "oo4BCTgJ"
status = "qLykAl5u"
2017-10-04 23:48:00 +00:00
args = [ "f3BemRjy" , "e5zgpef7" ]
2017-09-25 18:40:42 +00:00
http = "29B93haH"
header = {
hBq0zn1q = [ "2a9o9ZKP" , "vKwA5lR6" ]
f3r6xFtM = [ "RyuIdDWv" , "QbxEcIUM" ]
}
method = "Dou0nGT5"
tcp = "JY6fTTcw"
interval = "18714s"
docker_container_id = "qF66POS9"
shell = "sOnDy228"
tls_skip_verify = true
timeout = "5954s"
ttl = "30044s"
deregister_critical_service_after = "13209s"
} ,
checks = [
{
id = "uAjE6m9Z"
name = "QsZRGpYr"
notes = "VJ7Sk4BY"
service_id = "lSulPcyz"
token = "toO59sh8"
status = "9RlWsXMV"
2017-10-04 23:48:00 +00:00
args = [ "4BAJttck" , "4D2NPtTQ" ]
2017-09-25 18:40:42 +00:00
http = "dohLcyQ2"
header = {
"ZBfTin3L" = [ "1sDbEqYG" , "lJGASsWK" ]
"Ui0nU99X" = [ "LMccm3Qe" , "k5H5RggQ" ]
}
method = "aldrIQ4l"
tcp = "RJQND605"
interval = "22164s"
docker_container_id = "ipgdFtjd"
shell = "qAeOYy0M"
tls_skip_verify = true
timeout = "1813s"
ttl = "21743s"
deregister_critical_service_after = "14232s"
} ,
{
id = "Cqq95BhP"
name = "3qXpkS0i"
notes = "sb5qLTex"
service_id = "CmUUcRna"
token = "a3nQzHuy"
status = "irj26nf3"
2017-10-04 23:48:00 +00:00
args = [ "9s526ogY" , "gSlOHj1w" ]
2017-09-25 18:40:42 +00:00
http = "yzhgsQ7Y"
header = {
"zcqwA8dO" = [ "qb1zx0DL" , "sXCxPFsD" ]
"qxvdnSE9" = [ "6wBPUYdF" , "YYh8wtSZ" ]
}
method = "gLrztrNw"
tcp = "4jG5casb"
interval = "28767s"
docker_container_id = "THW6u7rL"
shell = "C1Zt3Zwh"
tls_skip_verify = true
timeout = "18506s"
ttl = "31006s"
deregister_critical_service_after = "2366s"
}
]
check_update_interval = "16507s"
client_addr = "93.83.18.19"
2019-04-26 18:25:03 +00:00
config_entries {
2019-04-30 14:13:59 +00:00
# This is using the repeated block - to - array HCL magic
bootstrap {
kind = "proxy-defaults"
name = "global"
config {
foo = "bar"
bar = 1.0
}
2019-04-26 18:25:03 +00:00
}
}
2018-04-16 15:00:20 +00:00
connect {
2018-06-16 00:59:08 +00:00
ca_provider = "consul"
2018-04-25 18:34:08 +00:00
ca_config {
2018-07-16 09:46:10 +00:00
rotation_period = "90h"
leaf_cert_ttl = "1h"
2019-01-22 17:19:36 +00:00
# hack float since json parses numbers as float and we have to
# assert against the same thing
csr_max_per_second = 100.0
csr_max_concurrent = 2.0
2018-04-25 18:34:08 +00:00
}
2018-04-16 15:00:20 +00:00
enabled = true
proxy_defaults {
exec_mode = "script"
2018-04-27 05:16:21 +00:00
daemon_command = [ "consul" , "connect" , "proxy" ]
script_command = [ "proxyctl.sh" ]
2018-04-16 15:00:20 +00:00
config = {
foo = "bar"
2018-04-26 13:01:20 +00:00
# hack float since json parses numbers as float and we have to
# assert against the same thing
2018-04-27 05:16:21 +00:00
connect_timeout_ms = 1000.0
2018-04-16 15:00:20 +00:00
pedantic_mode = true
}
}
}
2018-07-26 15:39:49 +00:00
gossip_lan {
gossip_nodes = 6
gossip_interval = "25252s"
retransmit_mult = 1234
suspicion_mult = 1235
probe_interval = "101ms"
probe_timeout = "102ms"
}
gossip_wan {
gossip_nodes = 2
gossip_interval = "6966s"
retransmit_mult = 16384
suspicion_mult = 16385
probe_interval = "103ms"
probe_timeout = "104ms"
}
2017-09-25 18:40:42 +00:00
data_dir = "` + dataDir + `"
datacenter = "rzo029wg"
disable_anonymous_signature = true
disable_coordinates = true
disable_host_node_id = true
2018-07-26 12:53:39 +00:00
disable_http_unprintable_char_filter = true
2017-09-25 18:40:42 +00:00
disable_keyring_file = true
disable_remote_exec = true
disable_update_check = true
2017-10-11 00:04:52 +00:00
discard_check_output = true
2018-03-30 15:14:44 +00:00
discovery_max_stale = "5s"
2017-09-25 18:40:42 +00:00
domain = "7W1xXSqd"
dns_config {
allow_stale = true
2018-03-06 01:07:42 +00:00
a_record_limit = 29907
2017-09-25 18:40:42 +00:00
disable_compression = true
enable_truncate = true
max_stale = "29685s"
node_ttl = "7084s"
only_passing = true
recursor_timeout = "4427s"
service_ttl = {
"*" = "32030s"
}
udp_answer_limit = 29909
2019-02-25 19:06:01 +00:00
use_cache = true
cache_max_age = "5m"
2017-09-25 18:40:42 +00:00
}
enable_acl_replication = true
2017-11-08 02:22:09 +00:00
enable_agent_tls_for_checks = true
2019-04-24 13:11:08 +00:00
enable_central_service_config = true
2017-09-25 18:40:42 +00:00
enable_debug = true
enable_script_checks = true
2018-10-11 12:22:11 +00:00
enable_local_script_checks = true
2017-09-25 18:40:42 +00:00
enable_syslog = true
encrypt = "A4wELWqH"
encrypt_verify_incoming = true
encrypt_verify_outgoing = true
http_config {
block_endpoints = [ "RBvAFcGD" , "fWOWFznh" ]
2019-01-10 14:27:26 +00:00
allow_write_http_from = [ "127.0.0.1/8" , "22.33.44.55/32" , "0.0.0.0/0" ]
2017-09-25 18:40:42 +00:00
response_headers = {
"M6TKa9NP" = "xjuxjOzQ"
"JRCrHZed" = "rl0mTx81"
}
}
key_file = "IEkkwgIA"
leave_on_terminate = true
limits {
rpc_rate = 12029.43
rpc_max_burst = 44848
}
log_level = "k1zo9Spt"
node_id = "AsUIlw99"
node_meta {
"5mgGQMBk" = "mJLtVMSG"
"A7ynFMJB" = "0Nx6RGab"
}
node_name = "otlLxGaI"
non_voting_server = true
performance {
2017-10-10 22:19:50 +00:00
leave_drain_time = "8265s"
2017-09-25 18:40:42 +00:00
raft_multiplier = 5
2017-10-10 22:19:50 +00:00
rpc_hold_timeout = "15707s"
2017-09-25 18:40:42 +00:00
}
pid_file = "43xN80Km"
ports {
dns = 7001 ,
http = 7999 ,
https = 15127
server = 3757
2018-10-03 13:05:28 +00:00
grpc = 4881
2018-06-06 20:35:44 +00:00
proxy_min_port = 2000
proxy_max_port = 3000
2018-09-27 13:33:12 +00:00
sidecar_min_port = 8888
sidecar_max_port = 9999
2017-09-25 18:40:42 +00:00
}
protocol = 30793
2018-10-15 16:17:48 +00:00
primary_datacenter = "ejtmd43d"
2017-09-25 18:40:42 +00:00
raft_protocol = 19016
2018-05-10 15:27:18 +00:00
raft_snapshot_threshold = 16384
2018-05-10 22:06:47 +00:00
raft_snapshot_interval = "30s"
2017-09-25 18:40:42 +00:00
reconnect_timeout = "23739s"
reconnect_timeout_wan = "26694s"
2017-10-20 13:36:52 +00:00
recursors = [ "63.38.39.58" , "92.49.18.18" ]
2017-09-25 18:40:42 +00:00
rejoin_after_leave = true
retry_interval = "8067s"
retry_interval_wan = "28866s"
retry_join = [ "pbsSFY7U" , "l0qLtWij" ]
retry_join_wan = [ "PFsR02Ye" , "rJdQIhER" ]
retry_max = 913
retry_max_wan = 23160
segment = "BC2NhTDi"
segments = [
{
name = "PExYMe2E"
bind = "36.73.36.19"
port = 38295
rpc_listener = true
advertise = "63.39.19.18"
} ,
{
name = "UzCvJgup"
bind = "37.58.38.19"
port = 39292
rpc_listener = true
advertise = "83.58.26.27"
}
]
serf_lan = "99.43.63.15"
serf_wan = "67.88.33.19"
server = true
server_name = "Oerr9n1G"
service = {
id = "dLOXpSCI"
name = "o1ynPkp0"
2018-04-24 14:39:43 +00:00
meta = {
mymeta = "data"
}
2017-09-25 18:40:42 +00:00
tags = [ "nkwshvM5" , "NTDWn3ek" ]
address = "cOlSOhbp"
token = "msy7iWER"
port = 24237
2018-09-07 14:30:47 +00:00
weights = {
passing = 100 ,
warning = 1
}
2017-09-25 18:40:42 +00:00
enable_tag_override = true
check = {
2018-05-07 22:51:05 +00:00
id = "RMi85Dv8"
2017-09-25 18:40:42 +00:00
name = "iehanzuq"
status = "rCvn53TH"
notes = "fti5lfF3"
2017-10-04 23:48:00 +00:00
args = [ "16WRUmwS" , "QWk7j7ae" ]
2017-09-25 18:40:42 +00:00
http = "dl3Fgme3"
header = {
rjm4DEd3 = [ "2m3m2Fls" ]
l4HwQ112 = [ "fk56MNlo" , "dhLK56aZ" ]
}
method = "9afLm3Mj"
tcp = "fjiLFqVd"
interval = "23926s"
docker_container_id = "dO5TtRHk"
shell = "e6q2ttES"
tls_skip_verify = true
timeout = "38483s"
ttl = "10943s"
deregister_critical_service_after = "68787s"
}
checks = [
{
id = "Zv99e9Ka"
name = "sgV4F7Pk"
notes = "yP5nKbW0"
status = "7oLMEyfu"
2017-10-04 23:48:00 +00:00
args = [ "5wEZtZpv" , "0Ihyk8cS" ]
2017-09-25 18:40:42 +00:00
http = "KyDjGY9H"
header = {
"gv5qefTz" = [ "5Olo2pMG" , "PvvKWQU5" ]
"SHOVq1Vv" = [ "jntFhyym" , "GYJh32pp" ]
}
method = "T66MFBfR"
tcp = "bNnNfx2A"
interval = "22224s"
docker_container_id = "ipgdFtjd"
shell = "omVZq7Sz"
tls_skip_verify = true
timeout = "18913s"
ttl = "44743s"
deregister_critical_service_after = "8482s"
} ,
{
id = "G79O6Mpr"
name = "IEqrzrsd"
notes = "SVqApqeM"
status = "XXkVoZXt"
2017-10-04 23:48:00 +00:00
args = [ "wD05Bvao" , "rLYB7kQC" ]
2017-09-25 18:40:42 +00:00
http = "kyICZsn8"
header = {
"4ebP5vL4" = [ "G20SrL5Q" , "DwPKlMbo" ]
"p2UI34Qz" = [ "UsG1D0Qh" , "NHhRiB6s" ]
}
method = "ciYHWors"
tcp = "FfvCwlqH"
interval = "12356s"
docker_container_id = "HBndBU6R"
shell = "hVI33JjA"
tls_skip_verify = true
timeout = "38282s"
ttl = "1181s"
deregister_critical_service_after = "4992s"
}
]
2018-07-25 18:55:41 +00:00
connect {
native = true
}
2017-09-25 18:40:42 +00:00
}
services = [
{
id = "wI1dzxS4"
name = "7IszXMQ1"
tags = [ "0Zwg8l6v" , "zebELdN5" ]
address = "9RhqPSPB"
token = "myjKJkWH"
port = 72219
enable_tag_override = true
check = {
2018-05-07 22:51:05 +00:00
id = "qmfeO5if"
2017-09-25 18:40:42 +00:00
name = "atDGP7n5"
status = "pDQKEhWL"
notes = "Yt8EDLev"
2017-10-04 23:48:00 +00:00
args = [ "81EDZLPa" , "bPY5X8xd" ]
2017-09-25 18:40:42 +00:00
http = "qzHYvmJO"
header = {
UkpmZ3a3 = [ "2dfzXuxZ" ]
cVFpko4u = [ "gGqdEB6k" , "9LsRo22u" ]
}
method = "X5DrovFc"
tcp = "ICbxkpSF"
interval = "24392s"
docker_container_id = "ZKXr68Yb"
shell = "CEfzx0Fo"
tls_skip_verify = true
timeout = "38333s"
ttl = "57201s"
deregister_critical_service_after = "44214s"
}
2018-09-27 13:33:12 +00:00
connect {
sidecar_service { }
}
2017-09-25 18:40:42 +00:00
} ,
{
id = "MRHVMZuD"
name = "6L6BVfgH"
tags = [ "7Ale4y6o" , "PMBW08hy" ]
address = "R6H6g8h0"
token = "ZgY8gjMI"
port = 38292
2018-09-07 14:30:47 +00:00
weights = {
passing = 1979 ,
warning = 6
}
2017-09-25 18:40:42 +00:00
enable_tag_override = true
checks = [
{
id = "GTti9hCo"
name = "9OOS93ne"
notes = "CQy86DH0"
status = "P0SWDvrk"
2017-10-04 23:48:00 +00:00
args = [ "EXvkYIuG" , "BATOyt6h" ]
2017-09-25 18:40:42 +00:00
http = "u97ByEiW"
header = {
"MUlReo8L" = [ "AUZG7wHG" , "gsN0Dc2N" ]
"1UJXjVrT" = [ "OJgxzTfk" , "xZZrFsq7" ]
}
method = "5wkAxCUE"
tcp = "MN3oA9D2"
interval = "32718s"
docker_container_id = "cU15LMet"
shell = "nEz9qz2l"
tls_skip_verify = true
timeout = "34738s"
ttl = "22773s"
deregister_critical_service_after = "84282s"
} ,
{
id = "UHsDeLxG"
name = "PQSaPWlT"
notes = "jKChDOdl"
status = "5qFz6OZn"
2017-10-04 23:48:00 +00:00
args = [ "NMtYWlT9" , "vj74JXsm" ]
2017-09-25 18:40:42 +00:00
http = "1LBDJhw4"
header = {
"cXPmnv1M" = [ "imDqfaBx" , "NFxZ1bQe" ] ,
"vr7wY7CS" = [ "EtCoNPPL" , "9vAarJ5s" ]
}
method = "wzByP903"
tcp = "2exjZIGE"
interval = "5656s"
docker_container_id = "5tDBWpfA"
shell = "rlTpLM8s"
tls_skip_verify = true
timeout = "4868s"
ttl = "11222s"
deregister_critical_service_after = "68482s"
}
]
2018-04-16 15:00:20 +00:00
connect {
proxy {
exec_mode = "daemon"
2018-04-27 05:16:21 +00:00
command = [ "awesome-proxy" ]
2018-04-16 15:00:20 +00:00
config = {
foo = "qux"
}
}
}
2018-07-25 18:55:41 +00:00
} ,
{
id = "Kh81CPF6"
name = "Kh81CPF6-proxy"
port = 31471
kind = "connect-proxy"
2018-09-12 16:07:47 +00:00
proxy {
destination_service_name = "6L6BVfgH"
destination_service_id = "6L6BVfgH-id"
local_service_address = "127.0.0.2"
local_service_port = 23759
config {
cedGGtZf = "pWrUNiWw"
}
upstreams = [
{
destination_name = "KPtAj2cb"
local_bind_port = 4051
config {
kzRnZOyd = "nUNKoL8H"
}
} ,
{
destination_type = "prepared_query"
destination_namespace = "9nakw0td"
destination_name = "KSd8HsRl"
local_bind_port = 11884
local_bind_address = "127.24.88.0"
} ,
]
}
2017-09-25 18:40:42 +00:00
}
]
session_ttl_min = "26627s"
skip_leave_on_interrupt = true
start_join = [ "LR3hGDoG" , "MwVpZ4Up" ]
start_join_wan = [ "EbFSc3nA" , "kwXTh623" ]
syslog_facility = "hHv79Uia"
tagged_addresses = {
"7MYgHrYH" = "dALJAhLD"
"h6DdBy6K" = "ebrr9zZ8"
}
telemetry {
circonus_api_app = "p4QOTe9j"
circonus_api_token = "E3j35V23"
circonus_api_url = "mEMjHpGg"
circonus_broker_id = "BHlxUhed"
circonus_broker_select_tag = "13xy1gHm"
circonus_check_display_name = "DRSlQR6n"
circonus_check_force_metric_activation = "Ua5FGVYf"
circonus_check_id = "kGorutad"
circonus_check_instance_id = "rwoOL6R4"
circonus_check_search_tag = "ovT4hT4f"
circonus_check_tags = "prvO4uBl"
circonus_submission_interval = "DolzaflP"
circonus_submission_url = "gTcbS93G"
disable_hostname = true
dogstatsd_addr = "0wSndumK"
dogstatsd_tags = [ "3N81zSUB" , "Xtj8AnXZ" ]
filter_default = true
prefix_filter = [ "+oJotS8XJ" , "-cazlEhGn" ]
2017-09-27 00:49:55 +00:00
metrics_prefix = "ftO6DySn"
2018-04-06 12:21:05 +00:00
prometheus_retention_time = "15s"
2017-09-25 18:40:42 +00:00
statsd_address = "drce87cy"
statsite_address = "HpFwKB8R"
}
2018-03-15 17:30:38 +00:00
tls_cipher_suites = "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"
2017-09-25 18:40:42 +00:00
tls_min_version = "pAOWafkR"
tls_prefer_server_cipher_suites = true
translate_wan_addrs = true
2017-09-26 06:58:54 +00:00
ui = true
2017-09-25 18:40:42 +00:00
ui_dir = "11IFzAUn"
unix_sockets = {
group = "8pFodrV8"
mode = "E8sAwOv4"
user = "E0nB1DwA"
}
verify_incoming = true
verify_incoming_https = true
verify_incoming_rpc = true
verify_outgoing = true
verify_server_hostname = true
watches = [ {
type = "key"
datacenter = "GyE6jpeW"
key = "j9lF1Tve"
handler = "90N7S4LN"
2017-10-04 23:48:00 +00:00
} , {
type = "keyprefix"
datacenter = "fYrl3F5d"
key = "sl3Dffu7"
args = [ "dltjDJ2a" , "flEa7C2d" ]
2017-09-25 18:40:42 +00:00
} ]
` }
tail := map [ string ] [ ] Source {
"json" : [ ] Source {
{
Name : "tail.non-user.json" ,
Format : "json" ,
Data : `
{
"acl_disabled_ttl" : "957s" ,
2018-10-19 16:04:07 +00:00
"acl" : {
"disabled_ttl" : "957s"
} ,
2017-09-25 18:40:42 +00:00
"ae_interval" : "10003s" ,
"check_deregister_interval_min" : "27870s" ,
"check_reap_interval" : "10662s" ,
2018-03-30 15:14:44 +00:00
"discovery_max_stale" : "5s" ,
2017-09-25 18:40:42 +00:00
"segment_limit" : 24705 ,
"segment_name_limit" : 27046 ,
"sync_coordinate_interval_min" : "27983s" ,
"sync_coordinate_rate_target" : 137.81
} ` ,
} ,
{
Name : "tail.consul.json" ,
Format : "json" ,
Data : `
{
"consul" : {
"coordinate" : {
"update_batch_size" : 9244 ,
"update_max_batches" : 15164 ,
"update_period" : "25093s"
} ,
"raft" : {
"election_timeout" : "31947s" ,
"heartbeat_timeout" : "25699s" ,
"leader_lease_timeout" : "15351s"
} ,
"server" : {
"health_interval" : "17455s"
}
}
} ` ,
} ,
} ,
"hcl" : [ ] Source {
{
Name : "tail.non-user.hcl" ,
Format : "hcl" ,
Data : `
acl_disabled_ttl = "957s"
2018-10-19 16:04:07 +00:00
acl = {
disabled_ttl = "957s"
}
2017-09-25 18:40:42 +00:00
ae_interval = "10003s"
check_deregister_interval_min = "27870s"
check_reap_interval = "10662s"
2018-03-30 15:14:44 +00:00
discovery_max_stale = "5s"
2017-09-25 18:40:42 +00:00
segment_limit = 24705
segment_name_limit = 27046
sync_coordinate_interval_min = "27983s"
sync_coordinate_rate_target = 137.81
` ,
} ,
{
Name : "tail.consul.hcl" ,
Format : "hcl" ,
Data : `
consul = {
coordinate = {
update_batch_size = 9244
update_max_batches = 15164
update_period = "25093s"
}
raft = {
election_timeout = "31947s"
heartbeat_timeout = "25699s"
leader_lease_timeout = "15351s"
}
server = {
health_interval = "17455s"
}
}
` ,
} ,
} ,
}
want := RuntimeConfig {
// non-user configurable values
ACLDisabledTTL : 957 * time . Second ,
AEInterval : 10003 * time . Second ,
CheckDeregisterIntervalMin : 27870 * time . Second ,
CheckReapInterval : 10662 * time . Second ,
SegmentLimit : 24705 ,
SegmentNameLimit : 27046 ,
SyncCoordinateIntervalMin : 27983 * time . Second ,
SyncCoordinateRateTarget : 137.81 ,
Revision : "JNtPSav3" ,
Version : "R909Hblt" ,
VersionPrerelease : "ZT1JOQLn" ,
// consul configuration
ConsulCoordinateUpdateBatchSize : 9244 ,
ConsulCoordinateUpdateMaxBatches : 15164 ,
ConsulCoordinateUpdatePeriod : 25093 * time . Second ,
ConsulRaftElectionTimeout : 5 * 31947 * time . Second ,
ConsulRaftHeartbeatTimeout : 5 * 25699 * time . Second ,
ConsulRaftLeaderLeaseTimeout : 5 * 15351 * time . Second ,
2018-07-26 15:39:49 +00:00
GossipLANGossipInterval : 25252 * time . Second ,
GossipLANGossipNodes : 6 ,
GossipLANProbeInterval : 101 * time . Millisecond ,
GossipLANProbeTimeout : 102 * time . Millisecond ,
GossipLANSuspicionMult : 1235 ,
GossipLANRetransmitMult : 1234 ,
GossipWANGossipInterval : 6966 * time . Second ,
GossipWANGossipNodes : 2 ,
GossipWANProbeInterval : 103 * time . Millisecond ,
GossipWANProbeTimeout : 104 * time . Millisecond ,
GossipWANSuspicionMult : 16385 ,
GossipWANRetransmitMult : 16384 ,
2017-09-25 18:40:42 +00:00
ConsulServerHealthInterval : 17455 * time . Second ,
// user configurable values
2018-10-19 16:04:07 +00:00
ACLAgentMasterToken : "64fd0e08" ,
ACLAgentToken : "bed2377c" ,
ACLsEnabled : true ,
ACLDatacenter : "ejtmd43d" ,
ACLDefaultPolicy : "72c2e7a0" ,
ACLDownPolicy : "03eb2aee" ,
2017-09-25 18:40:42 +00:00
ACLEnforceVersion8 : true ,
2018-10-19 16:04:07 +00:00
ACLEnableKeyListPolicy : false ,
2019-02-27 19:28:31 +00:00
ACLEnableTokenPersistence : true ,
2018-10-19 16:04:07 +00:00
ACLMasterToken : "8a19ac27" ,
ACLReplicationToken : "5795983a" ,
ACLTokenTTL : 3321 * time . Second ,
ACLPolicyTTL : 1123 * time . Second ,
2019-04-15 20:43:19 +00:00
ACLRoleTTL : 9876 * time . Second ,
2018-10-19 16:04:07 +00:00
ACLToken : "418fdff1" ,
ACLTokenReplication : true ,
2017-09-25 18:40:42 +00:00
AdvertiseAddrLAN : ipAddr ( "17.99.29.16" ) ,
AdvertiseAddrWAN : ipAddr ( "78.63.37.19" ) ,
AutopilotCleanupDeadServers : true ,
AutopilotDisableUpgradeMigration : true ,
AutopilotLastContactThreshold : 12705 * time . Second ,
AutopilotMaxTrailingLogs : 17849 ,
AutopilotRedundancyZoneTag : "3IsufDJf" ,
AutopilotServerStabilizationTime : 23057 * time . Second ,
AutopilotUpgradeVersionTag : "W9pDwFAL" ,
BindAddr : ipAddr ( "16.99.34.17" ) ,
Bootstrap : true ,
BootstrapExpect : 53 ,
CAFile : "erA7T0PM" ,
CAPath : "mQEN1Mfp" ,
CertFile : "7s4QAzDk" ,
Checks : [ ] * structs . CheckDefinition {
& structs . CheckDefinition {
2017-10-04 23:48:00 +00:00
ID : "uAjE6m9Z" ,
Name : "QsZRGpYr" ,
Notes : "VJ7Sk4BY" ,
ServiceID : "lSulPcyz" ,
Token : "toO59sh8" ,
Status : "9RlWsXMV" ,
ScriptArgs : [ ] string { "4BAJttck" , "4D2NPtTQ" } ,
HTTP : "dohLcyQ2" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"ZBfTin3L" : [ ] string { "1sDbEqYG" , "lJGASsWK" } ,
"Ui0nU99X" : [ ] string { "LMccm3Qe" , "k5H5RggQ" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "aldrIQ4l" ,
TCP : "RJQND605" ,
Interval : 22164 * time . Second ,
DockerContainerID : "ipgdFtjd" ,
Shell : "qAeOYy0M" ,
TLSSkipVerify : true ,
Timeout : 1813 * time . Second ,
TTL : 21743 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 14232 * time . Second ,
} ,
& structs . CheckDefinition {
2017-10-04 23:48:00 +00:00
ID : "Cqq95BhP" ,
Name : "3qXpkS0i" ,
Notes : "sb5qLTex" ,
ServiceID : "CmUUcRna" ,
Token : "a3nQzHuy" ,
Status : "irj26nf3" ,
ScriptArgs : [ ] string { "9s526ogY" , "gSlOHj1w" } ,
HTTP : "yzhgsQ7Y" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"zcqwA8dO" : [ ] string { "qb1zx0DL" , "sXCxPFsD" } ,
"qxvdnSE9" : [ ] string { "6wBPUYdF" , "YYh8wtSZ" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "gLrztrNw" ,
TCP : "4jG5casb" ,
Interval : 28767 * time . Second ,
DockerContainerID : "THW6u7rL" ,
Shell : "C1Zt3Zwh" ,
TLSSkipVerify : true ,
Timeout : 18506 * time . Second ,
TTL : 31006 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 2366 * time . Second ,
} ,
2017-09-26 08:14:14 +00:00
& structs . CheckDefinition {
2017-10-04 23:48:00 +00:00
ID : "fZaCAXww" ,
Name : "OOM2eo0f" ,
Notes : "zXzXI9Gt" ,
ServiceID : "L8G0QNmR" ,
Token : "oo4BCTgJ" ,
Status : "qLykAl5u" ,
ScriptArgs : [ ] string { "f3BemRjy" , "e5zgpef7" } ,
HTTP : "29B93haH" ,
2017-09-26 08:14:14 +00:00
Header : map [ string ] [ ] string {
"hBq0zn1q" : { "2a9o9ZKP" , "vKwA5lR6" } ,
"f3r6xFtM" : { "RyuIdDWv" , "QbxEcIUM" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "Dou0nGT5" ,
TCP : "JY6fTTcw" ,
Interval : 18714 * time . Second ,
DockerContainerID : "qF66POS9" ,
Shell : "sOnDy228" ,
TLSSkipVerify : true ,
Timeout : 5954 * time . Second ,
TTL : 30044 * time . Second ,
2017-09-26 08:14:14 +00:00
DeregisterCriticalServiceAfter : 13209 * time . Second ,
} ,
2017-09-25 18:40:42 +00:00
} ,
2019-04-26 18:25:03 +00:00
CheckUpdateInterval : 16507 * time . Second ,
ClientAddrs : [ ] * net . IPAddr { ipAddr ( "93.83.18.19" ) } ,
ConfigEntryBootstrap : [ ] structs . ConfigEntry {
& structs . ProxyConfigEntry {
Kind : structs . ProxyDefaults ,
Name : structs . ProxyConfigGlobal ,
Config : map [ string ] interface { } {
"foo" : "bar" ,
// has to be a float due to being a map[string]interface
"bar" : float64 ( 1 ) ,
} ,
} ,
} ,
2018-04-28 03:10:15 +00:00
ConnectEnabled : true ,
2018-04-25 18:34:08 +00:00
ConnectProxyBindMinPort : 2000 ,
ConnectProxyBindMaxPort : 3000 ,
2018-09-27 13:33:12 +00:00
ConnectSidecarMinPort : 8888 ,
ConnectSidecarMaxPort : 9999 ,
2018-06-16 00:59:08 +00:00
ConnectCAProvider : "consul" ,
2018-04-25 18:34:08 +00:00
ConnectCAConfig : map [ string ] interface { } {
2019-01-22 17:19:36 +00:00
"RotationPeriod" : "90h" ,
"LeafCertTTL" : "1h" ,
"CSRMaxPerSecond" : float64 ( 100 ) ,
"CSRMaxConcurrent" : float64 ( 2 ) ,
2018-04-25 18:34:08 +00:00
} ,
2018-06-12 13:54:17 +00:00
ConnectProxyAllowManagedRoot : false ,
ConnectProxyAllowManagedAPIRegistration : false ,
ConnectProxyDefaultExecMode : "script" ,
ConnectProxyDefaultDaemonCommand : [ ] string { "consul" , "connect" , "proxy" } ,
ConnectProxyDefaultScriptCommand : [ ] string { "proxyctl.sh" } ,
2018-04-26 13:01:20 +00:00
ConnectProxyDefaultConfig : map [ string ] interface { } {
"foo" : "bar" ,
"connect_timeout_ms" : float64 ( 1000 ) ,
"pedantic_mode" : true ,
} ,
2018-07-26 12:53:39 +00:00
DNSAddrs : [ ] net . Addr { tcpAddr ( "93.95.95.81:7001" ) , udpAddr ( "93.95.95.81:7001" ) } ,
DNSARecordLimit : 29907 ,
DNSAllowStale : true ,
DNSDisableCompression : true ,
DNSDomain : "7W1xXSqd" ,
DNSEnableTruncate : true ,
DNSMaxStale : 29685 * time . Second ,
DNSNodeTTL : 7084 * time . Second ,
DNSOnlyPassing : true ,
DNSPort : 7001 ,
DNSRecursorTimeout : 4427 * time . Second ,
DNSRecursors : [ ] string { "63.38.39.58" , "92.49.18.18" } ,
Added SOA configuration for DNS settings. (#4714)
This will allow to fine TUNE SOA settings sent by Consul in DNS responses,
for instance to be able to control negative ttl.
Will fix: https://github.com/hashicorp/consul/issues/4713
# Example
Override all settings:
* min_ttl: 0 => 60s
* retry: 600 (10m) => 300s (5 minutes),
* expire: 86400 (24h) => 43200 (12h)
* refresh: 3600 (1h) => 1800 (30 minutes)
```
consul agent -dev -hcl 'dns_config={soa={min_ttl=60,retry=300,expire=43200,refresh=1800}}'
```
Result:
```
dig +multiline @localhost -p 8600 service.consul
; <<>> DiG 9.12.1 <<>> +multiline @localhost -p 8600 service.consul
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 36557
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;service.consul. IN A
;; AUTHORITY SECTION:
consul. 0 IN SOA ns.consul. hostmaster.consul. (
1537959133 ; serial
1800 ; refresh (30 minutes)
300 ; retry (5 minutes)
43200 ; expire (12 hours)
60 ; minimum (1 minute)
)
;; Query time: 4 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Sep 26 12:52:13 CEST 2018
;; MSG SIZE rcvd: 93
```
2018-10-10 19:50:56 +00:00
DNSSOA : RuntimeSOAConfig { Refresh : 3600 , Retry : 600 , Expire : 86400 , Minttl : 0 } ,
2018-07-26 12:53:39 +00:00
DNSServiceTTL : map [ string ] time . Duration { "*" : 32030 * time . Second } ,
DNSUDPAnswerLimit : 29909 ,
DNSNodeMetaTXT : true ,
2019-02-25 19:06:01 +00:00
DNSUseCache : true ,
DNSCacheMaxAge : 5 * time . Minute ,
2018-07-26 12:53:39 +00:00
DataDir : dataDir ,
Datacenter : "rzo029wg" ,
DevMode : true ,
DisableAnonymousSignature : true ,
DisableCoordinates : true ,
DisableHostNodeID : true ,
DisableHTTPUnprintableCharFilter : true ,
DisableKeyringFile : true ,
DisableRemoteExec : true ,
DisableUpdateCheck : true ,
DiscardCheckOutput : true ,
DiscoveryMaxStale : 5 * time . Second ,
EnableAgentTLSForChecks : true ,
2019-04-24 13:11:08 +00:00
EnableCentralServiceConfig : true ,
2018-07-26 12:53:39 +00:00
EnableDebug : true ,
2018-10-11 12:22:11 +00:00
EnableRemoteScriptChecks : true ,
EnableLocalScriptChecks : true ,
2018-07-26 12:53:39 +00:00
EnableSyslog : true ,
EnableUI : true ,
EncryptKey : "A4wELWqH" ,
EncryptVerifyIncoming : true ,
EncryptVerifyOutgoing : true ,
2018-10-03 13:05:28 +00:00
GRPCPort : 4881 ,
GRPCAddrs : [ ] net . Addr { tcpAddr ( "32.31.61.91:4881" ) } ,
2018-07-26 12:53:39 +00:00
HTTPAddrs : [ ] net . Addr { tcpAddr ( "83.39.91.39:7999" ) } ,
HTTPBlockEndpoints : [ ] string { "RBvAFcGD" , "fWOWFznh" } ,
2019-01-10 14:27:26 +00:00
AllowWriteHTTPFrom : [ ] * net . IPNet { cidr ( "127.0.0.0/8" ) , cidr ( "22.33.44.55/32" ) , cidr ( "0.0.0.0/0" ) } ,
2018-07-26 12:53:39 +00:00
HTTPPort : 7999 ,
HTTPResponseHeaders : map [ string ] string { "M6TKa9NP" : "xjuxjOzQ" , "JRCrHZed" : "rl0mTx81" } ,
HTTPSAddrs : [ ] net . Addr { tcpAddr ( "95.17.17.19:15127" ) } ,
HTTPSPort : 15127 ,
KeyFile : "IEkkwgIA" ,
LeaveDrainTime : 8265 * time . Second ,
LeaveOnTerm : true ,
LogLevel : "k1zo9Spt" ,
NodeID : types . NodeID ( "AsUIlw99" ) ,
NodeMeta : map [ string ] string { "5mgGQMBk" : "mJLtVMSG" , "A7ynFMJB" : "0Nx6RGab" } ,
NodeName : "otlLxGaI" ,
NonVotingServer : true ,
PidFile : "43xN80Km" ,
2018-10-15 16:17:48 +00:00
PrimaryDatacenter : "ejtmd43d" ,
2018-07-26 12:53:39 +00:00
RPCAdvertiseAddr : tcpAddr ( "17.99.29.16:3757" ) ,
RPCBindAddr : tcpAddr ( "16.99.34.17:3757" ) ,
RPCHoldTimeout : 15707 * time . Second ,
RPCProtocol : 30793 ,
RPCRateLimit : 12029.43 ,
RPCMaxBurst : 44848 ,
RaftProtocol : 19016 ,
RaftSnapshotThreshold : 16384 ,
RaftSnapshotInterval : 30 * time . Second ,
ReconnectTimeoutLAN : 23739 * time . Second ,
ReconnectTimeoutWAN : 26694 * time . Second ,
RejoinAfterLeave : true ,
RetryJoinIntervalLAN : 8067 * time . Second ,
RetryJoinIntervalWAN : 28866 * time . Second ,
RetryJoinLAN : [ ] string { "pbsSFY7U" , "l0qLtWij" } ,
RetryJoinMaxAttemptsLAN : 913 ,
RetryJoinMaxAttemptsWAN : 23160 ,
RetryJoinWAN : [ ] string { "PFsR02Ye" , "rJdQIhER" } ,
SegmentName : "BC2NhTDi" ,
2017-09-25 18:40:42 +00:00
Segments : [ ] structs . NetworkSegment {
{
Name : "PExYMe2E" ,
Bind : tcpAddr ( "36.73.36.19:38295" ) ,
Advertise : tcpAddr ( "63.39.19.18:38295" ) ,
RPCListener : true ,
} ,
{
Name : "UzCvJgup" ,
Bind : tcpAddr ( "37.58.38.19:39292" ) ,
Advertise : tcpAddr ( "83.58.26.27:39292" ) ,
RPCListener : true ,
} ,
} ,
SerfPortLAN : 8301 ,
SerfPortWAN : 8302 ,
ServerMode : true ,
ServerName : "Oerr9n1G" ,
ServerPort : 3757 ,
Services : [ ] * structs . ServiceDefinition {
{
2018-09-07 14:30:47 +00:00
ID : "wI1dzxS4" ,
Name : "7IszXMQ1" ,
Tags : [ ] string { "0Zwg8l6v" , "zebELdN5" } ,
Address : "9RhqPSPB" ,
Token : "myjKJkWH" ,
Port : 72219 ,
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2017-09-25 18:40:42 +00:00
EnableTagOverride : true ,
Checks : [ ] * structs . CheckType {
& structs . CheckType {
2017-10-04 23:48:00 +00:00
CheckID : "qmfeO5if" ,
Name : "atDGP7n5" ,
Status : "pDQKEhWL" ,
Notes : "Yt8EDLev" ,
ScriptArgs : [ ] string { "81EDZLPa" , "bPY5X8xd" } ,
HTTP : "qzHYvmJO" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"UkpmZ3a3" : { "2dfzXuxZ" } ,
"cVFpko4u" : { "gGqdEB6k" , "9LsRo22u" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "X5DrovFc" ,
TCP : "ICbxkpSF" ,
Interval : 24392 * time . Second ,
DockerContainerID : "ZKXr68Yb" ,
Shell : "CEfzx0Fo" ,
TLSSkipVerify : true ,
Timeout : 38333 * time . Second ,
TTL : 57201 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 44214 * time . Second ,
} ,
} ,
2018-09-27 13:33:12 +00:00
// Note that although this SidecarService is only syntax sugar for
// registering another service, that has to happen in the agent code so
// it can make intelligent decisions about automatic port assignments
// etc. So we expect config just to pass it through verbatim.
Connect : & structs . ServiceConnect {
2018-10-04 13:08:12 +00:00
SidecarService : & structs . ServiceDefinition {
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
} ,
2018-09-27 13:33:12 +00:00
} ,
2017-09-25 18:40:42 +00:00
} ,
{
2018-09-07 14:30:47 +00:00
ID : "MRHVMZuD" ,
Name : "6L6BVfgH" ,
Tags : [ ] string { "7Ale4y6o" , "PMBW08hy" } ,
Address : "R6H6g8h0" ,
Token : "ZgY8gjMI" ,
Port : 38292 ,
Weights : & structs . Weights {
Passing : 1979 ,
Warning : 6 ,
} ,
2017-09-25 18:40:42 +00:00
EnableTagOverride : true ,
Checks : structs . CheckTypes {
& structs . CheckType {
2017-10-04 23:48:00 +00:00
CheckID : "GTti9hCo" ,
Name : "9OOS93ne" ,
Notes : "CQy86DH0" ,
Status : "P0SWDvrk" ,
ScriptArgs : [ ] string { "EXvkYIuG" , "BATOyt6h" } ,
HTTP : "u97ByEiW" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"MUlReo8L" : { "AUZG7wHG" , "gsN0Dc2N" } ,
"1UJXjVrT" : { "OJgxzTfk" , "xZZrFsq7" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "5wkAxCUE" ,
TCP : "MN3oA9D2" ,
Interval : 32718 * time . Second ,
DockerContainerID : "cU15LMet" ,
Shell : "nEz9qz2l" ,
TLSSkipVerify : true ,
Timeout : 34738 * time . Second ,
TTL : 22773 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 84282 * time . Second ,
} ,
& structs . CheckType {
2017-10-04 23:48:00 +00:00
CheckID : "UHsDeLxG" ,
Name : "PQSaPWlT" ,
Notes : "jKChDOdl" ,
Status : "5qFz6OZn" ,
ScriptArgs : [ ] string { "NMtYWlT9" , "vj74JXsm" } ,
HTTP : "1LBDJhw4" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"cXPmnv1M" : { "imDqfaBx" , "NFxZ1bQe" } ,
"vr7wY7CS" : { "EtCoNPPL" , "9vAarJ5s" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "wzByP903" ,
TCP : "2exjZIGE" ,
Interval : 5656 * time . Second ,
DockerContainerID : "5tDBWpfA" ,
Shell : "rlTpLM8s" ,
TLSSkipVerify : true ,
Timeout : 4868 * time . Second ,
TTL : 11222 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 68482 * time . Second ,
} ,
} ,
2018-06-05 17:51:05 +00:00
Connect : & structs . ServiceConnect {
2018-04-17 12:29:02 +00:00
Proxy : & structs . ServiceDefinitionConnectProxy {
ExecMode : "daemon" ,
2018-04-27 05:16:21 +00:00
Command : [ ] string { "awesome-proxy" } ,
2018-04-17 12:29:02 +00:00
Config : map [ string ] interface { } {
"foo" : "qux" ,
} ,
} ,
} ,
2017-09-25 18:40:42 +00:00
} ,
2018-07-25 18:55:41 +00:00
{
2018-09-12 16:07:47 +00:00
ID : "Kh81CPF6" ,
Name : "Kh81CPF6-proxy" ,
Port : 31471 ,
Kind : "connect-proxy" ,
Proxy : & structs . ConnectProxyConfig {
DestinationServiceName : "6L6BVfgH" ,
DestinationServiceID : "6L6BVfgH-id" ,
LocalServiceAddress : "127.0.0.2" ,
LocalServicePort : 23759 ,
Config : map [ string ] interface { } {
"cedGGtZf" : "pWrUNiWw" ,
} ,
Upstreams : structs . Upstreams {
{
DestinationType : "service" , // Default should be explicitly filled
DestinationName : "KPtAj2cb" ,
LocalBindPort : 4051 ,
Config : map [ string ] interface { } {
"kzRnZOyd" : "nUNKoL8H" ,
} ,
} ,
{
DestinationType : "prepared_query" ,
DestinationNamespace : "9nakw0td" ,
DestinationName : "KSd8HsRl" ,
LocalBindPort : 11884 ,
LocalBindAddress : "127.24.88.0" ,
} ,
} ,
} ,
2018-09-07 14:30:47 +00:00
Weights : & structs . Weights {
Passing : 1 ,
Warning : 1 ,
} ,
2018-07-25 18:55:41 +00:00
} ,
2017-09-25 18:40:42 +00:00
{
2018-09-07 14:30:47 +00:00
ID : "dLOXpSCI" ,
Name : "o1ynPkp0" ,
Tags : [ ] string { "nkwshvM5" , "NTDWn3ek" } ,
Address : "cOlSOhbp" ,
Token : "msy7iWER" ,
Meta : map [ string ] string { "mymeta" : "data" } ,
Port : 24237 ,
Weights : & structs . Weights {
Passing : 100 ,
Warning : 1 ,
} ,
2017-09-25 18:40:42 +00:00
EnableTagOverride : true ,
2018-07-25 18:55:41 +00:00
Connect : & structs . ServiceConnect {
Native : true ,
} ,
2017-09-25 18:40:42 +00:00
Checks : structs . CheckTypes {
& structs . CheckType {
2017-10-04 23:48:00 +00:00
CheckID : "Zv99e9Ka" ,
Name : "sgV4F7Pk" ,
Notes : "yP5nKbW0" ,
Status : "7oLMEyfu" ,
ScriptArgs : [ ] string { "5wEZtZpv" , "0Ihyk8cS" } ,
HTTP : "KyDjGY9H" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"gv5qefTz" : { "5Olo2pMG" , "PvvKWQU5" } ,
"SHOVq1Vv" : { "jntFhyym" , "GYJh32pp" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "T66MFBfR" ,
TCP : "bNnNfx2A" ,
Interval : 22224 * time . Second ,
DockerContainerID : "ipgdFtjd" ,
Shell : "omVZq7Sz" ,
TLSSkipVerify : true ,
Timeout : 18913 * time . Second ,
TTL : 44743 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 8482 * time . Second ,
} ,
& structs . CheckType {
2017-10-04 23:48:00 +00:00
CheckID : "G79O6Mpr" ,
Name : "IEqrzrsd" ,
Notes : "SVqApqeM" ,
Status : "XXkVoZXt" ,
ScriptArgs : [ ] string { "wD05Bvao" , "rLYB7kQC" } ,
HTTP : "kyICZsn8" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"4ebP5vL4" : { "G20SrL5Q" , "DwPKlMbo" } ,
"p2UI34Qz" : { "UsG1D0Qh" , "NHhRiB6s" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "ciYHWors" ,
TCP : "FfvCwlqH" ,
Interval : 12356 * time . Second ,
DockerContainerID : "HBndBU6R" ,
Shell : "hVI33JjA" ,
TLSSkipVerify : true ,
Timeout : 38282 * time . Second ,
TTL : 1181 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 4992 * time . Second ,
} ,
& structs . CheckType {
2017-10-04 23:48:00 +00:00
CheckID : "RMi85Dv8" ,
Name : "iehanzuq" ,
Status : "rCvn53TH" ,
Notes : "fti5lfF3" ,
ScriptArgs : [ ] string { "16WRUmwS" , "QWk7j7ae" } ,
HTTP : "dl3Fgme3" ,
2017-09-25 18:40:42 +00:00
Header : map [ string ] [ ] string {
"rjm4DEd3" : { "2m3m2Fls" } ,
"l4HwQ112" : { "fk56MNlo" , "dhLK56aZ" } ,
} ,
2018-09-12 16:07:47 +00:00
Method : "9afLm3Mj" ,
TCP : "fjiLFqVd" ,
Interval : 23926 * time . Second ,
DockerContainerID : "dO5TtRHk" ,
Shell : "e6q2ttES" ,
TLSSkipVerify : true ,
Timeout : 38483 * time . Second ,
TTL : 10943 * time . Second ,
2017-09-25 18:40:42 +00:00
DeregisterCriticalServiceAfter : 68787 * time . Second ,
} ,
} ,
} ,
} ,
2018-06-14 12:52:48 +00:00
SerfAdvertiseAddrLAN : tcpAddr ( "17.99.29.16:8301" ) ,
SerfAdvertiseAddrWAN : tcpAddr ( "78.63.37.19:8302" ) ,
SerfBindAddrLAN : tcpAddr ( "99.43.63.15:8301" ) ,
SerfBindAddrWAN : tcpAddr ( "67.88.33.19:8302" ) ,
SessionTTLMin : 26627 * time . Second ,
SkipLeaveOnInt : true ,
StartJoinAddrsLAN : [ ] string { "LR3hGDoG" , "MwVpZ4Up" } ,
StartJoinAddrsWAN : [ ] string { "EbFSc3nA" , "kwXTh623" } ,
SyslogFacility : "hHv79Uia" ,
Telemetry : lib . TelemetryConfig {
CirconusAPIApp : "p4QOTe9j" ,
CirconusAPIToken : "E3j35V23" ,
CirconusAPIURL : "mEMjHpGg" ,
CirconusBrokerID : "BHlxUhed" ,
CirconusBrokerSelectTag : "13xy1gHm" ,
CirconusCheckDisplayName : "DRSlQR6n" ,
CirconusCheckForceMetricActivation : "Ua5FGVYf" ,
CirconusCheckID : "kGorutad" ,
CirconusCheckInstanceID : "rwoOL6R4" ,
CirconusCheckSearchTag : "ovT4hT4f" ,
CirconusCheckTags : "prvO4uBl" ,
CirconusSubmissionInterval : "DolzaflP" ,
CirconusSubmissionURL : "gTcbS93G" ,
DisableHostname : true ,
DogstatsdAddr : "0wSndumK" ,
DogstatsdTags : [ ] string { "3N81zSUB" , "Xtj8AnXZ" } ,
FilterDefault : true ,
AllowedPrefixes : [ ] string { "oJotS8XJ" } ,
BlockedPrefixes : [ ] string { "cazlEhGn" } ,
MetricsPrefix : "ftO6DySn" ,
PrometheusRetentionTime : 15 * time . Second ,
StatsdAddr : "drce87cy" ,
StatsiteAddr : "HpFwKB8R" ,
} ,
TLSCipherSuites : [ ] uint16 { tls . TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 , tls . TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 } ,
TLSMinVersion : "pAOWafkR" ,
TLSPreferServerCipherSuites : true ,
2017-09-25 18:40:42 +00:00
TaggedAddresses : map [ string ] string {
"7MYgHrYH" : "dALJAhLD" ,
"h6DdBy6K" : "ebrr9zZ8" ,
"lan" : "17.99.29.16" ,
"wan" : "78.63.37.19" ,
} ,
TranslateWANAddrs : true ,
UIDir : "11IFzAUn" ,
UnixSocketUser : "E0nB1DwA" ,
UnixSocketGroup : "8pFodrV8" ,
UnixSocketMode : "E8sAwOv4" ,
VerifyIncoming : true ,
VerifyIncomingHTTPS : true ,
VerifyIncomingRPC : true ,
VerifyOutgoing : true ,
VerifyServerHostname : true ,
Watches : [ ] map [ string ] interface { } {
map [ string ] interface { } {
"type" : "key" ,
"datacenter" : "GyE6jpeW" ,
"key" : "j9lF1Tve" ,
"handler" : "90N7S4LN" ,
} ,
2017-10-04 23:48:00 +00:00
map [ string ] interface { } {
"type" : "keyprefix" ,
"datacenter" : "fYrl3F5d" ,
"key" : "sl3Dffu7" ,
"args" : [ ] interface { } { "dltjDJ2a" , "flEa7C2d" } ,
} ,
2017-09-25 18:40:42 +00:00
} ,
}
warns := [ ] string {
2018-10-15 16:17:48 +00:00
` The 'acl_datacenter' field is deprecated. Use the 'primary_datacenter' field instead. ` ,
2017-09-25 18:40:42 +00:00
` bootstrap_expect > 0: expecting 53 servers ` ,
}
// ensure that all fields are set to unique non-zero values
// todo(fs): This currently fails since ServiceDefinition.Check is not used
// todo(fs): not sure on how to work around this. Possible options are:
// todo(fs): * move first check into the Check field
// todo(fs): * ignore the Check field
// todo(fs): both feel like a hack
if err := nonZero ( "RuntimeConfig" , nil , want ) ; err != nil {
t . Log ( err )
}
for format , data := range src {
t . Run ( format , func ( t * testing . T ) {
// parse the flags since this is the only way we can set the
// DevMode flag
var flags Flags
fs := flag . NewFlagSet ( "" , flag . ContinueOnError )
AddFlags ( fs , & flags )
if err := fs . Parse ( flagSrc ) ; err != nil {
t . Fatalf ( "ParseFlags: %s" , err )
}
// ensure that all fields are set to unique non-zero values
// if err := nonZero("Config", nil, c); err != nil {
// t.Fatal(err)
// }
b , err := NewBuilder ( flags )
if err != nil {
t . Fatalf ( "NewBuilder: %s" , err )
}
2017-10-31 22:30:01 +00:00
b . Sources = append ( b . Sources , Source { Name : "full." + format , Data : data } )
2017-09-25 18:40:42 +00:00
b . Tail = append ( b . Tail , tail [ format ] ... )
b . Tail = append ( b . Tail , VersionSource ( "JNtPSav3" , "R909Hblt" , "ZT1JOQLn" ) )
// construct the runtime config
rt , err := b . Build ( )
if err != nil {
t . Fatalf ( "Build: %s" , err )
}
// verify that all fields are set
if ! verify . Values ( t , "runtime_config" , rt , want ) {
t . FailNow ( )
}
// at this point we have confirmed that the parsing worked
// for all fields but the validation will fail since certain
// combinations are not allowed. Since it is not possible to have
// all fields with non-zero values and to have a valid configuration
// we are patching a handful of safe fields to make validation pass.
rt . Bootstrap = false
rt . DevMode = false
rt . EnableUI = false
rt . SegmentName = ""
rt . Segments = nil
// validate the runtime config
if err := b . Validate ( rt ) ; err != nil {
t . Fatalf ( "Validate: %s" , err )
}
// check the warnings
if got , want := b . Warnings , warns ; ! verify . Values ( t , "warnings" , got , want ) {
t . FailNow ( )
}
} )
}
}
// nonZero verifies recursively that all fields are set to unique,
// non-zero and non-nil values.
//
// struct: check all fields recursively
// slice: check len > 0 and all values recursively
// ptr: check not nil
// bool: check not zero (cannot check uniqueness)
// string, int, uint: check not zero and unique
// other: error
func nonZero ( name string , uniq map [ interface { } ] string , v interface { } ) error {
if v == nil {
return fmt . Errorf ( "%q is nil" , name )
}
if uniq == nil {
uniq = map [ interface { } ] string { }
}
isUnique := func ( v interface { } ) error {
if other := uniq [ v ] ; other != "" {
2018-03-19 16:56:00 +00:00
return fmt . Errorf ( "%q and %q both use value %q" , name , other , v )
2017-09-25 18:40:42 +00:00
}
uniq [ v ] = name
return nil
}
val , typ := reflect . ValueOf ( v ) , reflect . TypeOf ( v )
// fmt.Printf("%s: %T\n", name, v)
switch typ . Kind ( ) {
case reflect . Struct :
for i := 0 ; i < typ . NumField ( ) ; i ++ {
f := typ . Field ( i )
fieldname := fmt . Sprintf ( "%s.%s" , name , f . Name )
err := nonZero ( fieldname , uniq , val . Field ( i ) . Interface ( ) )
if err != nil {
return err
}
}
case reflect . Slice :
if val . Len ( ) == 0 {
return fmt . Errorf ( "%q is empty slice" , name )
}
for i := 0 ; i < val . Len ( ) ; i ++ {
elemname := fmt . Sprintf ( "%s[%d]" , name , i )
err := nonZero ( elemname , uniq , val . Index ( i ) . Interface ( ) )
if err != nil {
return err
}
}
case reflect . Map :
if val . Len ( ) == 0 {
return fmt . Errorf ( "%q is empty map" , name )
}
for _ , key := range val . MapKeys ( ) {
keyname := fmt . Sprintf ( "%s[%s]" , name , key . String ( ) )
if err := nonZero ( keyname , uniq , key . Interface ( ) ) ; err != nil {
if strings . Contains ( err . Error ( ) , "is zero value" ) {
return fmt . Errorf ( "%q has zero value map key" , name )
}
return err
}
if err := nonZero ( keyname , uniq , val . MapIndex ( key ) . Interface ( ) ) ; err != nil {
return err
}
}
case reflect . Bool :
if val . Bool ( ) != true {
return fmt . Errorf ( "%q is zero value" , name )
}
// do not test bool for uniqueness since there are only two values
case reflect . String :
if val . Len ( ) == 0 {
return fmt . Errorf ( "%q is zero value" , name )
}
return isUnique ( v )
case reflect . Int , reflect . Int8 , reflect . Int16 , reflect . Int32 , reflect . Int64 :
if val . Int ( ) == 0 {
return fmt . Errorf ( "%q is zero value" , name )
}
return isUnique ( v )
case reflect . Uint , reflect . Uint8 , reflect . Uint16 , reflect . Uint32 , reflect . Uint64 :
if val . Uint ( ) == 0 {
return fmt . Errorf ( "%q is zero value" , name )
}
return isUnique ( v )
case reflect . Float32 , reflect . Float64 :
if val . Float ( ) == 0 {
return fmt . Errorf ( "%q is zero value" , name )
}
return isUnique ( v )
case reflect . Ptr :
if val . IsNil ( ) {
return fmt . Errorf ( "%q is nil" , name )
}
return nonZero ( "*" + name , uniq , val . Elem ( ) . Interface ( ) )
default :
return fmt . Errorf ( "%T is not supported" , v )
}
return nil
}
func TestNonZero ( t * testing . T ) {
var empty string
tests := [ ] struct {
desc string
v interface { }
err error
} {
{ "nil" , nil , errors . New ( ` "x" is nil ` ) } ,
{ "zero bool" , false , errors . New ( ` "x" is zero value ` ) } ,
{ "zero string" , "" , errors . New ( ` "x" is zero value ` ) } ,
{ "zero int" , int ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero int8" , int8 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero int16" , int16 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero int32" , int32 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero int64" , int64 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero uint" , uint ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero uint8" , uint8 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero uint16" , uint16 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero uint32" , uint32 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero uint64" , uint64 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero float32" , float32 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "zero float64" , float64 ( 0 ) , errors . New ( ` "x" is zero value ` ) } ,
{ "ptr to zero value" , & empty , errors . New ( ` "*x" is zero value ` ) } ,
{ "empty slice" , [ ] string { } , errors . New ( ` "x" is empty slice ` ) } ,
{ "slice with zero value" , [ ] string { "" } , errors . New ( ` "x[0]" is zero value ` ) } ,
{ "empty map" , map [ string ] string { } , errors . New ( ` "x" is empty map ` ) } ,
{ "map with zero value key" , map [ string ] string { "" : "y" } , errors . New ( ` "x" has zero value map key ` ) } ,
{ "map with zero value elem" , map [ string ] string { "y" : "" } , errors . New ( ` "x[y]" is zero value ` ) } ,
{ "struct with nil field" , struct { Y * int } { } , errors . New ( ` "x.Y" is nil ` ) } ,
{ "struct with zero value field" , struct { Y string } { } , errors . New ( ` "x.Y" is zero value ` ) } ,
{ "struct with empty array" , struct { Y [ ] string } { } , errors . New ( ` "x.Y" is empty slice ` ) } ,
}
for _ , tt := range tests {
t . Run ( tt . desc , func ( t * testing . T ) {
if got , want := nonZero ( "x" , nil , tt . v ) , tt . err ; ! reflect . DeepEqual ( got , want ) {
t . Fatalf ( "got error %v want %v" , got , want )
}
} )
}
}
func TestConfigDecodeBytes ( t * testing . T ) {
t . Parallel ( )
// Test with some input
src := [ ] byte ( "abc" )
key := base64 . StdEncoding . EncodeToString ( src )
result , err := decodeBytes ( key )
if err != nil {
t . Fatalf ( "err: %s" , err )
}
if ! bytes . Equal ( src , result ) {
t . Fatalf ( "bad: %#v" , result )
}
// Test with no input
result , err = decodeBytes ( "" )
if err != nil {
t . Fatalf ( "err: %s" , err )
}
if len ( result ) > 0 {
t . Fatalf ( "bad: %#v" , result )
}
}
func TestSanitize ( t * testing . T ) {
rt := RuntimeConfig {
2017-09-27 18:47:40 +00:00
BindAddr : & net . IPAddr { IP : net . ParseIP ( "127.0.0.1" ) } ,
SerfAdvertiseAddrLAN : & net . TCPAddr { IP : net . ParseIP ( "1.2.3.4" ) , Port : 5678 } ,
DNSAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "1.2.3.4" ) , Port : 5678 } ,
& net . UDPAddr { IP : net . ParseIP ( "1.2.3.4" ) , Port : 5678 } ,
} ,
Added SOA configuration for DNS settings. (#4714)
This will allow to fine TUNE SOA settings sent by Consul in DNS responses,
for instance to be able to control negative ttl.
Will fix: https://github.com/hashicorp/consul/issues/4713
# Example
Override all settings:
* min_ttl: 0 => 60s
* retry: 600 (10m) => 300s (5 minutes),
* expire: 86400 (24h) => 43200 (12h)
* refresh: 3600 (1h) => 1800 (30 minutes)
```
consul agent -dev -hcl 'dns_config={soa={min_ttl=60,retry=300,expire=43200,refresh=1800}}'
```
Result:
```
dig +multiline @localhost -p 8600 service.consul
; <<>> DiG 9.12.1 <<>> +multiline @localhost -p 8600 service.consul
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 36557
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;service.consul. IN A
;; AUTHORITY SECTION:
consul. 0 IN SOA ns.consul. hostmaster.consul. (
1537959133 ; serial
1800 ; refresh (30 minutes)
300 ; retry (5 minutes)
43200 ; expire (12 hours)
60 ; minimum (1 minute)
)
;; Query time: 4 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Sep 26 12:52:13 CEST 2018
;; MSG SIZE rcvd: 93
```
2018-10-10 19:50:56 +00:00
DNSSOA : RuntimeSOAConfig { Refresh : 3600 , Retry : 600 , Expire : 86400 , Minttl : 0 } ,
2017-09-27 18:47:40 +00:00
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "1.2.3.4" ) , Port : 5678 } ,
& net . UnixAddr { Name : "/var/run/foo" } ,
} ,
ConsulCoordinateUpdatePeriod : 15 * time . Second ,
2017-09-25 18:40:42 +00:00
RetryJoinLAN : [ ] string {
"foo=bar key=baz secret=boom bang=bar" ,
} ,
RetryJoinWAN : [ ] string {
"wan_foo=bar wan_key=baz wan_secret=boom wan_bang=bar" ,
} ,
2017-09-27 18:47:40 +00:00
Services : [ ] * structs . ServiceDefinition {
& structs . ServiceDefinition {
Name : "foo" ,
Token : "bar" ,
Check : structs . CheckType {
Name : "blurb" ,
} ,
2018-09-07 14:30:47 +00:00
Weights : & structs . Weights {
Passing : 67 ,
Warning : 3 ,
} ,
2017-09-27 18:47:40 +00:00
} ,
2017-09-25 18:40:42 +00:00
} ,
2017-09-27 18:47:40 +00:00
Checks : [ ] * structs . CheckDefinition {
& structs . CheckDefinition {
Name : "zoo" ,
Token : "zope" ,
} ,
2017-09-25 18:40:42 +00:00
} ,
}
2017-09-27 18:47:40 +00:00
rtJSON := ` {
2018-08-29 20:56:58 +00:00
"ACLAgentMasterToken" : "hidden" ,
"ACLAgentToken" : "hidden" ,
"ACLDatacenter" : "" ,
"ACLDefaultPolicy" : "" ,
"ACLDisabledTTL" : "0s" ,
"ACLDownPolicy" : "" ,
"ACLEnableKeyListPolicy" : false ,
2019-02-27 19:28:31 +00:00
"ACLEnableTokenPersistence" : false ,
2018-08-29 20:56:58 +00:00
"ACLEnforceVersion8" : false ,
"ACLMasterToken" : "hidden" ,
2018-10-19 16:04:07 +00:00
"ACLPolicyTTL" : "0s" ,
2018-08-29 20:56:58 +00:00
"ACLReplicationToken" : "hidden" ,
2019-04-15 20:43:19 +00:00
"ACLRoleTTL" : "0s" ,
2018-10-19 16:04:07 +00:00
"ACLTokenReplication" : false ,
"ACLTokenTTL" : "0s" ,
2018-08-29 20:56:58 +00:00
"ACLToken" : "hidden" ,
2018-10-19 16:04:07 +00:00
"ACLsEnabled" : false ,
2018-08-29 20:56:58 +00:00
"AEInterval" : "0s" ,
"AdvertiseAddrLAN" : "" ,
"AdvertiseAddrWAN" : "" ,
"AutopilotCleanupDeadServers" : false ,
"AutopilotDisableUpgradeMigration" : false ,
"AutopilotLastContactThreshold" : "0s" ,
"AutopilotMaxTrailingLogs" : 0 ,
"AutopilotRedundancyZoneTag" : "" ,
"AutopilotServerStabilizationTime" : "0s" ,
"AutopilotUpgradeVersionTag" : "" ,
"BindAddr" : "127.0.0.1" ,
"Bootstrap" : false ,
"BootstrapExpect" : 0 ,
"CAFile" : "" ,
"CAPath" : "" ,
"CertFile" : "" ,
"CheckDeregisterIntervalMin" : "0s" ,
"CheckReapInterval" : "0s" ,
"CheckUpdateInterval" : "0s" ,
"Checks" : [ {
"AliasNode" : "" ,
"AliasService" : "" ,
"DeregisterCriticalServiceAfter" : "0s" ,
"DockerContainerID" : "" ,
"GRPC" : "" ,
"GRPCUseTLS" : false ,
"HTTP" : "" ,
"Header" : { } ,
"ID" : "" ,
"Interval" : "0s" ,
"Method" : "" ,
"Name" : "zoo" ,
"Notes" : "" ,
"ScriptArgs" : [ ] ,
"ServiceID" : "" ,
"Shell" : "" ,
"Status" : "" ,
"TCP" : "" ,
"TLSSkipVerify" : false ,
"TTL" : "0s" ,
"Timeout" : "0s" ,
"Token" : "hidden"
} ] ,
"ClientAddrs" : [ ] ,
2019-04-26 18:25:03 +00:00
"ConfigEntryBootstrap" : [ ] ,
2018-08-29 20:56:58 +00:00
"ConnectCAConfig" : { } ,
"ConnectCAProvider" : "" ,
"ConnectEnabled" : false ,
"ConnectProxyAllowManagedAPIRegistration" : false ,
"ConnectProxyAllowManagedRoot" : false ,
"ConnectProxyBindMaxPort" : 0 ,
"ConnectProxyBindMinPort" : 0 ,
"ConnectProxyDefaultConfig" : { } ,
"ConnectProxyDefaultDaemonCommand" : [ ] ,
"ConnectProxyDefaultExecMode" : "" ,
"ConnectProxyDefaultScriptCommand" : [ ] ,
2018-09-27 13:33:12 +00:00
"ConnectSidecarMaxPort" : 0 ,
"ConnectSidecarMinPort" : 0 ,
2019-01-10 12:46:11 +00:00
"ConnectTestCALeafRootChangeSpread" : "0s" ,
2018-08-29 20:56:58 +00:00
"ConnectTestDisableManagedProxies" : false ,
"ConsulCoordinateUpdateBatchSize" : 0 ,
"ConsulCoordinateUpdateMaxBatches" : 0 ,
"ConsulCoordinateUpdatePeriod" : "15s" ,
"ConsulRaftElectionTimeout" : "0s" ,
"ConsulRaftHeartbeatTimeout" : "0s" ,
"ConsulRaftLeaderLeaseTimeout" : "0s" ,
"GossipLANGossipInterval" : "0s" ,
"GossipLANGossipNodes" : 0 ,
"GossipLANProbeInterval" : "0s" ,
"GossipLANProbeTimeout" : "0s" ,
"GossipLANRetransmitMult" : 0 ,
"GossipLANSuspicionMult" : 0 ,
"GossipWANGossipInterval" : "0s" ,
"GossipWANGossipNodes" : 0 ,
"GossipWANProbeInterval" : "0s" ,
"GossipWANProbeTimeout" : "0s" ,
"GossipWANRetransmitMult" : 0 ,
"GossipWANSuspicionMult" : 0 ,
"ConsulServerHealthInterval" : "0s" ,
"DNSARecordLimit" : 0 ,
"DNSAddrs" : [
"tcp://1.2.3.4:5678" ,
"udp://1.2.3.4:5678"
] ,
"DNSAllowStale" : false ,
"DNSDisableCompression" : false ,
"DNSDomain" : "" ,
"DNSEnableTruncate" : false ,
"DNSMaxStale" : "0s" ,
"DNSNodeMetaTXT" : false ,
"DNSNodeTTL" : "0s" ,
"DNSOnlyPassing" : false ,
"DNSPort" : 0 ,
"DNSRecursorTimeout" : "0s" ,
"DNSRecursors" : [ ] ,
"DNSServiceTTL" : { } ,
Added SOA configuration for DNS settings. (#4714)
This will allow to fine TUNE SOA settings sent by Consul in DNS responses,
for instance to be able to control negative ttl.
Will fix: https://github.com/hashicorp/consul/issues/4713
# Example
Override all settings:
* min_ttl: 0 => 60s
* retry: 600 (10m) => 300s (5 minutes),
* expire: 86400 (24h) => 43200 (12h)
* refresh: 3600 (1h) => 1800 (30 minutes)
```
consul agent -dev -hcl 'dns_config={soa={min_ttl=60,retry=300,expire=43200,refresh=1800}}'
```
Result:
```
dig +multiline @localhost -p 8600 service.consul
; <<>> DiG 9.12.1 <<>> +multiline @localhost -p 8600 service.consul
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 36557
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;service.consul. IN A
;; AUTHORITY SECTION:
consul. 0 IN SOA ns.consul. hostmaster.consul. (
1537959133 ; serial
1800 ; refresh (30 minutes)
300 ; retry (5 minutes)
43200 ; expire (12 hours)
60 ; minimum (1 minute)
)
;; Query time: 4 msec
;; SERVER: 127.0.0.1#8600(127.0.0.1)
;; WHEN: Wed Sep 26 12:52:13 CEST 2018
;; MSG SIZE rcvd: 93
```
2018-10-10 19:50:56 +00:00
"DNSSOA" : {
"Refresh" : 3600 ,
"Retry" : 600 ,
"Expire" : 86400 ,
"Minttl" : 0
} ,
2018-08-29 20:56:58 +00:00
"DNSUDPAnswerLimit" : 0 ,
2019-02-25 19:06:01 +00:00
"DNSUseCache" : false ,
"DNSCacheMaxAge" : "0s" ,
2018-08-29 20:56:58 +00:00
"DataDir" : "" ,
"Datacenter" : "" ,
"DevMode" : false ,
"DisableAnonymousSignature" : false ,
"DisableCoordinates" : false ,
"DisableHTTPUnprintableCharFilter" : false ,
"DisableHostNodeID" : false ,
"DisableKeyringFile" : false ,
"DisableRemoteExec" : false ,
"DisableUpdateCheck" : false ,
"DiscardCheckOutput" : false ,
"DiscoveryMaxStale" : "0s" ,
"EnableAgentTLSForChecks" : false ,
"EnableDebug" : false ,
2019-04-24 13:11:08 +00:00
"EnableCentralServiceConfig" : false ,
2018-10-11 12:22:11 +00:00
"EnableLocalScriptChecks" : false ,
"EnableRemoteScriptChecks" : false ,
2018-08-29 20:56:58 +00:00
"EnableSyslog" : false ,
"EnableUI" : false ,
"EncryptKey" : "hidden" ,
"EncryptVerifyIncoming" : false ,
"EncryptVerifyOutgoing" : false ,
2018-10-03 13:05:28 +00:00
"GRPCAddrs" : [ ] ,
"GRPCPort" : 0 ,
2018-08-29 20:56:58 +00:00
"HTTPAddrs" : [
"tcp://1.2.3.4:5678" ,
"unix:///var/run/foo"
] ,
"HTTPBlockEndpoints" : [ ] ,
"HTTPPort" : 0 ,
"HTTPResponseHeaders" : { } ,
"HTTPSAddrs" : [ ] ,
"HTTPSPort" : 0 ,
"KeyFile" : "hidden" ,
"LeaveDrainTime" : "0s" ,
"LeaveOnTerm" : false ,
"LogLevel" : "" ,
"LogFile" : "" ,
"LogRotateBytes" : 0 ,
"LogRotateDuration" : "0s" ,
"NodeID" : "" ,
"NodeMeta" : { } ,
"NodeName" : "" ,
"NonVotingServer" : false ,
"PidFile" : "" ,
2018-10-15 16:17:48 +00:00
"PrimaryDatacenter" : "" ,
2018-08-29 20:56:58 +00:00
"RPCAdvertiseAddr" : "" ,
"RPCBindAddr" : "" ,
"RPCHoldTimeout" : "0s" ,
"RPCMaxBurst" : 0 ,
"RPCProtocol" : 0 ,
"RPCRateLimit" : 0 ,
"RaftProtocol" : 0 ,
"RaftSnapshotInterval" : "0s" ,
"RaftSnapshotThreshold" : 0 ,
"ReconnectTimeoutLAN" : "0s" ,
"ReconnectTimeoutWAN" : "0s" ,
"RejoinAfterLeave" : false ,
"RetryJoinIntervalLAN" : "0s" ,
"RetryJoinIntervalWAN" : "0s" ,
"RetryJoinLAN" : [
"foo=bar key=hidden secret=hidden bang=bar"
] ,
"RetryJoinMaxAttemptsLAN" : 0 ,
"RetryJoinMaxAttemptsWAN" : 0 ,
"RetryJoinWAN" : [
"wan_foo=bar wan_key=hidden wan_secret=hidden wan_bang=bar"
] ,
"Revision" : "" ,
"SegmentLimit" : 0 ,
"SegmentName" : "" ,
"SegmentNameLimit" : 0 ,
"Segments" : [ ] ,
"SerfAdvertiseAddrLAN" : "tcp://1.2.3.4:5678" ,
"SerfAdvertiseAddrWAN" : "" ,
"SerfBindAddrLAN" : "" ,
"SerfBindAddrWAN" : "" ,
"SerfPortLAN" : 0 ,
"SerfPortWAN" : 0 ,
"ServerMode" : false ,
"ServerName" : "" ,
"ServerPort" : 0 ,
"Services" : [ {
"Address" : "" ,
"Check" : {
"AliasNode" : "" ,
"AliasService" : "" ,
"CheckID" : "" ,
"DeregisterCriticalServiceAfter" : "0s" ,
"DockerContainerID" : "" ,
"GRPC" : "" ,
"GRPCUseTLS" : false ,
"HTTP" : "" ,
"Header" : { } ,
"Interval" : "0s" ,
"Method" : "" ,
"Name" : "blurb" ,
"Notes" : "" ,
"ScriptArgs" : [ ] ,
"Shell" : "" ,
"Status" : "" ,
"TCP" : "" ,
"TLSSkipVerify" : false ,
"TTL" : "0s" ,
"Timeout" : "0s"
} ,
"Checks" : [ ] ,
"Connect" : null ,
"EnableTagOverride" : false ,
"ID" : "" ,
"Kind" : "" ,
"Meta" : { } ,
"Name" : "foo" ,
"Port" : 0 ,
2018-09-12 16:07:47 +00:00
"Proxy" : null ,
2018-08-29 20:56:58 +00:00
"ProxyDestination" : "" ,
"Tags" : [ ] ,
2018-09-07 14:30:47 +00:00
"Token" : "hidden" ,
"Weights" : {
"Passing" : 67 ,
"Warning" : 3
}
2018-08-29 20:56:58 +00:00
} ] ,
"SessionTTLMin" : "0s" ,
"SkipLeaveOnInt" : false ,
"StartJoinAddrsLAN" : [ ] ,
"StartJoinAddrsWAN" : [ ] ,
"SyncCoordinateIntervalMin" : "0s" ,
"SyncCoordinateRateTarget" : 0 ,
"SyslogFacility" : "" ,
"TLSCipherSuites" : [ ] ,
"TLSMinVersion" : "" ,
"TLSPreferServerCipherSuites" : false ,
"TaggedAddresses" : { } ,
"Telemetry" : {
"AllowedPrefixes" : [ ] ,
"BlockedPrefixes" : [ ] ,
"CirconusAPIApp" : "" ,
"CirconusAPIToken" : "hidden" ,
"CirconusAPIURL" : "" ,
"CirconusBrokerID" : "" ,
"CirconusBrokerSelectTag" : "" ,
"CirconusCheckDisplayName" : "" ,
"CirconusCheckForceMetricActivation" : "" ,
"CirconusCheckID" : "" ,
"CirconusCheckInstanceID" : "" ,
"CirconusCheckSearchTag" : "" ,
"CirconusCheckTags" : "" ,
"CirconusSubmissionInterval" : "" ,
"CirconusSubmissionURL" : "" ,
"DisableHostname" : false ,
"DogstatsdAddr" : "" ,
"DogstatsdTags" : [ ] ,
"FilterDefault" : false ,
"MetricsPrefix" : "" ,
"PrometheusRetentionTime" : "0s" ,
"StatsdAddr" : "" ,
"StatsiteAddr" : ""
} ,
"TranslateWANAddrs" : false ,
"UIDir" : "" ,
"UnixSocketGroup" : "" ,
"UnixSocketMode" : "" ,
"UnixSocketUser" : "" ,
"VerifyIncoming" : false ,
"VerifyIncomingHTTPS" : false ,
"VerifyIncomingRPC" : false ,
"VerifyOutgoing" : false ,
"VerifyServerHostname" : false ,
"Version" : "" ,
"VersionPrerelease" : "" ,
2019-01-10 14:27:26 +00:00
"Watches" : [ ] ,
"AllowWriteHTTPFrom" : [ ]
2018-08-29 20:56:58 +00:00
} `
2017-09-27 18:47:40 +00:00
b , err := json . MarshalIndent ( rt . Sanitized ( ) , "" , " " )
if err != nil {
t . Fatal ( err )
}
2018-06-14 12:52:48 +00:00
require . JSONEq ( t , rtJSON , string ( b ) )
2017-09-25 18:40:42 +00:00
}
2018-07-11 21:25:36 +00:00
func TestRuntime_apiAddresses ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.1" ) , Port : 5678 } ,
& net . UnixAddr { Name : "/var/run/foo" } ,
} ,
HTTPSAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.2" ) , Port : 5678 } ,
} }
unixAddrs , httpAddrs , httpsAddrs := rt . apiAddresses ( 1 )
require . Len ( t , unixAddrs , 1 )
require . Len ( t , httpAddrs , 1 )
require . Len ( t , httpsAddrs , 1 )
require . Equal ( t , "/var/run/foo" , unixAddrs [ 0 ] )
require . Equal ( t , "198.18.0.1:5678" , httpAddrs [ 0 ] )
require . Equal ( t , "198.18.0.2:5678" , httpsAddrs [ 0 ] )
}
func TestRuntime_APIConfigHTTPS ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.1" ) , Port : 5678 } ,
& net . UnixAddr { Name : "/var/run/foo" } ,
} ,
HTTPSAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.2" ) , Port : 5678 } ,
} ,
2018-07-12 11:49:23 +00:00
Datacenter : "dc-test" ,
CAFile : "/etc/consul/ca.crt" ,
CAPath : "/etc/consul/ca.dir" ,
CertFile : "/etc/consul/server.crt" ,
KeyFile : "/etc/consul/ssl/server.key" ,
VerifyOutgoing : false ,
2018-07-11 21:25:36 +00:00
}
cfg , err := rt . APIConfig ( false )
require . NoError ( t , err )
require . Equal ( t , "198.18.0.2:5678" , cfg . Address )
require . Equal ( t , "https" , cfg . Scheme )
require . Equal ( t , rt . CAFile , cfg . TLSConfig . CAFile )
require . Equal ( t , rt . CAPath , cfg . TLSConfig . CAPath )
require . Equal ( t , "" , cfg . TLSConfig . CertFile )
require . Equal ( t , "" , cfg . TLSConfig . KeyFile )
require . Equal ( t , rt . Datacenter , cfg . Datacenter )
2018-07-12 11:49:23 +00:00
require . Equal ( t , true , cfg . TLSConfig . InsecureSkipVerify )
2018-07-11 21:25:36 +00:00
2018-07-12 11:49:23 +00:00
rt . VerifyOutgoing = true
2018-07-11 21:25:36 +00:00
cfg , err = rt . APIConfig ( true )
require . NoError ( t , err )
require . Equal ( t , "198.18.0.2:5678" , cfg . Address )
require . Equal ( t , "https" , cfg . Scheme )
require . Equal ( t , rt . CAFile , cfg . TLSConfig . CAFile )
require . Equal ( t , rt . CAPath , cfg . TLSConfig . CAPath )
require . Equal ( t , rt . CertFile , cfg . TLSConfig . CertFile )
require . Equal ( t , rt . KeyFile , cfg . TLSConfig . KeyFile )
require . Equal ( t , rt . Datacenter , cfg . Datacenter )
2018-07-12 11:49:23 +00:00
require . Equal ( t , false , cfg . TLSConfig . InsecureSkipVerify )
2018-07-11 21:25:36 +00:00
}
func TestRuntime_APIConfigHTTP ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . UnixAddr { Name : "/var/run/foo" } ,
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.1" ) , Port : 5678 } ,
} ,
Datacenter : "dc-test" ,
}
cfg , err := rt . APIConfig ( false )
require . NoError ( t , err )
require . Equal ( t , rt . Datacenter , cfg . Datacenter )
require . Equal ( t , "198.18.0.1:5678" , cfg . Address )
require . Equal ( t , "http" , cfg . Scheme )
require . Equal ( t , "" , cfg . TLSConfig . CAFile )
require . Equal ( t , "" , cfg . TLSConfig . CAPath )
require . Equal ( t , "" , cfg . TLSConfig . CertFile )
require . Equal ( t , "" , cfg . TLSConfig . KeyFile )
}
func TestRuntime_APIConfigUNIX ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . UnixAddr { Name : "/var/run/foo" } ,
} ,
Datacenter : "dc-test" ,
}
cfg , err := rt . APIConfig ( false )
require . NoError ( t , err )
require . Equal ( t , rt . Datacenter , cfg . Datacenter )
require . Equal ( t , "unix:///var/run/foo" , cfg . Address )
require . Equal ( t , "http" , cfg . Scheme )
require . Equal ( t , "" , cfg . TLSConfig . CAFile )
require . Equal ( t , "" , cfg . TLSConfig . CAPath )
require . Equal ( t , "" , cfg . TLSConfig . CertFile )
require . Equal ( t , "" , cfg . TLSConfig . KeyFile )
}
2018-07-16 20:30:15 +00:00
func TestRuntime_APIConfigANYAddrV4 ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "0.0.0.0" ) , Port : 5678 } ,
} ,
Datacenter : "dc-test" ,
}
cfg , err := rt . APIConfig ( false )
require . NoError ( t , err )
require . Equal ( t , rt . Datacenter , cfg . Datacenter )
require . Equal ( t , "127.0.0.1:5678" , cfg . Address )
require . Equal ( t , "http" , cfg . Scheme )
require . Equal ( t , "" , cfg . TLSConfig . CAFile )
require . Equal ( t , "" , cfg . TLSConfig . CAPath )
require . Equal ( t , "" , cfg . TLSConfig . CertFile )
require . Equal ( t , "" , cfg . TLSConfig . KeyFile )
}
func TestRuntime_APIConfigANYAddrV6 ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "::" ) , Port : 5678 } ,
} ,
Datacenter : "dc-test" ,
}
cfg , err := rt . APIConfig ( false )
require . NoError ( t , err )
require . Equal ( t , rt . Datacenter , cfg . Datacenter )
require . Equal ( t , "[::1]:5678" , cfg . Address )
require . Equal ( t , "http" , cfg . Scheme )
require . Equal ( t , "" , cfg . TLSConfig . CAFile )
require . Equal ( t , "" , cfg . TLSConfig . CAPath )
require . Equal ( t , "" , cfg . TLSConfig . CertFile )
require . Equal ( t , "" , cfg . TLSConfig . KeyFile )
}
func TestRuntime_ClientAddress ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "::" ) , Port : 5678 } ,
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.1" ) , Port : 5679 } ,
& net . UnixAddr { Name : "/var/run/foo" , Net : "unix" } ,
} ,
HTTPSAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "::" ) , Port : 5688 } ,
& net . TCPAddr { IP : net . ParseIP ( "198.18.0.1" ) , Port : 5689 } ,
} ,
}
unix , http , https := rt . ClientAddress ( )
require . Equal ( t , "unix:///var/run/foo" , unix )
require . Equal ( t , "198.18.0.1:5679" , http )
require . Equal ( t , "198.18.0.1:5689" , https )
}
func TestRuntime_ClientAddressAnyV4 ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "0.0.0.0" ) , Port : 5678 } ,
& net . UnixAddr { Name : "/var/run/foo" , Net : "unix" } ,
} ,
HTTPSAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "0.0.0.0" ) , Port : 5688 } ,
} ,
}
unix , http , https := rt . ClientAddress ( )
require . Equal ( t , "unix:///var/run/foo" , unix )
require . Equal ( t , "127.0.0.1:5678" , http )
require . Equal ( t , "127.0.0.1:5688" , https )
}
func TestRuntime_ClientAddressAnyV6 ( t * testing . T ) {
rt := RuntimeConfig {
HTTPAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "::" ) , Port : 5678 } ,
& net . UnixAddr { Name : "/var/run/foo" , Net : "unix" } ,
} ,
HTTPSAddrs : [ ] net . Addr {
& net . TCPAddr { IP : net . ParseIP ( "::" ) , Port : 5688 } ,
} ,
}
unix , http , https := rt . ClientAddress ( )
require . Equal ( t , "unix:///var/run/foo" , unix )
require . Equal ( t , "[::1]:5678" , http )
require . Equal ( t , "[::1]:5688" , https )
}
2019-02-26 15:52:07 +00:00
func TestRuntime_ToTLSUtilConfig ( t * testing . T ) {
c := & RuntimeConfig {
VerifyIncoming : true ,
VerifyIncomingRPC : true ,
VerifyIncomingHTTPS : true ,
VerifyOutgoing : true ,
2019-03-13 09:29:06 +00:00
VerifyServerHostname : true ,
2019-02-26 15:52:07 +00:00
CAFile : "a" ,
CAPath : "b" ,
CertFile : "c" ,
KeyFile : "d" ,
NodeName : "e" ,
ServerName : "f" ,
2019-03-19 21:35:19 +00:00
DNSDomain : "g" ,
2019-02-26 15:52:07 +00:00
TLSMinVersion : "tls12" ,
TLSCipherSuites : [ ] uint16 { tls . TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305 } ,
TLSPreferServerCipherSuites : true ,
EnableAgentTLSForChecks : true ,
}
r := c . ToTLSUtilConfig ( )
require . Equal ( t , c . VerifyIncoming , r . VerifyIncoming )
require . Equal ( t , c . VerifyIncomingRPC , r . VerifyIncomingRPC )
require . Equal ( t , c . VerifyIncomingHTTPS , r . VerifyIncomingHTTPS )
require . Equal ( t , c . VerifyOutgoing , r . VerifyOutgoing )
2019-03-13 09:29:06 +00:00
require . Equal ( t , c . VerifyServerHostname , r . VerifyServerHostname )
2019-02-26 15:52:07 +00:00
require . Equal ( t , c . CAFile , r . CAFile )
require . Equal ( t , c . CAPath , r . CAPath )
require . Equal ( t , c . CertFile , r . CertFile )
require . Equal ( t , c . KeyFile , r . KeyFile )
require . Equal ( t , c . NodeName , r . NodeName )
require . Equal ( t , c . ServerName , r . ServerName )
2019-03-19 21:35:19 +00:00
require . Equal ( t , c . DNSDomain , r . Domain )
2019-02-26 15:52:07 +00:00
require . Equal ( t , c . TLSMinVersion , r . TLSMinVersion )
require . Equal ( t , c . TLSCipherSuites , r . CipherSuites )
require . Equal ( t , c . TLSPreferServerCipherSuites , r . PreferServerCipherSuites )
require . Equal ( t , c . EnableAgentTLSForChecks , r . EnableAgentTLSForChecks )
}
2019-04-30 18:43:32 +00:00
func TestReadPath ( t * testing . T ) {
dataDir := testutil . TempDir ( t , "consul" )
defer os . RemoveAll ( dataDir )
2019-04-30 19:28:02 +00:00
tt := [ ] struct {
name string
pre func ( )
args [ ] string
2019-04-30 18:43:32 +00:00
expect int
} {
{
name : "dir skip non json or hcl if config-format not set" ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.d/conf.json" ) , [ ] byte ( ` { } ` ) )
writeFile ( filepath . Join ( dataDir , "conf.d/conf.foobar" ) , [ ] byte ( ` { } ` ) )
} ,
args : [ ] string {
2019-04-30 19:28:02 +00:00
` -config-dir ` , filepath . Join ( dataDir , "conf.d" ) ,
} ,
2019-04-30 18:43:32 +00:00
expect : 1 ,
} ,
{
name : "dir read non json or hcl if config-format set" ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.d/conf.json" ) , [ ] byte ( ` { } ` ) )
writeFile ( filepath . Join ( dataDir , "conf.d/conf.foobar" ) , [ ] byte ( ` { } ` ) )
} ,
args : [ ] string {
2019-04-30 19:28:02 +00:00
` -config-dir ` , filepath . Join ( dataDir , "conf.d" ) ,
` -config-format ` , "json" ,
} ,
2019-04-30 18:43:32 +00:00
expect : 2 ,
} ,
{
name : "file skip non json or hcl if config-format not set" ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.d/conf.foobar" ) , [ ] byte ( ` { } ` ) )
} ,
args : [ ] string {
2019-04-30 19:28:02 +00:00
` -config-file ` , filepath . Join ( dataDir , "conf.d" ) ,
} ,
2019-04-30 18:43:32 +00:00
expect : 0 ,
} ,
{
name : "file read non json or hcl if config-format set" ,
pre : func ( ) {
writeFile ( filepath . Join ( dataDir , "conf.d/conf.foobar" ) , [ ] byte ( ` { } ` ) )
} ,
args : [ ] string {
2019-04-30 19:28:02 +00:00
` -config-file ` , filepath . Join ( dataDir , "conf.d" ) ,
` -config-format ` , "json" ,
} ,
2019-04-30 18:43:32 +00:00
expect : 1 ,
} ,
}
for _ , tc := range tt {
cleanDir ( dataDir )
2019-04-30 19:28:02 +00:00
t . Run ( tc . name , func ( t * testing . T ) {
2019-04-30 18:43:32 +00:00
flags := Flags { }
fs := flag . NewFlagSet ( "" , flag . ContinueOnError )
AddFlags ( fs , & flags )
err := fs . Parse ( tc . args )
if err != nil {
t . Fatalf ( "ParseFlags failed: %s" , err )
}
flags . Args = fs . Args ( )
// write cfg files
tc . pre ( )
// Then create a builder with the flags.
b , err := NewBuilder ( flags )
if err != nil {
t . Fatal ( "NewBuilder" , err )
}
got := len ( b . Sources )
if tc . expect != got {
t . Fatalf ( "expected %d sources, got %d" , tc . expect , got )
}
} )
}
}
2017-09-25 18:40:42 +00:00
func splitIPPort ( hostport string ) ( net . IP , int ) {
h , p , err := net . SplitHostPort ( hostport )
if err != nil {
panic ( err )
}
port , err := strconv . Atoi ( p )
if err != nil {
panic ( err )
}
return net . ParseIP ( h ) , port
}
func ipAddr ( addr string ) * net . IPAddr {
return & net . IPAddr { IP : net . ParseIP ( addr ) }
}
func tcpAddr ( addr string ) * net . TCPAddr {
ip , port := splitIPPort ( addr )
return & net . TCPAddr { IP : ip , Port : port }
}
func udpAddr ( addr string ) * net . UDPAddr {
ip , port := splitIPPort ( addr )
return & net . UDPAddr { IP : ip , Port : port }
}
func unixAddr ( addr string ) * net . UnixAddr {
if ! strings . HasPrefix ( addr , "unix://" ) {
panic ( "not a unix socket addr: " + addr )
}
return & net . UnixAddr { Net : "unix" , Name : addr [ len ( "unix://" ) : ] }
}
func writeFile ( path string , data [ ] byte ) {
if err := os . MkdirAll ( filepath . Dir ( path ) , 0750 ) ; err != nil {
panic ( err )
}
if err := ioutil . WriteFile ( path , data , 0640 ) ; err != nil {
panic ( err )
}
}
2017-10-31 22:30:01 +00:00
func cleanDir ( path string ) {
root := path
err := filepath . Walk ( root , func ( path string , info os . FileInfo , err error ) error {
if path == root {
return nil
}
return os . RemoveAll ( path )
} )
if err != nil {
panic ( err )
}
}
2017-09-25 18:40:42 +00:00
func randomString ( n int ) string {
s := ""
for ; n > 0 ; n -- {
s += "x"
}
return s
}
func metaPairs ( n int , format string ) string {
var s [ ] string
for i := 0 ; i < n ; i ++ {
switch format {
case "json" :
s = append ( s , fmt . Sprintf ( ` "%d":"%d" ` , i , i ) )
case "hcl" :
s = append ( s , fmt . Sprintf ( ` "%d"="%d" ` , i , i ) )
default :
panic ( "invalid format: " + format )
}
}
switch format {
case "json" :
return strings . Join ( s , "," )
case "hcl" :
return strings . Join ( s , " " )
default :
panic ( "invalid format: " + format )
}
}