@@ -238,7 +238,7 @@ describe('log retention provider', () => {
238
238
239
239
} ) ;
240
240
241
- test ( 'does not if when operations on provider log group fails ' , async ( ) => {
241
+ test ( 'succeeds when createLogGroup for provider log group returns OperationAbortedException twice ' , async ( ) => {
242
242
let attempt = 2 ;
243
243
const createLogGroupFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
244
244
if ( params . logGroupName === '/aws/lambda/provider' ) {
@@ -280,7 +280,7 @@ describe('log retention provider', () => {
280
280
281
281
} ) ;
282
282
283
- test ( 'does not fail if operations on CDK lambda log group fails twice' , async ( ) => {
283
+ test ( 'succeeds when createLogGroup for CDK lambda log group returns OperationAbortedException twice' , async ( ) => {
284
284
let attempt = 2 ;
285
285
const createLogGroupFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
286
286
if ( params . logGroupName === 'group' ) {
@@ -322,7 +322,7 @@ describe('log retention provider', () => {
322
322
323
323
} ) ;
324
324
325
- test ( 'does fail if operations on CDK lambda log group fails indefinitely' , async ( ) => {
325
+ test ( 'fails when createLogGroup for CDK lambda log group fails with OperationAbortedException indefinitely' , async ( ) => {
326
326
const createLogGroupFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
327
327
if ( params . logGroupName === 'group' ) {
328
328
return Promise . reject ( new MyError (
@@ -356,6 +356,204 @@ describe('log retention provider', () => {
356
356
expect ( request . isDone ( ) ) . toEqual ( true ) ;
357
357
358
358
359
+ } ) ;
360
+
361
+ test ( 'succeeds when putRetentionPolicy for provider log group returns OperationAbortedException twice' , async ( ) => {
362
+ let attempt = 2 ;
363
+ const putRetentionPolicyFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
364
+ if ( params . logGroupName === '/aws/lambda/provider' ) {
365
+ if ( attempt > 0 ) {
366
+ attempt -- ;
367
+ return Promise . reject ( new MyError (
368
+ 'A conflicting operation is currently in progress against this resource. Please try again.' ,
369
+ 'OperationAbortedException' ) ) ;
370
+ } else {
371
+ return Promise . resolve ( { } ) ;
372
+ }
373
+ }
374
+ return Promise . resolve ( { } ) ;
375
+ } ;
376
+
377
+ const createLogGroupFake = sinon . fake . resolves ( { } ) ;
378
+ const deleteRetentionPolicyFake = sinon . fake . resolves ( { } ) ;
379
+
380
+ AWS . mock ( 'CloudWatchLogs' , 'createLogGroup' , createLogGroupFake ) ;
381
+ AWS . mock ( 'CloudWatchLogs' , 'putRetentionPolicy' , putRetentionPolicyFake ) ;
382
+ AWS . mock ( 'CloudWatchLogs' , 'deleteRetentionPolicy' , deleteRetentionPolicyFake ) ;
383
+
384
+ const event = {
385
+ ...eventCommon ,
386
+ RequestType : 'Create' ,
387
+ ResourceProperties : {
388
+ ServiceToken : 'token' ,
389
+ RetentionInDays : '30' ,
390
+ LogGroupName : 'group' ,
391
+ } ,
392
+ } ;
393
+
394
+ const request = createRequest ( 'SUCCESS' ) ;
395
+
396
+ await provider . handler ( event as AWSLambda . CloudFormationCustomResourceCreateEvent , context ) ;
397
+
398
+ expect ( request . isDone ( ) ) . toEqual ( true ) ;
399
+
400
+
401
+ } ) ;
402
+
403
+ test ( 'succeeds when putRetentionPolicy for CDK lambda log group returns OperationAbortedException twice' , async ( ) => {
404
+ let attempt = 2 ;
405
+ const putRetentionPolicyFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
406
+ if ( params . logGroupName === 'group' ) {
407
+ if ( attempt > 0 ) {
408
+ attempt -- ;
409
+ return Promise . reject ( new MyError (
410
+ 'A conflicting operation is currently in progress against this resource. Please try again.' ,
411
+ 'OperationAbortedException' ) ) ;
412
+ } else {
413
+ return Promise . resolve ( { } ) ;
414
+ }
415
+ }
416
+ return Promise . resolve ( { } ) ;
417
+ } ;
418
+
419
+ const createLogGroupFake = sinon . fake . resolves ( { } ) ;
420
+ const deleteRetentionPolicyFake = sinon . fake . resolves ( { } ) ;
421
+
422
+ AWS . mock ( 'CloudWatchLogs' , 'createLogGroup' , createLogGroupFake ) ;
423
+ AWS . mock ( 'CloudWatchLogs' , 'putRetentionPolicy' , putRetentionPolicyFake ) ;
424
+ AWS . mock ( 'CloudWatchLogs' , 'deleteRetentionPolicy' , deleteRetentionPolicyFake ) ;
425
+
426
+ const event = {
427
+ ...eventCommon ,
428
+ RequestType : 'Create' ,
429
+ ResourceProperties : {
430
+ ServiceToken : 'token' ,
431
+ RetentionInDays : '30' ,
432
+ LogGroupName : 'group' ,
433
+ } ,
434
+ } ;
435
+
436
+ const request = createRequest ( 'SUCCESS' ) ;
437
+
438
+ await provider . handler ( event as AWSLambda . CloudFormationCustomResourceCreateEvent , context ) ;
439
+
440
+ expect ( request . isDone ( ) ) . toEqual ( true ) ;
441
+
442
+
443
+ } ) ;
444
+
445
+ test ( 'fails when putRetentionPolicy for CDK lambda log group fails with OperationAbortedException indefinitely' , async ( ) => {
446
+ const putRetentionPolicyFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
447
+ if ( params . logGroupName === 'group' ) {
448
+ return Promise . reject ( new MyError (
449
+ 'A conflicting operation is currently in progress against this resource. Please try again.' ,
450
+ 'OperationAbortedException' ) ) ;
451
+ }
452
+ return Promise . resolve ( { } ) ;
453
+ } ;
454
+
455
+ const createLogGroupFake = sinon . fake . resolves ( { } ) ;
456
+ const deleteRetentionPolicyFake = sinon . fake . resolves ( { } ) ;
457
+
458
+ AWS . mock ( 'CloudWatchLogs' , 'createLogGroup' , createLogGroupFake ) ;
459
+ AWS . mock ( 'CloudWatchLogs' , 'putRetentionPolicy' , putRetentionPolicyFake ) ;
460
+ AWS . mock ( 'CloudWatchLogs' , 'deleteRetentionPolicy' , deleteRetentionPolicyFake ) ;
461
+
462
+ const event = {
463
+ ...eventCommon ,
464
+ RequestType : 'Create' ,
465
+ ResourceProperties : {
466
+ ServiceToken : 'token' ,
467
+ RetentionInDays : '30' ,
468
+ LogGroupName : 'group' ,
469
+ } ,
470
+ } ;
471
+
472
+ const request = createRequest ( 'FAILED' ) ;
473
+
474
+ await provider . handler ( event as AWSLambda . CloudFormationCustomResourceCreateEvent , context ) ;
475
+
476
+ expect ( request . isDone ( ) ) . toEqual ( true ) ;
477
+
478
+
479
+ } ) ;
480
+
481
+ test ( 'succeeds when deleteRetentionPolicy for provider log group returns OperationAbortedException twice' , async ( ) => {
482
+ let attempt = 2 ;
483
+ const deleteRetentionPolicyFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
484
+ if ( params . logGroupName === '/aws/lambda/provider' ) {
485
+ if ( attempt > 0 ) {
486
+ attempt -- ;
487
+ return Promise . reject ( new MyError (
488
+ 'A conflicting operation is currently in progress against this resource. Please try again.' ,
489
+ 'OperationAbortedException' ) ) ;
490
+ } else {
491
+ return Promise . resolve ( { } ) ;
492
+ }
493
+ }
494
+ return Promise . resolve ( { } ) ;
495
+ } ;
496
+
497
+ const createLogGroupFake = sinon . fake . resolves ( { } ) ;
498
+ const putRetentionPolicyFake = sinon . fake . resolves ( { } ) ;
499
+
500
+ AWS . mock ( 'CloudWatchLogs' , 'createLogGroup' , createLogGroupFake ) ;
501
+ AWS . mock ( 'CloudWatchLogs' , 'putRetentionPolicy' , putRetentionPolicyFake ) ;
502
+ AWS . mock ( 'CloudWatchLogs' , 'deleteRetentionPolicy' , deleteRetentionPolicyFake ) ;
503
+
504
+ const event = {
505
+ ...eventCommon ,
506
+ RequestType : 'Create' ,
507
+ ResourceProperties : {
508
+ ServiceToken : 'token' ,
509
+ RetentionInDays : '0' , // Setting this to 0 triggers the call to deleteRetentionPolicy
510
+ LogGroupName : 'group' ,
511
+ } ,
512
+ } ;
513
+
514
+ const request = createRequest ( 'SUCCESS' ) ;
515
+
516
+ await provider . handler ( event as AWSLambda . CloudFormationCustomResourceCreateEvent , context ) ;
517
+
518
+ expect ( request . isDone ( ) ) . toEqual ( true ) ;
519
+
520
+
521
+ } ) ;
522
+
523
+ test ( 'fails when deleteRetentionPolicy for provider log group fails with OperationAbortedException indefinitely' , async ( ) => {
524
+ const deleteRetentionPolicyFake = ( params : AWSSDK . CloudWatchLogs . CreateLogGroupRequest ) => {
525
+ if ( params . logGroupName === 'group' ) {
526
+ return Promise . reject ( new MyError (
527
+ 'A conflicting operation is currently in progress against this resource. Please try again.' ,
528
+ 'OperationAbortedException' ) ) ;
529
+ }
530
+ return Promise . resolve ( { } ) ;
531
+ } ;
532
+
533
+ const createLogGroupFake = sinon . fake . resolves ( { } ) ;
534
+ const putRetentionPolicyFake = sinon . fake . resolves ( { } ) ;
535
+
536
+ AWS . mock ( 'CloudWatchLogs' , 'createLogGroup' , createLogGroupFake ) ;
537
+ AWS . mock ( 'CloudWatchLogs' , 'putRetentionPolicy' , putRetentionPolicyFake ) ;
538
+ AWS . mock ( 'CloudWatchLogs' , 'deleteRetentionPolicy' , deleteRetentionPolicyFake ) ;
539
+
540
+ const event = {
541
+ ...eventCommon ,
542
+ RequestType : 'Create' ,
543
+ ResourceProperties : {
544
+ ServiceToken : 'token' ,
545
+ RetentionInDays : '0' , // Setting this to 0 triggers the call to deleteRetentionPolicy
546
+ LogGroupName : 'group' ,
547
+ } ,
548
+ } ;
549
+
550
+ const request = createRequest ( 'FAILED' ) ;
551
+
552
+ await provider . handler ( event as AWSLambda . CloudFormationCustomResourceCreateEvent , context ) ;
553
+
554
+ expect ( request . isDone ( ) ) . toEqual ( true ) ;
555
+
556
+
359
557
} ) ;
360
558
361
559
test ( 'response data contains the log group name' , async ( ) => {
0 commit comments