From 495c4b3dbc52fac047557851a124bd482d2fb511 Mon Sep 17 00:00:00 2001 From: Justin Nauman Date: Wed, 27 Apr 2016 18:00:21 -0500 Subject: [PATCH] provider/aws - CloudFront custom_error_response fixes for missing (#6382) * provider/aws - CloudFront custom_error_response fixes for missing - Omit custom_error_response response_* fields when not explicitly set via config for SDK call - Adding a test case to ensure that the response_error gets converted to an empty string properly, versus "0". (Thanks @vancluever) Fixes #6342 * - Fixing ACC test case resource names --- ...nt_distribution_configuration_structure.go | 5 +- ...stribution_configuration_structure_test.go | 18 +++++ ...source_aws_cloudfront_distribution_test.go | 69 +++++++++++++++++++ 3 files changed, 91 insertions(+), 1 deletion(-) diff --git a/builtin/providers/aws/cloudfront_distribution_configuration_structure.go b/builtin/providers/aws/cloudfront_distribution_configuration_structure.go index 6e0f532013..8b3be62054 100644 --- a/builtin/providers/aws/cloudfront_distribution_configuration_structure.go +++ b/builtin/providers/aws/cloudfront_distribution_configuration_structure.go @@ -719,12 +719,15 @@ func expandCustomErrorResponse(m map[string]interface{}) *cloudfront.CustomError if v, ok := m["error_caching_min_ttl"]; ok { er.ErrorCachingMinTTL = aws.Int64(int64(v.(int))) } - if v, ok := m["response_code"]; ok { + if v, ok := m["response_code"]; ok && v.(int) != 0 { er.ResponseCode = aws.String(strconv.Itoa(v.(int))) + } else { + er.ResponseCode = aws.String("") } if v, ok := m["response_page_path"]; ok { er.ResponsePagePath = aws.String(v.(string)) } + return &er } diff --git a/builtin/providers/aws/cloudfront_distribution_configuration_structure_test.go b/builtin/providers/aws/cloudfront_distribution_configuration_structure_test.go index 5a7eff5f4d..e788c80b70 100644 --- a/builtin/providers/aws/cloudfront_distribution_configuration_structure_test.go +++ b/builtin/providers/aws/cloudfront_distribution_configuration_structure_test.go @@ -191,6 +191,13 @@ func customErrorResponsesConfFirst() map[string]interface{} { return customErrorResponsesConf()[0].(map[string]interface{}) } +func customErrorResponseConfNoResponseCode() map[string]interface{} { + er := customErrorResponsesConf()[0].(map[string]interface{}) + er["response_code"] = 0 + er["response_page_path"] = "" + return er +} + func viewerCertificateConfSetCloudFrontDefault() map[string]interface{} { return map[string]interface{}{ "acm_certificate_arn": "", @@ -759,6 +766,17 @@ func TestCloudFrontStructure_expandCustomErrorResponse(t *testing.T) { } } +func TestCloudFrontStructure_expandCustomErrorResponse_emptyResponseCode(t *testing.T) { + data := customErrorResponseConfNoResponseCode() + er := expandCustomErrorResponse(data) + if *er.ResponseCode != "" { + t.Fatalf("Expected ResponseCode to be empty string, got %v", *er.ResponseCode) + } + if *er.ResponsePagePath != "" { + t.Fatalf("Expected ResponsePagePath to be empty string, got %v", *er.ResponsePagePath) + } +} + func TestCloudFrontStructure_flattenCustomErrorResponse(t *testing.T) { in := customErrorResponsesConfFirst() er := expandCustomErrorResponse(in) diff --git a/builtin/providers/aws/resource_aws_cloudfront_distribution_test.go b/builtin/providers/aws/resource_aws_cloudfront_distribution_test.go index cf36874292..477a92115b 100644 --- a/builtin/providers/aws/resource_aws_cloudfront_distribution_test.go +++ b/builtin/providers/aws/resource_aws_cloudfront_distribution_test.go @@ -105,6 +105,24 @@ func TestAccAWSCloudFrontDistribution_noOptionalItemsConfig(t *testing.T) { }) } +func TestAccAWSCloudFrontDistribution_noCustomErrorResponseConfig(t *testing.T) { + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckCloudFrontDistributionDestroy, + Steps: []resource.TestStep{ + resource.TestStep{ + Config: testAccAWSCloudFrontDistributionNoCustomErroResponseInfo, + Check: resource.ComposeTestCheckFunc( + testAccCheckCloudFrontDistributionExistence( + "aws_cloudfront_distribution.no_custom_error_responses", + ), + ), + }, + }, + }) +} + func testAccCheckCloudFrontDistributionDestroy(s *terraform.State) error { for k, rs := range s.RootModule().Resources { if rs.Type != "aws_cloudfront_distribution" { @@ -373,6 +391,57 @@ resource "aws_cloudfront_distribution" "multi_origin_distribution" { } `, rand.New(rand.NewSource(time.Now().UnixNano())).Int(), testAccAWSCloudFrontDistributionRetainConfig()) +var testAccAWSCloudFrontDistributionNoCustomErroResponseInfo = fmt.Sprintf(` +variable rand_id { + default = %d +} + +resource "aws_cloudfront_distribution" "no_custom_error_responses" { + origin { + domain_name = "www.example.com" + origin_id = "myCustomOrigin" + custom_origin_config { + http_port = 80 + https_port = 443 + origin_protocol_policy = "http-only" + origin_ssl_protocols = [ "SSLv3", "TLSv1" ] + } + } + enabled = true + comment = "Some comment" + default_cache_behavior { + allowed_methods = [ "DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT" ] + cached_methods = [ "GET", "HEAD" ] + target_origin_id = "myCustomOrigin" + smooth_streaming = false + forwarded_values { + query_string = false + cookies { + forward = "all" + } + } + viewer_protocol_policy = "allow-all" + min_ttl = 0 + default_ttl = 3600 + max_ttl = 86400 + } + custom_error_response { + error_code = 404 + error_caching_min_ttl = 30 + } + restrictions { + geo_restriction { + restriction_type = "whitelist" + locations = [ "US", "CA", "GB", "DE" ] + } + } + viewer_certificate { + cloudfront_default_certificate = true + } + %s +} +`, rand.New(rand.NewSource(time.Now().UnixNano())).Int(), testAccAWSCloudFrontDistributionRetainConfig()) + var testAccAWSCloudFrontDistributionNoOptionalItemsConfig = fmt.Sprintf(` variable rand_id { default = %d