github.com/sl1pm4t/consul@v1.4.5-0.20190325224627-74c31c540f9c/agent/config/config.go (about) 1 package config 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strings" 7 8 multierror "github.com/hashicorp/go-multierror" 9 "github.com/hashicorp/hcl" 10 "github.com/mitchellh/mapstructure" 11 ) 12 13 const ( 14 SerfLANKeyring = "serf/local.keyring" 15 SerfWANKeyring = "serf/remote.keyring" 16 ) 17 18 type Source struct { 19 Name string 20 Format string 21 Data string 22 } 23 24 func FormatFrom(name string) string { 25 switch { 26 case strings.HasSuffix(name, ".json"): 27 return "json" 28 case strings.HasSuffix(name, ".hcl"): 29 return "hcl" 30 default: 31 return "" 32 } 33 } 34 35 // Parse parses a config fragment in either JSON or HCL format. 36 func Parse(data string, format string) (c Config, err error) { 37 var raw map[string]interface{} 38 switch format { 39 case "json": 40 err = json.Unmarshal([]byte(data), &raw) 41 case "hcl": 42 err = hcl.Decode(&raw, data) 43 default: 44 err = fmt.Errorf("invalid format: %s", format) 45 } 46 if err != nil { 47 return Config{}, err 48 } 49 50 // We want to be able to report fields which we cannot map as an 51 // error so that users find typos in their configuration quickly. To 52 // achieve this we use the mapstructure library which maps a a raw 53 // map[string]interface{} to a nested structure and reports unused 54 // fields. The input for a mapstructure.Decode expects a 55 // map[string]interface{} as produced by encoding/json. 56 // 57 // The HCL language allows to repeat map keys which forces it to 58 // store nested structs as []map[string]interface{} instead of 59 // map[string]interface{}. This is an ambiguity which makes the 60 // generated structures incompatible with a corresponding JSON 61 // struct. It also does not work well with the mapstructure library. 62 // 63 // In order to still use the mapstructure library to find unused 64 // fields we patch instances of []map[string]interface{} to a 65 // map[string]interface{} before we decode that into a Config 66 // struct. 67 // 68 // However, Config has some fields which are either 69 // []map[string]interface{} or are arrays of structs which 70 // encoding/json will decode to []map[string]interface{}. Therefore, 71 // we need to be able to specify exceptions for this mapping. The 72 // patchSliceOfMaps() implements that mapping. All fields of type 73 // []map[string]interface{} are mapped to map[string]interface{} if 74 // it contains at most one value. If there is more than one value it 75 // panics. To define exceptions one can specify the nested field 76 // names in dot notation. 77 // 78 // todo(fs): There might be an easier way to achieve the same thing 79 // todo(fs): but this approach works for now. 80 m := patchSliceOfMaps(raw, []string{ 81 "checks", 82 "segments", 83 "service.checks", 84 "services", 85 "services.checks", 86 "watches", 87 "service.connect.proxy.config.upstreams", // Deprecated 88 "services.connect.proxy.config.upstreams", // Deprecated 89 "service.connect.proxy.upstreams", 90 "services.connect.proxy.upstreams", 91 "service.proxy.upstreams", 92 "services.proxy.upstreams", 93 94 // Need all the service(s) exceptions also for nested sidecar service except 95 // managed proxy which is explicitly not supported there. 96 "service.connect.sidecar_service.checks", 97 "services.connect.sidecar_service.checks", 98 "service.connect.sidecar_service.proxy.upstreams", 99 "services.connect.sidecar_service.proxy.upstreams", 100 }) 101 102 // There is a difference of representation of some fields depending on 103 // where they are used. The HTTP API uses CamelCase whereas the config 104 // files use snake_case and between the two there is no automatic mapping. 105 // While the JSON and HCL parsers match keys without case (both `id` and 106 // `ID` are mapped to an ID field) the same thing does not happen between 107 // CamelCase and snake_case. Since changing either format would break 108 // existing setups we have to support both and slowly transition to one of 109 // the formats. Also, there is at least one case where we use the "wrong" 110 // key and want to map that to the new key to support deprecation - 111 // see [GH-3179]. TranslateKeys maps potentially CamelCased values to the 112 // snake_case that is used in the config file parser. If both the CamelCase 113 // and snake_case values are set the snake_case value is used and the other 114 // value is discarded. 115 TranslateKeys(m, map[string]string{ 116 "deregistercriticalserviceafter": "deregister_critical_service_after", 117 "dockercontainerid": "docker_container_id", 118 "scriptargs": "args", 119 "serviceid": "service_id", 120 "tlsskipverify": "tls_skip_verify", 121 }) 122 123 var md mapstructure.Metadata 124 d, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{ 125 Metadata: &md, 126 Result: &c, 127 }) 128 if err != nil { 129 return Config{}, err 130 } 131 if err := d.Decode(m); err != nil { 132 return Config{}, err 133 } 134 for _, k := range md.Unused { 135 err = multierror.Append(err, fmt.Errorf("invalid config key %s", k)) 136 } 137 return 138 } 139 140 // Config defines the format of a configuration file in either JSON or 141 // HCL format. 142 // 143 // It must contain only pointer values, slices and maps to support 144 // standardized merging of multiple Config structs into one. 145 // 146 // Since this is the format which users use to specify their 147 // configuration it should be treated as an external API which cannot be 148 // changed and refactored at will since this will break existing setups. 149 type Config struct { 150 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza 151 ACLAgentMasterToken *string `json:"acl_agent_master_token,omitempty" hcl:"acl_agent_master_token" mapstructure:"acl_agent_master_token"` 152 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza 153 ACLAgentToken *string `json:"acl_agent_token,omitempty" hcl:"acl_agent_token" mapstructure:"acl_agent_token"` 154 // DEPRECATED (ACL-Legacy-Compat) - moved to "primary_datacenter" 155 ACLDatacenter *string `json:"acl_datacenter,omitempty" hcl:"acl_datacenter" mapstructure:"acl_datacenter"` 156 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl" stanza 157 ACLDefaultPolicy *string `json:"acl_default_policy,omitempty" hcl:"acl_default_policy" mapstructure:"acl_default_policy"` 158 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl" stanza 159 ACLDownPolicy *string `json:"acl_down_policy,omitempty" hcl:"acl_down_policy" mapstructure:"acl_down_policy"` 160 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl" stanza 161 ACLEnableKeyListPolicy *bool `json:"acl_enable_key_list_policy,omitempty" hcl:"acl_enable_key_list_policy" mapstructure:"acl_enable_key_list_policy"` 162 // DEPRECATED (ACL-Legacy-Compat) - pre-version8 enforcement is deprecated. 163 ACLEnforceVersion8 *bool `json:"acl_enforce_version_8,omitempty" hcl:"acl_enforce_version_8" mapstructure:"acl_enforce_version_8"` 164 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl" stanza 165 ACLMasterToken *string `json:"acl_master_token,omitempty" hcl:"acl_master_token" mapstructure:"acl_master_token"` 166 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza 167 ACLReplicationToken *string `json:"acl_replication_token,omitempty" hcl:"acl_replication_token" mapstructure:"acl_replication_token"` 168 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza 169 ACLTTL *string `json:"acl_ttl,omitempty" hcl:"acl_ttl" mapstructure:"acl_ttl"` 170 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl.tokens" stanza 171 ACLToken *string `json:"acl_token,omitempty" hcl:"acl_token" mapstructure:"acl_token"` 172 ACL ACL `json:"acl,omitempty" hcl:"acl" mapstructure:"acl"` 173 Addresses Addresses `json:"addresses,omitempty" hcl:"addresses" mapstructure:"addresses"` 174 AdvertiseAddrLAN *string `json:"advertise_addr,omitempty" hcl:"advertise_addr" mapstructure:"advertise_addr"` 175 AdvertiseAddrWAN *string `json:"advertise_addr_wan,omitempty" hcl:"advertise_addr_wan" mapstructure:"advertise_addr_wan"` 176 Autopilot Autopilot `json:"autopilot,omitempty" hcl:"autopilot" mapstructure:"autopilot"` 177 BindAddr *string `json:"bind_addr,omitempty" hcl:"bind_addr" mapstructure:"bind_addr"` 178 Bootstrap *bool `json:"bootstrap,omitempty" hcl:"bootstrap" mapstructure:"bootstrap"` 179 BootstrapExpect *int `json:"bootstrap_expect,omitempty" hcl:"bootstrap_expect" mapstructure:"bootstrap_expect"` 180 CAFile *string `json:"ca_file,omitempty" hcl:"ca_file" mapstructure:"ca_file"` 181 CAPath *string `json:"ca_path,omitempty" hcl:"ca_path" mapstructure:"ca_path"` 182 CertFile *string `json:"cert_file,omitempty" hcl:"cert_file" mapstructure:"cert_file"` 183 Check *CheckDefinition `json:"check,omitempty" hcl:"check" mapstructure:"check"` // needs to be a pointer to avoid partial merges 184 CheckUpdateInterval *string `json:"check_update_interval,omitempty" hcl:"check_update_interval" mapstructure:"check_update_interval"` 185 Checks []CheckDefinition `json:"checks,omitempty" hcl:"checks" mapstructure:"checks"` 186 ClientAddr *string `json:"client_addr,omitempty" hcl:"client_addr" mapstructure:"client_addr"` 187 Connect Connect `json:"connect,omitempty" hcl:"connect" mapstructure:"connect"` 188 DNS DNS `json:"dns_config,omitempty" hcl:"dns_config" mapstructure:"dns_config"` 189 DNSDomain *string `json:"domain,omitempty" hcl:"domain" mapstructure:"domain"` 190 DNSRecursors []string `json:"recursors,omitempty" hcl:"recursors" mapstructure:"recursors"` 191 DataDir *string `json:"data_dir,omitempty" hcl:"data_dir" mapstructure:"data_dir"` 192 Datacenter *string `json:"datacenter,omitempty" hcl:"datacenter" mapstructure:"datacenter"` 193 DisableAnonymousSignature *bool `json:"disable_anonymous_signature,omitempty" hcl:"disable_anonymous_signature" mapstructure:"disable_anonymous_signature"` 194 DisableCoordinates *bool `json:"disable_coordinates,omitempty" hcl:"disable_coordinates" mapstructure:"disable_coordinates"` 195 DisableHostNodeID *bool `json:"disable_host_node_id,omitempty" hcl:"disable_host_node_id" mapstructure:"disable_host_node_id"` 196 DisableHTTPUnprintableCharFilter *bool `json:"disable_http_unprintable_char_filter,omitempty" hcl:"disable_http_unprintable_char_filter" mapstructure:"disable_http_unprintable_char_filter"` 197 DisableKeyringFile *bool `json:"disable_keyring_file,omitempty" hcl:"disable_keyring_file" mapstructure:"disable_keyring_file"` 198 DisableRemoteExec *bool `json:"disable_remote_exec,omitempty" hcl:"disable_remote_exec" mapstructure:"disable_remote_exec"` 199 DisableUpdateCheck *bool `json:"disable_update_check,omitempty" hcl:"disable_update_check" mapstructure:"disable_update_check"` 200 DiscardCheckOutput *bool `json:"discard_check_output" hcl:"discard_check_output" mapstructure:"discard_check_output"` 201 DiscoveryMaxStale *string `json:"discovery_max_stale" hcl:"discovery_max_stale" mapstructure:"discovery_max_stale"` 202 EnableACLReplication *bool `json:"enable_acl_replication,omitempty" hcl:"enable_acl_replication" mapstructure:"enable_acl_replication"` 203 EnableAgentTLSForChecks *bool `json:"enable_agent_tls_for_checks,omitempty" hcl:"enable_agent_tls_for_checks" mapstructure:"enable_agent_tls_for_checks"` 204 EnableDebug *bool `json:"enable_debug,omitempty" hcl:"enable_debug" mapstructure:"enable_debug"` 205 EnableScriptChecks *bool `json:"enable_script_checks,omitempty" hcl:"enable_script_checks" mapstructure:"enable_script_checks"` 206 EnableLocalScriptChecks *bool `json:"enable_local_script_checks,omitempty" hcl:"enable_local_script_checks" mapstructure:"enable_local_script_checks"` 207 EnableSyslog *bool `json:"enable_syslog,omitempty" hcl:"enable_syslog" mapstructure:"enable_syslog"` 208 EncryptKey *string `json:"encrypt,omitempty" hcl:"encrypt" mapstructure:"encrypt"` 209 EncryptVerifyIncoming *bool `json:"encrypt_verify_incoming,omitempty" hcl:"encrypt_verify_incoming" mapstructure:"encrypt_verify_incoming"` 210 EncryptVerifyOutgoing *bool `json:"encrypt_verify_outgoing,omitempty" hcl:"encrypt_verify_outgoing" mapstructure:"encrypt_verify_outgoing"` 211 GossipLAN GossipLANConfig `json:"gossip_lan,omitempty" hcl:"gossip_lan" mapstructure:"gossip_lan"` 212 GossipWAN GossipWANConfig `json:"gossip_wan,omitempty" hcl:"gossip_wan" mapstructure:"gossip_wan"` 213 HTTPConfig HTTPConfig `json:"http_config,omitempty" hcl:"http_config" mapstructure:"http_config"` 214 KeyFile *string `json:"key_file,omitempty" hcl:"key_file" mapstructure:"key_file"` 215 LeaveOnTerm *bool `json:"leave_on_terminate,omitempty" hcl:"leave_on_terminate" mapstructure:"leave_on_terminate"` 216 Limits Limits `json:"limits,omitempty" hcl:"limits" mapstructure:"limits"` 217 LogLevel *string `json:"log_level,omitempty" hcl:"log_level" mapstructure:"log_level"` 218 LogFile *string `json:"log_file,omitempty" hcl:"log_file" mapstructure:"log_file"` 219 LogRotateDuration *string `json:"log_rotate_duration,omitempty" hcl:"log_rotate_duration" mapstructure:"log_rotate_duration"` 220 LogRotateBytes *int `json:"log_rotate_bytes,omitempty" hcl:"log_rotate_bytes" mapstructure:"log_rotate_bytes"` 221 NodeID *string `json:"node_id,omitempty" hcl:"node_id" mapstructure:"node_id"` 222 NodeMeta map[string]string `json:"node_meta,omitempty" hcl:"node_meta" mapstructure:"node_meta"` 223 NodeName *string `json:"node_name,omitempty" hcl:"node_name" mapstructure:"node_name"` 224 NonVotingServer *bool `json:"non_voting_server,omitempty" hcl:"non_voting_server" mapstructure:"non_voting_server"` 225 Performance Performance `json:"performance,omitempty" hcl:"performance" mapstructure:"performance"` 226 PidFile *string `json:"pid_file,omitempty" hcl:"pid_file" mapstructure:"pid_file"` 227 Ports Ports `json:"ports,omitempty" hcl:"ports" mapstructure:"ports"` 228 PrimaryDatacenter *string `json:"primary_datacenter,omitempty" hcl:"primary_datacenter" mapstructure:"primary_datacenter"` 229 RPCProtocol *int `json:"protocol,omitempty" hcl:"protocol" mapstructure:"protocol"` 230 RaftProtocol *int `json:"raft_protocol,omitempty" hcl:"raft_protocol" mapstructure:"raft_protocol"` 231 RaftSnapshotThreshold *int `json:"raft_snapshot_threshold,omitempty" hcl:"raft_snapshot_threshold" mapstructure:"raft_snapshot_threshold"` 232 RaftSnapshotInterval *string `json:"raft_snapshot_interval,omitempty" hcl:"raft_snapshot_interval" mapstructure:"raft_snapshot_interval"` 233 ReconnectTimeoutLAN *string `json:"reconnect_timeout,omitempty" hcl:"reconnect_timeout" mapstructure:"reconnect_timeout"` 234 ReconnectTimeoutWAN *string `json:"reconnect_timeout_wan,omitempty" hcl:"reconnect_timeout_wan" mapstructure:"reconnect_timeout_wan"` 235 RejoinAfterLeave *bool `json:"rejoin_after_leave,omitempty" hcl:"rejoin_after_leave" mapstructure:"rejoin_after_leave"` 236 RetryJoinIntervalLAN *string `json:"retry_interval,omitempty" hcl:"retry_interval" mapstructure:"retry_interval"` 237 RetryJoinIntervalWAN *string `json:"retry_interval_wan,omitempty" hcl:"retry_interval_wan" mapstructure:"retry_interval_wan"` 238 RetryJoinLAN []string `json:"retry_join,omitempty" hcl:"retry_join" mapstructure:"retry_join"` 239 RetryJoinMaxAttemptsLAN *int `json:"retry_max,omitempty" hcl:"retry_max" mapstructure:"retry_max"` 240 RetryJoinMaxAttemptsWAN *int `json:"retry_max_wan,omitempty" hcl:"retry_max_wan" mapstructure:"retry_max_wan"` 241 RetryJoinWAN []string `json:"retry_join_wan,omitempty" hcl:"retry_join_wan" mapstructure:"retry_join_wan"` 242 SegmentName *string `json:"segment,omitempty" hcl:"segment" mapstructure:"segment"` 243 Segments []Segment `json:"segments,omitempty" hcl:"segments" mapstructure:"segments"` 244 SerfBindAddrLAN *string `json:"serf_lan,omitempty" hcl:"serf_lan" mapstructure:"serf_lan"` 245 SerfBindAddrWAN *string `json:"serf_wan,omitempty" hcl:"serf_wan" mapstructure:"serf_wan"` 246 ServerMode *bool `json:"server,omitempty" hcl:"server" mapstructure:"server"` 247 ServerName *string `json:"server_name,omitempty" hcl:"server_name" mapstructure:"server_name"` 248 Service *ServiceDefinition `json:"service,omitempty" hcl:"service" mapstructure:"service"` 249 Services []ServiceDefinition `json:"services,omitempty" hcl:"services" mapstructure:"services"` 250 SessionTTLMin *string `json:"session_ttl_min,omitempty" hcl:"session_ttl_min" mapstructure:"session_ttl_min"` 251 SkipLeaveOnInt *bool `json:"skip_leave_on_interrupt,omitempty" hcl:"skip_leave_on_interrupt" mapstructure:"skip_leave_on_interrupt"` 252 StartJoinAddrsLAN []string `json:"start_join,omitempty" hcl:"start_join" mapstructure:"start_join"` 253 StartJoinAddrsWAN []string `json:"start_join_wan,omitempty" hcl:"start_join_wan" mapstructure:"start_join_wan"` 254 SyslogFacility *string `json:"syslog_facility,omitempty" hcl:"syslog_facility" mapstructure:"syslog_facility"` 255 TLSCipherSuites *string `json:"tls_cipher_suites,omitempty" hcl:"tls_cipher_suites" mapstructure:"tls_cipher_suites"` 256 TLSMinVersion *string `json:"tls_min_version,omitempty" hcl:"tls_min_version" mapstructure:"tls_min_version"` 257 TLSPreferServerCipherSuites *bool `json:"tls_prefer_server_cipher_suites,omitempty" hcl:"tls_prefer_server_cipher_suites" mapstructure:"tls_prefer_server_cipher_suites"` 258 TaggedAddresses map[string]string `json:"tagged_addresses,omitempty" hcl:"tagged_addresses" mapstructure:"tagged_addresses"` 259 Telemetry Telemetry `json:"telemetry,omitempty" hcl:"telemetry" mapstructure:"telemetry"` 260 TranslateWANAddrs *bool `json:"translate_wan_addrs,omitempty" hcl:"translate_wan_addrs" mapstructure:"translate_wan_addrs"` 261 UI *bool `json:"ui,omitempty" hcl:"ui" mapstructure:"ui"` 262 UIDir *string `json:"ui_dir,omitempty" hcl:"ui_dir" mapstructure:"ui_dir"` 263 UnixSocket UnixSocket `json:"unix_sockets,omitempty" hcl:"unix_sockets" mapstructure:"unix_sockets"` 264 VerifyIncoming *bool `json:"verify_incoming,omitempty" hcl:"verify_incoming" mapstructure:"verify_incoming"` 265 VerifyIncomingHTTPS *bool `json:"verify_incoming_https,omitempty" hcl:"verify_incoming_https" mapstructure:"verify_incoming_https"` 266 VerifyIncomingRPC *bool `json:"verify_incoming_rpc,omitempty" hcl:"verify_incoming_rpc" mapstructure:"verify_incoming_rpc"` 267 VerifyOutgoing *bool `json:"verify_outgoing,omitempty" hcl:"verify_outgoing" mapstructure:"verify_outgoing"` 268 VerifyServerHostname *bool `json:"verify_server_hostname,omitempty" hcl:"verify_server_hostname" mapstructure:"verify_server_hostname"` 269 Watches []map[string]interface{} `json:"watches,omitempty" hcl:"watches" mapstructure:"watches"` 270 271 // This isn't used by Consul but we've documented a feature where users 272 // can deploy their snapshot agent configs alongside their Consul configs 273 // so we have a placeholder here so it can be parsed but this doesn't 274 // manifest itself in any way inside the runtime config. 275 SnapshotAgent map[string]interface{} `json:"snapshot_agent,omitempty" hcl:"snapshot_agent" mapstructure:"snapshot_agent"` 276 277 // non-user configurable values 278 // DEPRECATED (ACL-Legacy-Compat) - moved into the "acl" stanza 279 ACLDisabledTTL *string `json:"acl_disabled_ttl,omitempty" hcl:"acl_disabled_ttl" mapstructure:"acl_disabled_ttl"` 280 AEInterval *string `json:"ae_interval,omitempty" hcl:"ae_interval" mapstructure:"ae_interval"` 281 CheckDeregisterIntervalMin *string `json:"check_deregister_interval_min,omitempty" hcl:"check_deregister_interval_min" mapstructure:"check_deregister_interval_min"` 282 CheckReapInterval *string `json:"check_reap_interval,omitempty" hcl:"check_reap_interval" mapstructure:"check_reap_interval"` 283 Consul Consul `json:"consul,omitempty" hcl:"consul" mapstructure:"consul"` 284 Revision *string `json:"revision,omitempty" hcl:"revision" mapstructure:"revision"` 285 SegmentLimit *int `json:"segment_limit,omitempty" hcl:"segment_limit" mapstructure:"segment_limit"` 286 SegmentNameLimit *int `json:"segment_name_limit,omitempty" hcl:"segment_name_limit" mapstructure:"segment_name_limit"` 287 SyncCoordinateIntervalMin *string `json:"sync_coordinate_interval_min,omitempty" hcl:"sync_coordinate_interval_min" mapstructure:"sync_coordinate_interval_min"` 288 SyncCoordinateRateTarget *float64 `json:"sync_coordinate_rate_target,omitempty" hcl:"sync_coordinate_rate_target" mapstructure:"sync_coordinate_rate_target"` 289 Version *string `json:"version,omitempty" hcl:"version" mapstructure:"version"` 290 VersionPrerelease *string `json:"version_prerelease,omitempty" hcl:"version_prerelease" mapstructure:"version_prerelease"` 291 } 292 293 type GossipLANConfig struct { 294 GossipNodes *int `json:"gossip_nodes,omitempty" hcl:"gossip_nodes" mapstructure:"gossip_nodes"` 295 GossipInterval *string `json:"gossip_interval,omitempty" hcl:"gossip_interval" mapstructure:"gossip_interval"` 296 ProbeInterval *string `json:"probe_interval,omitempty" hcl:"probe_interval" mapstructure:"probe_interval"` 297 ProbeTimeout *string `json:"probe_timeout,omitempty" hcl:"probe_timeout" mapstructure:"probe_timeout"` 298 SuspicionMult *int `json:"suspicion_mult,omitempty" hcl:"suspicion_mult" mapstructure:"suspicion_mult"` 299 RetransmitMult *int `json:"retransmit_mult,omitempty" hcl:"retransmit_mult" mapstructure:"retransmit_mult"` 300 } 301 302 type GossipWANConfig struct { 303 GossipNodes *int `json:"gossip_nodes,omitempty" hcl:"gossip_nodes" mapstructure:"gossip_nodes"` 304 GossipInterval *string `json:"gossip_interval,omitempty" hcl:"gossip_interval" mapstructure:"gossip_interval"` 305 ProbeInterval *string `json:"probe_interval,omitempty" hcl:"probe_interval" mapstructure:"probe_interval"` 306 ProbeTimeout *string `json:"probe_timeout,omitempty" hcl:"probe_timeout" mapstructure:"probe_timeout"` 307 SuspicionMult *int `json:"suspicion_mult,omitempty" hcl:"suspicion_mult" mapstructure:"suspicion_mult"` 308 RetransmitMult *int `json:"retransmit_mult,omitempty" hcl:"retransmit_mult" mapstructure:"retransmit_mult"` 309 } 310 311 type Consul struct { 312 Coordinate struct { 313 UpdateBatchSize *int `json:"update_batch_size,omitempty" hcl:"update_batch_size" mapstructure:"update_batch_size"` 314 UpdateMaxBatches *int `json:"update_max_batches,omitempty" hcl:"update_max_batches" mapstructure:"update_max_batches"` 315 UpdatePeriod *string `json:"update_period,omitempty" hcl:"update_period" mapstructure:"update_period"` 316 } `json:"coordinate,omitempty" hcl:"coordinate" mapstructure:"coordinate"` 317 318 Raft struct { 319 ElectionTimeout *string `json:"election_timeout,omitempty" hcl:"election_timeout" mapstructure:"election_timeout"` 320 HeartbeatTimeout *string `json:"heartbeat_timeout,omitempty" hcl:"heartbeat_timeout" mapstructure:"heartbeat_timeout"` 321 LeaderLeaseTimeout *string `json:"leader_lease_timeout,omitempty" hcl:"leader_lease_timeout" mapstructure:"leader_lease_timeout"` 322 } `json:"raft,omitempty" hcl:"raft" mapstructure:"raft"` 323 324 Server struct { 325 HealthInterval *string `json:"health_interval,omitempty" hcl:"health_interval" mapstructure:"health_interval"` 326 } `json:"server,omitempty" hcl:"server" mapstructure:"server"` 327 } 328 329 type Addresses struct { 330 DNS *string `json:"dns,omitempty" hcl:"dns" mapstructure:"dns"` 331 HTTP *string `json:"http,omitempty" hcl:"http" mapstructure:"http"` 332 HTTPS *string `json:"https,omitempty" hcl:"https" mapstructure:"https"` 333 GRPC *string `json:"grpc,omitempty" hcl:"grpc" mapstructure:"grpc"` 334 } 335 336 type AdvertiseAddrsConfig struct { 337 RPC *string `json:"rpc,omitempty" hcl:"rpc" mapstructure:"rpc"` 338 SerfLAN *string `json:"serf_lan,omitempty" hcl:"serf_lan" mapstructure:"serf_lan"` 339 SerfWAN *string `json:"serf_wan,omitempty" hcl:"serf_wan" mapstructure:"serf_wan"` 340 } 341 342 type Autopilot struct { 343 CleanupDeadServers *bool `json:"cleanup_dead_servers,omitempty" hcl:"cleanup_dead_servers" mapstructure:"cleanup_dead_servers"` 344 DisableUpgradeMigration *bool `json:"disable_upgrade_migration,omitempty" hcl:"disable_upgrade_migration" mapstructure:"disable_upgrade_migration"` 345 LastContactThreshold *string `json:"last_contact_threshold,omitempty" hcl:"last_contact_threshold" mapstructure:"last_contact_threshold"` 346 MaxTrailingLogs *int `json:"max_trailing_logs,omitempty" hcl:"max_trailing_logs" mapstructure:"max_trailing_logs"` 347 RedundancyZoneTag *string `json:"redundancy_zone_tag,omitempty" hcl:"redundancy_zone_tag" mapstructure:"redundancy_zone_tag"` 348 ServerStabilizationTime *string `json:"server_stabilization_time,omitempty" hcl:"server_stabilization_time" mapstructure:"server_stabilization_time"` 349 UpgradeVersionTag *string `json:"upgrade_version_tag,omitempty" hcl:"upgrade_version_tag" mapstructure:"upgrade_version_tag"` 350 } 351 352 // ServiceWeights defines the registration of weights used in DNS for a Service 353 type ServiceWeights struct { 354 Passing *int `json:"passing,omitempty" hcl:"passing" mapstructure:"passing"` 355 Warning *int `json:"warning,omitempty" hcl:"warning" mapstructure:"warning"` 356 } 357 358 type ServiceDefinition struct { 359 Kind *string `json:"kind,omitempty" hcl:"kind" mapstructure:"kind"` 360 ID *string `json:"id,omitempty" hcl:"id" mapstructure:"id"` 361 Name *string `json:"name,omitempty" hcl:"name" mapstructure:"name"` 362 Tags []string `json:"tags,omitempty" hcl:"tags" mapstructure:"tags"` 363 Address *string `json:"address,omitempty" hcl:"address" mapstructure:"address"` 364 Meta map[string]string `json:"meta,omitempty" hcl:"meta" mapstructure:"meta"` 365 Port *int `json:"port,omitempty" hcl:"port" mapstructure:"port"` 366 Check *CheckDefinition `json:"check,omitempty" hcl:"check" mapstructure:"check"` 367 Checks []CheckDefinition `json:"checks,omitempty" hcl:"checks" mapstructure:"checks"` 368 Token *string `json:"token,omitempty" hcl:"token" mapstructure:"token"` 369 Weights *ServiceWeights `json:"weights,omitempty" hcl:"weights" mapstructure:"weights"` 370 EnableTagOverride *bool `json:"enable_tag_override,omitempty" hcl:"enable_tag_override" mapstructure:"enable_tag_override"` 371 // DEPRECATED (ProxyDestination) - remove this when removing ProxyDestination 372 ProxyDestination *string `json:"proxy_destination,omitempty" hcl:"proxy_destination" mapstructure:"proxy_destination"` 373 Proxy *ServiceProxy `json:"proxy,omitempty" hcl:"proxy" mapstructure:"proxy"` 374 Connect *ServiceConnect `json:"connect,omitempty" hcl:"connect" mapstructure:"connect"` 375 } 376 377 type CheckDefinition struct { 378 ID *string `json:"id,omitempty" hcl:"id" mapstructure:"id"` 379 Name *string `json:"name,omitempty" hcl:"name" mapstructure:"name"` 380 Notes *string `json:"notes,omitempty" hcl:"notes" mapstructure:"notes"` 381 ServiceID *string `json:"service_id,omitempty" hcl:"service_id" mapstructure:"service_id"` 382 Token *string `json:"token,omitempty" hcl:"token" mapstructure:"token"` 383 Status *string `json:"status,omitempty" hcl:"status" mapstructure:"status"` 384 ScriptArgs []string `json:"args,omitempty" hcl:"args" mapstructure:"args"` 385 HTTP *string `json:"http,omitempty" hcl:"http" mapstructure:"http"` 386 Header map[string][]string `json:"header,omitempty" hcl:"header" mapstructure:"header"` 387 Method *string `json:"method,omitempty" hcl:"method" mapstructure:"method"` 388 TCP *string `json:"tcp,omitempty" hcl:"tcp" mapstructure:"tcp"` 389 Interval *string `json:"interval,omitempty" hcl:"interval" mapstructure:"interval"` 390 DockerContainerID *string `json:"docker_container_id,omitempty" hcl:"docker_container_id" mapstructure:"docker_container_id"` 391 Shell *string `json:"shell,omitempty" hcl:"shell" mapstructure:"shell"` 392 GRPC *string `json:"grpc,omitempty" hcl:"grpc" mapstructure:"grpc"` 393 GRPCUseTLS *bool `json:"grpc_use_tls,omitempty" hcl:"grpc_use_tls" mapstructure:"grpc_use_tls"` 394 TLSSkipVerify *bool `json:"tls_skip_verify,omitempty" hcl:"tls_skip_verify" mapstructure:"tls_skip_verify"` 395 AliasNode *string `json:"alias_node,omitempty" hcl:"alias_node" mapstructure:"alias_node"` 396 AliasService *string `json:"alias_service,omitempty" hcl:"alias_service" mapstructure:"alias_service"` 397 Timeout *string `json:"timeout,omitempty" hcl:"timeout" mapstructure:"timeout"` 398 TTL *string `json:"ttl,omitempty" hcl:"ttl" mapstructure:"ttl"` 399 DeregisterCriticalServiceAfter *string `json:"deregister_critical_service_after,omitempty" hcl:"deregister_critical_service_after" mapstructure:"deregister_critical_service_after"` 400 } 401 402 // ServiceConnect is the connect block within a service registration 403 type ServiceConnect struct { 404 // Native is true when this service can natively understand Connect. 405 Native *bool `json:"native,omitempty" hcl:"native" mapstructure:"native"` 406 407 // Proxy configures a connect proxy instance for the service 408 Proxy *ServiceConnectProxy `json:"proxy,omitempty" hcl:"proxy" mapstructure:"proxy"` 409 410 // SidecarService is a nested Service Definition to register at the same time. 411 // It's purely a convenience mechanism to allow specifying a sidecar service 412 // along with the application service definition. It's nested nature allows 413 // all of the fields to be defaulted which can reduce the amount of 414 // boilerplate needed to register a sidecar service separately, but the end 415 // result is identical to just making a second service registration via any 416 // other means. 417 SidecarService *ServiceDefinition `json:"sidecar_service,omitempty" hcl:"sidecar_service" mapstructure:"sidecar_service"` 418 } 419 420 type ServiceConnectProxy struct { 421 Command []string `json:"command,omitempty" hcl:"command" mapstructure:"command"` 422 ExecMode *string `json:"exec_mode,omitempty" hcl:"exec_mode" mapstructure:"exec_mode"` 423 Config map[string]interface{} `json:"config,omitempty" hcl:"config" mapstructure:"config"` 424 Upstreams []Upstream `json:"upstreams,omitempty" hcl:"upstreams" mapstructure:"upstreams"` 425 } 426 427 // ServiceProxy is the additional config needed for a Kind = connect-proxy 428 // registration. 429 type ServiceProxy struct { 430 // DestinationServiceName is required and is the name of the service to accept 431 // traffic for. 432 DestinationServiceName *string `json:"destination_service_name,omitempty" hcl:"destination_service_name" mapstructure:"destination_service_name"` 433 434 // DestinationServiceID is optional and should only be specified for 435 // "side-car" style proxies where the proxy is in front of just a single 436 // instance of the service. It should be set to the service ID of the instance 437 // being represented which must be registered to the same agent. It's valid to 438 // provide a service ID that does not yet exist to avoid timing issues when 439 // bootstrapping a service with a proxy. 440 DestinationServiceID *string `json:"destination_service_id,omitempty" hcl:"destination_service_id" mapstructure:"destination_service_id"` 441 442 // LocalServiceAddress is the address of the local service instance. It is 443 // optional and should only be specified for "side-car" style proxies. It will 444 // default to 127.0.0.1 if the proxy is a "side-car" (DestinationServiceID is 445 // set) but otherwise will be ignored. 446 LocalServiceAddress *string `json:"local_service_address,omitempty" hcl:"local_service_address" mapstructure:"local_service_address"` 447 448 // LocalServicePort is the port of the local service instance. It is optional 449 // and should only be specified for "side-car" style proxies. It will default 450 // to the registered port for the instance if the proxy is a "side-car" 451 // (DestinationServiceID is set) but otherwise will be ignored. 452 LocalServicePort *int `json:"local_service_port,omitempty" hcl:"local_service_port" mapstructure:"local_service_port"` 453 454 // Config is the arbitrary configuration data provided with the proxy 455 // registration. 456 Config map[string]interface{} `json:"config,omitempty" hcl:"config" mapstructure:"config"` 457 458 // Upstreams describes any upstream dependencies the proxy instance should 459 // setup. 460 Upstreams []Upstream `json:"upstreams,omitempty" hcl:"upstreams" mapstructure:"upstreams"` 461 } 462 463 // Upstream represents a single upstream dependency for a service or proxy. It 464 // describes the mechanism used to discover instances to communicate with (the 465 // Target) as well as any potential client configuration that may be useful such 466 // as load balancer options, timeouts etc. 467 type Upstream struct { 468 // Destination fields are the required ones for determining what this upstream 469 // points to. Depending on DestinationType some other fields below might 470 // further restrict the set of instances allowable. 471 // 472 // DestinationType would be better as an int constant but even with custom 473 // JSON marshallers it causes havoc with all the mapstructure mangling we do 474 // on service definitions in various places. 475 DestinationType *string `json:"destination_type,omitempty" hcl:"destination_type" mapstructure:"destination_type"` 476 DestinationNamespace *string `json:"destination_namespace,omitempty" hcl:"destination_namespace" mapstructure:"destination_namespace"` 477 DestinationName *string `json:"destination_name,omitempty" hcl:"destination_name" mapstructure:"destination_name"` 478 479 // Datacenter that the service discovery request should be run against. Note 480 // for prepared queries, the actual results might be from a different 481 // datacenter. 482 Datacenter *string `json:"datacenter,omitempty" hcl:"datacenter" mapstructure:"datacenter"` 483 484 // LocalBindAddress is the ip address a side-car proxy should listen on for 485 // traffic destined for this upstream service. Default if empty is 127.0.0.1. 486 LocalBindAddress *string `json:"local_bind_address,omitempty" hcl:"local_bind_address" mapstructure:"local_bind_address"` 487 488 // LocalBindPort is the ip address a side-car proxy should listen on for traffic 489 // destined for this upstream service. Required. 490 LocalBindPort *int `json:"local_bind_port,omitempty" hcl:"local_bind_port" mapstructure:"local_bind_port"` 491 492 // Config is an opaque config that is specific to the proxy process being run. 493 // It can be used to pass arbitrary configuration for this specific upstream 494 // to the proxy. 495 Config map[string]interface{} `json:"config,omitempty" hcl:"config" mapstructure:"config"` 496 } 497 498 // Connect is the agent-global connect configuration. 499 type Connect struct { 500 // Enabled opts the agent into connect. It should be set on all clients and 501 // servers in a cluster for correct connect operation. 502 Enabled *bool `json:"enabled,omitempty" hcl:"enabled" mapstructure:"enabled"` 503 Proxy ConnectProxy `json:"proxy,omitempty" hcl:"proxy" mapstructure:"proxy"` 504 ProxyDefaults ConnectProxyDefaults `json:"proxy_defaults,omitempty" hcl:"proxy_defaults" mapstructure:"proxy_defaults"` 505 CAProvider *string `json:"ca_provider,omitempty" hcl:"ca_provider" mapstructure:"ca_provider"` 506 CAConfig map[string]interface{} `json:"ca_config,omitempty" hcl:"ca_config" mapstructure:"ca_config"` 507 } 508 509 // ConnectProxy is the agent-global connect proxy configuration. 510 type ConnectProxy struct { 511 // Consul will not execute managed proxies if its EUID is 0 (root). 512 // If this is true, then Consul will execute proxies if Consul is 513 // running as root. This is not recommended. 514 AllowManagedRoot *bool `json:"allow_managed_root" hcl:"allow_managed_root" mapstructure:"allow_managed_root"` 515 516 // AllowManagedAPIRegistration enables managed proxy registration 517 // via the agent HTTP API. If this is false, only file configurations 518 // can be used. 519 AllowManagedAPIRegistration *bool `json:"allow_managed_api_registration" hcl:"allow_managed_api_registration" mapstructure:"allow_managed_api_registration"` 520 } 521 522 // ConnectProxyDefaults is the agent-global defaults for managed Connect proxies. 523 type ConnectProxyDefaults struct { 524 // ExecMode is used where a registration doesn't include an exec_mode. 525 // Defaults to daemon. 526 ExecMode *string `json:"exec_mode,omitempty" hcl:"exec_mode" mapstructure:"exec_mode"` 527 // DaemonCommand is used to start proxy in exec_mode = daemon if not specified 528 // at registration time. 529 DaemonCommand []string `json:"daemon_command,omitempty" hcl:"daemon_command" mapstructure:"daemon_command"` 530 // ScriptCommand is used to start proxy in exec_mode = script if not specified 531 // at registration time. 532 ScriptCommand []string `json:"script_command,omitempty" hcl:"script_command" mapstructure:"script_command"` 533 // Config is merged into an Config specified at registration time. 534 Config map[string]interface{} `json:"config,omitempty" hcl:"config" mapstructure:"config"` 535 } 536 537 // SOA is the configuration of SOA for DNS 538 type SOA struct { 539 Refresh *uint32 `json:"refresh,omitempty" hcl:"refresh" mapstructure:"refresh"` 540 Retry *uint32 `json:"retry,omitempty" hcl:"retry" mapstructure:"retry"` 541 Expire *uint32 `json:"expire,omitempty" hcl:"expire" mapstructure:"expire"` 542 Minttl *uint32 `json:"min_ttl,omitempty" hcl:"min_ttl" mapstructure:"min_ttl"` 543 } 544 545 type DNS struct { 546 AllowStale *bool `json:"allow_stale,omitempty" hcl:"allow_stale" mapstructure:"allow_stale"` 547 ARecordLimit *int `json:"a_record_limit,omitempty" hcl:"a_record_limit" mapstructure:"a_record_limit"` 548 DisableCompression *bool `json:"disable_compression,omitempty" hcl:"disable_compression" mapstructure:"disable_compression"` 549 EnableTruncate *bool `json:"enable_truncate,omitempty" hcl:"enable_truncate" mapstructure:"enable_truncate"` 550 MaxStale *string `json:"max_stale,omitempty" hcl:"max_stale" mapstructure:"max_stale"` 551 NodeTTL *string `json:"node_ttl,omitempty" hcl:"node_ttl" mapstructure:"node_ttl"` 552 OnlyPassing *bool `json:"only_passing,omitempty" hcl:"only_passing" mapstructure:"only_passing"` 553 RecursorTimeout *string `json:"recursor_timeout,omitempty" hcl:"recursor_timeout" mapstructure:"recursor_timeout"` 554 ServiceTTL map[string]string `json:"service_ttl,omitempty" hcl:"service_ttl" mapstructure:"service_ttl"` 555 UDPAnswerLimit *int `json:"udp_answer_limit,omitempty" hcl:"udp_answer_limit" mapstructure:"udp_answer_limit"` 556 NodeMetaTXT *bool `json:"enable_additional_node_meta_txt,omitempty" hcl:"enable_additional_node_meta_txt" mapstructure:"enable_additional_node_meta_txt"` 557 SOA *SOA `json:"soa,omitempty" hcl:"soa" mapstructure:"soa"` 558 UseCache *bool `json:"use_cache,omitempty" hcl:"use_cache" mapstructure:"use_cache"` 559 CacheMaxAge *string `json:"cache_max_age,omitempty" hcl:"cache_max_age" mapstructure:"cache_max_age"` 560 } 561 562 type HTTPConfig struct { 563 BlockEndpoints []string `json:"block_endpoints,omitempty" hcl:"block_endpoints" mapstructure:"block_endpoints"` 564 AllowWriteHTTPFrom []string `json:"allow_write_http_from,omitempty" hcl:"allow_write_http_from" mapstructure:"allow_write_http_from"` 565 ResponseHeaders map[string]string `json:"response_headers,omitempty" hcl:"response_headers" mapstructure:"response_headers"` 566 } 567 568 type Performance struct { 569 LeaveDrainTime *string `json:"leave_drain_time,omitempty" hcl:"leave_drain_time" mapstructure:"leave_drain_time"` 570 RaftMultiplier *int `json:"raft_multiplier,omitempty" hcl:"raft_multiplier" mapstructure:"raft_multiplier"` // todo(fs): validate as uint 571 RPCHoldTimeout *string `json:"rpc_hold_timeout" hcl:"rpc_hold_timeout" mapstructure:"rpc_hold_timeout"` 572 } 573 574 type Telemetry struct { 575 CirconusAPIApp *string `json:"circonus_api_app,omitempty" hcl:"circonus_api_app" mapstructure:"circonus_api_app"` 576 CirconusAPIToken *string `json:"circonus_api_token,omitempty" json:"-" hcl:"circonus_api_token" mapstructure:"circonus_api_token" json:"-"` 577 CirconusAPIURL *string `json:"circonus_api_url,omitempty" hcl:"circonus_api_url" mapstructure:"circonus_api_url"` 578 CirconusBrokerID *string `json:"circonus_broker_id,omitempty" hcl:"circonus_broker_id" mapstructure:"circonus_broker_id"` 579 CirconusBrokerSelectTag *string `json:"circonus_broker_select_tag,omitempty" hcl:"circonus_broker_select_tag" mapstructure:"circonus_broker_select_tag"` 580 CirconusCheckDisplayName *string `json:"circonus_check_display_name,omitempty" hcl:"circonus_check_display_name" mapstructure:"circonus_check_display_name"` 581 CirconusCheckForceMetricActivation *string `json:"circonus_check_force_metric_activation,omitempty" hcl:"circonus_check_force_metric_activation" mapstructure:"circonus_check_force_metric_activation"` 582 CirconusCheckID *string `json:"circonus_check_id,omitempty" hcl:"circonus_check_id" mapstructure:"circonus_check_id"` 583 CirconusCheckInstanceID *string `json:"circonus_check_instance_id,omitempty" hcl:"circonus_check_instance_id" mapstructure:"circonus_check_instance_id"` 584 CirconusCheckSearchTag *string `json:"circonus_check_search_tag,omitempty" hcl:"circonus_check_search_tag" mapstructure:"circonus_check_search_tag"` 585 CirconusCheckTags *string `json:"circonus_check_tags,omitempty" hcl:"circonus_check_tags" mapstructure:"circonus_check_tags"` 586 CirconusSubmissionInterval *string `json:"circonus_submission_interval,omitempty" hcl:"circonus_submission_interval" mapstructure:"circonus_submission_interval"` 587 CirconusSubmissionURL *string `json:"circonus_submission_url,omitempty" hcl:"circonus_submission_url" mapstructure:"circonus_submission_url"` 588 DisableHostname *bool `json:"disable_hostname,omitempty" hcl:"disable_hostname" mapstructure:"disable_hostname"` 589 DogstatsdAddr *string `json:"dogstatsd_addr,omitempty" hcl:"dogstatsd_addr" mapstructure:"dogstatsd_addr"` 590 DogstatsdTags []string `json:"dogstatsd_tags,omitempty" hcl:"dogstatsd_tags" mapstructure:"dogstatsd_tags"` 591 FilterDefault *bool `json:"filter_default,omitempty" hcl:"filter_default" mapstructure:"filter_default"` 592 PrefixFilter []string `json:"prefix_filter,omitempty" hcl:"prefix_filter" mapstructure:"prefix_filter"` 593 MetricsPrefix *string `json:"metrics_prefix,omitempty" hcl:"metrics_prefix" mapstructure:"metrics_prefix"` 594 PrometheusRetentionTime *string `json:"prometheus_retention_time,omitempty" hcl:"prometheus_retention_time" mapstructure:"prometheus_retention_time"` 595 StatsdAddr *string `json:"statsd_address,omitempty" hcl:"statsd_address" mapstructure:"statsd_address"` 596 StatsiteAddr *string `json:"statsite_address,omitempty" hcl:"statsite_address" mapstructure:"statsite_address"` 597 } 598 599 type Ports struct { 600 DNS *int `json:"dns,omitempty" hcl:"dns" mapstructure:"dns"` 601 HTTP *int `json:"http,omitempty" hcl:"http" mapstructure:"http"` 602 HTTPS *int `json:"https,omitempty" hcl:"https" mapstructure:"https"` 603 SerfLAN *int `json:"serf_lan,omitempty" hcl:"serf_lan" mapstructure:"serf_lan"` 604 SerfWAN *int `json:"serf_wan,omitempty" hcl:"serf_wan" mapstructure:"serf_wan"` 605 Server *int `json:"server,omitempty" hcl:"server" mapstructure:"server"` 606 GRPC *int `json:"grpc,omitempty" hcl:"grpc" mapstructure:"grpc"` 607 ProxyMinPort *int `json:"proxy_min_port,omitempty" hcl:"proxy_min_port" mapstructure:"proxy_min_port"` 608 ProxyMaxPort *int `json:"proxy_max_port,omitempty" hcl:"proxy_max_port" mapstructure:"proxy_max_port"` 609 SidecarMinPort *int `json:"sidecar_min_port,omitempty" hcl:"sidecar_min_port" mapstructure:"sidecar_min_port"` 610 SidecarMaxPort *int `json:"sidecar_max_port,omitempty" hcl:"sidecar_max_port" mapstructure:"sidecar_max_port"` 611 } 612 613 type UnixSocket struct { 614 Group *string `json:"group,omitempty" hcl:"group" mapstructure:"group"` 615 Mode *string `json:"mode,omitempty" hcl:"mode" mapstructure:"mode"` 616 User *string `json:"user,omitempty" hcl:"user" mapstructure:"user"` 617 } 618 619 type Limits struct { 620 RPCMaxBurst *int `json:"rpc_max_burst,omitempty" hcl:"rpc_max_burst" mapstructure:"rpc_max_burst"` 621 RPCRate *float64 `json:"rpc_rate,omitempty" hcl:"rpc_rate" mapstructure:"rpc_rate"` 622 } 623 624 type Segment struct { 625 Advertise *string `json:"advertise,omitempty" hcl:"advertise" mapstructure:"advertise"` 626 Bind *string `json:"bind,omitempty" hcl:"bind" mapstructure:"bind"` 627 Name *string `json:"name,omitempty" hcl:"name" mapstructure:"name"` 628 Port *int `json:"port,omitempty" hcl:"port" mapstructure:"port"` 629 RPCListener *bool `json:"rpc_listener,omitempty" hcl:"rpc_listener" mapstructure:"rpc_listener"` 630 } 631 632 type ACL struct { 633 Enabled *bool `json:"enabled,omitempty" hcl:"enabled" mapstructure:"enabled"` 634 TokenReplication *bool `json:"enable_token_replication,omitempty" hcl:"enable_token_replication" mapstructure:"enable_token_replication"` 635 PolicyTTL *string `json:"policy_ttl,omitempty" hcl:"policy_ttl" mapstructure:"policy_ttl"` 636 TokenTTL *string `json:"token_ttl,omitempty" hcl:"token_ttl" mapstructure:"token_ttl"` 637 DownPolicy *string `json:"down_policy,omitempty" hcl:"down_policy" mapstructure:"down_policy"` 638 DefaultPolicy *string `json:"default_policy,omitempty" hcl:"default_policy" mapstructure:"default_policy"` 639 EnableKeyListPolicy *bool `json:"enable_key_list_policy,omitempty" hcl:"enable_key_list_policy" mapstructure:"enable_key_list_policy"` 640 Tokens Tokens `json:"tokens,omitempty" hcl:"tokens" mapstructure:"tokens"` 641 DisabledTTL *string `json:"disabled_ttl,omitempty" hcl:"disabled_ttl" mapstructure:"disabled_ttl"` 642 EnableTokenPersistence *bool `json:"enable_token_persistence" hcl:"enable_token_persistence" mapstructure:"enable_token_persistence"` 643 } 644 645 type Tokens struct { 646 Master *string `json:"master,omitempty" hcl:"master" mapstructure:"master"` 647 Replication *string `json:"replication,omitempty" hcl:"replication" mapstructure:"replication"` 648 AgentMaster *string `json:"agent_master,omitempty" hcl:"agent_master" mapstructure:"agent_master"` 649 Default *string `json:"default,omitempty" hcl:"default" mapstructure:"default"` 650 Agent *string `json:"agent,omitempty" hcl:"agent" mapstructure:"agent"` 651 }