From 51341ab263f66a333c7b5e19715f5fa9d2b9c01a Mon Sep 17 00:00:00 2001 From: Brian Flad Date: Mon, 9 Mar 2020 09:56:34 -0500 Subject: [PATCH] service/ec2: Finish refactoring to keyvaluetags package (#12289) Reference: https://github.com/terraform-providers/terraform-provider-aws/issues/10688 Replaces `testAccCheckTags()` custom `TestCheckFunc` with the standard Terraform Plugin SDK `resource.TestCheckResourceAttr()` -- nowadays we prefer checking the Terraform state values and checking `ImportStateVerify` for state validity compared to the API. Output from acceptance testing: ``` --- PASS: TestAccDataSourceAwsEip_Id (22.59s) --- PASS: TestAccDataSourceAwsEip_Instance (144.97s) --- PASS: TestAccDataSourceAwsEip_NetworkInterface (54.82s) --- PASS: TestAccDataSourceAwsEip_PublicIP_EC2Classic (14.56s) --- PASS: TestAccAWSAMI_basic (71.24s) --- PASS: TestAccAWSAMI_disappears (57.69s) --- PASS: TestAccAWSAMI_snapshotSize (82.98s) --- PASS: TestAccAWSAMI_tags (98.21s) --- PASS: TestAccAWSInstance_tags (145.87s) --- PASS: TestAccAWSInstancesDataSource_basic (99.26s) --- PASS: TestAccAWSInstancesDataSource_instance_state_names (94.67s) --- PASS: TestAccAWSInstancesDataSource_tags (83.91s) --- PASS: TestAccAWSInternetGateway_tags (67.39s) --- PASS: TestAccAWSLaunchTemplate_tags (35.69s) --- PASS: TestAccAWSNatGateway_tags (273.08s) --- PASS: TestAccAWSNetworkAcl_OnlyEgressRules (43.22s) --- PASS: TestAccAWSRouteTable_tags (64.47s) --- PASS: TestAccAWSSecurityGroup_tags (71.51s) --- PASS: TestAccAWSVPCPeeringConnection_tags (43.86s) --- PASS: TestAccAWSVpc_tags (74.30s) --- PASS: TestAccAWSVpnGateway_tags (91.97s) --- PASS: TestAccDataSourceAwsSubnetIDs (58.36s) --- PASS: TestAccDataSourceAwsSubnetIDs_filter (48.78s) --- PASS: TestAccDataSourceAwsSubnet_basic (41.70s) --- PASS: TestAccDataSourceAwsSubnet_ipv6ByIpv6CidrBlock (69.88s) --- PASS: TestAccDataSourceAwsSubnet_ipv6ByIpv6Filter (63.06s) --- PASS: TestAccDataSourceAwsVpc_basic (46.32s) --- PASS: TestAccDataSourceAwsVpc_ipv6Associated (45.43s) --- PASS: TestAccDataSourceAwsVpc_multipleCidr (57.43s) --- PASS: TestAccDataSourceAwsVpcPeeringConnection_basic (36.43s) --- PASS: TestAccDataSourceAwsVpcs_basic (32.72s) --- PASS: TestAccDataSourceAwsVpcs_filters (38.44s) --- PASS: TestAccDataSourceAwsVpcs_tags (41.74s) ``` --- aws/data_source_aws_eip.go | 8 +-- aws/data_source_aws_instances.go | 3 +- aws/data_source_aws_subnet.go | 10 ++-- aws/data_source_aws_subnet_ids.go | 3 +- aws/data_source_aws_vpc.go | 10 ++-- aws/data_source_aws_vpc_peering_connection.go | 15 ++++-- aws/data_source_aws_vpcs.go | 14 +++-- aws/resource_aws_ami.go | 4 +- aws/resource_aws_instance_test.go | 9 ++-- aws/resource_aws_internet_gateway_test.go | 11 ++-- aws/resource_aws_launch_template_test.go | 7 +-- aws/resource_aws_nat_gateway_test.go | 11 ++-- aws/resource_aws_network_acl_test.go | 4 +- aws/resource_aws_route_table_test.go | 16 +++--- aws/resource_aws_security_group_test.go | 9 ++-- ...esource_aws_vpc_peering_connection_test.go | 5 +- aws/resource_aws_vpc_test.go | 9 ++-- aws/resource_aws_vpn_gateway_test.go | 7 +-- aws/tags.go | 46 ---------------- aws/tags_test.go | 52 ------------------- 20 files changed, 93 insertions(+), 160 deletions(-) delete mode 100644 aws/tags_test.go diff --git a/aws/data_source_aws_eip.go b/aws/data_source_aws_eip.go index fedf7e19d14f..c5f8b85572a4 100644 --- a/aws/data_source_aws_eip.go +++ b/aws/data_source_aws_eip.go @@ -87,9 +87,11 @@ func dataSourceAwsEipRead(d *schema.ResourceData, meta interface{}) error { d.Get("filter").(*schema.Set), )...) - req.Filters = append(req.Filters, buildEC2TagFilterList( - tagsFromMap(d.Get("tags").(map[string]interface{})), - )...) + if tags, tagsOk := d.GetOk("tags"); tagsOk { + req.Filters = append(req.Filters, buildEC2TagFilterList( + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), + )...) + } if len(req.Filters) == 0 { // Don't send an empty filters list; the EC2 API won't accept it. diff --git a/aws/data_source_aws_instances.go b/aws/data_source_aws_instances.go index d3128e6d919f..6b88e2513491 100644 --- a/aws/data_source_aws_instances.go +++ b/aws/data_source_aws_instances.go @@ -9,6 +9,7 @@ import ( "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 dataSourceAwsInstances() *schema.Resource { @@ -82,7 +83,7 @@ func dataSourceAwsInstancesRead(d *schema.ResourceData, meta interface{}) error } if tagsOk { params.Filters = append(params.Filters, buildEC2TagFilterList( - tagsFromMap(tags.(map[string]interface{})), + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), )...) } diff --git a/aws/data_source_aws_subnet.go b/aws/data_source_aws_subnet.go index 064d3c25d3b7..a9291d474c61 100644 --- a/aws/data_source_aws_subnet.go +++ b/aws/data_source_aws_subnet.go @@ -131,9 +131,13 @@ func dataSourceAwsSubnetRead(d *schema.ResourceData, meta interface{}) error { } req.Filters = buildEC2AttributeFilterList(filters) - req.Filters = append(req.Filters, buildEC2TagFilterList( - tagsFromMap(d.Get("tags").(map[string]interface{})), - )...) + + if tags, tagsOk := d.GetOk("tags"); tagsOk { + req.Filters = append(req.Filters, buildEC2TagFilterList( + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), + )...) + } + req.Filters = append(req.Filters, buildEC2CustomFilterList( d.Get("filter").(*schema.Set), )...) diff --git a/aws/data_source_aws_subnet_ids.go b/aws/data_source_aws_subnet_ids.go index ce72d3d2afff..005e9bbda451 100644 --- a/aws/data_source_aws_subnet_ids.go +++ b/aws/data_source_aws_subnet_ids.go @@ -6,6 +6,7 @@ import ( "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func dataSourceAwsSubnetIDs() *schema.Resource { @@ -46,7 +47,7 @@ func dataSourceAwsSubnetIDsRead(d *schema.ResourceData, meta interface{}) error if tags, tagsOk := d.GetOk("tags"); tagsOk { req.Filters = append(req.Filters, buildEC2TagFilterList( - tagsFromMap(tags.(map[string]interface{})), + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), )...) } diff --git a/aws/data_source_aws_vpc.go b/aws/data_source_aws_vpc.go index edd13c10c8b4..686eeb053ff0 100644 --- a/aws/data_source_aws_vpc.go +++ b/aws/data_source_aws_vpc.go @@ -146,9 +146,13 @@ func dataSourceAwsVpcRead(d *schema.ResourceData, meta interface{}) error { "state": d.Get("state").(string), }, ) - req.Filters = append(req.Filters, buildEC2TagFilterList( - tagsFromMap(d.Get("tags").(map[string]interface{})), - )...) + + if tags, tagsOk := d.GetOk("tags"); tagsOk { + req.Filters = append(req.Filters, buildEC2TagFilterList( + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), + )...) + } + req.Filters = append(req.Filters, buildEC2CustomFilterList( d.Get("filter").(*schema.Set), )...) diff --git a/aws/data_source_aws_vpc_peering_connection.go b/aws/data_source_aws_vpc_peering_connection.go index fa7b2aa47cd0..f635485cedba 100644 --- a/aws/data_source_aws_vpc_peering_connection.go +++ b/aws/data_source_aws_vpc_peering_connection.go @@ -7,6 +7,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func dataSourceAwsVpcPeeringConnection() *schema.Resource { @@ -102,9 +103,13 @@ func dataSourceAwsVpcPeeringConnectionRead(d *schema.ResourceData, meta interfac "accepter-vpc-info.cidr-block": d.Get("peer_cidr_block").(string), }, ) - req.Filters = append(req.Filters, buildEC2TagFilterList( - tagsFromMap(d.Get("tags").(map[string]interface{})), - )...) + + if tags, tagsOk := d.GetOk("tags"); tagsOk { + req.Filters = append(req.Filters, buildEC2TagFilterList( + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), + )...) + } + req.Filters = append(req.Filters, buildEC2CustomFilterList( d.Get("filter").(*schema.Set), )...) @@ -137,7 +142,9 @@ func dataSourceAwsVpcPeeringConnectionRead(d *schema.ResourceData, meta interfac d.Set("peer_owner_id", pcx.AccepterVpcInfo.OwnerId) d.Set("peer_cidr_block", pcx.AccepterVpcInfo.CidrBlock) d.Set("peer_region", pcx.AccepterVpcInfo.Region) - d.Set("tags", tagsToMap(pcx.Tags)) + if err := d.Set("tags", keyvaluetags.Ec2KeyValueTags(pcx.Tags).IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) + } if pcx.AccepterVpcInfo.PeeringOptions != nil { if err := d.Set("accepter", flattenVpcPeeringConnectionOptions(pcx.AccepterVpcInfo.PeeringOptions)[0]); err != nil { diff --git a/aws/data_source_aws_vpcs.go b/aws/data_source_aws_vpcs.go index cc2d5d391079..5cfbbfc2283c 100644 --- a/aws/data_source_aws_vpcs.go +++ b/aws/data_source_aws_vpcs.go @@ -8,6 +8,7 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" + "github.com/terraform-providers/terraform-provider-aws/aws/internal/keyvaluetags" ) func dataSourceAwsVpcs() *schema.Resource { @@ -31,18 +32,15 @@ func dataSourceAwsVpcs() *schema.Resource { func dataSourceAwsVpcsRead(d *schema.ResourceData, meta interface{}) error { conn := meta.(*AWSClient).ec2conn - filters, filtersOk := d.GetOk("filter") - tags, tagsOk := d.GetOk("tags") - req := &ec2.DescribeVpcsInput{} - if tagsOk { - req.Filters = buildEC2TagFilterList( - tagsFromMap(tags.(map[string]interface{})), - ) + if tags, tagsOk := d.GetOk("tags"); tagsOk { + req.Filters = append(req.Filters, buildEC2TagFilterList( + keyvaluetags.New(tags.(map[string]interface{})).Ec2Tags(), + )...) } - if filtersOk { + if filters, filtersOk := d.GetOk("filter"); filtersOk { req.Filters = append(req.Filters, buildEC2CustomFilterList( filters.(*schema.Set), )...) diff --git a/aws/resource_aws_ami.go b/aws/resource_aws_ami.go index 2709df804957..81bd1322abb1 100644 --- a/aws/resource_aws_ami.go +++ b/aws/resource_aws_ami.go @@ -401,7 +401,9 @@ func resourceAwsAmiRead(d *schema.ResourceData, meta interface{}) error { d.Set("ebs_block_device", ebsBlockDevs) d.Set("ephemeral_block_device", ephemeralBlockDevs) - d.Set("tags", tagsToMap(image.Tags)) + if err := d.Set("tags", keyvaluetags.Ec2KeyValueTags(image.Tags).IgnoreAws().Map()); err != nil { + return fmt.Errorf("error setting tags: %s", err) + } return nil } diff --git a/aws/resource_aws_instance_test.go b/aws/resource_aws_instance_test.go index d7464e3ec12c..952ae4c8e968 100644 --- a/aws/resource_aws_instance_test.go +++ b/aws/resource_aws_instance_test.go @@ -1131,9 +1131,8 @@ func TestAccAWSInstance_tags(t *testing.T) { Config: testAccCheckInstanceConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckInstanceExists(resourceName, &v), - testAccCheckTags(&v.Tags, "test", "test2"), - // Guard against regression of https://github.com/hashicorp/terraform/issues/914 - testAccCheckTags(&v.Tags, "#", ""), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.test", "test2"), ), }, { @@ -1145,8 +1144,8 @@ func TestAccAWSInstance_tags(t *testing.T) { Config: testAccCheckInstanceConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckInstanceExists(resourceName, &v), - testAccCheckTags(&v.Tags, "test", ""), - testAccCheckTags(&v.Tags, "test2", "test3"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.test2", "test3"), ), }, }, diff --git a/aws/resource_aws_internet_gateway_test.go b/aws/resource_aws_internet_gateway_test.go index 1daa427e53b7..5993eafb5ae0 100644 --- a/aws/resource_aws_internet_gateway_test.go +++ b/aws/resource_aws_internet_gateway_test.go @@ -218,8 +218,9 @@ func TestAccAWSInternetGateway_tags(t *testing.T) { Config: testAccCheckInternetGatewayConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckInternetGatewayExists(resourceName, &v), - testAccCheckTags(&v.Tags, "Name", "terraform-testacc-internet-gateway-tags"), - testAccCheckTags(&v.Tags, "test", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-internet-gateway-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.test", "bar"), testAccCheckResourceAttrAccountID(resourceName, "owner_id"), ), }, @@ -232,9 +233,9 @@ func TestAccAWSInternetGateway_tags(t *testing.T) { Config: testAccCheckInternetGatewayConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckInternetGatewayExists(resourceName, &v), - testAccCheckTags(&v.Tags, "Name", "terraform-testacc-internet-gateway-tags"), - testAccCheckTags(&v.Tags, "test", ""), - testAccCheckTags(&v.Tags, "bar", "baz"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-internet-gateway-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.bar", "baz"), testAccCheckResourceAttrAccountID(resourceName, "owner_id"), ), }, diff --git a/aws/resource_aws_launch_template_test.go b/aws/resource_aws_launch_template_test.go index 668b529dbad0..1de7535b41f8 100644 --- a/aws/resource_aws_launch_template_test.go +++ b/aws/resource_aws_launch_template_test.go @@ -414,7 +414,8 @@ func TestAccAWSLaunchTemplate_tags(t *testing.T) { Config: testAccAWSLaunchTemplateConfig_basic(rInt), Check: resource.ComposeTestCheckFunc( testAccCheckAWSLaunchTemplateExists(resourceName, &template), - testAccCheckTags(&template.Tags, "test", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.test", "bar"), ), }, { @@ -426,8 +427,8 @@ func TestAccAWSLaunchTemplate_tags(t *testing.T) { Config: testAccAWSLaunchTemplateConfig_tagsUpdate(rInt), Check: resource.ComposeTestCheckFunc( testAccCheckAWSLaunchTemplateExists(resourceName, &template), - testAccCheckTags(&template.Tags, "test", ""), - testAccCheckTags(&template.Tags, "bar", "baz"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.bar", "baz"), ), }, }, diff --git a/aws/resource_aws_nat_gateway_test.go b/aws/resource_aws_nat_gateway_test.go index a57949044247..0b3caa0da981 100644 --- a/aws/resource_aws_nat_gateway_test.go +++ b/aws/resource_aws_nat_gateway_test.go @@ -94,8 +94,9 @@ func TestAccAWSNatGateway_tags(t *testing.T) { Config: testAccNatGatewayConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckNatGatewayExists(resourceName, &natGateway), - testAccCheckTags(&natGateway.Tags, "Name", "terraform-testacc-nat-gw-tags"), - testAccCheckTags(&natGateway.Tags, "foo", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-nat-gw-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.foo", "bar"), ), }, @@ -103,9 +104,9 @@ func TestAccAWSNatGateway_tags(t *testing.T) { Config: testAccNatGatewayConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckNatGatewayExists(resourceName, &natGateway), - testAccCheckTags(&natGateway.Tags, "Name", "terraform-testacc-nat-gw-tags"), - testAccCheckTags(&natGateway.Tags, "foo", ""), - testAccCheckTags(&natGateway.Tags, "bar", "baz"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-nat-gw-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.bar", "baz"), ), }, { diff --git a/aws/resource_aws_network_acl_test.go b/aws/resource_aws_network_acl_test.go index 1f3c57ff2c7f..df8bb42563f7 100644 --- a/aws/resource_aws_network_acl_test.go +++ b/aws/resource_aws_network_acl_test.go @@ -441,7 +441,9 @@ func TestAccAWSNetworkAcl_OnlyEgressRules(t *testing.T) { Config: testAccAWSNetworkAclEgressConfig, Check: resource.ComposeTestCheckFunc( testAccCheckAWSNetworkAclExists(resourceName, &networkAcl), - testAccCheckTags(&networkAcl.Tags, "foo", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "tf-acc-acl-egress"), + resource.TestCheckResourceAttr(resourceName, "tags.foo", "bar"), ), }, { diff --git a/aws/resource_aws_route_table_test.go b/aws/resource_aws_route_table_test.go index e71dbec25476..327774f58bcd 100644 --- a/aws/resource_aws_route_table_test.go +++ b/aws/resource_aws_route_table_test.go @@ -241,31 +241,33 @@ func TestAccAWSRouteTable_ipv6(t *testing.T) { func TestAccAWSRouteTable_tags(t *testing.T) { var route_table ec2.RouteTable + resourceName := "aws_route_table.foo" resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, - IDRefreshName: "aws_route_table.foo", + IDRefreshName: resourceName, Providers: testAccProviders, CheckDestroy: testAccCheckRouteTableDestroy, Steps: []resource.TestStep{ { Config: testAccRouteTableConfigTags, Check: resource.ComposeTestCheckFunc( - testAccCheckRouteTableExists("aws_route_table.foo", &route_table), - testAccCheckTags(&route_table.Tags, "foo", "bar"), + testAccCheckRouteTableExists(resourceName, &route_table), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.foo", "bar"), ), }, { - ResourceName: "aws_route_table.foo", + ResourceName: resourceName, ImportState: true, ImportStateVerify: true, }, { Config: testAccRouteTableConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( - testAccCheckRouteTableExists("aws_route_table.foo", &route_table), - testAccCheckTags(&route_table.Tags, "foo", ""), - testAccCheckTags(&route_table.Tags, "bar", "baz"), + testAccCheckRouteTableExists(resourceName, &route_table), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.bar", "baz"), ), }, }, diff --git a/aws/resource_aws_security_group_test.go b/aws/resource_aws_security_group_test.go index 2ac6e59a179b..46590a920143 100644 --- a/aws/resource_aws_security_group_test.go +++ b/aws/resource_aws_security_group_test.go @@ -1695,7 +1695,8 @@ func TestAccAWSSecurityGroup_tags(t *testing.T) { Config: testAccAWSSecurityGroupConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckAWSSecurityGroupExists(resourceName, &group), - testAccCheckTags(&group.Tags, "foo", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.foo", "bar"), ), }, { @@ -1709,9 +1710,9 @@ func TestAccAWSSecurityGroup_tags(t *testing.T) { Config: testAccAWSSecurityGroupConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckAWSSecurityGroupExists(resourceName, &group), - testAccCheckTags(&group.Tags, "foo", ""), - testAccCheckTags(&group.Tags, "bar", "baz"), - testAccCheckTags(&group.Tags, "env", "Production"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.env", "Production"), + resource.TestCheckResourceAttr(resourceName, "tags.bar", "baz"), ), }, }, diff --git a/aws/resource_aws_vpc_peering_connection_test.go b/aws/resource_aws_vpc_peering_connection_test.go index 17e4f936e1cc..ee61d00b4bfc 100644 --- a/aws/resource_aws_vpc_peering_connection_test.go +++ b/aws/resource_aws_vpc_peering_connection_test.go @@ -180,8 +180,9 @@ func TestAccAWSVPCPeeringConnection_tags(t *testing.T) { resourceName, &connection, ), - testAccCheckTags(&connection.Tags, "Name", rName), - testAccCheckTags(&connection.Tags, "test", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", rName), + resource.TestCheckResourceAttr(resourceName, "tags.test", "bar"), ), }, { diff --git a/aws/resource_aws_vpc_test.go b/aws/resource_aws_vpc_test.go index 02ffa7eb2c56..e123f3393e38 100644 --- a/aws/resource_aws_vpc_test.go +++ b/aws/resource_aws_vpc_test.go @@ -295,7 +295,9 @@ func TestAccAWSVpc_tags(t *testing.T) { testAccCheckVpcExists(resourceName, &vpc), testAccCheckVpcCidr(&vpc, "10.1.0.0/16"), resource.TestCheckResourceAttr(resourceName, "cidr_block", "10.1.0.0/16"), - testAccCheckTags(&vpc.Tags, "foo", "bar"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-vpc-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.foo", "bar"), ), }, { @@ -307,8 +309,9 @@ func TestAccAWSVpc_tags(t *testing.T) { Config: testAccVpcConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckVpcExists(resourceName, &vpc), - testAccCheckTags(&vpc.Tags, "foo", ""), - testAccCheckTags(&vpc.Tags, "bar", "baz"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "2"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-vpc-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.bar", "baz"), ), }, }, diff --git a/aws/resource_aws_vpn_gateway_test.go b/aws/resource_aws_vpn_gateway_test.go index 866b425f692b..9d0b197e50e9 100644 --- a/aws/resource_aws_vpn_gateway_test.go +++ b/aws/resource_aws_vpn_gateway_test.go @@ -369,7 +369,8 @@ func TestAccAWSVpnGateway_tags(t *testing.T) { Config: testAccCheckVpnGatewayConfigTags, Check: resource.ComposeTestCheckFunc( testAccCheckVpnGatewayExists(resourceName, &v), - testAccCheckTags(&v.Tags, "Name", "terraform-testacc-vpn-gateway-tags"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-vpn-gateway-tags"), ), }, { @@ -381,8 +382,8 @@ func TestAccAWSVpnGateway_tags(t *testing.T) { Config: testAccCheckVpnGatewayConfigTagsUpdate, Check: resource.ComposeTestCheckFunc( testAccCheckVpnGatewayExists(resourceName, &v), - testAccCheckTags(&v.Tags, "test", ""), - testAccCheckTags(&v.Tags, "Name", "terraform-testacc-vpn-gateway-tags-updated"), + resource.TestCheckResourceAttr(resourceName, "tags.%", "1"), + resource.TestCheckResourceAttr(resourceName, "tags.Name", "terraform-testacc-vpn-gateway-tags-updated"), ), }, }, diff --git a/aws/tags.go b/aws/tags.go index 0da481b7da68..c35f62ef62d7 100644 --- a/aws/tags.go +++ b/aws/tags.go @@ -1,9 +1,6 @@ package aws import ( - "log" - "regexp" - "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/ec2" "github.com/hashicorp/terraform-plugin-sdk/helper/schema" @@ -35,49 +32,6 @@ func tagsSchemaForceNew() *schema.Schema { } } -// tagsFromMap returns the tags for the given map of data. -func tagsFromMap(m map[string]interface{}) []*ec2.Tag { - result := make([]*ec2.Tag, 0, len(m)) - for k, v := range m { - t := &ec2.Tag{ - Key: aws.String(k), - Value: aws.String(v.(string)), - } - if !tagIgnored(t) { - result = append(result, t) - } - } - - return result -} - -// tagsToMap turns the list of tags into a map. -func tagsToMap(ts []*ec2.Tag) map[string]string { - result := make(map[string]string) - for _, t := range ts { - if !tagIgnored(t) { - result[*t.Key] = *t.Value - } - } - - return result -} - -// tagIgnored compares a tag against a list of strings and checks if it should -// be ignored or not -func tagIgnored(t *ec2.Tag) bool { - filter := []string{"^aws:"} - for _, v := range filter { - log.Printf("[DEBUG] Matching %v with %v\n", v, *t.Key) - r, _ := regexp.MatchString(v, *t.Key) - if r { - log.Printf("[DEBUG] Found AWS specific tag %s (val: %s), ignoring.\n", *t.Key, *t.Value) - return true - } - } - return false -} - // ec2TagsFromTagDescriptions returns the tags from the given tag descriptions. // No attempt is made to remove duplicates. func ec2TagsFromTagDescriptions(tds []*ec2.TagDescription) []*ec2.Tag { diff --git a/aws/tags_test.go b/aws/tags_test.go deleted file mode 100644 index b77da637ee98..000000000000 --- a/aws/tags_test.go +++ /dev/null @@ -1,52 +0,0 @@ -package aws - -import ( - "fmt" - "testing" - - "github.com/aws/aws-sdk-go/aws" - "github.com/aws/aws-sdk-go/service/ec2" - "github.com/hashicorp/terraform-plugin-sdk/helper/resource" - "github.com/hashicorp/terraform-plugin-sdk/terraform" -) - -func TestIgnoringTags(t *testing.T) { - var ignoredTags []*ec2.Tag - ignoredTags = append(ignoredTags, &ec2.Tag{ - - Key: aws.String("aws:cloudformation:logical-id"), - Value: aws.String("foo"), - }) - ignoredTags = append(ignoredTags, &ec2.Tag{ - Key: aws.String("aws:foo:bar"), - Value: aws.String("baz"), - }) - for _, tag := range ignoredTags { - if !tagIgnored(tag) { - t.Fatalf("Tag %v with value %v not ignored, but should be!", *tag.Key, *tag.Value) - } - } -} - -// testAccCheckTags can be used to check the tags on a resource. -func testAccCheckTags( - ts *[]*ec2.Tag, key string, value string) resource.TestCheckFunc { - return func(s *terraform.State) error { - m := tagsToMap(*ts) - v, ok := m[key] - if value != "" && !ok { - return fmt.Errorf("Missing tag: %s", key) - } else if value == "" && ok { - return fmt.Errorf("Extra tag: %s", key) - } - if value == "" { - return nil - } - - if v != value { - return fmt.Errorf("%s: bad value: %s", key, v) - } - - return nil - } -}