From 38a9fbd43e2f4c0531551732c6c7b3ee88c4c849 Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Wed, 16 Jan 2019 18:12:01 +0100 Subject: [PATCH 1/5] Add test case to reproduce #7156 --- aws/resource_aws_s3_bucket_test.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/aws/resource_aws_s3_bucket_test.go b/aws/resource_aws_s3_bucket_test.go index 926f3d3468be..5706260b6795 100644 --- a/aws/resource_aws_s3_bucket_test.go +++ b/aws/resource_aws_s3_bucket_test.go @@ -942,6 +942,16 @@ func TestAccAWSS3Bucket_Lifecycle(t *testing.T) { "aws_s3_bucket.bucket", "lifecycle_rule.3.tags.tagKey", "tagValue"), resource.TestCheckResourceAttr( "aws_s3_bucket.bucket", "lifecycle_rule.3.tags.terraform", "hashicorp"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.4.id", "id5"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.4.tags.tagKey", "tagValue"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.4.tags.terraform", "hashicorp"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.4.transition.460947558.days", "0"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.4.transition.460947558.storage_class", "GLACIER"), ), }, { @@ -2539,6 +2549,20 @@ resource "aws_s3_bucket" "bucket" { date = "2016-01-12" } } + lifecycle_rule { + id = "id5" + enabled = true + + tags = { + "tagKey" = "tagValue" + "terraform" = "hashicorp" + } + + transition { + days = 0 + storage_class = "GLACIER" + } + } } `, randInt) } From ed4a2fa78585d68b135df8f5e468b66108010d93 Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Wed, 16 Jan 2019 19:20:45 +0100 Subject: [PATCH 2/5] Accept S3 lifecycle with filter on tags only (resolves #7156) --- aws/resource_aws_s3_bucket.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/aws/resource_aws_s3_bucket.go b/aws/resource_aws_s3_bucket.go index c8c75e81ce71..ec275278dba5 100644 --- a/aws/resource_aws_s3_bucket.go +++ b/aws/resource_aws_s3_bucket.go @@ -1033,6 +1033,10 @@ func resourceAwsS3BucketRead(d *schema.ResourceData, meta interface{}) error { if filter.Prefix != nil && *filter.Prefix != "" { rule["prefix"] = *filter.Prefix } + // Tag + if filter.Tag != nil { + rule["tags"] = tagsToMapS3([]*s3.Tag{filter.Tag}) + } } } else { if lifecycleRule.Prefix != nil { From bd6c5d4a7b8cfc21e77881e044c7b5e98276dc3b Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Wed, 16 Jan 2019 19:32:56 +0100 Subject: [PATCH 3/5] Add additional S3 lifecycle test case with a filter on a single tag (still no prefix) --- aws/resource_aws_s3_bucket_test.go | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/aws/resource_aws_s3_bucket_test.go b/aws/resource_aws_s3_bucket_test.go index 5706260b6795..d8bce1a6c2a4 100644 --- a/aws/resource_aws_s3_bucket_test.go +++ b/aws/resource_aws_s3_bucket_test.go @@ -952,6 +952,14 @@ func TestAccAWSS3Bucket_Lifecycle(t *testing.T) { "aws_s3_bucket.bucket", "lifecycle_rule.4.transition.460947558.days", "0"), resource.TestCheckResourceAttr( "aws_s3_bucket.bucket", "lifecycle_rule.4.transition.460947558.storage_class", "GLACIER"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.5.id", "id6"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.5.tags.tagKey", "tagValue"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.5.transition.460947558.days", "0"), + resource.TestCheckResourceAttr( + "aws_s3_bucket.bucket", "lifecycle_rule.5.transition.460947558.storage_class", "GLACIER"), ), }, { @@ -2558,6 +2566,19 @@ resource "aws_s3_bucket" "bucket" { "terraform" = "hashicorp" } + transition { + days = 0 + storage_class = "GLACIER" + } + } + lifecycle_rule { + id = "id6" + enabled = true + + tags = { + "tagKey" = "tagValue" + } + transition { days = 0 storage_class = "GLACIER" From af4338bcd94dd19509e2bdbe2c2c75b5ade994cc Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Wed, 16 Jan 2019 19:34:02 +0100 Subject: [PATCH 4/5] Rename TestAccAWSS3Bucket_Lifecycle to TestAccAWSS3Bucket_LifecycleBasic to allow targetting this test without also matching TestAccAWSS3Bucket_LifecycleExpireMarkerOnly --- aws/resource_aws_s3_bucket_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aws/resource_aws_s3_bucket_test.go b/aws/resource_aws_s3_bucket_test.go index d8bce1a6c2a4..4c75bee6c5a1 100644 --- a/aws/resource_aws_s3_bucket_test.go +++ b/aws/resource_aws_s3_bucket_test.go @@ -867,7 +867,7 @@ func TestAccAWSS3Bucket_Logging(t *testing.T) { }) } -func TestAccAWSS3Bucket_Lifecycle(t *testing.T) { +func TestAccAWSS3Bucket_LifecycleBasic(t *testing.T) { rInt := acctest.RandInt() resource.ParallelTest(t, resource.TestCase{ PreCheck: func() { testAccPreCheck(t) }, From 9a694438084469a5806f9c01380c1e69a4b83a85 Mon Sep 17 00:00:00 2001 From: Patrick Decat Date: Wed, 16 Jan 2019 23:28:21 +0100 Subject: [PATCH 5/5] Log read lifecycle rule at debug level --- aws/resource_aws_s3_bucket.go | 1 + 1 file changed, 1 insertion(+) diff --git a/aws/resource_aws_s3_bucket.go b/aws/resource_aws_s3_bucket.go index ec275278dba5..9fe560056995 100644 --- a/aws/resource_aws_s3_bucket.go +++ b/aws/resource_aws_s3_bucket.go @@ -1011,6 +1011,7 @@ func resourceAwsS3BucketRead(d *schema.ResourceData, meta interface{}) error { lifecycleRules = make([]map[string]interface{}, 0, len(lifecycle.Rules)) for _, lifecycleRule := range lifecycle.Rules { + log.Printf("[DEBUG] S3 bucket: %s, read lifecycle rule: %v", d.Id(), lifecycleRule) rule := make(map[string]interface{}) // ID