Adds consul_prepared_query resource (#7474)
* provider/consul: first stab at adding prepared query support * provider/consul: flatten pq resource * provider/consul: implement updates for PQ's * provider/consul: implement PQ delete * provider/consul: add acceptance tests for prepared queries * provider/consul: add template support to PQ's * provider/consul: use substructures to express optional related components for PQs * website: first pass at consul prepared query docs * provider/consul: PQ's support datacenter option and store_token option * provider/consul: remove store_token on PQ's for now * provider/consul: allow specifying a separate stored_token * website: update consul PQ docs * website: add link to consul_prepared_query resource * vendor: update github.com/hashicorp/consul/api * provider/consul: handle 404's when reading prepared queries * provider/consul: prepared query failover dcs is a list * website: update consul PQ example usage * website: re-order arguments for consul prepared queries
This commit is contained in:
parent
d7c028d210
commit
ec7fc60d5f
|
@ -0,0 +1,271 @@
|
||||||
|
package consul
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
consulapi "github.com/hashicorp/consul/api"
|
||||||
|
"github.com/hashicorp/terraform/helper/schema"
|
||||||
|
)
|
||||||
|
|
||||||
|
func resourceConsulPreparedQuery() *schema.Resource {
|
||||||
|
return &schema.Resource{
|
||||||
|
Create: resourceConsulPreparedQueryCreate,
|
||||||
|
Update: resourceConsulPreparedQueryUpdate,
|
||||||
|
Read: resourceConsulPreparedQueryRead,
|
||||||
|
Delete: resourceConsulPreparedQueryDelete,
|
||||||
|
|
||||||
|
SchemaVersion: 0,
|
||||||
|
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
"id": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Computed: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"datacenter": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"name": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"session": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"token": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"stored_token": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"service": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"tags": &schema.Schema{
|
||||||
|
Type: schema.TypeSet,
|
||||||
|
Optional: true,
|
||||||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
},
|
||||||
|
|
||||||
|
"near": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"only_passing": &schema.Schema{
|
||||||
|
Type: schema.TypeBool,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
|
||||||
|
"failover": &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Optional: true,
|
||||||
|
MaxItems: 1,
|
||||||
|
Elem: &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
"nearest_n": &schema.Schema{
|
||||||
|
Type: schema.TypeInt,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
"datacenters": &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Optional: true,
|
||||||
|
Elem: &schema.Schema{Type: schema.TypeString},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
"dns": &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
Optional: true,
|
||||||
|
MaxItems: 1,
|
||||||
|
Elem: &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
"ttl": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Optional: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
"template": &schema.Schema{
|
||||||
|
Type: schema.TypeList,
|
||||||
|
MaxItems: 1,
|
||||||
|
Optional: true,
|
||||||
|
Elem: &schema.Resource{
|
||||||
|
Schema: map[string]*schema.Schema{
|
||||||
|
"type": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
"regexp": &schema.Schema{
|
||||||
|
Type: schema.TypeString,
|
||||||
|
Required: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceConsulPreparedQueryCreate(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
client := meta.(*consulapi.Client)
|
||||||
|
wo := &consulapi.WriteOptions{
|
||||||
|
Datacenter: d.Get("datacenter").(string),
|
||||||
|
Token: d.Get("token").(string),
|
||||||
|
}
|
||||||
|
|
||||||
|
pq := preparedQueryDefinitionFromResourceData(d)
|
||||||
|
|
||||||
|
id, _, err := client.PreparedQuery().Create(pq, wo)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId(id)
|
||||||
|
return resourceConsulPreparedQueryRead(d, meta)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceConsulPreparedQueryUpdate(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
client := meta.(*consulapi.Client)
|
||||||
|
wo := &consulapi.WriteOptions{
|
||||||
|
Datacenter: d.Get("datacenter").(string),
|
||||||
|
Token: d.Get("token").(string),
|
||||||
|
}
|
||||||
|
|
||||||
|
pq := preparedQueryDefinitionFromResourceData(d)
|
||||||
|
|
||||||
|
if _, err := client.PreparedQuery().Update(pq, wo); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return resourceConsulPreparedQueryRead(d, meta)
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceConsulPreparedQueryRead(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
client := meta.(*consulapi.Client)
|
||||||
|
qo := &consulapi.QueryOptions{
|
||||||
|
Datacenter: d.Get("datacenter").(string),
|
||||||
|
Token: d.Get("token").(string),
|
||||||
|
}
|
||||||
|
|
||||||
|
queries, _, err := client.PreparedQuery().Get(d.Id(), qo)
|
||||||
|
if err != nil {
|
||||||
|
// Check for a 404/not found, these are returned as errors.
|
||||||
|
if strings.Contains(err.Error(), "not found") {
|
||||||
|
d.SetId("")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(queries) != 1 {
|
||||||
|
d.SetId("")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
pq := queries[0]
|
||||||
|
|
||||||
|
d.Set("name", pq.Name)
|
||||||
|
d.Set("session", pq.Session)
|
||||||
|
d.Set("stored_token", pq.Token)
|
||||||
|
d.Set("service", pq.Service.Service)
|
||||||
|
d.Set("near", pq.Service.Near)
|
||||||
|
d.Set("only_passing", pq.Service.OnlyPassing)
|
||||||
|
d.Set("tags", pq.Service.Tags)
|
||||||
|
|
||||||
|
if pq.Service.Failover.NearestN > 0 {
|
||||||
|
d.Set("failover.0.nearest_n", pq.Service.Failover.NearestN)
|
||||||
|
}
|
||||||
|
if len(pq.Service.Failover.Datacenters) > 0 {
|
||||||
|
d.Set("failover.0.datacenters", pq.Service.Failover.Datacenters)
|
||||||
|
}
|
||||||
|
|
||||||
|
if pq.DNS.TTL != "" {
|
||||||
|
d.Set("dns.0.ttl", pq.DNS.TTL)
|
||||||
|
}
|
||||||
|
|
||||||
|
if pq.Template.Type != "" {
|
||||||
|
d.Set("template.0.type", pq.Template.Type)
|
||||||
|
d.Set("template.0.regexp", pq.Template.Regexp)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func resourceConsulPreparedQueryDelete(d *schema.ResourceData, meta interface{}) error {
|
||||||
|
client := meta.(*consulapi.Client)
|
||||||
|
qo := &consulapi.QueryOptions{
|
||||||
|
Datacenter: d.Get("datacenter").(string),
|
||||||
|
Token: d.Get("token").(string),
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := client.PreparedQuery().Delete(d.Id(), qo); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
d.SetId("")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func preparedQueryDefinitionFromResourceData(d *schema.ResourceData) *consulapi.PreparedQueryDefinition {
|
||||||
|
pq := &consulapi.PreparedQueryDefinition{
|
||||||
|
ID: d.Id(),
|
||||||
|
Name: d.Get("name").(string),
|
||||||
|
Session: d.Get("session").(string),
|
||||||
|
Token: d.Get("stored_token").(string),
|
||||||
|
Service: consulapi.ServiceQuery{
|
||||||
|
Service: d.Get("service").(string),
|
||||||
|
Near: d.Get("near").(string),
|
||||||
|
OnlyPassing: d.Get("only_passing").(bool),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
tags := d.Get("tags").(*schema.Set).List()
|
||||||
|
pq.Service.Tags = make([]string, len(tags))
|
||||||
|
for i, v := range tags {
|
||||||
|
pq.Service.Tags[i] = v.(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := d.GetOk("failover.0"); ok {
|
||||||
|
failover := consulapi.QueryDatacenterOptions{
|
||||||
|
NearestN: d.Get("failover.0.nearest_n").(int),
|
||||||
|
}
|
||||||
|
|
||||||
|
dcs := d.Get("failover.0.datacenters").([]interface{})
|
||||||
|
failover.Datacenters = make([]string, len(dcs))
|
||||||
|
for i, v := range dcs {
|
||||||
|
failover.Datacenters[i] = v.(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
pq.Service.Failover = failover
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := d.GetOk("template.0"); ok {
|
||||||
|
pq.Template = consulapi.QueryTemplate{
|
||||||
|
Type: d.Get("template.0.type").(string),
|
||||||
|
Regexp: d.Get("template.0.regexp").(string),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, ok := d.GetOk("dns.0"); ok {
|
||||||
|
pq.DNS = consulapi.QueryDNSOptions{
|
||||||
|
TTL: d.Get("dns.0.ttl").(string),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pq
|
||||||
|
}
|
|
@ -0,0 +1,171 @@
|
||||||
|
package consul
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
consulapi "github.com/hashicorp/consul/api"
|
||||||
|
"github.com/hashicorp/terraform/helper/resource"
|
||||||
|
"github.com/hashicorp/terraform/terraform"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAccConsulPreparedQuery_basic(t *testing.T) {
|
||||||
|
resource.Test(t, resource.TestCase{
|
||||||
|
PreCheck: func() { testAccPreCheck(t) },
|
||||||
|
Providers: testAccProviders,
|
||||||
|
CheckDestroy: testAccCheckConsulPreparedQueryDestroy,
|
||||||
|
Steps: []resource.TestStep{
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccConsulPreparedQueryConfig,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckConsulPreparedQueryExists(),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("name", "foo"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("stored_token", "pq-token"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("service", "redis"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("near", "_agent"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("tags.#", "1"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("only_passing", "true"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("failover.0.nearest_n", "3"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("failover.0.datacenters.#", "2"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("template.0.type", "name_prefix_match"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("template.0.regexp", "hello"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("dns.0.ttl", "8m"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccConsulPreparedQueryConfigUpdate1,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckConsulPreparedQueryExists(),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("name", "baz"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("stored_token", "pq-token-updated"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("service", "memcached"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("near", "node1"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("tags.#", "2"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("only_passing", "false"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("failover.0.nearest_n", "2"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("failover.0.datacenters.#", "1"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("template.0.regexp", "goodbye"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("dns.0.ttl", "16m"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
resource.TestStep{
|
||||||
|
Config: testAccConsulPreparedQueryConfigUpdate2,
|
||||||
|
Check: resource.ComposeTestCheckFunc(
|
||||||
|
testAccCheckConsulPreparedQueryExists(),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("stored_token", ""),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("near", ""),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("tags.#", "0"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("failover.#", "0"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("template.#", "0"),
|
||||||
|
testAccCheckConsulPreparedQueryAttrValue("dns.#", "0"),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkPreparedQueryExists(s *terraform.State) bool {
|
||||||
|
rn, ok := s.RootModule().Resources["consul_prepared_query.foo"]
|
||||||
|
if !ok {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
id := rn.Primary.ID
|
||||||
|
|
||||||
|
client := testAccProvider.Meta().(*consulapi.Client).PreparedQuery()
|
||||||
|
opts := &consulapi.QueryOptions{Datacenter: "dc1"}
|
||||||
|
pq, _, err := client.Get(id, opts)
|
||||||
|
return err == nil && pq != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccCheckConsulPreparedQueryDestroy(s *terraform.State) error {
|
||||||
|
if checkPreparedQueryExists(s) {
|
||||||
|
return fmt.Errorf("Prepared query 'foo' still exists")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccCheckConsulPreparedQueryExists() resource.TestCheckFunc {
|
||||||
|
return func(s *terraform.State) error {
|
||||||
|
if !checkPreparedQueryExists(s) {
|
||||||
|
return fmt.Errorf("Prepared query 'foo' does not exist")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testAccCheckConsulPreparedQueryAttrValue(attr, val string) resource.TestCheckFunc {
|
||||||
|
return func(s *terraform.State) error {
|
||||||
|
rn, ok := s.RootModule().Resources["consul_prepared_query.foo"]
|
||||||
|
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 out != val {
|
||||||
|
return fmt.Errorf("Attribute '%s' value '%s' != '%s'", attr, out, val)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const testAccConsulPreparedQueryConfig = `
|
||||||
|
resource "consul_prepared_query" "foo" {
|
||||||
|
name = "foo"
|
||||||
|
token = "client-token"
|
||||||
|
stored_token = "pq-token"
|
||||||
|
service = "redis"
|
||||||
|
tags = ["prod"]
|
||||||
|
near = "_agent"
|
||||||
|
only_passing = true
|
||||||
|
|
||||||
|
failover {
|
||||||
|
nearest_n = 3
|
||||||
|
datacenters = ["dc1", "dc2"]
|
||||||
|
}
|
||||||
|
|
||||||
|
template {
|
||||||
|
type = "name_prefix_match"
|
||||||
|
regexp = "hello"
|
||||||
|
}
|
||||||
|
|
||||||
|
dns {
|
||||||
|
ttl = "8m"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
const testAccConsulPreparedQueryConfigUpdate1 = `
|
||||||
|
resource "consul_prepared_query" "foo" {
|
||||||
|
name = "baz"
|
||||||
|
token = "client-token"
|
||||||
|
stored_token = "pq-token-updated"
|
||||||
|
service = "memcached"
|
||||||
|
tags = ["prod","sup"]
|
||||||
|
near = "node1"
|
||||||
|
only_passing = false
|
||||||
|
|
||||||
|
failover {
|
||||||
|
nearest_n = 2
|
||||||
|
datacenters = ["dc2"]
|
||||||
|
}
|
||||||
|
|
||||||
|
template {
|
||||||
|
type = "name_prefix_match"
|
||||||
|
regexp = "goodbye"
|
||||||
|
}
|
||||||
|
|
||||||
|
dns {
|
||||||
|
ttl = "16m"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
const testAccConsulPreparedQueryConfigUpdate2 = `
|
||||||
|
resource "consul_prepared_query" "foo" {
|
||||||
|
name = "baz"
|
||||||
|
service = "memcached"
|
||||||
|
token = "client-token"
|
||||||
|
}
|
||||||
|
`
|
|
@ -66,6 +66,7 @@ func Provider() terraform.ResourceProvider {
|
||||||
"consul_keys": resourceConsulKeys(),
|
"consul_keys": resourceConsulKeys(),
|
||||||
"consul_key_prefix": resourceConsulKeyPrefix(),
|
"consul_key_prefix": resourceConsulKeyPrefix(),
|
||||||
"consul_node": resourceConsulNode(),
|
"consul_node": resourceConsulNode(),
|
||||||
|
"consul_prepared_query": resourceConsulPreparedQuery(),
|
||||||
"consul_service": resourceConsulService(),
|
"consul_service": resourceConsulService(),
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,11 @@ type ServiceQuery struct {
|
||||||
// Service is the service to query.
|
// Service is the service to query.
|
||||||
Service string
|
Service string
|
||||||
|
|
||||||
|
// Near allows baking in the name of a node to automatically distance-
|
||||||
|
// sort from. The magic "_agent" value is supported, which sorts near
|
||||||
|
// the agent which initiated the request by default.
|
||||||
|
Near string
|
||||||
|
|
||||||
// Failover controls what we do if there are no healthy nodes in the
|
// Failover controls what we do if there are no healthy nodes in the
|
||||||
// local datacenter.
|
// local datacenter.
|
||||||
Failover QueryDatacenterOptions
|
Failover QueryDatacenterOptions
|
||||||
|
@ -40,6 +45,17 @@ type ServiceQuery struct {
|
||||||
Tags []string
|
Tags []string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// QueryTemplate carries the arguments for creating a templated query.
|
||||||
|
type QueryTemplate struct {
|
||||||
|
// Type specifies the type of the query template. Currently only
|
||||||
|
// "name_prefix_match" is supported. This field is required.
|
||||||
|
Type string
|
||||||
|
|
||||||
|
// Regexp allows specifying a regex pattern to match against the name
|
||||||
|
// of the query being executed.
|
||||||
|
Regexp string
|
||||||
|
}
|
||||||
|
|
||||||
// PrepatedQueryDefinition defines a complete prepared query.
|
// PrepatedQueryDefinition defines a complete prepared query.
|
||||||
type PreparedQueryDefinition struct {
|
type PreparedQueryDefinition struct {
|
||||||
// ID is this UUID-based ID for the query, always generated by Consul.
|
// ID is this UUID-based ID for the query, always generated by Consul.
|
||||||
|
@ -67,6 +83,11 @@ type PreparedQueryDefinition struct {
|
||||||
// DNS has options that control how the results of this query are
|
// DNS has options that control how the results of this query are
|
||||||
// served over DNS.
|
// served over DNS.
|
||||||
DNS QueryDNSOptions
|
DNS QueryDNSOptions
|
||||||
|
|
||||||
|
// Template is used to pass through the arguments for creating a
|
||||||
|
// prepared query with an attached template. If a template is given,
|
||||||
|
// interpolations are possible in other struct fields.
|
||||||
|
Template QueryTemplate
|
||||||
}
|
}
|
||||||
|
|
||||||
// PreparedQueryExecuteResponse has the results of executing a query.
|
// PreparedQueryExecuteResponse has the results of executing a query.
|
||||||
|
|
|
@ -902,11 +902,11 @@
|
||||||
"revisionTime": "2016-07-26T16:33:11Z"
|
"revisionTime": "2016-07-26T16:33:11Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"checksumSHA1": "glOabn8rkJvz7tjz/xfX4lmt070=",
|
"checksumSHA1": "ZY6NCrR80zUmtOtPtKffbmFxRWw=",
|
||||||
"comment": "v0.6.3-28-g3215b87",
|
"comment": "v0.6.3-28-g3215b87",
|
||||||
"path": "github.com/hashicorp/consul/api",
|
"path": "github.com/hashicorp/consul/api",
|
||||||
"revision": "d4a8a43d2b600e662a50a75be70daed5fad8dd2d",
|
"revision": "6e061b2d580d80347b7c5c4dfc8730de7403a145",
|
||||||
"revisionTime": "2016-06-04T06:35:46Z"
|
"revisionTime": "2016-07-03T02:45:54Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"path": "github.com/hashicorp/errwrap",
|
"path": "github.com/hashicorp/errwrap",
|
||||||
|
|
|
@ -0,0 +1,99 @@
|
||||||
|
---
|
||||||
|
layout: "consul"
|
||||||
|
page_title: "Consul: consul_prepared_query"
|
||||||
|
sidebar_current: "docs-consul-resource-prepared-query"
|
||||||
|
description: |-
|
||||||
|
Allows Terraform to manage a Consul prepared query
|
||||||
|
---
|
||||||
|
|
||||||
|
# consul\_prepared\_query
|
||||||
|
|
||||||
|
Allows Terraform to manage a Consul prepared query.
|
||||||
|
|
||||||
|
Managing prepared queries is done using Consul's REST API. This resource is
|
||||||
|
useful to provide a consistent and declarative way of managing prepared
|
||||||
|
queries in your Consul cluster using Terraform.
|
||||||
|
|
||||||
|
## Example Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
resource "consul_prepared_query" "service-near-self" {
|
||||||
|
datacenter = "nyc1"
|
||||||
|
token = "abcd"
|
||||||
|
stored_token = "wxyz"
|
||||||
|
name = ""
|
||||||
|
only_passing = true
|
||||||
|
near = "_agent"
|
||||||
|
|
||||||
|
template {
|
||||||
|
type = "name_prefix_match"
|
||||||
|
regexp = "^(.*)-near-self$"
|
||||||
|
}
|
||||||
|
|
||||||
|
service = "$${match(1)}"
|
||||||
|
|
||||||
|
failover {
|
||||||
|
nearest_n = 3
|
||||||
|
datacenters = ["dc2", "dc3", "dc4"]
|
||||||
|
}
|
||||||
|
|
||||||
|
dns {
|
||||||
|
ttl = "5m"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Argument Reference
|
||||||
|
|
||||||
|
The following arguments are supported:
|
||||||
|
|
||||||
|
* `datacenter` - (Optional) The datacenter to use. This overrides the
|
||||||
|
datacenter in the provider setup and the agent's default datacenter.
|
||||||
|
|
||||||
|
* `token` - (Optional) The ACL token to use when saving the prepared query.
|
||||||
|
This overrides the token that the agent provides by default.
|
||||||
|
|
||||||
|
* `stored_token` - (Optional) The ACL token to store with the prepared
|
||||||
|
query. This token will be used by default whenever the query is executed.
|
||||||
|
|
||||||
|
* `name` - (Required) The name of the prepared query. Used to identify
|
||||||
|
the prepared query during requests. Can be specified as an empty string
|
||||||
|
to configure the query as a catch-all.
|
||||||
|
|
||||||
|
* `service` - (Required) The name of the service to query.
|
||||||
|
|
||||||
|
* `only_passing` - (Optional) When true, the prepared query will only
|
||||||
|
return nodes with passing health checks in the result.
|
||||||
|
|
||||||
|
* `near` - (Optional) Allows specifying the name of a node to sort results
|
||||||
|
near using Consul's distance sorting and network coordinates. The magic
|
||||||
|
`_agent` value can be used to always sort nearest the node servicing the
|
||||||
|
request.
|
||||||
|
|
||||||
|
* `failover` - (Optional) Options for controlling behavior when no healthy
|
||||||
|
nodes are available in the local DC.
|
||||||
|
|
||||||
|
* `nearest_n` - (Optional) Return results from this many datacenters,
|
||||||
|
sorted in ascending order of estimated RTT.
|
||||||
|
|
||||||
|
* `datacenters` - (Optional) Remote datacenters to return results from.
|
||||||
|
|
||||||
|
* `dns` - (Optional) Settings for controlling the DNS response details.
|
||||||
|
|
||||||
|
* `ttl` - (Optional) The TTL to send when returning DNS results.
|
||||||
|
|
||||||
|
* `template` - (Optional) Query templating options. This is used to make a
|
||||||
|
single prepared query respond to many different requests.
|
||||||
|
|
||||||
|
* `type` - (Required) The type of template matching to perform. Currently
|
||||||
|
only `name_prefix_match` is supported.
|
||||||
|
|
||||||
|
* `regexp` - (Required) The regular expression to match with. When using
|
||||||
|
`name_prefix_match`, this regex is applied against the query name.
|
||||||
|
|
||||||
|
## Attributes Reference
|
||||||
|
|
||||||
|
The following attributes are exported:
|
||||||
|
|
||||||
|
* `id` - The ID of the prepared query, generated by Consul.
|
|
@ -36,10 +36,14 @@
|
||||||
</li>
|
</li>
|
||||||
<li<%= sidebar_current("docs-consul-resource-node") %>>
|
<li<%= sidebar_current("docs-consul-resource-node") %>>
|
||||||
<a href="/docs/providers/consul/r/node.html">consul_node</a>
|
<a href="/docs/providers/consul/r/node.html">consul_node</a>
|
||||||
|
</li>
|
||||||
|
<li<%= sidebar_current("docs-consul-resource-prepared-query") %>>
|
||||||
|
<a href="/docs/providers/consul/r/prepared_query.html">consul_prepared_query</a>
|
||||||
</li>
|
</li>
|
||||||
<li<%= sidebar_current("docs-consul-resource-service") %>>
|
<li<%= sidebar_current("docs-consul-resource-service") %>>
|
||||||
<a href="/docs/providers/consul/r/service.html">consul_service</a>
|
<a href="/docs/providers/consul/r/service.html">consul_service</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
Loading…
Reference in New Issue