// ĠCopyright Ġ 2 0 1 9 ĠAmazon . com , ĠInc . Ġor Ġits Ġaffiliates . ĠAll ĠRights ĠReserved . Ċ // ĠSPDX - License - Identifier : ĠApache - 2 . 0 Ċ Ċ package Ġsoftware . aws . tool k its . jetbrains . services . cloudformation Ċ Ċ import Ġcom . intellij . openapi . application . Application Manager Ċ import Ġsoftware . amazon . aw ssdk . services . cloudformation . Cloud Formation Client Ċ import Ġsoftware . amazon . aw ssdk . services . cloudformation . model . Cloud Formation Exception Ċ import Ġsoftware . amazon . aw ssdk . services . cloudformation . model . Describe Stack sRequest Ċ import Ġsoftware . amazon . aw ssdk . services . cloudformation . model . Stack Ċ import Ġsoftware . amazon . aw ssdk . services . cloudformation . model . Stack Status Ċ import Ġsoftware . aws . tool k its . core . utils . wait Ċ import Ġsoftware . aws . tool k its . resources . message Ċ import Ġjava . time . Duration Ċ Ċ fun ĠCloudFormation Client . execute Change Set And Wait ( stack Name : ĠString , Ġchange Set : ĠString ) Ġ{ ĊĠĠĠ Ġval Ġis Create Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdescribe Stack Ġ= Ġthis . describe Stack s Ġ{ Ġit . stack Name ( stack Name ) Ġ} ĊĠĠĠĠĠĠĠ Ġdescribe Stack . stacks (). first OrNull ()?. stack Status () Ġ== ĠStack Status . RE VIEW _ IN _ PROGRESS ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠCloudFormation Exception ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( e . message ?. contains (" Stack Ġwith Ġid Ġ$ stack Name Ġdoes Ġnot Ġexist ") Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġthis . execute Change Set Ġ{ Ġit . stack Name ( stack Name ). change SetName ( change Set ) Ġ} ĊĊĠĠĠ Ġif Ġ( is Create ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . waitFor Stack Create Complete ( stack Name ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . waitFor Stack Update Complete ( stack Name ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ fun ĠCloudFormation Client . describe Stack ( stack Name : ĠString , Ġcallback : Ġ( Stack ?) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠ ĠApplication Manager . getApplication (). execute On P ooled Thread Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstack Ġ= Ġthis . describe Stack s Ġ{ Ġit . stack Name ( stack Name ) Ġ}. stacks (). first OrNull () ĊĠĠĠĠĠĠĠ Ġcallback ( stack ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġval ĠC FN _ CREATE _ FAILURE _ TERMIN AL _ STAT ES Ġ= Ġset Of ( ĊĠĠĠ ĠStack Status . CREATE _ FAILED , ĊĠĠĠ ĠStack Status . DELETE _ COMPLETE , ĊĠĠĠ ĠStack Status . DELETE _ FAILED , ĊĠĠĠ ĠStack Status . ROLL BACK _ FAILED , ĊĠĠĠ ĠStack Status . ROLL BACK _ COMPLETE Ċ ) Ċ Ċ fun ĠCloudFormation Client . waitFor Stack Create Complete ( ĊĠĠĠ Ġstack Name : ĠString , ĊĠĠĠ Ġmax Attempts : ĠInt Ġ= Ġ 7 2 0 , ĊĠĠĠ Ġdelay : ĠDuration Ġ= ĠDuration . of Seconds ( 5 ) Ċ ) Ġ{ ĊĠĠĠ Ġwait ( ĊĠĠĠĠĠĠĠ Ġcall Ġ= Ġ{ Ġthis . describe Stack s ( Describe Stack sRequest . builder (). stack Name ( stack Name ). build ()). stacks ()[ 0 ] Ġ}, ĊĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġ{ Ġstack Ġ-> Ġstack . stack Status () Ġ== ĠStack Status . CREATE _ COMPLETE Ġ}, ĊĠĠĠĠĠĠĠ Ġfail Ġ= Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . stack Status () Ġin ĠC FN _ CREATE _ FAILURE _ TERMIN AL _ STAT ES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" cloudformation . create _ stack . failed ", Ġstack . stack Name (), Ġstack . stack Status ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġfail By Exception Ġ= Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠCloudFormation Exception Ġ&& Ġe . aws Error Details (). errorCode () Ġ== Ġ" ValidationError ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" cloudformation . create _ stack . failed _ validation ", Ġstack Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġtimeout ErrorMessage Ġ= Ġmessage (" cloudformation . create _ stack . timeout ", Ġstack Name , Ġmax Attempts Ġ* Ġdelay . seconds ), ĊĠĠĠĠĠĠĠ Ġattempts Ġ= Ġmax Attempts , ĊĠĠĠĠĠĠĠ Ġdelay Ġ= Ġdelay ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġval ĠC FN _ UPDATE _ FAILURE _ TERMIN AL _ STAT ES Ġ= Ġset Of ( ĊĠĠĠ ĠStack Status . UPDATE _ ROLL BACK _ COMPLETE , ĊĠĠĠ ĠStack Status . UPDATE _ ROLL BACK _ FAILED Ċ ) Ċ Ċ fun ĠCloudFormation Client . waitFor Stack Update Complete ( ĊĠĠĠ Ġstack Name : ĠString , ĊĠĠĠ Ġmax Attempts : ĠInt Ġ= Ġ 7 2 0 , ĊĠĠĠ Ġdelay : ĠDuration Ġ= ĠDuration . of Seconds ( 5 ) Ċ ) Ġ{ ĊĠĠĠ Ġwait ( ĊĠĠĠĠĠĠĠ Ġcall Ġ= Ġ{ Ġthis . describe Stack s ( Describe Stack sRequest . builder (). stack Name ( stack Name ). build ()). stacks ()[ 0 ] Ġ}, ĊĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġ{ Ġstack Ġ-> Ġstack . stack Status () Ġ== ĠStack Status . UPDATE _ COMPLETE Ġ}, ĊĠĠĠĠĠĠĠ Ġfail Ġ= Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . stack Status () Ġin ĠC FN _ UPDATE _ FAILURE _ TERMIN AL _ STAT ES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" cloudformation . update _ stack . failed ", Ġstack . stack Name (), Ġstack . stack Status ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġfail By Exception Ġ= Ġ{ Ġe Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( e Ġis ĠCloudFormation Exception Ġ&& Ġe . aws Error Details (). errorCode () Ġ== Ġ" ValidationError ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" cloudformation . update _ stack . failed _ validation ", Ġstack Name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġtimeout ErrorMessage Ġ= Ġmessage (" cloudformation . update _ stack . timeout ", Ġstack Name , Ġmax Attempts Ġ* Ġdelay . seconds ), ĊĠĠĠĠĠĠĠ Ġattempts Ġ= Ġmax Attempts , ĊĠĠĠĠĠĠĠ Ġdelay Ġ= Ġdelay ĊĠĠĠ Ġ) Ċ } Ċ Ċ private Ġval ĠC FN _ DELETE _ FAILURE _ TERMIN AL _ STAT ES Ġ= Ġset Of ( ĊĠĠĠ ĠStack Status . CREATE _ FAILED , ĊĠĠĠ ĠStack Status . DELETE _ FAILED , ĊĠĠĠ ĠStack Status . ROLL BACK _ FAILED , ĊĠĠĠ ĠStack Status . UPDATE _ ROLL BACK _ IN _ PROGRESS , ĊĠĠĠ ĠStack Status . UPDATE _ ROLL BACK _ FAILED Ċ ) Ċ Ċ fun ĠCloudFormation Client . waitFor Stack Deletion Complete ( ĊĠĠĠ Ġstack Name : ĠString , ĊĠĠĠ Ġmax Attempts : ĠInt Ġ= Ġ 1 2 0 , ĊĠĠĠ Ġdelay : ĠDuration Ġ= ĠDuration . of Seconds ( 2 0 ) Ċ ) Ġ{ ĊĠĠĠ Ġwait ( ĊĠĠĠĠĠĠĠ Ġcall Ġ= Ġ{ Ġthis . describe Stack s ( Describe Stack sRequest . builder (). stack Name ( stack Name ). build ()). stacks ()[ 0 ] Ġ}, ĊĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġ{ Ġstack Ġ-> Ġstack . stack Status () Ġ== ĠStack Status . DELETE _ COMPLETE Ġ}, ĊĠĠĠĠĠĠĠ Ġfail Ġ= Ġ{ Ġstack Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( stack . stack Status () Ġin ĠC FN _ DELETE _ FAILURE _ TERMIN AL _ STAT ES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmessage (" cloudformation . delete _ stack . failed ", Ġstack . stack Name (), Ġstack . stack Status ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠ Ġsuccess By Exception Ġ= Ġ{ Ġe Ġ-> Ġe Ġis ĠCloudFormation Exception Ġ&& Ġe . aws Error Details (). errorCode () Ġ== Ġ" ValidationError " Ġ}, ĊĠĠĠĠĠĠĠ Ġtimeout ErrorMessage Ġ= Ġmessage (" cloudformation . delete _ stack . timeout ", Ġstack Name , Ġmax Attempts Ġ* Ġdelay . seconds ), ĊĠĠĠĠĠĠĠ Ġattempts Ġ= Ġmax Attempts , ĊĠĠĠĠĠĠĠ Ġdelay Ġ= Ġdelay ĊĠĠĠ Ġ) Ċ } Ċ