Skip to content

Commit

Permalink
Add support for request_payer of aws_s3_bucket
Browse files Browse the repository at this point in the history
  • Loading branch information
minamijoyo committed Mar 11, 2022
1 parent d5f8e10 commit 1cc825d
Show file tree
Hide file tree
Showing 5 changed files with 127 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ For upgrading AWS provider v4, some rules have not been implemented yet. The cur
- [ ] object_lock_configuration rule
- [x] policy
- [ ] replication_configuration
- [ ] request_payer
- [x] request_payer
- [x] server_side_encryption_configuration
- [x] versioning
- [x] website
Expand Down
2 changes: 1 addition & 1 deletion filter/awsv4upgrade/aws_s3_bucket.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ func NewAWSS3BucketFilter() editor.Filter {
// &AWSS3BucketObjectLockConfigurationFilter{},
&AWSS3BucketPolicyFilter{},
// &AWSS3BucketReplicationConfigurationFilter{},
// &AWSS3BucketRequestPayerFilter{},
&AWSS3BucketRequestPayerFilter{},
&AWSS3BucketServerSideEncryptionConfigurationFilter{},
&AWSS3BucketVersioningFilter{},
&AWSS3BucketWebsiteFilter{},
Expand Down
43 changes: 43 additions & 0 deletions filter/awsv4upgrade/aws_s3_bucket_request_payer.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package awsv4upgrade

import (
"github.com/minamijoyo/tfedit/tfeditor"
"github.com/minamijoyo/tfedit/tfwrite"
)

// AWSS3BucketRequestPayerFilter is a filter implementation for upgrading
// the request_payer argument of aws_s3_bucket.
// https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#request_payer-argument
type AWSS3BucketRequestPayerFilter struct{}

var _ tfeditor.ResourceFilter = (*AWSS3BucketRequestPayerFilter)(nil)

// NewAWSS3BucketRequestPayerFilter creates a new instance of AWSS3BucketRequestPayerFilter.
func NewAWSS3BucketRequestPayerFilter() tfeditor.ResourceFilter {
return &AWSS3BucketRequestPayerFilter{}
}

// ResourceFilter upgrades the request_payer argument of aws_s3_bucket.
func (f *AWSS3BucketRequestPayerFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) {
oldAttribute := "request_payer"
newResourceType := "aws_s3_bucket_request_payment_configuration"

attr := resource.GetAttribute(oldAttribute)
if attr == nil {
return inFile, nil
}

resourceName := resource.Name()
newResource := tfwrite.NewEmptyResource(newResourceType, resourceName)
inFile.AppendResource(newResource)
setBucketArgument(newResource, resource)

// Map an `request_payer` attribute to an `payer` attribute.
// request_payer = "Requester" => payer = "Requester"
payer := attr.ValueAsTokens()
newResource.SetAttributeRaw("payer", payer)

resource.RemoveAttribute(oldAttribute)

return inFile, nil
}
75 changes: 75 additions & 0 deletions filter/awsv4upgrade/aws_s3_bucket_request_payer_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package awsv4upgrade

import (
"testing"

"github.com/google/go-cmp/cmp"
"github.com/minamijoyo/hcledit/editor"
"github.com/minamijoyo/tfedit/tfeditor"
)

func TestAWSS3BucketRequestPayerFilter(t *testing.T) {
cases := []struct {
name string
src string
ok bool
want string
}{
{
name: "simple",
src: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
request_payer = "Requester"
}
`,
ok: true,
want: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
}
resource "aws_s3_bucket_request_payment_configuration" "example" {
bucket = aws_s3_bucket.example.id
payer = "Requester"
}
`,
},
{
name: "argument not found",
src: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
foo = "bar"
}
`,
ok: true,
want: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
foo = "bar"
}
`,
},
}

for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
filter := &AWSS3BucketFilter{filters: []tfeditor.ResourceFilter{&AWSS3BucketRequestPayerFilter{}}}
o := editor.NewEditOperator(filter)
output, err := o.Apply([]byte(tc.src), "test")
if tc.ok && err != nil {
t.Fatalf("unexpected err = %s", err)
}

got := string(output)
if !tc.ok && err == nil {
t.Fatalf("expected to return an error, but no error, outStream: \n%s", got)
}

if diff := cmp.Diff(got, tc.want); diff != "" {
t.Fatalf("got:\n%s\nwant:\n%s\ndiff:\n%s", got, tc.want, diff)
}
})
}
}
7 changes: 7 additions & 0 deletions filter/awsv4upgrade/aws_s3_bucket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,8 @@ resource "aws_s3_bucket" "example" {
}
EOF
request_payer = "Requester"
server_side_encryption_configuration {
rule {
apply_server_side_encryption_by_default {
Expand Down Expand Up @@ -303,6 +305,11 @@ resource "aws_s3_bucket_policy" "example" {
EOF
}
resource "aws_s3_bucket_request_payment_configuration" "example" {
bucket = aws_s3_bucket.example.id
payer = "Requester"
}
resource "aws_s3_bucket_server_side_encryption_configuration" "example" {
bucket = aws_s3_bucket.example.id
Expand Down

0 comments on commit 1cc825d

Please sign in to comment.