Skip to content

Commit

Permalink
Add support for acceleration_status 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 6f9c6c8 commit 8056c03
Show file tree
Hide file tree
Showing 6 changed files with 131 additions and 2 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ For upgrading AWS provider v4, some rules have not been implemented yet. The cur
[S3 Bucket Refactor](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/guides/version-4-upgrade#s3-bucket-refactor)

- [ ] Arguments of aws_s3_bucket resource
- [ ] acceleration_status
- [x] acceleration_status
- [x] acl
- [x] cors_rule
- [x] grant
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 @@ -19,7 +19,7 @@ var _ editor.Filter = (*AWSS3BucketFilter)(nil)
// NewAWSS3BucketFilter creates a new instance of AWSS3BucketFilter.
func NewAWSS3BucketFilter() editor.Filter {
filters := []tfeditor.ResourceFilter{
// &AWSS3BucketAccelerationStatusFilter{},
&AWSS3BucketAccelerationStatusFilter{},
&AWSS3BucketACLFilter{},
&AWSS3BucketCorsRuleFilter{},
&AWSS3BucketGrantFilter{},
Expand Down
43 changes: 43 additions & 0 deletions filter/awsv4upgrade/aws_s3_bucket_acceleration_status.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"
)

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

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

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

// ResourceFilter upgrades the acceleration_status argument of aws_s3_bucket.
func (f *AWSS3BucketAccelerationStatusFilter) ResourceFilter(inFile *tfwrite.File, resource *tfwrite.Resource) (*tfwrite.File, error) {
oldAttribute := "acceleration_status"
newResourceType := "aws_s3_bucket_accelerate_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 `acceleration_status` attribute to an `status` attribute.
// acceleration_status = "Enabled" => status = "Enabled"
status := attr.ValueAsTokens()
newResource.SetAttributeRaw("status", status)

resource.RemoveAttribute(oldAttribute)

return inFile, nil
}
75 changes: 75 additions & 0 deletions filter/awsv4upgrade/aws_s3_bucket_acceleration_status_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 TestAWSS3BucketAccelerationStatusFilter(t *testing.T) {
cases := []struct {
name string
src string
ok bool
want string
}{
{
name: "simple",
src: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
acceleration_status = "Enabled"
}
`,
ok: true,
want: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
}
resource "aws_s3_bucket_accelerate_configuration" "example" {
bucket = aws_s3_bucket.example.id
status = "Enabled"
}
`,
},
{
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{&AWSS3BucketAccelerationStatusFilter{}}}
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)
}
})
}
}
6 changes: 6 additions & 0 deletions filter/awsv4upgrade/aws_s3_bucket_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ resource "aws_s3_bucket_foo" "example" {
src: `
resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
acceleration_status = "Enabled"
acl = "private"
cors_rule {
Expand Down Expand Up @@ -217,6 +218,11 @@ resource "aws_s3_bucket" "example" {
bucket = "tfedit-test"
}
resource "aws_s3_bucket_accelerate_configuration" "example" {
bucket = aws_s3_bucket.example.id
status = "Enabled"
}
resource "aws_s3_bucket_acl" "example" {
bucket = aws_s3_bucket.example.id
acl = "private"
Expand Down
5 changes: 5 additions & 0 deletions tfwrite/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,11 @@ func (r *Resource) SetAttributeByReference(name string, refResource *Resource, r
r.raw.Body().SetAttributeTraversal(name, traversal)
}

// SetAttributeRaw sets an attribute for a given name with raw tokens.
func (r *Resource) SetAttributeRaw(name string, tokens hclwrite.Tokens) {
r.raw.Body().SetAttributeRaw(name, tokens)
}

// AppendAttribute appends a given attribute to the resource.
func (r *Resource) AppendAttribute(attr *Attribute) {
expr := attr.raw.BuildTokens(nil)
Expand Down

0 comments on commit 8056c03

Please sign in to comment.