From b351a72e4c52ff5df01fce1dcafae30423c53250 Mon Sep 17 00:00:00 2001 From: Clint Date: Mon, 4 Apr 2016 11:41:36 -0500 Subject: [PATCH] provider/aws: Normalize and compact SQS Redrive, Policy JSON * provider/aws: Nomralize SQS Redrive Policy JSON * provider/aws: Fix typo in log statements * compact the Policy on SNS Queue * add acceptance test for policy formatting --- .../providers/aws/resource_aws_sns_topic.go | 4 +- .../providers/aws/resource_aws_sqs_queue.go | 22 +++- .../aws/resource_aws_sqs_queue_test.go | 118 +++++++++++++++++- .../providers/aws/r/sqs_queue.html.markdown | 2 +- 4 files changed, 135 insertions(+), 11 deletions(-) diff --git a/builtin/providers/aws/resource_aws_sns_topic.go b/builtin/providers/aws/resource_aws_sns_topic.go index 300de3794..6a8e62fa7 100644 --- a/builtin/providers/aws/resource_aws_sns_topic.go +++ b/builtin/providers/aws/resource_aws_sns_topic.go @@ -177,14 +177,14 @@ func resourceAwsSnsTopicRead(d *schema.ResourceData, meta interface{}) error { resource := *resourceAwsSnsTopic() // iKey = internal struct key, oKey = AWS Attribute Map key for iKey, oKey := range SNSAttributeMap { - log.Printf("[DEBUG] Updating %s => %s", iKey, oKey) + log.Printf("[DEBUG] Reading %s => %s", iKey, oKey) if attrmap[oKey] != nil { // Some of the fetched attributes are stateful properties such as // the number of subscriptions, the owner, etc. skip those if resource.Schema[iKey] != nil { value := *attrmap[oKey] - log.Printf("[DEBUG] Updating %s => %s -> %s", iKey, oKey, value) + log.Printf("[DEBUG] Reading %s => %s -> %s", iKey, oKey, value) d.Set(iKey, *attrmap[oKey]) } } diff --git a/builtin/providers/aws/resource_aws_sqs_queue.go b/builtin/providers/aws/resource_aws_sqs_queue.go index 2ce67d917..fb3833072 100644 --- a/builtin/providers/aws/resource_aws_sqs_queue.go +++ b/builtin/providers/aws/resource_aws_sqs_queue.go @@ -1,6 +1,8 @@ package aws import ( + "bytes" + "encoding/json" "fmt" "log" "strconv" @@ -66,10 +68,24 @@ func resourceAwsSqsQueue() *schema.Resource { "policy": &schema.Schema{ Type: schema.TypeString, Optional: true, + StateFunc: func(v interface{}) string { + s, ok := v.(string) + if !ok || s == "" { + return "" + } + jsonb := []byte(s) + buffer := new(bytes.Buffer) + if err := json.Compact(buffer, jsonb); err != nil { + log.Printf("[WARN] Error compacting JSON for Policy in SNS Queue") + return "" + } + return buffer.String() + }, }, "redrive_policy": &schema.Schema{ - Type: schema.TypeString, - Optional: true, + Type: schema.TypeString, + Optional: true, + StateFunc: normalizeJson, }, "arn": &schema.Schema{ Type: schema.TypeString, @@ -176,7 +192,9 @@ func resourceAwsSqsQueueRead(d *schema.ResourceData, meta interface{}) error { return err } d.Set(iKey, value) + log.Printf("[DEBUG] Reading %s => %s -> %d", iKey, oKey, value) } else { + log.Printf("[DEBUG] Reading %s => %s -> %s", iKey, oKey, *attrmap[oKey]) d.Set(iKey, *attrmap[oKey]) } } diff --git a/builtin/providers/aws/resource_aws_sqs_queue_test.go b/builtin/providers/aws/resource_aws_sqs_queue_test.go index 965fb44a2..a210fc5d2 100644 --- a/builtin/providers/aws/resource_aws_sqs_queue_test.go +++ b/builtin/providers/aws/resource_aws_sqs_queue_test.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/sqs" + "github.com/hashicorp/terraform/helper/acctest" "github.com/hashicorp/terraform/helper/resource" "github.com/hashicorp/terraform/terraform" ) @@ -33,6 +34,39 @@ func TestAccAWSSQSQueue_basic(t *testing.T) { }) } +func TestAccAWSSQSQueue_redrivePolicy(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSSQSQueueDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAWSSQSConfigWithRedrive(acctest.RandStringFromCharSet(5, acctest.CharSetAlpha)), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSSQSExistsWithDefaults("aws_sqs_queue.my_dead_letter_queue"), + ), + }, + }, + }) +} + +// Tests formatting and compacting of Policy, Redrive json +func TestAccAWSSQSQueue_Policybasic(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSSQSQueueDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAWSSQSConfig_PolicyFormat, + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSSQSExistsWithOverrides("aws_sqs_queue.test-email-events"), + ), + }, + }, + }) +} + func testAccCheckAWSSQSQueueDestroy(s *terraform.State) error { conn := testAccProvider.Meta().(*AWSClient).sqsconn @@ -168,11 +202,83 @@ resource "aws_sqs_queue" "queue-with-defaults" { const testAccAWSSQSConfigWithOverrides = ` resource "aws_sqs_queue" "queue-with-overrides" { - name = "test-sqs-queue-with-overrides" - delay_seconds = 90 - max_message_size = 2048 - message_retention_seconds = 86400 - receive_wait_time_seconds = 10 - visibility_timeout_seconds = 60 + name = "test-sqs-queue-with-overrides" + delay_seconds = 90 + max_message_size = 2048 + message_retention_seconds = 86400 + receive_wait_time_seconds = 10 + visibility_timeout_seconds = 60 +} +` + +func testAccAWSSQSConfigWithRedrive(name string) string { + return fmt.Sprintf(` +resource "aws_sqs_queue" "my_queue" { + name = "tftestqueuq-%s" + delay_seconds = 0 + visibility_timeout_seconds = 300 + + redrive_policy = <