Add the `circonus_agent_self` data source.

This commit is contained in:
Sean Chittenden 2017-02-06 14:53:01 -08:00
parent 1f40e23c1c
commit 4b73ac7abe
No known key found for this signature in database
GPG Key ID: 4EBC9DC16C2E5E16
8 changed files with 1565 additions and 1 deletions

View File

@ -0,0 +1,4 @@
# env TESTARGS='-test.parallel=1 -run TestAccDataConsulAgentSelf_basic' TF_LOG=debug make test
test::
2>&1 env \
make -C ../../.. testacc TEST=./builtin/providers/consul | tee test.log

View File

@ -0,0 +1,14 @@
package consul
import "github.com/hashicorp/terraform/helper/schema"
type _AttrWriter interface {
BackingType() string
SetBool(_SchemaAttr, bool) error
SetFloat64(_SchemaAttr, float64) error
SetList(_SchemaAttr, []interface{}) error
SetMap(_SchemaAttr, map[string]interface{}) error
SetSet(_SchemaAttr, *schema.Set) error
SetString(_SchemaAttr, string) error
}

View File

@ -0,0 +1,77 @@
package consul
import (
"fmt"
"strconv"
"strings"
"github.com/hashicorp/terraform/helper/schema"
)
type _AttrWriterMap struct {
m *map[string]interface{}
}
func _NewMapWriter(m *map[string]interface{}) *_AttrWriterMap {
return &_AttrWriterMap{
m: m,
}
}
func (w *_AttrWriterMap) BackingType() string {
return "map"
}
func (w *_AttrWriterMap) Set(name _SchemaAttr, v interface{}) error {
switch u := v.(type) {
case string:
return w.SetString(name, u)
case float64:
return w.SetFloat64(name, u)
case bool:
return w.SetBool(name, u)
case nil:
return w.SetString(name, "")
default:
panic(fmt.Sprintf("PROVIDER BUG: Set type %T not supported (%#v) for %s ", v, v, name))
}
}
func (w *_AttrWriterMap) SetBool(name _SchemaAttr, b bool) error {
(*w.m)[string(name)] = fmt.Sprintf("%t", b)
return nil
}
func (w *_AttrWriterMap) SetFloat64(name _SchemaAttr, f float64) error {
(*w.m)[string(name)] = strconv.FormatFloat(f, 'g', -1, 64)
return nil
}
func (w *_AttrWriterMap) SetList(name _SchemaAttr, l []interface{}) error {
panic(fmt.Sprintf("PROVIDER BUG: Cat set a list within a map for %s", name))
out := make([]string, 0, len(l))
for i, v := range l {
switch u := v.(type) {
case string:
out[i] = u
default:
panic(fmt.Sprintf("PROVIDER BUG: SetList type %T not supported (%#v)", v, v))
}
}
(*w.m)[string(name)] = strings.Join(out, ", ")
return nil
}
func (w *_AttrWriterMap) SetMap(name _SchemaAttr, m map[string]interface{}) error {
panic(fmt.Sprintf("PROVIDER BUG: Cat set a map within a map for %s", name))
}
func (w *_AttrWriterMap) SetSet(name _SchemaAttr, s *schema.Set) error {
panic(fmt.Sprintf("PROVIDER BUG: Cat set a set within a map for %s", name))
}
func (w *_AttrWriterMap) SetString(name _SchemaAttr, s string) error {
(*w.m)[string(name)] = s
return nil
}

View File

@ -0,0 +1,45 @@
package consul
import "github.com/hashicorp/terraform/helper/schema"
type _AttrWriterState struct {
d *schema.ResourceData
}
func _NewStateWriter(d *schema.ResourceData) *_AttrWriterState {
return &_AttrWriterState{
d: d,
}
}
func (w *_AttrWriterState) BackingType() string {
return "state"
}
func (w *_AttrWriterState) SetBool(name _SchemaAttr, b bool) error {
return _StateSet(w.d, name, b)
}
func (w *_AttrWriterState) SetID(id string) {
w.d.SetId(id)
}
func (w *_AttrWriterState) SetFloat64(name _SchemaAttr, f float64) error {
return _StateSet(w.d, name, f)
}
func (w *_AttrWriterState) SetList(name _SchemaAttr, l []interface{}) error {
return _StateSet(w.d, name, l)
}
func (w *_AttrWriterState) SetMap(name _SchemaAttr, m map[string]interface{}) error {
return _StateSet(w.d, name, m)
}
func (w *_AttrWriterState) SetSet(name _SchemaAttr, s *schema.Set) error {
return _StateSet(w.d, name, []interface{}{s})
}
func (w *_AttrWriterState) SetString(name _SchemaAttr, s string) error {
return _StateSet(w.d, name, s)
}

View File

