@@ -2,7 +2,6 @@ package networkfirewall
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
5
"log"
7
6
8
7
"github.com/aws/aws-sdk-go/aws"
@@ -70,6 +69,20 @@ func ResourceFirewallPolicy() *schema.Resource {
70
69
Optional : true ,
71
70
Elem : & schema.Resource {
72
71
Schema : map [string ]* schema.Schema {
72
+ "override" : {
73
+ Type : schema .TypeList ,
74
+ MaxItems : 1 ,
75
+ Optional : true ,
76
+ Elem : & schema.Resource {
77
+ Schema : map [string ]* schema.Schema {
78
+ "action" : {
79
+ Type : schema .TypeString ,
80
+ Optional : true ,
81
+ ValidateFunc : validation .StringInSlice (networkfirewall .OverrideAction_Values (), false ),
82
+ },
83
+ },
84
+ },
85
+ },
73
86
"priority" : {
74
87
Type : schema .TypeInt ,
75
88
Optional : true ,
@@ -143,6 +156,7 @@ func resourceFirewallPolicyCreate(ctx context.Context, d *schema.ResourceData, m
143
156
conn := meta .(* conns.AWSClient ).NetworkFirewallConn
144
157
defaultTagsConfig := meta .(* conns.AWSClient ).DefaultTagsConfig
145
158
tags := defaultTagsConfig .MergeTags (tftags .New (d .Get ("tags" ).(map [string ]interface {})))
159
+
146
160
name := d .Get ("name" ).(string )
147
161
input := & networkfirewall.CreateFirewallPolicyInput {
148
162
FirewallPolicy : expandFirewallPolicy (d .Get ("firewall_policy" ).([]interface {})),
@@ -157,14 +171,11 @@ func resourceFirewallPolicyCreate(ctx context.Context, d *schema.ResourceData, m
157
171
input .Tags = Tags (tags .IgnoreAWS ())
158
172
}
159
173
160
- log .Printf ("[DEBUG] Creating NetworkFirewall Firewall Policy %s" , name )
161
-
174
+ log .Printf ("[DEBUG] Creating NetworkFirewall Firewall Policy: %s" , input )
162
175
output , err := conn .CreateFirewallPolicyWithContext (ctx , input )
176
+
163
177
if err != nil {
164
- return diag .FromErr (fmt .Errorf ("error creating NetworkFirewall Firewall Policy (%s): %w" , name , err ))
165
- }
166
- if output == nil || output .FirewallPolicyResponse == nil {
167
- return diag .FromErr (fmt .Errorf ("error creating NetworkFirewall Firewall Policy (%s): empty output" , name ))
178
+ return diag .Errorf ("creating NetworkFirewall Firewall Policy (%s): %s" , name , err )
168
179
}
169
180
170
181
d .SetId (aws .StringValue (output .FirewallPolicyResponse .FirewallPolicyArn ))
@@ -177,23 +188,16 @@ func resourceFirewallPolicyRead(ctx context.Context, d *schema.ResourceData, met
177
188
defaultTagsConfig := meta .(* conns.AWSClient ).DefaultTagsConfig
178
189
ignoreTagsConfig := meta .(* conns.AWSClient ).IgnoreTagsConfig
179
190
180
- log . Printf ( "[DEBUG] Reading NetworkFirewall Firewall Policy %s" , d .Id ())
191
+ output , err := FindFirewallPolicyByARN ( ctx , conn , d .Id ())
181
192
182
- output , err := FindFirewallPolicy (ctx , conn , d .Id ())
183
- if ! d .IsNewResource () && tfawserr .ErrCodeEquals (err , networkfirewall .ErrCodeResourceNotFoundException ) {
193
+ if ! d .IsNewResource () && tfresource .NotFound (err ) {
184
194
log .Printf ("[WARN] NetworkFirewall Firewall Policy (%s) not found, removing from state" , d .Id ())
185
195
d .SetId ("" )
186
196
return nil
187
197
}
188
- if err != nil {
189
- return diag .FromErr (fmt .Errorf ("error reading NetworkFirewall Firewall Policy (%s): %w" , d .Id (), err ))
190
- }
191
198
192
- if output == nil {
193
- return diag .FromErr (fmt .Errorf ("error reading NetworkFirewall Firewall Policy (%s): empty output" , d .Id ()))
194
- }
195
- if output .FirewallPolicyResponse == nil {
196
- return diag .FromErr (fmt .Errorf ("error reading NetworkFirewall Firewall Policy (%s): empty output.FirewallPolicyResponse" , d .Id ()))
199
+ if err != nil {
200
+ return diag .Errorf ("reading NetworkFirewall Firewall Policy (%s): %s" , d .Id (), err )
197
201
}
198
202
199
203
resp := output .FirewallPolicyResponse
@@ -205,49 +209,51 @@ func resourceFirewallPolicyRead(ctx context.Context, d *schema.ResourceData, met
205
209
d .Set ("update_token" , output .UpdateToken )
206
210
207
211
if err := d .Set ("firewall_policy" , flattenFirewallPolicy (policy )); err != nil {
208
- return diag .FromErr ( fmt . Errorf ("error setting firewall_policy: %w " , err ) )
212
+ return diag .Errorf ("setting firewall_policy: %s " , err )
209
213
}
210
214
211
215
tags := KeyValueTags (resp .Tags ).IgnoreAWS ().IgnoreConfig (ignoreTagsConfig )
212
216
213
217
//lintignore:AWSR002
214
218
if err := d .Set ("tags" , tags .RemoveDefaultConfig (defaultTagsConfig ).Map ()); err != nil {
215
- return diag .FromErr ( fmt . Errorf ("error setting tags: %w " , err ) )
219
+ return diag .Errorf ("setting tags: %s " , err )
216
220
}
217
221
218
222
if err := d .Set ("tags_all" , tags .Map ()); err != nil {
219
- return diag .FromErr ( fmt . Errorf ("error setting tags_all: %w " , err ) )
223
+ return diag .Errorf ("setting tags_all: %s " , err )
220
224
}
221
225
222
226
return nil
223
227
}
224
228
225
229
func resourceFirewallPolicyUpdate (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
226
230
conn := meta .(* conns.AWSClient ).NetworkFirewallConn
227
- arn := d .Id ()
228
-
229
- log .Printf ("[DEBUG] Updating NetworkFirewall Firewall Policy %s" , arn )
230
231
231
232
if d .HasChanges ("description" , "firewall_policy" ) {
232
233
input := & networkfirewall.UpdateFirewallPolicyInput {
233
234
FirewallPolicy : expandFirewallPolicy (d .Get ("firewall_policy" ).([]interface {})),
234
- FirewallPolicyArn : aws .String (arn ),
235
+ FirewallPolicyArn : aws .String (d . Id () ),
235
236
UpdateToken : aws .String (d .Get ("update_token" ).(string )),
236
237
}
238
+
237
239
// Only pass non-empty description values, else API request returns an InternalServiceError
238
240
if v , ok := d .GetOk ("description" ); ok {
239
241
input .Description = aws .String (v .(string ))
240
242
}
243
+
244
+ log .Printf ("[DEBUG] Updating NetworkFirewall Firewall Policy: %s" , input )
241
245
_ , err := conn .UpdateFirewallPolicyWithContext (ctx , input )
246
+
242
247
if err != nil {
243
- return diag .FromErr ( fmt . Errorf ("error updating NetworkFirewall Firewall Policy (%s) firewall_policy : %w " , arn , err ) )
248
+ return diag .Errorf ("updating NetworkFirewall Firewall Policy (%s): %s " , d . Id () , err )
244
249
}
245
250
}
246
251
247
252
if d .HasChange ("tags_all" ) {
248
253
o , n := d .GetChange ("tags_all" )
249
- if err := UpdateTags (conn , arn , o , n ); err != nil {
250
- return diag .FromErr (fmt .Errorf ("error updating NetworkFirewall Firewall Policy (%s) tags: %w" , arn , err ))
254
+
255
+ if err := UpdateTagsWithContext (ctx , conn , d .Id (), o , n ); err != nil {
256
+ return diag .Errorf ("updating NetworkFirewall Firewall Policy (%s) tags: %s" , d .Id (), err )
251
257
}
252
258
}
253
259
@@ -257,42 +263,84 @@ func resourceFirewallPolicyUpdate(ctx context.Context, d *schema.ResourceData, m
257
263
func resourceFirewallPolicyDelete (ctx context.Context , d * schema.ResourceData , meta interface {}) diag.Diagnostics {
258
264
conn := meta .(* conns.AWSClient ).NetworkFirewallConn
259
265
260
- log .Printf ("[DEBUG] Deleting NetworkFirewall Firewall Policy %s" , d .Id ())
266
+ log .Printf ("[DEBUG] Deleting NetworkFirewall Firewall Policy: %s" , d .Id ())
267
+ _ , err := tfresource .RetryWhenAWSErrMessageContainsContext (ctx , firewallPolicyTimeout , func () (interface {}, error ) {
268
+ return conn .DeleteFirewallPolicyWithContext (ctx , & networkfirewall.DeleteFirewallPolicyInput {
269
+ FirewallPolicyArn : aws .String (d .Id ()),
270
+ })
271
+ }, networkfirewall .ErrCodeInvalidOperationException , "Unable to delete the object because it is still in use" )
261
272
262
- input := & networkfirewall.DeleteFirewallPolicyInput {
263
- FirewallPolicyArn : aws . String ( d . Id ()),
273
+ if tfawserr . ErrCodeEquals ( err , networkfirewall .ErrCodeResourceNotFoundException ) {
274
+ return nil
264
275
}
265
276
266
- err := resource .RetryContext (ctx , firewallPolicyTimeout , func () * resource.RetryError {
267
- _ , err := conn .DeleteFirewallPolicyWithContext (ctx , input )
268
- if err != nil {
269
- if tfawserr .ErrMessageContains (err , networkfirewall .ErrCodeInvalidOperationException , "Unable to delete the object because it is still in use" ) {
270
- return resource .RetryableError (err )
271
- }
272
- return resource .NonRetryableError (err )
273
- }
274
- return nil
275
- })
277
+ if err != nil {
278
+ return diag .Errorf ("deleting NetworkFirewall Firewall Policy (%s): %s" , d .Id (), err )
279
+ }
276
280
277
- if tfresource . TimedOut ( err ) {
278
- _ , err = conn . DeleteFirewallPolicyWithContext ( ctx , input )
281
+ if _ , err := waitFirewallPolicyDeleted ( ctx , conn , d . Id ()); err != nil {
282
+ return diag . Errorf ( "waiting for NetworkFirewall Firewall Policy (%s) delete: %s" , d . Id (), err )
279
283
}
280
284
281
- if err != nil {
282
- if tfawserr .ErrCodeEquals (err , networkfirewall .ErrCodeResourceNotFoundException ) {
283
- return nil
285
+ return nil
286
+ }
287
+
288
+ func FindFirewallPolicyByARN (ctx context.Context , conn * networkfirewall.NetworkFirewall , arn string ) (* networkfirewall.DescribeFirewallPolicyOutput , error ) {
289
+ input := & networkfirewall.DescribeFirewallPolicyInput {
290
+ FirewallPolicyArn : aws .String (arn ),
291
+ }
292
+
293
+ output , err := conn .DescribeFirewallPolicyWithContext (ctx , input )
294
+
295
+ if tfawserr .ErrCodeEquals (err , networkfirewall .ErrCodeResourceNotFoundException ) {
296
+ return nil , & resource.NotFoundError {
297
+ LastError : err ,
298
+ LastRequest : input ,
284
299
}
285
- return diag .FromErr (fmt .Errorf ("error deleting NetworkFirewall Firewall Policy (%s): %w" , d .Id (), err ))
286
300
}
287
301
288
- if _ , err := waitFirewallPolicyDeleted (ctx , conn , d .Id ()); err != nil {
289
- if tfawserr .ErrCodeEquals (err , networkfirewall .ErrCodeResourceNotFoundException ) {
290
- return nil
302
+ if err != nil {
303
+ return nil , err
304
+ }
305
+
306
+ if output == nil || output .FirewallPolicyResponse == nil {
307
+ return nil , tfresource .NewEmptyResultError (input )
308
+ }
309
+
310
+ return output , nil
311
+ }
312
+
313
+ func statusFirewallPolicy (ctx context.Context , conn * networkfirewall.NetworkFirewall , arn string ) resource.StateRefreshFunc {
314
+ return func () (interface {}, string , error ) {
315
+ output , err := FindFirewallPolicyByARN (ctx , conn , arn )
316
+
317
+ if tfresource .NotFound (err ) {
318
+ return nil , "" , nil
291
319
}
292
- return diag .FromErr (fmt .Errorf ("error waiting for NetworkFirewall Firewall Policy (%s) to delete: %w" , d .Id (), err ))
320
+
321
+ if err != nil {
322
+ return nil , "" , err
323
+ }
324
+
325
+ return output , aws .StringValue (output .FirewallPolicyResponse .FirewallPolicyStatus ), nil
293
326
}
327
+ }
294
328
295
- return nil
329
+ func waitFirewallPolicyDeleted (ctx context.Context , conn * networkfirewall.NetworkFirewall , arn string ) (* networkfirewall.DescribeFirewallPolicyOutput , error ) {
330
+ stateConf := & resource.StateChangeConf {
331
+ Pending : []string {networkfirewall .ResourceStatusDeleting },
332
+ Target : []string {},
333
+ Refresh : statusFirewallPolicy (ctx , conn , arn ),
334
+ Timeout : firewallPolicyTimeout ,
335
+ }
336
+
337
+ outputRaw , err := stateConf .WaitForStateContext (ctx )
338
+
339
+ if v , ok := outputRaw .(* networkfirewall.DescribeFirewallPolicyOutput ); ok {
340
+ return v , err
341
+ }
342
+
343
+ return nil , err
296
344
}
297
345
298
346
func expandStatefulEngineOptions (l []interface {}) * networkfirewall.StatefulEngineOptions {
@@ -310,6 +358,21 @@ func expandStatefulEngineOptions(l []interface{}) *networkfirewall.StatefulEngin
310
358
return options
311
359
}
312
360
361
+ func expandStatefulRuleGroupOverride (l []interface {}) * networkfirewall.StatefulRuleGroupOverride {
362
+ if len (l ) == 0 || l [0 ] == nil {
363
+ return nil
364
+ }
365
+
366
+ lRaw := l [0 ].(map [string ]interface {})
367
+ override := & networkfirewall.StatefulRuleGroupOverride {}
368
+
369
+ if v , ok := lRaw ["action" ].(string ); ok && v != "" {
370
+ override .SetAction (v )
371
+ }
372
+
373
+ return override
374
+ }
375
+
313
376
func expandStatefulRuleGroupReferences (l []interface {}) []* networkfirewall.StatefulRuleGroupReference {
314
377
if len (l ) == 0 || l [0 ] == nil {
315
378
return nil
@@ -320,15 +383,22 @@ func expandStatefulRuleGroupReferences(l []interface{}) []*networkfirewall.State
320
383
if ! ok {
321
384
continue
322
385
}
386
+
323
387
reference := & networkfirewall.StatefulRuleGroupReference {}
324
388
if v , ok := tfMap ["priority" ].(int ); ok && v > 0 {
325
389
reference .Priority = aws .Int64 (int64 (v ))
326
390
}
327
391
if v , ok := tfMap ["resource_arn" ].(string ); ok && v != "" {
328
392
reference .ResourceArn = aws .String (v )
329
393
}
394
+
395
+ if v , ok := tfMap ["override" ].([]interface {}); ok && len (v ) > 0 {
396
+ reference .Override = expandStatefulRuleGroupOverride (v )
397
+ }
398
+
330
399
references = append (references , reference )
331
400
}
401
+
332
402
return references
333
403
}
334
404
@@ -429,6 +499,18 @@ func flattenStatefulEngineOptions(options *networkfirewall.StatefulEngineOptions
429
499
return []interface {}{m }
430
500
}
431
501
502
+ func flattenStatefulRuleGroupOverride (override * networkfirewall.StatefulRuleGroupOverride ) []interface {} {
503
+ if override == nil {
504
+ return []interface {}{}
505
+ }
506
+
507
+ m := map [string ]interface {}{
508
+ "action" : aws .StringValue (override .Action ),
509
+ }
510
+
511
+ return []interface {}{m }
512
+ }
513
+
432
514
func flattenPolicyStatefulRuleGroupReference (l []* networkfirewall.StatefulRuleGroupReference ) []interface {} {
433
515
references := make ([]interface {}, 0 , len (l ))
434
516
for _ , ref := range l {
@@ -438,6 +520,10 @@ func flattenPolicyStatefulRuleGroupReference(l []*networkfirewall.StatefulRuleGr
438
520
if ref .Priority != nil {
439
521
reference ["priority" ] = int (aws .Int64Value (ref .Priority ))
440
522
}
523
+ if ref .Override != nil {
524
+ reference ["override" ] = flattenStatefulRuleGroupOverride (ref .Override )
525
+ }
526
+
441
527
references = append (references , reference )
442
528
}
443
529
0 commit comments