150 lines
4.1 KiB
Go
150 lines
4.1 KiB
Go
package consul
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
consulapi "github.com/hashicorp/consul/api"
|
|
"github.com/hashicorp/terraform/helper/resource"
|
|
"github.com/hashicorp/terraform/terraform"
|
|
)
|
|
|
|
func TestAccConsulKeyPrefix_basic(t *testing.T) {
|
|
resource.Test(t, resource.TestCase{
|
|
Providers: testAccProviders,
|
|
CheckDestroy: resource.ComposeTestCheckFunc(
|
|
testAccCheckConsulKeyPrefixKeyAbsent("species"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("meat"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("cheese"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("bread"),
|
|
),
|
|
Steps: []resource.TestStep{
|
|
resource.TestStep{
|
|
Config: testAccConsulKeyPrefixConfig,
|
|
Check: resource.ComposeTestCheckFunc(
|
|
testAccCheckConsulKeyPrefixKeyValue("cheese", "chevre"),
|
|
testAccCheckConsulKeyPrefixKeyValue("bread", "baguette"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("species"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("meat"),
|
|
),
|
|
},
|
|
resource.TestStep{
|
|
Config: testAccConsulKeyPrefixConfig,
|
|
ExpectNonEmptyPlan: true,
|
|
Check: resource.ComposeTestCheckFunc(
|
|
// This will add a rogue key that Terraform isn't
|
|
// expecting, causing a non-empty plan that wants
|
|
// to remove it.
|
|
testAccAddConsulKeyPrefixRogue("species", "gorilla"),
|
|
),
|
|
},
|
|
resource.TestStep{
|
|
Config: testAccConsulKeyPrefixConfig_Update,
|
|
Check: resource.ComposeTestCheckFunc(
|
|
testAccCheckConsulKeyPrefixKeyValue("meat", "ham"),
|
|
testAccCheckConsulKeyPrefixKeyValue("bread", "batard"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("cheese"),
|
|
testAccCheckConsulKeyPrefixKeyAbsent("species"),
|
|
),
|
|
},
|
|
resource.TestStep{
|
|
Config: testAccConsulKeyPrefixConfig_Update,
|
|
ExpectNonEmptyPlan: true,
|
|
Check: resource.ComposeTestCheckFunc(
|
|
testAccAddConsulKeyPrefixRogue("species", "gorilla"),
|
|
),
|
|
},
|
|
},
|
|
})
|
|
}
|
|
|
|
func testAccCheckConsulKeyPrefixDestroy(s *terraform.State) error {
|
|
kv := testAccProvider.Meta().(*consulapi.Client).KV()
|
|
opts := &consulapi.QueryOptions{Datacenter: "dc1"}
|
|
pair, _, err := kv.Get("test/set", opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if pair != nil {
|
|
return fmt.Errorf("Key still exists: %#v", pair)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func testAccCheckConsulKeyPrefixKeyAbsent(name string) resource.TestCheckFunc {
|
|
fullName := "prefix_test/" + name
|
|
return func(s *terraform.State) error {
|
|
kv := testAccProvider.Meta().(*consulapi.Client).KV()
|
|
opts := &consulapi.QueryOptions{Datacenter: "dc1"}
|
|
pair, _, err := kv.Get(fullName, opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if pair != nil {
|
|
return fmt.Errorf("key '%s' exists, but shouldn't", fullName)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
// This one is actually not a check, but rather a mutation step. It writes
|
|
// a value directly into Consul, bypassing our Terraform resource.
|
|
func testAccAddConsulKeyPrefixRogue(name, value string) resource.TestCheckFunc {
|
|
fullName := "prefix_test/" + name
|
|
return func(s *terraform.State) error {
|
|
kv := testAccProvider.Meta().(*consulapi.Client).KV()
|
|
opts := &consulapi.WriteOptions{Datacenter: "dc1"}
|
|
pair := &consulapi.KVPair{
|
|
Key: fullName,
|
|
Value: []byte(value),
|
|
}
|
|
_, err := kv.Put(pair, opts)
|
|
return err
|
|
}
|
|
}
|
|
|
|
func testAccCheckConsulKeyPrefixKeyValue(name, value string) resource.TestCheckFunc {
|
|
fullName := "prefix_test/" + name
|
|
return func(s *terraform.State) error {
|
|
kv := testAccProvider.Meta().(*consulapi.Client).KV()
|
|
opts := &consulapi.QueryOptions{Datacenter: "dc1"}
|
|
pair, _, err := kv.Get(fullName, opts)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if pair == nil {
|
|
return fmt.Errorf("key %v doesn't exist, but should", fullName)
|
|
}
|
|
if string(pair.Value) != value {
|
|
return fmt.Errorf("key %v has value %v; want %v", fullName, pair.Value, value)
|
|
}
|
|
return nil
|
|
}
|
|
}
|
|
|
|
const testAccConsulKeyPrefixConfig = `
|
|
resource "consul_key_prefix" "app" {
|
|
datacenter = "dc1"
|
|
|
|
path_prefix = "prefix_test/"
|
|
|
|
subkeys = {
|
|
cheese = "chevre"
|
|
bread = "baguette"
|
|
}
|
|
}
|
|
`
|
|
|
|
const testAccConsulKeyPrefixConfig_Update = `
|
|
resource "consul_key_prefix" "app" {
|
|
datacenter = "dc1"
|
|
|
|
path_prefix = "prefix_test/"
|
|
|
|
subkeys = {
|
|
bread = "batard"
|
|
meat = "ham"
|
|
}
|
|
}
|
|
`
|