From 60418c6d18d1200f4617811b61fa557f5f5779c0 Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Sun, 20 Oct 2019 17:26:32 +0300 Subject: [PATCH 1/3] Add tag support to api gateway usage plan --- aws/provider_test.go | 20 ++ aws/resource_aws_api_gateway_usage_plan.go | 30 +++ ...esource_aws_api_gateway_usage_plan_test.go | 221 ++++++++++++------ .../r/api_gateway_usage_plan.html.markdown | 2 + 4 files changed, 200 insertions(+), 73 deletions(-) diff --git a/aws/provider_test.go b/aws/provider_test.go index c98da9c9d91..7ab6632fa66 100644 --- a/aws/provider_test.go +++ b/aws/provider_test.go @@ -128,6 +128,26 @@ func testAccMatchResourceAttrRegionalARN(resourceName, attributeName, arnService } } +// testAccMatchResourceAttrRegionalARN ensures the Terraform state regexp matches a formatted ARN with region and no account id +func testAccMatchResourceAttrRegionalARNNoAccount(resourceName, attributeName, arnService string, arnResourceRegexp *regexp.Regexp) resource.TestCheckFunc { + return func(s *terraform.State) error { + arnRegexp := arn.ARN{ + Partition: testAccGetPartition(), + Region: testAccGetRegion(), + Resource: arnResourceRegexp.String(), + Service: arnService, + }.String() + + attributeMatch, err := regexp.Compile(arnRegexp) + + if err != nil { + return fmt.Errorf("Unable to compile ARN regexp (%s): %s", arnRegexp, err) + } + + return resource.TestMatchResourceAttr(resourceName, attributeName, attributeMatch)(s) + } +} + // testAccCheckResourceAttrGlobalARN ensures the Terraform state exactly matches a formatted ARN without region func testAccCheckResourceAttrGlobalARN(resourceName, attributeName, arnService, arnResource string) resource.TestCheckFunc { return func(s *terraform.State) error { diff --git a/aws/resource_aws_api_gateway_usage_plan.go b/aws/resource_aws_api_gateway_usage_plan.go index 11f4d2dad5b..3cfc6e69423 100644 --- a/aws/resource_aws_api_gateway_usage_plan.go +++ b/aws/resource_aws_api_gateway_usage_plan.go @@ -7,10 +7,12 @@ import ( "strconv" "github.com/aws/aws-sdk-go/aws" + "github.com/aws/aws-sdk-go/aws/arn" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/apigateway" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsApiGatewayUsagePlan() *schema.Resource { @@ -107,6 +109,11 @@ func resourceAwsApiGatewayUsagePlan() *schema.Resource { Type: schema.TypeString, Optional: true, }, + "tags": tagsSchema(), + "arn": { + Type: schema.TypeString, + Computed: true, + }, }, } } @@ -197,6 +204,10 @@ func resourceAwsApiGatewayUsagePlanCreate(d *schema.ResourceData, meta interface params.Throttle = ts } + if v, ok := d.GetOk("tags"); ok { + params.Tags = keyvaluetags.New(v.(map[string]interface{})).IgnoreAws().ApigatewayTags() + } + up, err := conn.CreateUsagePlan(params) if err != nil { return fmt.Errorf("Error creating API Gateway Usage Plan: %s", err) @@ -243,6 +254,18 @@ func resourceAwsApiGatewayUsagePlanRead(d *schema.ResourceData, meta interface{} return err } + if err := d.Set("tags", keyvaluetags.ApigatewayKeyValueTags(up.Tags).IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) + } + + arn := arn.ARN{ + Partition: meta.(*AWSClient).partition, + Service: "apigateway", + Region: meta.(*AWSClient).region, + Resource: fmt.Sprintf("/usageplans/%s", d.Id()), + }.String() + d.Set("arn", arn) + d.Set("name", up.Name) d.Set("description", up.Description) d.Set("product_code", up.ProductCode) @@ -446,6 +469,13 @@ func resourceAwsApiGatewayUsagePlanUpdate(d *schema.ResourceData, meta interface } } + if d.HasChange("tags") { + o, n := d.GetChange("tags") + if err := keyvaluetags.ApigatewayUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { + return fmt.Errorf("error updating tags: %s", err) + } + } + params := &apigateway.UpdateUsagePlanInput{ UsagePlanId: aws.String(d.Id()), PatchOperations: operations, diff --git a/aws/resource_aws_api_gateway_usage_plan_test.go b/aws/resource_aws_api_gateway_usage_plan_test.go index 1183edfaf14..0c78425f002 100644 --- a/aws/resource_aws_api_gateway_usage_plan_test.go +++ b/aws/resource_aws_api_gateway_usage_plan_test.go @@ -2,6 +2,7 @@ package aws import ( "fmt" + "regexp" "testing" "github.com/aws/aws-sdk-go/aws" @@ -38,6 +39,7 @@ func TestAccAWSAPIGatewayUsagePlan_basic(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) updatedName := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -47,24 +49,66 @@ func TestAccAWSAPIGatewayUsagePlan_basic(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/usageplans/+.`)), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "description", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicUpdatedConfig(updatedName), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", updatedName), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), + resource.TestCheckResourceAttr(resourceName, "name", updatedName), + resource.TestCheckResourceAttr(resourceName, "description", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "description", ""), + ), + }, + }, + }) +} + +func TestAccAWSAPIGatewayUsagePlan_tags(t *testing.T) { + var conf apigateway.UsagePlan + name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" + + resource.ParallelTest(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckAWSAPIGatewayUsagePlanDestroy, + Steps: []resource.TestStep{ + { + Config: testAccAWSApiGatewayUsagePlanBasicTags1(name, "key1", "value1"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1"), + ), + }, + { + Config: testAccAWSApiGatewayUsagePlanBasicTags2(name, "key1", "value1updated", "key2", "value2"), + Check: resource.ComposeTestCheckFunc( + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1updated"), + resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), + ), + }, + { + Config: testAccAWSApiGatewayUsagePlanBasicTags1(name, "key2", "value2"), + Check: resource.ComposeTestCheckFunc( + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), ), }, }, @@ -74,6 +118,7 @@ func TestAccAWSAPIGatewayUsagePlan_basic(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_description(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -83,35 +128,35 @@ func TestAccAWSAPIGatewayUsagePlan_description(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "description", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanDescriptionConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", "This is a description"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "description", "This is a description"), ), }, { Config: testAccAWSApiGatewayUsagePlanDescriptionUpdatedConfig(name), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", "This is a new description"), + resource.TestCheckResourceAttr(resourceName, "description", "This is a new description"), ), }, { Config: testAccAWSApiGatewayUsagePlanDescriptionConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", "This is a description"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "description", "This is a description"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "description", ""), ), }, }, @@ -121,6 +166,7 @@ func TestAccAWSAPIGatewayUsagePlan_description(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_productCode(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -130,35 +176,35 @@ func TestAccAWSAPIGatewayUsagePlan_productCode(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", ""), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "product_code", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanProductCodeConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", "MYCODE"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "product_code", "MYCODE"), ), }, { Config: testAccAWSApiGatewayUsagePlanProductCodeUpdatedConfig(name), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", "MYCODE2"), + resource.TestCheckResourceAttr(resourceName, "product_code", "MYCODE2"), ), }, { Config: testAccAWSApiGatewayUsagePlanProductCodeConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", "MYCODE"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "product_code", "MYCODE"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", ""), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "product_code", ""), ), }, }, @@ -168,6 +214,7 @@ func TestAccAWSAPIGatewayUsagePlan_productCode(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_throttling(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -177,35 +224,35 @@ func TestAccAWSAPIGatewayUsagePlan_throttling(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckNoResourceAttr(resourceName, "throttle_settings"), ), }, { Config: testAccAWSApiGatewayUsagePlanThrottlingConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.4173790118.burst_limit", "2"), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.4173790118.rate_limit", "5"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "throttle_settings.4173790118.burst_limit", "2"), + resource.TestCheckResourceAttr(resourceName, "throttle_settings.4173790118.rate_limit", "5"), ), }, { Config: testAccAWSApiGatewayUsagePlanThrottlingModifiedConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.1779463053.burst_limit", "3"), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.1779463053.rate_limit", "6"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "throttle_settings.1779463053.burst_limit", "3"), + resource.TestCheckResourceAttr(resourceName, "throttle_settings.1779463053.rate_limit", "6"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckNoResourceAttr(resourceName, "throttle_settings"), ), }, }, @@ -216,6 +263,7 @@ func TestAccAWSAPIGatewayUsagePlan_throttling(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_throttlingInitialRateLimit(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -225,8 +273,8 @@ func TestAccAWSAPIGatewayUsagePlan_throttlingInitialRateLimit(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanThrottlingConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.4173790118.rate_limit", "5"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "throttle_settings.4173790118.rate_limit", "5"), ), }, }, @@ -236,6 +284,7 @@ func TestAccAWSAPIGatewayUsagePlan_throttlingInitialRateLimit(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_quota(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -245,37 +294,37 @@ func TestAccAWSAPIGatewayUsagePlan_quota(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckNoResourceAttr(resourceName, "quota_settings"), ), }, { Config: testAccAWSApiGatewayUsagePlanQuotaConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.1956747625.limit", "100"), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.1956747625.offset", "6"), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.1956747625.period", "WEEK"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "quota_settings.1956747625.limit", "100"), + resource.TestCheckResourceAttr(resourceName, "quota_settings.1956747625.offset", "6"), + resource.TestCheckResourceAttr(resourceName, "quota_settings.1956747625.period", "WEEK"), ), }, { Config: testAccAWSApiGatewayUsagePlanQuotaModifiedConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.3909168194.limit", "200"), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.3909168194.offset", "20"), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.3909168194.period", "MONTH"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "quota_settings.3909168194.limit", "200"), + resource.TestCheckResourceAttr(resourceName, "quota_settings.3909168194.offset", "20"), + resource.TestCheckResourceAttr(resourceName, "quota_settings.3909168194.period", "MONTH"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckNoResourceAttr(resourceName, "quota_settings"), ), }, }, @@ -285,6 +334,7 @@ func TestAccAWSAPIGatewayUsagePlan_quota(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_apiStages(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) + resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -296,44 +346,44 @@ func TestAccAWSAPIGatewayUsagePlan_apiStages(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanApiStagesConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "api_stages.0.stage", "test"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "api_stages.0.stage", "test"), ), }, // Handle api stages removal { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "api_stages"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckNoResourceAttr(resourceName, "api_stages"), ), }, // Handle api stages additions { Config: testAccAWSApiGatewayUsagePlanApiStagesConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "api_stages.0.stage", "test"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "api_stages.0.stage", "test"), ), }, // Handle api stages updates { Config: testAccAWSApiGatewayUsagePlanApiStagesModifiedConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "api_stages.0.stage", "foo"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckResourceAttr(resourceName, "api_stages.0.stage", "foo"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), - resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "api_stages"), + testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), + resource.TestCheckResourceAttr(resourceName, "name", name), + resource.TestCheckNoResourceAttr(resourceName, "api_stages"), ), }, }, @@ -475,6 +525,31 @@ resource "aws_api_gateway_usage_plan" "main" { `, rName) } +func testAccAWSApiGatewayUsagePlanBasicTags1(rName, tagKey1, tagValue1 string) string { + return fmt.Sprintf(testAccAWSAPIGatewayUsagePlanConfig+` +resource "aws_api_gateway_usage_plan" "main" { + name = "%s" + + tags = { + %q = %q + } +} +`, rName, tagKey1, tagValue1) +} + +func testAccAWSApiGatewayUsagePlanBasicTags2(rName, tagKey1, tagValue1, tagKey2, tagValue2 string) string { + return fmt.Sprintf(testAccAWSAPIGatewayUsagePlanConfig+` +resource "aws_api_gateway_usage_plan" "main" { + name = "%s" + + tags = { + %q = %q + %q = %q + } +} +`, rName, tagKey1, tagValue1, tagKey2, tagValue2) +} + func testAccAWSApiGatewayUsagePlanDescriptionConfig(rName string) string { return fmt.Sprintf(testAccAWSAPIGatewayUsagePlanConfig+` resource "aws_api_gateway_usage_plan" "main" { diff --git a/website/docs/r/api_gateway_usage_plan.html.markdown b/website/docs/r/api_gateway_usage_plan.html.markdown index afb9b7c9e03..e8b66dc085f 100644 --- a/website/docs/r/api_gateway_usage_plan.html.markdown +++ b/website/docs/r/api_gateway_usage_plan.html.markdown @@ -68,6 +68,7 @@ The API Gateway Usage Plan argument layout is a structure composed of several su * `quota_settings` - (Optional) The [quota settings](#quota-settings-arguments) of the usage plan. * `throttle_settings` - (Optional) The [throttling limits](#throttling-settings-arguments) of the usage plan. * `product_code` - (Optional) The AWS Markeplace product identifier to associate with the usage plan as a SaaS product on AWS Marketplace. +* `tags` - (Optional) Key-value mapping of resource tags #### Api Stages arguments @@ -96,6 +97,7 @@ In addition to all arguments above, the following attributes are exported: * `quota_settings` - The quota of the usage plan. * `throttle_settings` - The throttling limits of the usage plan. * `product_code` - The AWS Markeplace product identifier to associate with the usage plan as a SaaS product on AWS Marketplace. +* `arn` - Amazon Resource Name (ARN) ## Import From 61eddeee2a95152e85d56ebab97ac24369ddadd6 Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Sun, 20 Oct 2019 17:50:35 +0300 Subject: [PATCH 2/3] Revert "Add tag support to api gateway usage plan" This reverts commit 60418c6d --- aws/resource_aws_api_gateway_usage_plan.go | 30 --- ...esource_aws_api_gateway_usage_plan_test.go | 221 ++++++------------ .../r/api_gateway_usage_plan.html.markdown | 2 - 3 files changed, 73 insertions(+), 180 deletions(-) diff --git a/aws/resource_aws_api_gateway_usage_plan.go b/aws/resource_aws_api_gateway_usage_plan.go index 3cfc6e69423..11f4d2dad5b 100644 --- a/aws/resource_aws_api_gateway_usage_plan.go +++ b/aws/resource_aws_api_gateway_usage_plan.go @@ -7,12 +7,10 @@ import ( "strconv" "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/aws/arn" "github.com/aws/aws-sdk-go/aws/awserr" "github.com/aws/aws-sdk-go/service/apigateway" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/helper/validation" - "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsApiGatewayUsagePlan() *schema.Resource { @@ -109,11 +107,6 @@ func resourceAwsApiGatewayUsagePlan() *schema.Resource { Type: schema.TypeString, Optional: true, }, - "tags": tagsSchema(), - "arn": { - Type: schema.TypeString, - Computed: true, - }, }, } } @@ -204,10 +197,6 @@ func resourceAwsApiGatewayUsagePlanCreate(d *schema.ResourceData, meta interface params.Throttle = ts } - if v, ok := d.GetOk("tags"); ok { - params.Tags = keyvaluetags.New(v.(map[string]interface{})).IgnoreAws().ApigatewayTags() - } - up, err := conn.CreateUsagePlan(params) if err != nil { return fmt.Errorf("Error creating API Gateway Usage Plan: %s", err) @@ -254,18 +243,6 @@ func resourceAwsApiGatewayUsagePlanRead(d *schema.ResourceData, meta interface{} return err } - if err := d.Set("tags", keyvaluetags.ApigatewayKeyValueTags(up.Tags).IgnoreAws().Map()); err != nil { - return fmt.Errorf("error setting tags: %s", err) - } - - arn := arn.ARN{ - Partition: meta.(*AWSClient).partition, - Service: "apigateway", - Region: meta.(*AWSClient).region, - Resource: fmt.Sprintf("/usageplans/%s", d.Id()), - }.String() - d.Set("arn", arn) - d.Set("name", up.Name) d.Set("description", up.Description) d.Set("product_code", up.ProductCode) @@ -469,13 +446,6 @@ func resourceAwsApiGatewayUsagePlanUpdate(d *schema.ResourceData, meta interface } } - if d.HasChange("tags") { - o, n := d.GetChange("tags") - if err := keyvaluetags.ApigatewayUpdateTags(conn, d.Get("arn").(string), o, n); err != nil { - return fmt.Errorf("error updating tags: %s", err) - } - } - params := &apigateway.UpdateUsagePlanInput{ UsagePlanId: aws.String(d.Id()), PatchOperations: operations, diff --git a/aws/resource_aws_api_gateway_usage_plan_test.go b/aws/resource_aws_api_gateway_usage_plan_test.go index 0c78425f002..1183edfaf14 100644 --- a/aws/resource_aws_api_gateway_usage_plan_test.go +++ b/aws/resource_aws_api_gateway_usage_plan_test.go @@ -2,7 +2,6 @@ package aws import ( "fmt" - "regexp" "testing" "github.com/aws/aws-sdk-go/aws" @@ -39,7 +38,6 @@ func TestAccAWSAPIGatewayUsagePlan_basic(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) updatedName := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -49,66 +47,24 @@ func TestAccAWSAPIGatewayUsagePlan_basic(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/usageplans/+.`)), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicUpdatedConfig(updatedName), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "name", updatedName), - resource.TestCheckResourceAttr(resourceName, "description", ""), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", updatedName), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "description", ""), - ), - }, - }, - }) -} - -func TestAccAWSAPIGatewayUsagePlan_tags(t *testing.T) { - var conf apigateway.UsagePlan - name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" - - resource.ParallelTest(t, resource.TestCase{ - PreCheck: func() { testAccPreCheck(t) }, - Providers: testAccProviders, - CheckDestroy: testAccCheckAWSAPIGatewayUsagePlanDestroy, - Steps: []resource.TestStep{ - { - Config: testAccAWSApiGatewayUsagePlanBasicTags1(name, "key1", "value1"), - Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), - resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1"), - ), - }, - { - Config: testAccAWSApiGatewayUsagePlanBasicTags2(name, "key1", "value1updated", "key2", "value2"), - Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), - resource.TestCheckResourceAttr(resourceName, "tags.key1", "value1updated"), - resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), - ), - }, - { - Config: testAccAWSApiGatewayUsagePlanBasicTags1(name, "key2", "value2"), - Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), - resource.TestCheckResourceAttr(resourceName, "tags.key2", "value2"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), ), }, }, @@ -118,7 +74,6 @@ func TestAccAWSAPIGatewayUsagePlan_tags(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_description(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -128,35 +83,35 @@ func TestAccAWSAPIGatewayUsagePlan_description(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanDescriptionConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "description", "This is a description"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", "This is a description"), ), }, { Config: testAccAWSApiGatewayUsagePlanDescriptionUpdatedConfig(name), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "description", "This is a new description"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", "This is a new description"), ), }, { Config: testAccAWSApiGatewayUsagePlanDescriptionConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "description", "This is a description"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", "This is a description"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "description", ""), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "description", ""), ), }, }, @@ -166,7 +121,6 @@ func TestAccAWSAPIGatewayUsagePlan_description(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_productCode(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -176,35 +130,35 @@ func TestAccAWSAPIGatewayUsagePlan_productCode(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "product_code", ""), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", ""), ), }, { Config: testAccAWSApiGatewayUsagePlanProductCodeConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "product_code", "MYCODE"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", "MYCODE"), ), }, { Config: testAccAWSApiGatewayUsagePlanProductCodeUpdatedConfig(name), Check: resource.ComposeTestCheckFunc( - resource.TestCheckResourceAttr(resourceName, "product_code", "MYCODE2"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", "MYCODE2"), ), }, { Config: testAccAWSApiGatewayUsagePlanProductCodeConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "product_code", "MYCODE"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", "MYCODE"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "product_code", ""), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "product_code", ""), ), }, }, @@ -214,7 +168,6 @@ func TestAccAWSAPIGatewayUsagePlan_productCode(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_throttling(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -224,35 +177,35 @@ func TestAccAWSAPIGatewayUsagePlan_throttling(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckNoResourceAttr(resourceName, "throttle_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings"), ), }, { Config: testAccAWSApiGatewayUsagePlanThrottlingConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "throttle_settings.4173790118.burst_limit", "2"), - resource.TestCheckResourceAttr(resourceName, "throttle_settings.4173790118.rate_limit", "5"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.4173790118.burst_limit", "2"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.4173790118.rate_limit", "5"), ), }, { Config: testAccAWSApiGatewayUsagePlanThrottlingModifiedConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "throttle_settings.1779463053.burst_limit", "3"), - resource.TestCheckResourceAttr(resourceName, "throttle_settings.1779463053.rate_limit", "6"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.1779463053.burst_limit", "3"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.1779463053.rate_limit", "6"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckNoResourceAttr(resourceName, "throttle_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings"), ), }, }, @@ -263,7 +216,6 @@ func TestAccAWSAPIGatewayUsagePlan_throttling(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_throttlingInitialRateLimit(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -273,8 +225,8 @@ func TestAccAWSAPIGatewayUsagePlan_throttlingInitialRateLimit(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanThrottlingConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "throttle_settings.4173790118.rate_limit", "5"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "throttle_settings.4173790118.rate_limit", "5"), ), }, }, @@ -284,7 +236,6 @@ func TestAccAWSAPIGatewayUsagePlan_throttlingInitialRateLimit(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_quota(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -294,37 +245,37 @@ func TestAccAWSAPIGatewayUsagePlan_quota(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckNoResourceAttr(resourceName, "quota_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings"), ), }, { Config: testAccAWSApiGatewayUsagePlanQuotaConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "quota_settings.1956747625.limit", "100"), - resource.TestCheckResourceAttr(resourceName, "quota_settings.1956747625.offset", "6"), - resource.TestCheckResourceAttr(resourceName, "quota_settings.1956747625.period", "WEEK"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.1956747625.limit", "100"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.1956747625.offset", "6"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.1956747625.period", "WEEK"), ), }, { Config: testAccAWSApiGatewayUsagePlanQuotaModifiedConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "quota_settings.3909168194.limit", "200"), - resource.TestCheckResourceAttr(resourceName, "quota_settings.3909168194.offset", "20"), - resource.TestCheckResourceAttr(resourceName, "quota_settings.3909168194.period", "MONTH"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.3909168194.limit", "200"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.3909168194.offset", "20"), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings.3909168194.period", "MONTH"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckNoResourceAttr(resourceName, "quota_settings"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "quota_settings"), ), }, }, @@ -334,7 +285,6 @@ func TestAccAWSAPIGatewayUsagePlan_quota(t *testing.T) { func TestAccAWSAPIGatewayUsagePlan_apiStages(t *testing.T) { var conf apigateway.UsagePlan name := acctest.RandString(10) - resourceName := "aws_api_gateway_usage_plan.main" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -346,44 +296,44 @@ func TestAccAWSAPIGatewayUsagePlan_apiStages(t *testing.T) { { Config: testAccAWSApiGatewayUsagePlanApiStagesConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "api_stages.0.stage", "test"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "api_stages.0.stage", "test"), ), }, // Handle api stages removal { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckNoResourceAttr(resourceName, "api_stages"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "api_stages"), ), }, // Handle api stages additions { Config: testAccAWSApiGatewayUsagePlanApiStagesConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "api_stages.0.stage", "test"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "api_stages.0.stage", "test"), ), }, // Handle api stages updates { Config: testAccAWSApiGatewayUsagePlanApiStagesModifiedConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckResourceAttr(resourceName, "api_stages.0.stage", "foo"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "api_stages.0.stage", "foo"), ), }, { Config: testAccAWSApiGatewayUsagePlanBasicConfig(name), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayUsagePlanExists(resourceName, &conf), - resource.TestCheckResourceAttr(resourceName, "name", name), - resource.TestCheckNoResourceAttr(resourceName, "api_stages"), + testAccCheckAWSAPIGatewayUsagePlanExists("aws_api_gateway_usage_plan.main", &conf), + resource.TestCheckResourceAttr("aws_api_gateway_usage_plan.main", "name", name), + resource.TestCheckNoResourceAttr("aws_api_gateway_usage_plan.main", "api_stages"), ), }, }, @@ -525,31 +475,6 @@ resource "aws_api_gateway_usage_plan" "main" { `, rName) } -func testAccAWSApiGatewayUsagePlanBasicTags1(rName, tagKey1, tagValue1 string) string { - return fmt.Sprintf(testAccAWSAPIGatewayUsagePlanConfig+` -resource "aws_api_gateway_usage_plan" "main" { - name = "%s" - - tags = { - %q = %q - } -} -`, rName, tagKey1, tagValue1) -} - -func testAccAWSApiGatewayUsagePlanBasicTags2(rName, tagKey1, tagValue1, tagKey2, tagValue2 string) string { - return fmt.Sprintf(testAccAWSAPIGatewayUsagePlanConfig+` -resource "aws_api_gateway_usage_plan" "main" { - name = "%s" - - tags = { - %q = %q - %q = %q - } -} -`, rName, tagKey1, tagValue1, tagKey2, tagValue2) -} - func testAccAWSApiGatewayUsagePlanDescriptionConfig(rName string) string { return fmt.Sprintf(testAccAWSAPIGatewayUsagePlanConfig+` resource "aws_api_gateway_usage_plan" "main" { diff --git a/website/docs/r/api_gateway_usage_plan.html.markdown b/website/docs/r/api_gateway_usage_plan.html.markdown index e8b66dc085f..afb9b7c9e03 100644 --- a/website/docs/r/api_gateway_usage_plan.html.markdown +++ b/website/docs/r/api_gateway_usage_plan.html.markdown @@ -68,7 +68,6 @@ The API Gateway Usage Plan argument layout is a structure composed of several su * `quota_settings` - (Optional) The [quota settings](#quota-settings-arguments) of the usage plan. * `throttle_settings` - (Optional) The [throttling limits](#throttling-settings-arguments) of the usage plan. * `product_code` - (Optional) The AWS Markeplace product identifier to associate with the usage plan as a SaaS product on AWS Marketplace. -* `tags` - (Optional) Key-value mapping of resource tags #### Api Stages arguments @@ -97,7 +96,6 @@ In addition to all arguments above, the following attributes are exported: * `quota_settings` - The quota of the usage plan. * `throttle_settings` - The throttling limits of the usage plan. * `product_code` - The AWS Markeplace product identifier to associate with the usage plan as a SaaS product on AWS Marketplace. -* `arn` - Amazon Resource Name (ARN) ## Import From 60046c8669eaf66ca44b6f6cffdd35d555258070 Mon Sep 17 00:00:00 2001 From: DrFaust92 Date: Sun, 20 Oct 2019 23:52:23 +0300 Subject: [PATCH 3/3] refactor api gateway stage to use keyvaluetags add additional tag tests add arn resource + test update doc remove tags_apigateway.go file use enums where applicable --- aws/resource_aws_api_gateway_stage.go | 66 ++++++++----- aws/resource_aws_api_gateway_stage_test.go | 99 +++++++++++-------- aws/tags_apigateway.go | 44 --------- .../docs/r/api_gateway_stage.html.markdown | 1 + 4 files changed, 102 insertions(+), 108 deletions(-) delete mode 100644 aws/tags_apigateway.go diff --git a/aws/resource_aws_api_gateway_stage.go b/aws/resource_aws_api_gateway_stage.go index 2735e736f5c..8ab4f5c70d2 100644 --- a/aws/resource_aws_api_gateway_stage.go +++ b/aws/resource_aws_api_gateway_stage.go @@ -12,6 +12,8 @@ import ( "github.com/aws/aws-sdk-go/service/apigateway" "github.com/hashicorp/terraform-plugin-sdk/helper/resource" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/hashicorp/terraform-plugin-sdk/helper/validation" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func resourceAwsApiGatewayStage() *schema.Resource { @@ -64,6 +66,16 @@ func resourceAwsApiGatewayStage() *schema.Resource { "cache_cluster_size": { Type: schema.TypeString, Optional: true, + ValidateFunc: validation.StringInSlice([]string{ + apigateway.CacheClusterSize05, + apigateway.CacheClusterSize16, + apigateway.CacheClusterSize61, + apigateway.CacheClusterSize118, + apigateway.CacheClusterSize135, + apigateway.CacheClusterSize237, + apigateway.CacheClusterSize284, + apigateway.CacheClusterSize582, + }, true), }, "client_certificate_id": { Type: schema.TypeString, @@ -108,6 +120,10 @@ func resourceAwsApiGatewayStage() *schema.Resource { Type: schema.TypeBool, Optional: true, }, + "arn": { + Type: schema.TypeString, + Computed: true, + }, }, } } @@ -148,12 +164,8 @@ func resourceAwsApiGatewayStageCreate(d *schema.ResourceData, meta interface{}) } input.Variables = aws.StringMap(variables) } - if vars, ok := d.GetOk("tags"); ok { - newMap := make(map[string]string, len(vars.(map[string]interface{}))) - for k, v := range vars.(map[string]interface{}) { - newMap[k] = v.(string) - } - input.Tags = aws.StringMap(newMap) + if v, ok := d.GetOk("tags"); ok { + input.Tags = keyvaluetags.New(v.(map[string]interface{})).IgnoreAws().ApigatewayTags() } out, err := conn.CreateStage(&input) @@ -170,14 +182,14 @@ func resourceAwsApiGatewayStageCreate(d *schema.ResourceData, meta interface{}) d.SetPartial("variables") d.SetPartial("xray_tracing_enabled") - if waitForCache && *out.CacheClusterStatus != "NOT_AVAILABLE" { + if waitForCache && *out.CacheClusterStatus != apigateway.CacheClusterStatusNotAvailable { stateConf := &resource.StateChangeConf{ Pending: []string{ - "CREATE_IN_PROGRESS", - "DELETE_IN_PROGRESS", - "FLUSH_IN_PROGRESS", + apigateway.CacheClusterStatusCreateInProgress, + apigateway.CacheClusterStatusDeleteInProgress, + apigateway.CacheClusterStatusFlushInProgress, }, - Target: []string{"AVAILABLE"}, + Target: []string{apigateway.CacheClusterStatusAvailable}, Refresh: apiGatewayStageCacheRefreshFunc(conn, d.Get("rest_api_id").(string), d.Get("stage_name").(string)), @@ -215,7 +227,7 @@ func resourceAwsApiGatewayStageRead(d *schema.ResourceData, meta interface{}) er } stage, err := conn.GetStage(&input) if err != nil { - if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == "NotFoundException" { + if awsErr, ok := err.(awserr.Error); ok && awsErr.Code() == apigateway.ErrCodeNotFoundException { log.Printf("[WARN] API Gateway Stage (%s) not found, removing from state", d.Id()) d.SetId("") return nil @@ -230,7 +242,7 @@ func resourceAwsApiGatewayStageRead(d *schema.ResourceData, meta interface{}) er d.Set("client_certificate_id", stage.ClientCertificateId) - if stage.CacheClusterStatus != nil && *stage.CacheClusterStatus == "DELETE_IN_PROGRESS" { + if stage.CacheClusterStatus != nil && *stage.CacheClusterStatus == apigateway.CacheClusterStatusDeleteInProgress { d.Set("cache_cluster_enabled", false) d.Set("cache_cluster_size", nil) } else { @@ -243,10 +255,18 @@ func resourceAwsApiGatewayStageRead(d *schema.ResourceData, meta interface{}) er d.Set("documentation_version", stage.DocumentationVersion) d.Set("xray_tracing_enabled", stage.TracingEnabled) - if err := d.Set("tags", aws.StringValueMap(stage.Tags)); err != nil { + if err := d.Set("tags", keyvaluetags.ApigatewayKeyValueTags(stage.Tags).IgnoreAws().Map()); err != nil { return fmt.Errorf("error setting tags: %s", err) } + stageArn := arn.ARN{ + Partition: meta.(*AWSClient).partition, + Region: meta.(*AWSClient).region, + Service: "apigateway", + Resource: fmt.Sprintf("/restapis/%s/stages/%s", d.Get("rest_api_id").(string), d.Get("stage_name").(string)), + }.String() + d.Set("arn", stageArn) + if err := d.Set("variables", aws.StringValueMap(stage.Variables)); err != nil { return fmt.Errorf("error setting variables: %s", err) } @@ -277,10 +297,12 @@ func resourceAwsApiGatewayStageUpdate(d *schema.ResourceData, meta interface{}) Service: "apigateway", Resource: fmt.Sprintf("/restapis/%s/stages/%s", d.Get("rest_api_id").(string), d.Get("stage_name").(string)), }.String() - if tagErr := setTagsAPIGatewayStage(conn, d, stageArn); tagErr != nil { - return tagErr + if d.HasChange("tags") { + o, n := d.GetChange("tags") + if err := keyvaluetags.ApigatewayUpdateTags(conn, stageArn, o, n); err != nil { + return fmt.Errorf("error updating tags: %s", err) + } } - d.SetPartial("tags") operations := make([]*apigateway.PatchOperation, 0) waitForCache := false @@ -380,17 +402,17 @@ func resourceAwsApiGatewayStageUpdate(d *schema.ResourceData, meta interface{}) d.SetPartial("xray_tracing_enabled") d.SetPartial("variables") - if waitForCache && *out.CacheClusterStatus != "NOT_AVAILABLE" { + if waitForCache && *out.CacheClusterStatus != apigateway.CacheClusterStatusNotAvailable { stateConf := &resource.StateChangeConf{ Pending: []string{ - "CREATE_IN_PROGRESS", - "FLUSH_IN_PROGRESS", + apigateway.CacheClusterStatusCreateInProgress, + apigateway.CacheClusterStatusFlushInProgress, }, Target: []string{ - "AVAILABLE", + apigateway.CacheClusterStatusAvailable, // There's an AWS API bug (raised & confirmed in Sep 2016 by support) // which causes the stage to remain in deletion state forever - "DELETE_IN_PROGRESS", + apigateway.CacheClusterStatusDeleteInProgress, }, Refresh: apiGatewayStageCacheRefreshFunc(conn, d.Get("rest_api_id").(string), diff --git a/aws/resource_aws_api_gateway_stage_test.go b/aws/resource_aws_api_gateway_stage_test.go index 9ea0ba46cb6..e0510e51794 100644 --- a/aws/resource_aws_api_gateway_stage_test.go +++ b/aws/resource_aws_api_gateway_stage_test.go @@ -16,6 +16,7 @@ import ( func TestAccAWSAPIGatewayStage_basic(t *testing.T) { var conf apigateway.Stage rName := acctest.RandString(5) + resourceName := "aws_api_gateway_stage.test" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, @@ -25,43 +26,51 @@ func TestAccAWSAPIGatewayStage_basic(t *testing.T) { { Config: testAccAWSAPIGatewayStageConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "stage_name", "prod"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "cache_cluster_enabled", "true"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "cache_cluster_size", "0.5"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "tags.%", "1"), - resource.TestCheckResourceAttrSet("aws_api_gateway_stage.test", "execution_arn"), - resource.TestCheckResourceAttrSet("aws_api_gateway_stage.test", "invoke_url"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "xray_tracing_enabled", "true"), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "stage_name", "prod"), + resource.TestCheckResourceAttr(resourceName, "cache_cluster_enabled", "true"), + resource.TestCheckResourceAttr(resourceName, "cache_cluster_size", "0.5"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "tf-test"), + resource.TestCheckResourceAttrSet(resourceName, "execution_arn"), + resource.TestCheckResourceAttrSet(resourceName, "invoke_url"), + resource.TestCheckResourceAttr(resourceName, "xray_tracing_enabled", "true"), ), }, { - ResourceName: "aws_api_gateway_stage.test", + ResourceName: resourceName, ImportState: true, - ImportStateIdFunc: testAccAWSAPIGatewayStageImportStateIdFunc("aws_api_gateway_stage.test"), + ImportStateIdFunc: testAccAWSAPIGatewayStageImportStateIdFunc(resourceName), ImportStateVerify: true, }, { Config: testAccAWSAPIGatewayStageConfig_updated(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "stage_name", "prod"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "cache_cluster_enabled", "false"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "tags.%", "2"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "xray_tracing_enabled", "false"), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "stage_name", "prod"), + resource.TestCheckResourceAttr(resourceName, "cache_cluster_enabled", "false"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "tf-test"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "tf-test"), + resource.TestCheckResourceAttr(resourceName, "tags.ExtraName", "tf-test"), + resource.TestCheckResourceAttr(resourceName, "xray_tracing_enabled", "false"), ), }, { Config: testAccAWSAPIGatewayStageConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "stage_name", "prod"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "cache_cluster_enabled", "true"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "cache_cluster_size", "0.5"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "tags.%", "1"), - resource.TestCheckResourceAttrSet("aws_api_gateway_stage.test", "execution_arn"), - resource.TestCheckResourceAttrSet("aws_api_gateway_stage.test", "invoke_url"), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "xray_tracing_enabled", "true"), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "stage_name", "prod"), + resource.TestCheckResourceAttr(resourceName, "cache_cluster_enabled", "true"), + resource.TestCheckResourceAttr(resourceName, "cache_cluster_size", "0.5"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "tf-test"), + resource.TestCheckResourceAttrSet(resourceName, "execution_arn"), + resource.TestCheckResourceAttrSet(resourceName, "invoke_url"), + resource.TestCheckResourceAttr(resourceName, "xray_tracing_enabled", "true"), ), }, }, @@ -71,6 +80,7 @@ func TestAccAWSAPIGatewayStage_basic(t *testing.T) { func TestAccAWSAPIGatewayStage_accessLogSettings(t *testing.T) { var conf apigateway.Stage rName := acctest.RandString(5) + resourceName := "aws_api_gateway_stage.test" logGroupArnRegex := regexp.MustCompile(fmt.Sprintf("^arn:[^:]+:logs:[^:]+:[^:]+:log-group:foo-bar-%s$", rName)) clf := `$context.identity.sourceIp $context.identity.caller $context.identity.user [$context.requestTime] "$context.httpMethod $context.resourcePath $context.protocol" $context.status $context.responseLength $context.requestId` json := `{ "requestId":"$context.requestId", "ip": "$context.identity.sourceIp", "caller":"$context.identity.caller", "user":"$context.identity.user", "requestTime":"$context.requestTime", "httpMethod":"$context.httpMethod", "resourcePath":"$context.resourcePath", "status":"$context.status", "protocol":"$context.protocol", "responseLength":"$context.responseLength" }` @@ -85,45 +95,50 @@ func TestAccAWSAPIGatewayStage_accessLogSettings(t *testing.T) { { Config: testAccAWSAPIGatewayStageConfig_accessLogSettings(rName, clf), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.#", "1"), - resource.TestMatchResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.destination_arn", logGroupArnRegex), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.format", clf), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.#", "1"), + resource.TestMatchResourceAttr(resourceName, "access_log_settings.0.destination_arn", logGroupArnRegex), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.0.format", clf), ), }, { Config: testAccAWSAPIGatewayStageConfig_accessLogSettings(rName, json), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.#", "1"), - resource.TestMatchResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.destination_arn", logGroupArnRegex), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.format", json), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.#", "1"), + resource.TestMatchResourceAttr(resourceName, "access_log_settings.0.destination_arn", logGroupArnRegex), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.0.format", json), ), }, { Config: testAccAWSAPIGatewayStageConfig_accessLogSettings(rName, xml), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.#", "1"), - resource.TestMatchResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.destination_arn", logGroupArnRegex), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.format", xml), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.#", "1"), + resource.TestMatchResourceAttr(resourceName, "access_log_settings.0.destination_arn", logGroupArnRegex), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.0.format", xml), ), }, { Config: testAccAWSAPIGatewayStageConfig_accessLogSettings(rName, csv), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.#", "1"), - resource.TestMatchResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.destination_arn", logGroupArnRegex), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.0.format", csv), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.#", "1"), + resource.TestMatchResourceAttr(resourceName, "access_log_settings.0.destination_arn", logGroupArnRegex), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.0.format", csv), ), }, { Config: testAccAWSAPIGatewayStageConfig_basic(rName), Check: resource.ComposeTestCheckFunc( - testAccCheckAWSAPIGatewayStageExists("aws_api_gateway_stage.test", &conf), - resource.TestCheckResourceAttr("aws_api_gateway_stage.test", "access_log_settings.#", "0"), + testAccCheckAWSAPIGatewayStageExists(resourceName, &conf), + testAccMatchResourceAttrRegionalARNNoAccount(resourceName, "arn", "apigateway", regexp.MustCompile(`/restapis/.+/stages/prod`)), + resource.TestCheckResourceAttr(resourceName, "access_log_settings.#", "0"), ), }, }, @@ -179,7 +194,7 @@ func testAccCheckAWSAPIGatewayStageDestroy(s *terraform.State) error { if !ok { return err } - if awsErr.Code() != "NotFoundException" { + if awsErr.Code() != apigateway.ErrCodeNotFoundException { return err } diff --git a/aws/tags_apigateway.go b/aws/tags_apigateway.go deleted file mode 100644 index 56645afd45a..00000000000 --- a/aws/tags_apigateway.go +++ /dev/null @@ -1,44 +0,0 @@ -package aws - -import ( - "log" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/apigateway" - "github.com/hashicorp/terraform-plugin-sdk/helper/schema" -) - -func setTagsAPIGatewayStage(conn *apigateway.APIGateway, d *schema.ResourceData, arn string) error { - if d.HasChange("tags") { - oraw, nraw := d.GetChange("tags") - o := oraw.(map[string]interface{}) - n := nraw.(map[string]interface{}) - create, remove := diffTagsGeneric(o, n) - if len(remove) > 0 { - log.Printf("[DEBUG] Removing tags: %#v", remove) - keys := make([]*string, 0, len(remove)) - for k := range remove { - keys = append(keys, aws.String(k)) - } - - _, err := conn.UntagResource(&apigateway.UntagResourceInput{ - ResourceArn: aws.String(arn), - TagKeys: keys, - }) - if err != nil { - return err - } - } - if len(create) > 0 { - log.Printf("[DEBUG] Creating tags: %#v", create) - _, err := conn.TagResource(&apigateway.TagResourceInput{ - ResourceArn: aws.String(arn), - Tags: create, - }) - if err != nil { - return err - } - } - } - return nil -} diff --git a/website/docs/r/api_gateway_stage.html.markdown b/website/docs/r/api_gateway_stage.html.markdown index 206545091c0..eac7e3a3849 100644 --- a/website/docs/r/api_gateway_stage.html.markdown +++ b/website/docs/r/api_gateway_stage.html.markdown @@ -129,6 +129,7 @@ In addition to all arguments above, the following attributes are exported: * `execution_arn` - The execution ARN to be used in [`lambda_permission`](/docs/providers/aws/r/lambda_permission.html)'s `source_arn` when allowing API Gateway to invoke a Lambda function, e.g. `arn:aws:execute-api:eu-west-2:123456789012:z4675bid1j/prod` + * `arn` - Amazon Resource Name (ARN) ## Import