Skip to content

Commit e2fdf52

Browse files
authored
Merge pull request #28585 from brittandeyoung/f-aws_lightsail_bucket
New Resource: `aws_lightsail_bucket`
2 parents 535c44c + d05e376 commit e2fdf52

File tree

7 files changed

+556
-0
lines changed

7 files changed

+556
-0
lines changed

.changelog/28585.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
aws_lightsail_bucket
3+
```

internal/provider/provider.go

+1
Original file line numberDiff line numberDiff line change
@@ -1733,6 +1733,7 @@ func New(ctx context.Context) (*schema.Provider, error) {
17331733
"aws_licensemanager_association": licensemanager.ResourceAssociation(),
17341734
"aws_licensemanager_license_configuration": licensemanager.ResourceLicenseConfiguration(),
17351735

1736+
"aws_lightsail_bucket": lightsail.ResourceBucket(),
17361737
"aws_lightsail_certificate": lightsail.ResourceCertificate(),
17371738
"aws_lightsail_container_service": lightsail.ResourceContainerService(),
17381739
"aws_lightsail_container_service_deployment_version": lightsail.ResourceContainerServiceDeploymentVersion(),

internal/service/lightsail/bucket.go

+216
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,216 @@
1+
package lightsail
2+
3+
import (
4+
"context"
5+
"errors"
6+
"time"
7+
8+
"github.com/aws/aws-sdk-go/aws"
9+
"github.com/aws/aws-sdk-go/service/lightsail"
10+
"github.com/hashicorp/aws-sdk-go-base/v2/awsv1shim/v2/tfawserr"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
12+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
13+
"github.com/hashicorp/terraform-provider-aws/internal/conns"
14+
"github.com/hashicorp/terraform-provider-aws/internal/create"
15+
tftags "github.com/hashicorp/terraform-provider-aws/internal/tags"
16+
"github.com/hashicorp/terraform-provider-aws/internal/tfresource"
17+
"github.com/hashicorp/terraform-provider-aws/internal/verify"
18+
"github.com/hashicorp/terraform-provider-aws/names"
19+
)
20+
21+
func ResourceBucket() *schema.Resource {
22+
return &schema.Resource{
23+
CreateWithoutTimeout: resourceBucketCreate,
24+
ReadWithoutTimeout: resourceBucketRead,
25+
UpdateWithoutTimeout: resourceBucketUpdate,
26+
DeleteWithoutTimeout: resourceBucketDelete,
27+
Importer: &schema.ResourceImporter{
28+
State: schema.ImportStatePassthrough,
29+
},
30+
31+
Schema: map[string]*schema.Schema{
32+
"arn": {
33+
Type: schema.TypeString,
34+
Computed: true,
35+
},
36+
"availability_zone": {
37+
Type: schema.TypeString,
38+
Computed: true,
39+
},
40+
"created_at": {
41+
Type: schema.TypeString,
42+
Computed: true,
43+
},
44+
"bundle_id": {
45+
Type: schema.TypeString,
46+
Required: true,
47+
},
48+
"name": {
49+
Type: schema.TypeString,
50+
Required: true,
51+
ForceNew: true,
52+
},
53+
"region": {
54+
Type: schema.TypeString,
55+
Computed: true,
56+
},
57+
"support_code": {
58+
Type: schema.TypeString,
59+
Computed: true,
60+
},
61+
"tags": tftags.TagsSchema(),
62+
"tags_all": tftags.TagsSchemaComputed(),
63+
"url": {
64+
Type: schema.TypeString,
65+
Computed: true,
66+
},
67+
},
68+
CustomizeDiff: verify.SetTagsDiff,
69+
}
70+
}
71+
72+
func resourceBucketCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
73+
conn := meta.(*conns.AWSClient).LightsailConn()
74+
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
75+
tags := defaultTagsConfig.MergeTags(tftags.New(d.Get("tags").(map[string]interface{})))
76+
77+
in := lightsail.CreateBucketInput{
78+
BucketName: aws.String(d.Get("name").(string)),
79+
BundleId: aws.String(d.Get("bundle_id").(string)),
80+
}
81+
82+
if len(tags) > 0 {
83+
in.Tags = Tags(tags.IgnoreAWS())
84+
}
85+
86+
out, err := conn.CreateBucketWithContext(ctx, &in)
87+
88+
if err != nil {
89+
return create.DiagError(names.Lightsail, lightsail.OperationTypeCreateBucket, ResBucket, d.Get("name").(string), err)
90+
}
91+
92+
if len(out.Operations) == 0 {
93+
return create.DiagError(names.Lightsail, lightsail.OperationTypeCreateBucket, ResBucket, d.Get("name").(string), errors.New("No operations found for Create Bucket request"))
94+
}
95+
96+
op := out.Operations[0]
97+
98+
err = waitOperation(conn, op.Id)
99+
if err != nil {
100+
return create.DiagError(names.Lightsail, lightsail.OperationTypeCreateBucket, ResBucket, d.Get("name").(string), errors.New("Error waiting for Create Bucket request operation"))
101+
}
102+
103+
d.SetId(d.Get("name").(string))
104+
105+
return resourceBucketRead(ctx, d, meta)
106+
}
107+
108+
func resourceBucketRead(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
109+
conn := meta.(*conns.AWSClient).LightsailConn()
110+
defaultTagsConfig := meta.(*conns.AWSClient).DefaultTagsConfig
111+
ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig
112+
113+
out, err := FindBucketById(ctx, conn, d.Id())
114+
115+
if !d.IsNewResource() && tfresource.NotFound(err) {
116+
create.LogNotFoundRemoveState(names.CE, create.ErrActionReading, ResBucket, d.Id())
117+
d.SetId("")
118+
return nil
119+
}
120+
121+
if err != nil {
122+
return create.DiagError(names.CE, create.ErrActionReading, ResBucket, d.Id(), err)
123+
}
124+
125+
d.Set("arn", out.Arn)
126+
d.Set("availability_zone", out.Location.AvailabilityZone)
127+
d.Set("bundle_id", out.BundleId)
128+
d.Set("created_at", out.CreatedAt.Format(time.RFC3339))
129+
d.Set("name", out.Name)
130+
d.Set("region", out.Location.RegionName)
131+
d.Set("support_code", out.SupportCode)
132+
d.Set("url", out.Url)
133+
134+
tags := KeyValueTags(out.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig)
135+
136+
//lintignore:AWSR002
137+
if err := d.Set("tags", tags.RemoveDefaultConfig(defaultTagsConfig).Map()); err != nil {
138+
return create.DiagError(names.Lightsail, create.ErrActionReading, ResBucket, d.Id(), err)
139+
}
140+
141+
if err := d.Set("tags_all", tags.Map()); err != nil {
142+
return create.DiagError(names.Lightsail, create.ErrActionReading, ResBucket, d.Id(), err)
143+
}
144+
145+
return nil
146+
}
147+
148+
func resourceBucketUpdate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
149+
conn := meta.(*conns.AWSClient).LightsailConn()
150+
151+
if d.HasChange("tags") {
152+
o, n := d.GetChange("tags")
153+
154+
if err := UpdateTags(conn, d.Id(), o, n); err != nil {
155+
return create.DiagError(names.Lightsail, create.ErrActionUpdating, ResBucket, d.Id(), err)
156+
}
157+
}
158+
159+
if d.HasChange("tags_all") {
160+
o, n := d.GetChange("tags_all")
161+
162+
if err := UpdateTags(conn, d.Id(), o, n); err != nil {
163+
return create.DiagError(names.Lightsail, create.ErrActionUpdating, ResBucket, d.Id(), err)
164+
}
165+
}
166+
167+
if d.HasChange("bundle_id") {
168+
in := lightsail.UpdateBucketBundleInput{
169+
BucketName: aws.String(d.Id()),
170+
BundleId: aws.String(d.Get("bundle_id").(string)),
171+
}
172+
out, err := conn.UpdateBucketBundleWithContext(ctx, &in)
173+
174+
if err != nil {
175+
return create.DiagError(names.Lightsail, lightsail.OperationTypeUpdateBucket, ResBucket, d.Get("name").(string), err)
176+
}
177+
178+
if len(out.Operations) == 0 {
179+
return create.DiagError(names.Lightsail, lightsail.OperationTypeUpdateBucket, ResBucket, d.Get("name").(string), errors.New("No operations found for request"))
180+
}
181+
182+
op := out.Operations[0]
183+
184+
err = waitOperation(conn, op.Id)
185+
if err != nil {
186+
return create.DiagError(names.Lightsail, lightsail.OperationTypeUpdateBucket, ResBucket, d.Get("name").(string), errors.New("Error waiting for request operation"))
187+
}
188+
}
189+
190+
return resourceBucketRead(ctx, d, meta)
191+
}
192+
193+
func resourceBucketDelete(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics {
194+
conn := meta.(*conns.AWSClient).LightsailConn()
195+
out, err := conn.DeleteBucketWithContext(ctx, &lightsail.DeleteBucketInput{
196+
BucketName: aws.String(d.Id()),
197+
})
198+
199+
if err != nil && tfawserr.ErrCodeEquals(err, lightsail.ErrCodeNotFoundException) {
200+
return nil
201+
}
202+
203+
if err != nil {
204+
return create.DiagError(names.CE, create.ErrActionDeleting, ResBucket, d.Id(), err)
205+
}
206+
207+
op := out.Operations[0]
208+
209+
err = waitOperation(conn, op.Id)
210+
211+
if err != nil {
212+
return create.DiagError(names.Lightsail, lightsail.OperationTypeDeleteCertificate, ResBucket, d.Id(), err)
213+
}
214+
215+
return nil
216+
}

0 commit comments

Comments
 (0)