1
1
package s3control
2
2
3
3
import (
4
- "fmt "
4
+ "context "
5
5
"log"
6
6
7
7
"github.com/aws/aws-sdk-go/aws"
8
8
"github.com/aws/aws-sdk-go/aws/arn"
9
9
"github.com/aws/aws-sdk-go/service/s3control"
10
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/resource"
11
13
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12
14
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/structure"
13
15
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
14
16
"github.com/hashicorp/terraform-provider-aws/internal/conns"
17
+ "github.com/hashicorp/terraform-provider-aws/internal/tfresource"
15
18
"github.com/hashicorp/terraform-provider-aws/internal/verify"
16
19
)
17
20
18
- func ResourceBucketPolicy () * schema.Resource {
21
+ func init () {
22
+ _sp .registerSDKResourceFactory ("aws_s3control_bucket_policy" , resourceBucketPolicy )
23
+ }
24
+
25
+ func resourceBucketPolicy () * schema.Resource {
19
26
return & schema.Resource {
20
- Create : resourceBucketPolicyCreate ,
21
- Read : resourceBucketPolicyRead ,
22
- Update : resourceBucketPolicyUpdate ,
23
- Delete : resourceBucketPolicyDelete ,
27
+ CreateWithoutTimeout : resourceBucketPolicyCreate ,
28
+ ReadWithoutTimeout : resourceBucketPolicyRead ,
29
+ UpdateWithoutTimeout : resourceBucketPolicyUpdate ,
30
+ DeleteWithoutTimeout : resourceBucketPolicyDelete ,
24
31
25
32
Importer : & schema.ResourceImporter {
26
33
State : schema .ImportStatePassthrough ,
@@ -47,77 +54,56 @@ func ResourceBucketPolicy() *schema.Resource {
47
54
}
48
55
}
49
56
50
- func resourceBucketPolicyCreate (d * schema.ResourceData , meta interface {}) error {
57
+ func resourceBucketPolicyCreate (ctx context. Context , d * schema.ResourceData , meta interface {}) diag. Diagnostics {
51
58
conn := meta .(* conns.AWSClient ).S3ControlConn ()
52
59
53
60
bucket := d .Get ("bucket" ).(string )
54
61
55
62
policy , err := structure .NormalizeJsonString (d .Get ("policy" ).(string ))
56
63
57
64
if err != nil {
58
- return fmt .Errorf ("policy (%s) is invalid JSON: %w " , d .Get ("policy" ).(string ), err )
65
+ return diag .Errorf ("policy (%s) is invalid JSON: %s " , d .Get ("policy" ).(string ), err )
59
66
}
60
67
61
68
input := & s3control.PutBucketPolicyInput {
62
69
Bucket : aws .String (bucket ),
63
70
Policy : aws .String (policy ),
64
71
}
65
72
66
- _ , err = conn .PutBucketPolicy ( input )
73
+ _ , err = conn .PutBucketPolicyWithContext ( ctx , input )
67
74
68
75
if err != nil {
69
- return fmt .Errorf ("error creating S3 Control Bucket Policy (%s): %w " , bucket , err )
76
+ return diag .Errorf ("creating S3 Control Bucket Policy (%s): %s " , bucket , err )
70
77
}
71
78
72
79
d .SetId (bucket )
73
80
74
- return resourceBucketPolicyRead (d , meta )
81
+ return resourceBucketPolicyRead (ctx , d , meta )
75
82
}
76
83
77
- func resourceBucketPolicyRead (d * schema.ResourceData , meta interface {}) error {
84
+ func resourceBucketPolicyRead (ctx context. Context , d * schema.ResourceData , meta interface {}) diag. Diagnostics {
78
85
conn := meta .(* conns.AWSClient ).S3ControlConn ()
79
86
80
87
parsedArn , err := arn .Parse (d .Id ())
81
88
82
89
if err != nil {
83
- return fmt . Errorf ( "error parsing S3 Control Bucket ARN (%s): %w" , d . Id (), err )
90
+ return diag . FromErr ( err )
84
91
}
85
92
86
93
if parsedArn .AccountID == "" {
87
- return fmt .Errorf ("error parsing S3 Control Bucket ARN (%s): unknown format" , d .Id ())
88
- }
89
-
90
- input := & s3control.GetBucketPolicyInput {
91
- AccountId : aws .String (parsedArn .AccountID ),
92
- Bucket : aws .String (d .Id ()),
94
+ return diag .Errorf ("parsing S3 Control Bucket ARN (%s): unknown format" , d .Id ())
93
95
}
94
96
95
- output , err := conn . GetBucketPolicy ( input )
97
+ output , err := FindBucketPolicyByTwoPartKey ( ctx , conn , parsedArn . AccountID , d . Id () )
96
98
97
- if ! d .IsNewResource () && tfawserr .ErrCodeEquals (err , "NoSuchBucket" ) {
98
- log .Printf ("[WARN] S3 Control Bucket Policy (%s) not found, removing from state" , d .Id ())
99
- d .SetId ("" )
100
- return nil
101
- }
102
-
103
- if ! d .IsNewResource () && tfawserr .ErrCodeEquals (err , "NoSuchBucketPolicy" ) {
104
- log .Printf ("[WARN] S3 Control Bucket Policy (%s) not found, removing from state" , d .Id ())
105
- d .SetId ("" )
106
- return nil
107
- }
108
-
109
- if ! d .IsNewResource () && tfawserr .ErrCodeEquals (err , "NoSuchOutpost" ) {
99
+ if ! d .IsNewResource () && tfresource .NotFound (err ) {
110
100
log .Printf ("[WARN] S3 Control Bucket Policy (%s) not found, removing from state" , d .Id ())
111
101
d .SetId ("" )
112
102
return nil
113
103
}
114
104
115
105
if err != nil {
116
- return fmt .Errorf ("error reading S3 Control Bucket Policy (%s): %w" , d .Id (), err )
117
- }
118
-
119
- if output == nil {
120
- return fmt .Errorf ("error reading S3 Control Bucket Policy (%s): empty response" , d .Id ())
106
+ return diag .Errorf ("reading S3 Control Bucket Policy (%s): %s" , d .Id (), err )
121
107
}
122
108
123
109
d .Set ("bucket" , d .Id ())
@@ -126,7 +112,7 @@ func resourceBucketPolicyRead(d *schema.ResourceData, meta interface{}) error {
126
112
policyToSet , err := verify .PolicyToSet (d .Get ("policy" ).(string ), aws .StringValue (output .Policy ))
127
113
128
114
if err != nil {
129
- return err
115
+ return diag . FromErr ( err )
130
116
}
131
117
132
118
d .Set ("policy" , policyToSet )
@@ -137,60 +123,77 @@ func resourceBucketPolicyRead(d *schema.ResourceData, meta interface{}) error {
137
123
return nil
138
124
}
139
125
140
- func resourceBucketPolicyUpdate (d * schema.ResourceData , meta interface {}) error {
126
+ func resourceBucketPolicyUpdate (ctx context. Context , d * schema.ResourceData , meta interface {}) diag. Diagnostics {
141
127
conn := meta .(* conns.AWSClient ).S3ControlConn ()
142
128
143
129
policy , err := structure .NormalizeJsonString (d .Get ("policy" ).(string ))
144
130
145
131
if err != nil {
146
- return fmt .Errorf ("policy (%s) is invalid JSON: %w " , d .Get ("policy" ).(string ), err )
132
+ return diag .Errorf ("policy (%s) is invalid JSON: %s " , d .Get ("policy" ).(string ), err )
147
133
}
148
134
149
135
input := & s3control.PutBucketPolicyInput {
150
136
Bucket : aws .String (d .Id ()),
151
137
Policy : aws .String (policy ),
152
138
}
153
139
154
- _ , err = conn .PutBucketPolicy ( input )
140
+ _ , err = conn .PutBucketPolicyWithContext ( ctx , input )
155
141
156
142
if err != nil {
157
- return fmt .Errorf ("error updating S3 Control Bucket Policy (%s): %w " , d .Id (), err )
143
+ return diag .Errorf ("updating S3 Control Bucket Policy (%s): %s " , d .Id (), err )
158
144
}
159
145
160
- return resourceBucketPolicyRead (d , meta )
146
+ return resourceBucketPolicyRead (ctx , d , meta )
161
147
}
162
148
163
- func resourceBucketPolicyDelete (d * schema.ResourceData , meta interface {}) error {
149
+ func resourceBucketPolicyDelete (ctx context. Context , d * schema.ResourceData , meta interface {}) diag. Diagnostics {
164
150
conn := meta .(* conns.AWSClient ).S3ControlConn ()
165
151
166
152
parsedArn , err := arn .Parse (d .Id ())
167
153
168
154
if err != nil {
169
- return fmt . Errorf ( "error parsing S3 Control Bucket ARN (%s): %w" , d . Id (), err )
155
+ return diag . FromErr ( err )
170
156
}
171
157
172
- input := & s3control.DeleteBucketPolicyInput {
158
+ log .Printf ("[DEBUG] Deleting S3 Control Bucket Policy: %s" , d .Id ())
159
+ _ , err = conn .DeleteBucketPolicyWithContext (ctx , & s3control.DeleteBucketPolicyInput {
173
160
AccountId : aws .String (parsedArn .AccountID ),
174
161
Bucket : aws .String (d .Id ()),
175
- }
176
-
177
- _ , err = conn .DeleteBucketPolicy (input )
162
+ })
178
163
179
- if tfawserr .ErrCodeEquals (err , "NoSuchBucket" ) {
164
+ if tfawserr .ErrCodeEquals (err , errCodeNoSuchBucket , errCodeNoSuchBucketPolicy , errCodeNoSuchOutpost ) {
180
165
return nil
181
166
}
182
167
183
- if tfawserr . ErrCodeEquals ( err , "NoSuchBucketPolicy" ) {
184
- return nil
168
+ if err != nil {
169
+ return diag . Errorf ( "deleting S3 Control Bucket Policy (%s): %s" , d . Id (), err )
185
170
}
186
171
187
- if tfawserr .ErrCodeEquals (err , "NoSuchOutpost" ) {
188
- return nil
172
+ return nil
173
+ }
174
+
175
+ func FindBucketPolicyByTwoPartKey (ctx context.Context , conn * s3control.S3Control , accountID , bucket string ) (* s3control.GetBucketPolicyOutput , error ) {
176
+ input := & s3control.GetBucketPolicyInput {
177
+ AccountId : aws .String (accountID ),
178
+ Bucket : aws .String (bucket ),
179
+ }
180
+
181
+ output , err := conn .GetBucketPolicyWithContext (ctx , input )
182
+
183
+ if tfawserr .ErrCodeEquals (err , errCodeNoSuchBucket , errCodeNoSuchBucketPolicy , errCodeNoSuchOutpost ) {
184
+ return nil , & resource.NotFoundError {
185
+ LastError : err ,
186
+ LastRequest : input ,
187
+ }
189
188
}
190
189
191
190
if err != nil {
192
- return fmt . Errorf ( "error deleting S3 Control Bucket Policy (%s): %w" , d . Id (), err )
191
+ return nil , err
193
192
}
194
193
195
- return nil
194
+ if output == nil {
195
+ return nil , tfresource .NewEmptyResultError (input )
196
+ }
197
+
198
+ return output , nil
196
199
}
0 commit comments