@ -0,0 +1,872 @@
package consul
import (
"fmt"
consulapi "github.com/hashicorp/consul/api"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform/helper/schema"
)
const (
_AgentSelfACLDatacenter _TypeKey = iota
_AgentSelfACLDefaultPolicy
_AgentSelfACLDisableTTL
_AgentSelfACLDownPolicy
_AgentSelfACLEnforceVersion8
_AgentSelfACLTTL
_AgentSelfAddresses
_AgentSelfAdvertiseAddr
_AgentSelfAdvertiseAddrWAN
_AgentSelfAdvertiseAddrs
_AgentSelfAtlasJoin
_AgentSelfBindAddr
_AgentSelfBootstrap
_AgentSelfBootstrapExpect
_AgentSelfCAFile
_AgentSelfCertFile
_AgentSelfCheckDeregisterIntervalMin
_AgentSelfCheckDisableAnonymousSignature
_AgentSelfCheckDisableRemoteExec
_AgentSelfCheckReapInterval
_AgentSelfCheckUpdateInterval
_AgentSelfClientAddr
_AgentSelfDNSConfig
_AgentSelfDNSRecursors
_AgentSelfDataDir
_AgentSelfDatacenter
_AgentSelfDevMode
_AgentSelfDisableCoordinates
_AgentSelfDisableUpdateCheck
_AgentSelfDomain
_AgentSelfEnableDebug
_AgentSelfEnableSyslog
_AgentSelfEnableUI
_AgentSelfID
_AgentSelfKeyFile
_AgentSelfLeaveOnInt
_AgentSelfLeaveOnTerm
_AgentSelfLogLevel
_AgentSelfName
_AgentSelfPerformance
_AgentSelfPidFile
_AgentSelfPorts
_AgentSelfProtocol
_AgentSelfReconnectTimeoutLAN
_AgentSelfReconnectTimeoutWAN
_AgentSelfRejoinAfterLeave
_AgentSelfRetryJoin
_AgentSelfRetryJoinEC2
_AgentSelfRetryJoinGCE
_AgentSelfRetryJoinWAN
_AgentSelfRetryMaxAttempts
_AgentSelfRetryMaxAttemptsWAN
_AgentSelfRevision
_AgentSelfSerfLANBindAddr
_AgentSelfSerfWANBindAddr
_AgentSelfServer
_AgentSelfServerName
_AgentSelfSessionTTLMin
_AgentSelfStartJoin
_AgentSelfStartJoinWAN
_AgentSelfSyslogFacility
_AgentSelfTLSMinVersion
_AgentSelfTaggedAddresses
_AgentSelfTelemetry
_AgentSelfTranslateWANAddrs
_AgentSelfUIDir
_AgentSelfUnixSockets
_AgentSelfVerifyIncoming
_AgentSelfVerifyOutgoing
_AgentSelfVerifyServerHostname
_AgentSelfVersion
_AgentSelfVersionPrerelease
)
const (
_AgentSelfDNSAllowStale _TypeKey = iota
_AgentSelfDNSMaxStale
_AgentSelfRecursorTimeout
_AgentSelfDNSDisableCompression
_AgentSelfDNSEnableTruncate
_AgentSelfDNSNodeTTL
_AgentSelfDNSOnlyPassing
_AgentSelfDNSUDPAnswerLimit
_AgentSelfServiceTTL
)
const (
_AgentSelfPerformanceRaftMultiplier _TypeKey = iota
)
const (
_AgentSelfPortsDNS _TypeKey = iota
_AgentSelfPortsHTTP
_AgentSelfPortsHTTPS
_AgentSelfPortsRPC
_AgentSelfPortsSerfLAN
_AgentSelfPortsSerfWAN
_AgentSelfPortsServer
)
const (
_AgentSelfTaggedAddressesLAN _TypeKey = iota
_AgentSelfTaggedAddressesWAN
)
const (
_AgentSelfTelemetryCirconusAPIApp _TypeKey = iota
_AgentSelfTelemetryCirconusAPIURL
_AgentSelfTelemetryCirconusBrokerID
_AgentSelfTelemetryCirconusBrokerSelectTag
_AgentSelfTelemetryCirconusCheckDisplayName
_AgentSelfTelemetryCirconusCheckForceMetricActiation
_AgentSelfTelemetryCirconusCheckID
_AgentSelfTelemetryCirconusCheckInstanceID
_AgentSelfTelemetryCirconusCheckSearchTag
_AgentSelfTelemetryCirconusCheckSubmissionURL
_AgentSelfTelemetryCirconusCheckTags
_AgentSelfTelemetryCirconusSubmissionInterval
_AgentSelfTelemetryDisableHostname
_AgentSelfTelemetryDogStatsdAddr
_AgentSelfTelemetryDogStatsdTags
_AgentSelfTelemetryStatsdAddr
_AgentSelfTelemetryStatsiteAddr
_AgentSelfTelemetryStatsitePrefix
)
// Schema for consul's /v1/agent/self endpoint
var _AgentSelfMap = map[_TypeKey]*_TypeEntry{
_AgentSelfACLDatacenter: {
APIName: "ACLDatacenter",
SchemaName: "acl_datacenter",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfACLDefaultPolicy: {
APIName: "ACLDefaultPolicy",
SchemaName: "acl_default_policy",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfACLDisableTTL: {
APIName: "ACLDisabledTTL",
SchemaName: "acl_disable_ttl",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfACLDownPolicy: {
APIName: "ACLDownPolicy",
SchemaName: "acl_down_policy",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfACLEnforceVersion8: {
APIName: "ACLEnforceVersion8",
SchemaName: "acl_enforce_version_8",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfACLTTL: {
APIName: "ACLTTL",
SchemaName: "acl_ttl",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfAddresses: {
APIName: "Addresses",
SchemaName: "addresses",
Source: _SourceAPIResult,
Type: schema.TypeMap,
},
_AgentSelfAdvertiseAddr: {
APIName: "AdvertiseAddr",
SchemaName: "advertise_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfAdvertiseAddrs: {
APIName: "AdvertiseAddrs",
SchemaName: "advertise_addrs",
Source: _SourceAPIResult,
Type: schema.TypeMap,
},
_AgentSelfAdvertiseAddrWAN: {
APIName: "AdvertiseAddrWan",
SchemaName: "advertise_addr_wan",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
// Omitting the following since they've been depreciated:
//
// "AtlasInfrastructure": "",
// "AtlasEndpoint": "",
_AgentSelfAtlasJoin: {
APIName: "AtlasJoin",
SchemaName: "atlas_join",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfBindAddr: {
APIName: "BindAddr",
SchemaName: "bind_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfBootstrap: {
APIName: "Bootstrap",
SchemaName: "bootstrap",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfBootstrapExpect: {
APIName: "BootstrapExpect",
SchemaName: "bootstrap_expect",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfCAFile: {
APIName: "CAFile",
SchemaName: "ca_file",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfCertFile: {
APIName: "CertFile",
SchemaName: "cert_file",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfCheckDeregisterIntervalMin: {
APIName: "CheckDeregisterIntervalMin",
SchemaName: "check_deregister_interval_min",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfCheckDisableAnonymousSignature: {
APIName: "DisableAnonymousSignature",
SchemaName: "disable_anonymous_signature",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfCheckDisableRemoteExec: {
APIName: "DisableRemoteExec",
SchemaName: "disable_remote_exec",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfCheckReapInterval: {
APIName: "CheckReapInterval",
SchemaName: "check_reap_interval",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfCheckUpdateInterval: {
APIName: "CheckUpdateInterval",
SchemaName: "check_update_interval",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfClientAddr: {
APIName: "ClientAddr",
SchemaName: "client_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfDNSConfig: {
APIName: "DNSConfig",
SchemaName: "dns_config",
Source: _SourceAPIResult,
Type: schema.TypeMap,
SetMembers: map[_TypeKey]*_TypeEntry{
_AgentSelfDNSAllowStale: {
APIName: "AllowStale",
SchemaName: "allow_stale",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfDNSDisableCompression: {
APIName: "DisableCompression",
SchemaName: "disable_compression",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfDNSEnableTruncate: {
APIName: "EnableTruncate",
SchemaName: "enable_truncate",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfDNSMaxStale: {
APIName: "MaxStale",
SchemaName: "max_stale",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfDNSNodeTTL: {
APIName: "NodeTTL",
SchemaName: "node_ttl",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfDNSOnlyPassing: {
APIName: "OnlyPassing",
SchemaName: "only_passing",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfRecursorTimeout: {
APIName: "RecursorTimeout",
SchemaName: "recursor_timeout",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfServiceTTL: {
APIName: "ServiceTTL",
SchemaName: "service_ttl",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfDNSUDPAnswerLimit: {
APIName: "UDPAnswerLimit",
SchemaName: "udp_answer_limit",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
},
},
_AgentSelfDataDir: {
APIName: "DataDir",
SchemaName: "data_dir",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfDatacenter: {
APIName: "Datacenter",
SchemaName: "datacenter",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfDevMode: {
APIName: "DevMode",
SchemaName: "dev_mode",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfDisableCoordinates: {
APIName: "DisableCoordinates",
SchemaName: "coordinates",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfDisableUpdateCheck: {
APIName: "DisableUpdateCheck",
SchemaName: "update_check",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfDNSRecursors: {
APIName: "DNSRecursors",
APIAliases: []_APIAttr{"DNSRecursor"},
SchemaName: "dns_recursors",
Source: _SourceAPIResult,
Type: schema.TypeList,
},
_AgentSelfDomain: {
APIName: "Domain",
SchemaName: "domain",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfEnableDebug: {
APIName: "EnableDebug",
SchemaName: "debug",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfEnableSyslog: {
APIName: "EnableSyslog",
SchemaName: "syslog",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfEnableUI: {
APIName: "EnableUi",
SchemaName: "ui",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
// "HTTPAPIResponseHeaders": nil,
_AgentSelfID: {
APIName: "NodeID",
SchemaName: "id",
Source: _SourceAPIResult,
Type: schema.TypeString,
ValidateFuncs: []interface{}{
_ValidateRegexp(`(?i)^[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}$`),
},
APITest: _APITestID,
APIToState: _APIToStateID,
},
_AgentSelfKeyFile: {
APIName: "KeyFile",
SchemaName: "key_file",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfLeaveOnInt: {
APIName: "SkipLeaveOnInt",
SchemaName: "leave_on_int",
Source: _SourceAPIResult,
Type: schema.TypeBool,
APITest: _APITestBool,
APIToState: _NegateBoolToState(_APIToStateBool),
},
_AgentSelfLeaveOnTerm: {
APIName: "LeaveOnTerm",
SchemaName: "leave_on_term",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfLogLevel: {
APIName: "LogLevel",
SchemaName: "log_level",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfName: {
APIName: "NodeName",
SchemaName: "name",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfPerformance: {
APIName: "Performance",
SchemaName: "performance",
Source: _SourceAPIResult,
Type: schema.TypeMap,
SetMembers: map[_TypeKey]*_TypeEntry{
_AgentSelfPerformanceRaftMultiplier: {
APIName: "RaftMultiplier",
SchemaName: "raft_multiplier",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
},
},
_AgentSelfPidFile: {
APIName: "PidFile",
SchemaName: "pid_file",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfPorts: {
APIName: "Ports",
SchemaName: "ports",
Source: _SourceAPIResult,
Type: schema.TypeMap,
SetMembers: map[_TypeKey]*_TypeEntry{
_AgentSelfPortsDNS: {
APIName: "DNS",
SchemaName: "dns",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfPortsHTTP: {
APIName: "HTTP",
SchemaName: "http",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfPortsHTTPS: {
APIName: "HTTPS",
SchemaName: "https",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfPortsRPC: {
APIName: "RPC",
SchemaName: "rpc",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfPortsSerfLAN: {
APIName: "SerfLan",
SchemaName: "serf_lan",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfPortsSerfWAN: {
APIName: "SerfWan",
SchemaName: "serf_wan",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfPortsServer: {
APIName: "Server",
SchemaName: "server",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
},
},
_AgentSelfProtocol: {
APIName: "Protocol",
SchemaName: "protocol",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfReconnectTimeoutLAN: {
APIName: "ReconnectTimeoutLan",
SchemaName: "reconnect_timeout_lan",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfReconnectTimeoutWAN: {
APIName: "ReconnectTimeoutWan",
SchemaName: "reconnect_timeout_wan",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfRejoinAfterLeave: {
APIName: "RejoinAfterLeave",
SchemaName: "rejoin_after_leave",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
// "RetryIntervalWanRaw": "",
_AgentSelfRetryJoin: {
APIName: "RetryJoin",
SchemaName: "retry_join",
Source: _SourceAPIResult,
Type: schema.TypeList,
},
_AgentSelfRetryJoinWAN: {
APIName: "RetryJoinWan",
SchemaName: "retry_join_wan",
Source: _SourceAPIResult,
Type: schema.TypeList,
},
_AgentSelfRetryMaxAttempts: {
APIName: "RetryMaxAttempts",
SchemaName: "retry_max_attempts",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfRetryMaxAttemptsWAN: {
APIName: "RetryMaxAttemptsWan",
SchemaName: "retry_max_attempts_wan",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfRetryJoinEC2: {
APIName: "RetryJoinEC2",
SchemaName: "retry_join_ec2",
Source: _SourceAPIResult,
Type: schema.TypeMap,
},
_AgentSelfRetryJoinGCE: {
APIName: "RetryJoinGCE",
SchemaName: "retry_join_GCE",
Source: _SourceAPIResult,
Type: schema.TypeMap,
},
_AgentSelfRevision: {
APIName: "Revision",
SchemaName: "revision",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfSerfLANBindAddr: {
APIName: "SerfLanBindAddr",
SchemaName: "serf_lan_bind_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfSerfWANBindAddr: {
APIName: "SerfWanBindAddr",
SchemaName: "serf_wan_bind_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfServer: {
APIName: "Server",
SchemaName: "server",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfServerName: {
APIName: "ServerName",
SchemaName: "server_name",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfSessionTTLMin: {
APIName: "SessionTTLMin",
SchemaName: "session_ttl_min",
Source: _SourceAPIResult,
Type: schema.TypeFloat,
},
_AgentSelfStartJoin: {
APIName: "StartJoin",
SchemaName: "start_join",
Source: _SourceAPIResult,
Type: schema.TypeList,
},
_AgentSelfStartJoinWAN: {
APIName: "StartJoinWan",
SchemaName: "start_join_wan",
Source: _SourceAPIResult,
Type: schema.TypeList,
},
_AgentSelfSyslogFacility: {
APIName: "SyslogFacility",
SchemaName: "syslog_facility",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTaggedAddresses: {
APIName: "TaggedAddresses",
SchemaName: "tagged_addresses",
Source: _SourceAPIResult,
Type: schema.TypeMap,
SetMembers: map[_TypeKey]*_TypeEntry{
_AgentSelfTaggedAddressesLAN: {
APIName: "LAN",
SchemaName: "lan",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTaggedAddressesWAN: {
APIName: "WAN",
SchemaName: "wan",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
},
},
_AgentSelfTelemetry: {
APIName: "Telemetry",
SchemaName: "telemetry",
Source: _SourceAPIResult,
Type: schema.TypeMap,
SetMembers: map[_TypeKey]*_TypeEntry{
_AgentSelfTelemetryCirconusAPIApp: {
APIName: "CirconusAPIApp",
SchemaName: "circonus_api_app",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusAPIURL: {
APIName: "CirconusAPIURL",
SchemaName: "circonus_api_url",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusBrokerID: {
APIName: "CirconusBrokerID",
SchemaName: "circonus_broker_id",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusBrokerSelectTag: {
APIName: "CirconusBrokerSelectTag",
SchemaName: "circonus_broker_select_tag",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckDisplayName: {
APIName: "CirconusCheckDisplayName",
SchemaName: "circonus_check_display_name",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckForceMetricActiation: {
APIName: "CirconusCheckForceMetricActivation",
SchemaName: "circonus_check_force_metric_activation",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckID: {
APIName: "CirconusCheckID",
SchemaName: "circonus_check_id",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckInstanceID: {
APIName: "CirconusCheckInstanceID",
SchemaName: "circonus_check_instance_id",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckSearchTag: {
APIName: "CirconusCheckSearchTag",
SchemaName: "circonus_check_search_tag",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckSubmissionURL: {
APIName: "CirconusCheckSubmissionURL",
SchemaName: "circonus_check_submission_url",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusCheckTags: {
APIName: "CirconusCheckTags",
SchemaName: "circonus_check_tags",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryCirconusSubmissionInterval: {
APIName: "CirconusSubmissionInterval",
SchemaName: "circonus_submission_interval",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryDisableHostname: {
APIName: "DisableHostname",
SchemaName: "disable_hostname",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfTelemetryDogStatsdAddr: {
APIName: "DogStatsdAddr",
SchemaName: "dog_statsd_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryDogStatsdTags: {
APIName: "DogStatsdTags",
SchemaName: "dog_statsd_tags",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryStatsdAddr: {
APIName: "StatsdTags",
SchemaName: "statsd_tags",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryStatsiteAddr: {
APIName: "StatsiteAddr",
SchemaName: "statsite_addr",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTelemetryStatsitePrefix: {
APIName: "StatsitePrefix",
SchemaName: "statsite_prefix",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
},
},
_AgentSelfTLSMinVersion: {
APIName: "TLSMinVersion",
SchemaName: "tls_min_version",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfTranslateWANAddrs: {
APIName: "TranslateWanAddrs",
SchemaName: "translate_wan_addrs",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfUIDir: {
APIName: "UiDir",
SchemaName: "ui_dir",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfUnixSockets: {
APIName: "UnixSockets",
SchemaName: "unix_sockets",
Source: _SourceAPIResult,
Type: schema.TypeMap,
},
_AgentSelfVerifyIncoming: {
APIName: "VerifyIncoming",
SchemaName: "verify_incoming",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfVerifyServerHostname: {
APIName: "VerifyServerHostname",
SchemaName: "verify_server_hostname",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfVerifyOutgoing: {
APIName: "VerifyOutgoing",
SchemaName: "verify_outgoing",
Source: _SourceAPIResult,
Type: schema.TypeBool,
},
_AgentSelfVersion: {
APIName: "Version",
SchemaName: "version",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
_AgentSelfVersionPrerelease: {
APIName: "VersionPrerelease",
SchemaName: "version_prerelease",
Source: _SourceAPIResult,
Type: schema.TypeString,
},
// "Watches": nil,
}
func dataSourceConsulAgentSelf() *schema.Resource {
return &schema.Resource{
Read: dataSourceConsulAgentSelfRead,
Schema: _TypeEntryMapToSchema(_AgentSelfMap),
}
}
func dataSourceConsulAgentSelfRead(d *schema.ResourceData, meta interface{}) error {
client := meta.(*consulapi.Client)
info, err := client.Agent().Self()
if err != nil {
return err
}
const _APIAgentConfig = "Config"
cfg, ok := info[_APIAgentConfig]
if !ok {
return fmt.Errorf("No %s info available within provider's agent/self endpoint", _APIAgentConfig)
}
// TODO(sean@): It'd be nice if this data source had a way of filtering out
// irrelevant data so only the important bits are persisted in the state file.
// Something like an attribute mask or even a regexp of matching schema names
// would be sufficient in the most basic case. Food for thought.
dataSourceWriter := _NewStateWriter(d)
for k, e := range _AgentSelfMap {
apiTest := e.APITest
if apiTest == nil {
apiTest = e.LookupDefaultTypeHandler().APITest
}
if apiTest == nil {
panic(fmt.Sprintf("PROVIDER BUG: %v missing APITest method", k))
}
apiToState := e.APIToState
if apiToState == nil {
apiToState = e.LookupDefaultTypeHandler().APIToState
}
if apiToState == nil {
panic(fmt.Sprintf("PROVIDER BUG: %v missing APIToState method", k))
}
if v, ok := apiTest(e, cfg); ok {
if err := apiToState(e, v, dataSourceWriter); err != nil {
return errwrap.Wrapf(fmt.Sprintf("error writing %q's data to state: {{err}}", e.SchemaName), err)
}
}
}
return nil
}

View File

@ -0,0 +1,53 @@
package consul
import (
"fmt"
"testing"
"github.com/hashicorp/terraform/helper/resource"
"github.com/hashicorp/terraform/terraform"
)
func TestAccDataConsulAgentSelf_basic(t *testing.T) {
resource.Test(t, resource.TestCase{
PreCheck: func() { testAccPreCheck(t) },
Providers: testAccProviders,
Steps: []resource.TestStep{
resource.TestStep{
Config: testAccDataConsulAgentSelfConfig,
Check: resource.ComposeTestCheckFunc(
testAccCheckDataSourceValue("data.consul_agent_self.read", "bootstrap", "false"),
testAccCheckDataSourceValue("data.consul_agent_self.read", "datacenter", "dc1"),
testAccCheckDataSourceValue("data.consul_agent_self.read", "id", "<any>"),
testAccCheckDataSourceValue("data.consul_agent_self.read", "name", "<any>"),
testAccCheckDataSourceValue("data.consul_agent_self.read", "server", "true"),
),
},
},
})
}
func testAccCheckDataSourceValue(n, attr, val string) resource.TestCheckFunc {
return func(s *terraform.State) error {
rn, ok := s.RootModule().Resources[n]
if !ok {
return fmt.Errorf("Resource not found")
}
out, ok := rn.Primary.Attributes[attr]
if !ok {
return fmt.Errorf("Attribute '%s' not found: %#v", attr, rn.Primary.Attributes)
}
if val != "<any>" && out != val {
return fmt.Errorf("Attribute '%s' value '%s' != '%s'", attr, out, val)
}
if val == "<any>" && out == "" {
return fmt.Errorf("Attribute '%s' value '%s'", attr, out)
}
return nil
}
}
const testAccDataConsulAgentSelfConfig = `
data "consul_agent_self" "read" {
}
`

View File

@ -64,7 +64,8 @@ func Provider() terraform.ResourceProvider {
},
DataSourcesMap: map[string]*schema.Resource{
"consul_keys": dataSourceConsulKeys(),
"consul_agent_self": dataSourceConsulAgentSelf(),
"consul_keys": dataSourceConsulKeys(),
},
ResourcesMap: map[string]*schema.Resource{

View File

@ -0,0 +1,498 @@
package consul
import (
"bytes"
"fmt"
"regexp"
"sort"
"strconv"
"github.com/hashicorp/errwrap"
"github.com/hashicorp/terraform/helper/hashcode"
"github.com/hashicorp/terraform/helper/schema"
)
// _APIAttr is the type used for constants representing well known keys within
// the API that are transmitted back to a resource over an API.
type _APIAttr string
// _SchemaAttr is the type used for constants representing well known keys
// within the schema for a resource.
type _SchemaAttr string
// _SourceFlags represent the ways in which an attribute can be written. Some
// sources are mutually exclusive, yet other flag combinations are composable.
type _SourceFlags int
// _TypeKey is the lookup mechanism for the generated schema.
type _TypeKey int
// An array of inputs used as typed arguments and converted from their type into
// function objects that are dynamically constructed and executed.
type _ValidatorInputs []interface{}
// _ValidateRegexp is a regexp pattern to use to validate schema input.
type _ValidateRegexp string
const (
// _SourceUserRequired indicates the parameter must be provided by the user in
// their configuration.
_SourceUserRequired _SourceFlags = 1 << iota
// _SourceUserOptional indicates the parameter may optionally be specified by
// the user in their configuration.
_SourceUserOptional
// _SourceAPIResult indicates the parameter may only be set by the return of
// an API call.
_SourceAPIResult
)
type _TypeEntry struct {
APIName _APIAttr
APIAliases []_APIAttr
Source _SourceFlags
Description string
SchemaName _SchemaAttr
Type schema.ValueType
ValidateFuncs []interface{}
SetMembers map[_TypeKey]*_TypeEntry
// APITest, if returns true, will call APIToState. The if the value was
// found, the second return parameter will include the value that should be
// set in the state store.
APITest func(*_TypeEntry, map[string]interface{}) (interface{}, bool)
// APIToState takes the value from APITest and writes it to the _AttrWriter
APIToState func(*_TypeEntry, interface{}, _AttrWriter) error
}
type _TypeHandlers struct {
APITest func(*_TypeEntry, map[string]interface{}) (interface{}, bool)
APIToState func(*_TypeEntry, interface{}, _AttrWriter) error
}
var _TypeHandlerLookupMap = map[schema.ValueType]*_TypeHandlers{
schema.TypeBool: &_TypeHandlers{
APITest: _APITestBool,
APIToState: _APIToStateBool,
},
schema.TypeFloat: &_TypeHandlers{
APITest: _APITestFloat64,
APIToState: _APIToStateFloat64,
},
schema.TypeList: &_TypeHandlers{
APITest: _APITestList,
APIToState: _APIToStateList,
},
schema.TypeMap: &_TypeHandlers{
APITest: _APITestMap,
APIToState: _APIToStateMap,
},
schema.TypeSet: &_TypeHandlers{
APITest: _APITestSet,
APIToState: _APIToStateSet,
},
schema.TypeString: &_TypeHandlers{
APITest: _APITestString,
APIToState: _APIToStateString,
},
}
func _APITestBool(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
v, found := self[string(e.APIName)]
if found {
if b, ok := v.(bool); ok {
return b, true
} else {
panic(fmt.Sprintf("PROVIDER BUG: %q fails bool type assertion", e.SchemaName))
}
}
return false, false
}
func _APITestFloat64(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
v, found := self[string(e.APIName)]
if found {
if f, ok := v.(float64); ok {
return f, true
} else {
panic(fmt.Sprintf("PROVIDER BUG: %q fails float64 type assertion", e.SchemaName))
}
}
return 0.0, false
}
func _APITestID(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
v, _ := _APITestString(e, self)
// Unconditionally return true so that the call to the APIToState handler can
// return an error.
return v, true
}
func _APITestList(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
names := append([]_APIAttr{e.APIName}, e.APIAliases...)
const defaultListLen = 8
l := make([]interface{}, 0, defaultListLen)
var foundName bool
for _, name := range names {
v, found := self[string(name)]
if found {
foundName = true
// TODO(sean@): should make a list writer that normalizes v.(type) to a
// string. For now we only accept strings and lists.
switch u := v.(type) {
case []interface{}:
l = append(l, u...)
case string:
l = append(l, u)
default:
panic(fmt.Sprintf("PROVIDER BUG: %q fails list type assertion", e.SchemaName))
}
}
}
if foundName {
return l, true
}
return []interface{}{}, false
}
func _APITestMap(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
v, found := self[string(e.APIName)]
if found {
if m, ok := v.(map[string]interface{}); ok {
return m, true
} else {
panic(fmt.Sprintf("PROVIDER BUG: %q fails map type assertion", e.SchemaName))
}
}
return "", false
}
func _APITestSet(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
v, found := self[string(e.APIName)]
if found {
if m, ok := v.(map[string]interface{}); ok {
return m, true
} else {
panic(fmt.Sprintf("PROVIDER BUG: %q fails map type assertion", e.SchemaName))
}
}
return "", false
}
func _APITestString(e *_TypeEntry, self map[string]interface{}) (interface{}, bool) {
v, found := self[string(e.APIName)]
if found {
if s, ok := v.(string); ok {
return s, true
} else {
panic(fmt.Sprintf("PROVIDER BUG: %q fails string type assertion", e.SchemaName))
}
}
return "", false
}
func _APIToStateBool(e *_TypeEntry, v interface{}, w _AttrWriter) error {
return w.SetBool(e.SchemaName, v.(bool))
}
func _APIToStateID(e *_TypeEntry, v interface{}, w _AttrWriter) error {
s, ok := v.(string)
if !ok || len(s) == 0 {
return fmt.Errorf("Unable to set %q's ID to an empty or non-string value: %#v", e.SchemaName, v)
}
stateWriter, ok := w.(*_AttrWriterState)
if !ok {
return fmt.Errorf("PROVIDER BUG: unable to SetID with a non-_AttrWriterState")
}
stateWriter.SetID(s)
return nil
}
func _APIToStateFloat64(e *_TypeEntry, v interface{}, w _AttrWriter) error {
f, ok := v.(float64)
if !ok {
return fmt.Errorf("PROVIDER BUG: unable to cast %s to a float64", e.SchemaName)
}
return w.SetFloat64(e.SchemaName, f)
}
func _APIToStateList(e *_TypeEntry, v interface{}, w _AttrWriter) error {
l, ok := v.([]interface{})
if !ok {
return fmt.Errorf("PROVIDER BUG: unable to cast %s to a list", e.SchemaName)
}
return w.SetList(e.SchemaName, l)
}
func _APIToStateMap(e *_TypeEntry, v interface{}, w _AttrWriter) error {
rawMap, ok := v.(map[string]interface{})
if !ok {
return fmt.Errorf("PROVIDER BUG: unable to cast %s to a map", e.SchemaName)
}
m := make(map[string]interface{}, len(rawMap))
mWriter := _NewMapWriter(&m)
// Make a lookup map by API Schema Name
var setMembersLen int
if e.SetMembers != nil {
setMembersLen = len(e.SetMembers)
}
apiLookup := make(map[string]*_TypeEntry, setMembersLen)
for _, typeEntry := range e.SetMembers {
apiLookup[string(e.SchemaName)] = typeEntry
}
for k, v := range rawMap {
var usedSchemaHandler bool
if attrEntry, found := apiLookup[k]; found {
usedSchemaHandler = true
if err := attrEntry.APIToState(e, v, mWriter); err != nil {
return errwrap.Wrapf(fmt.Sprintf("Error calling API to state handler on %s: {{err}}", k), err)
}
}
if !usedSchemaHandler {
if err := mWriter.Set(_SchemaAttr(k), v); err != nil {
return errwrap.Wrapf("Unable to store map in state: {{err}}", err)
}
}
}
return w.SetMap(e.SchemaName, m)
}
func _APIToStateSet(e *_TypeEntry, v interface{}, w _AttrWriter) error {
s, ok := v.([]map[string]interface{})
if !ok {
return fmt.Errorf("PROVIDER BUG: unable to cast %s to a set", e.SchemaName)
}
set := schema.NewSet(schema.HashResource(nil), nil)
set.Add(s)
return w.SetSet(e.SchemaName, set)
}
func _APIToStateString(e *_TypeEntry, v interface{}, w _AttrWriter) error {
s, ok := v.(string)
if !ok {
return fmt.Errorf("PROVIDER BUG: unable to cast %s to a float64", e.SchemaName)
}
return w.SetString(e.SchemaName, s)
}
func _HashMap(in interface{}) int {
return 0
m, ok := in.(map[string]interface{})
if !ok {
panic(fmt.Sprintf("PROVIDER BUG: Unable to cast %#v to a map", in))
}
keys := make([]string, 0, len(m))
for k, _ := range m {
keys = append(keys, k)
}
sort.Strings(keys)
b := &bytes.Buffer{}
const _DefaultHashBufSize = 4096
b.Grow(_DefaultHashBufSize)
for _, k := range keys {
v, found := m[k]
if !found {
panic("PROVIDER BUG: race condition: key should not be missing")
}
fmt.Fprintf(b, k)
switch u := v.(type) {
case string:
fmt.Fprint(b, u)
case bool:
fmt.Fprintf(b, "%t", u)
case float64:
fmt.Fprint(b, strconv.FormatFloat(u, 'g', -1, 64))
case int, uint:
fmt.Fprintf(b, "%d", u)
case nil:
default:
panic(fmt.Sprintf("Unsupported type %T in map hasher", v))
}
}
return hashcode.String(b.String())
}
func _Indirect(v interface{}) interface{} {
switch v.(type) {
case string:
return v
case *string:
p := v.(*string)
if p == nil {
return nil
}
return *p
default:
return v
}
}
func (e *_TypeEntry) LookupDefaultTypeHandler() *_TypeHandlers {
h, found := _TypeHandlerLookupMap[e.Type]
if !found {
panic(fmt.Sprintf("PROVIDER BUG: unable to lookup %q's type (%#v)", e.SchemaName, e.Type))
}
return h
}
// _NegateBoolToState is a factory function that creates a new function that
// negates whatever the bool is that's passed in as an argument.
func _NegateBoolToState(fn func(*_TypeEntry, interface{}, _AttrWriter) error) func(*_TypeEntry, interface{}, _AttrWriter) error {
return func(e *_TypeEntry, v interface{}, w _AttrWriter) error {
b, ok := v.(bool)
if !ok {
return fmt.Errorf("Unable to type assert non-bool value: %#v", v)
}
return fn(e, !b, w)
}
}
// _StateSet sets an attribute based on an attrName. Return an error if the
// Set() to schema.ResourceData fails.
func _StateSet(d *schema.ResourceData, attrName _SchemaAttr, v interface{}) error {
if err := d.Set(string(attrName), _Indirect(v)); err != nil {
return fmt.Errorf("PROVIDER BUG: failed set schema attribute %s to value %#v: %v", attrName, v, err)
}
return nil
}
func _TypeEntryMapToSchema(in map[_TypeKey]*_TypeEntry) map[string]*schema.Schema {
out := make(map[string]*schema.Schema, len(in))
for _, e := range in {
e.Validate()
attr := &schema.Schema{
Type: e.Type,
Description: e.Description,
Optional: e.Source&_SourceAPIResult == _SourceAPIResult,
Required: e.Source&_SourceUserRequired == _SourceUserRequired,
Computed: e.Source&_SourceAPIResult == _SourceAPIResult,
ValidateFunc: e.MakeValidationFunc(),
}
// Fixup the type: use the real type vs a surrogate type
switch e.Type {
case schema.TypeList:
attr.Elem = &schema.Schema{
Type: schema.TypeString,
}
case schema.TypeSet:
attr.Elem = &schema.Resource{
Schema: _TypeEntryMapToSchema(e.SetMembers),
}
}
out[string(e.SchemaName)] = attr
}
return out
}
func (e *_TypeEntry) Validate() {
if e.Source&_SourceAPIResult == _SourceAPIResult && e.Type == schema.TypeSet {
panic(fmt.Sprintf("PROVIDER BUG: %s can not be computed and of type Set", e.SchemaName))
}
if len(e.SetMembers) != 0 && !(e.Type == schema.TypeSet || e.Type == schema.TypeMap) {
panic(fmt.Sprintf("PROVIDER BUG: %s is not of type Set but has SetMembers set", e.SchemaName))
}
if e.Source&(_SourceUserRequired|_SourceAPIResult) == (_SourceUserRequired | _SourceAPIResult) {
panic(fmt.Sprintf("PROVIDER BUG: %#v and %#v are mutually exclusive Source flags", _SourceUserRequired, _SourceAPIResult))
}
}
// MakeValidateionFunc takes a list of typed validator inputs from the receiver
// and creates a validation closure that calls each validator in serial until
// either a warning or error is returned from the first validation function.
func (e *_TypeEntry) MakeValidationFunc() func(v interface{}, key string) (warnings []string, errors []error) {
if len(e.ValidateFuncs) == 0 {
return nil
}
fns := make([]func(v interface{}, key string) (warnings []string, errors []error), len(e.ValidateFuncs))
for _, v := range e.ValidateFuncs {
switch u := v.(type) {
case _ValidateRegexp:
fns = append(fns, _ValidateRegexpFactory(e, string(u)))
}
}
return func(v interface{}, key string) (warnings []string, errors []error) {
for _, fn := range fns {
warnings, errors = fn(v, key)
if len(warnings) > 0 || len(errors) > 0 {
break
}
}
return warnings, errors
}
}
// _ValidateFuncs takes a list of typed validator inputs, creates validation
// functions for each and then runs them in serial until either a warning or
// error is returned from the first validation function.
func _ValidateFuncs(e *_TypeEntry, in ...interface{}) func(v interface{}, key string) (warnings []string, errors []error) {
if len(in) == 0 {
return nil
}
fns := make([]func(v interface{}, key string) (warnings []string, errors []error), len(in))
for _, v := range in {
switch v.(type) {
case _ValidateRegexp:
fns = append(fns, _ValidateRegexpFactory(e, v.(string)))
}
}
return func(v interface{}, key string) (warnings []string, errors []error) {
for _, fn := range fns {
warnings, errors = fn(v, key)
if len(warnings) > 0 || len(errors) > 0 {
break
}
}
return warnings, errors
}
}
func _ValidateRegexpFactory(e *_TypeEntry, reString string) func(v interface{}, key string) (warnings []string, errors []error) {
re := regexp.MustCompile(reString)
return func(v interface{}, key string) (warnings []string, errors []error) {
if !re.MatchString(v.(string)) {
errors = append(errors, fmt.Errorf("Invalid %s specified (%q): regexp failed to match string", e.SchemaName, v.(string)))
}
return warnings, errors
}
}