package Ġws . os iris . integration Ċ Ċ import Ġcom . amazonaws . services . cloudformation . Amazon Cloud Formation Ċ import Ġcom . amazonaws . services . cloudformation . model . Delete Stack Request Ċ import Ġcom . amazonaws . services . cloudformation . model . Describe Stack sRequest Ċ import Ġcom . amazonaws . services . s 3 . Amazon S 3 Ċ import Ġcom . amazonaws . wait ers . Wait er Parameters Ċ import Ġcom . google . gson . Gson Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġws . os iris . aws deploy . Aws Profile Ċ import Ġws . os iris . aws deploy . cloudformation . getAll Rest Apis Ċ import Ġws . os iris . aws deploy . cloudformation . list All Stack s Ċ import Ġws . os iris . aws deploy . code Bucket Name Ċ import Ġws . os iris . aws deploy . static Files Bucket Name Ċ import Ġws . os iris . core . HttpHeaders Ċ import Ġws . os iris . core . Mime Types Ċ import Ġws . os iris . core . Test Client Ċ import Ġws . os iris . server . Http Test Client Ċ import Ġws . os iris . server . Protocol Ċ import Ġjava . io . IOException Ċ import Ġjava . nio . file . File Visit Result Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . nio . file . Simple File Visitor Ċ import Ġjava . nio . file . Standard Copy Option Ċ import Ġjava . nio . file . attribute . Basic File Attributes Ċ import Ġkotlin . test . assertEquals Ċ Ċ private Ġval Ġlog Ġ= ĠLoggerFactory . getLogger (" ws . os iris . integration ") Ċ Ċ private Ġconst Ġval ĠTEST _ APP _ NAME Ġ= Ġ" os iris - e 2 e - test " Ċ private Ġconst Ġval ĠTEST _ GROUP _ ID Ġ= Ġ" com . example . os iris " Ċ private Ġconst Ġval ĠTEST _ REGION Ġ= Ġ" eu - west - 1 " Ċ Ċ fun Ġmain ( args : ĠArray < String >) Ġ{ ĊĠĠĠ Ġif Ġ( args . isEmpty ()) Ġthrow ĠIllegalArgumentException (" Must Ġprovide Ġthe ĠOs iris Ġversion Ġas Ġthe Ġonly Ġargument ") ĊĠĠĠ ĠEnd ToEnd Test . run ( args [ 0 ]) Ċ } Ċ Ċ class ĠEnd ToEnd Test Ġprivate Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġregion : ĠString , ĊĠĠĠ Ġprivate Ġval ĠgroupId : ĠString , ĊĠĠĠ Ġprivate Ġval ĠappName : ĠString , ĊĠĠĠ Ġprivate Ġval Ġos iris Version : ĠString , ĊĠĠĠ Ġprivate Ġval Ġprofile : ĠAws Profile , ĊĠĠĠ Ġprivate Ġval Ġbuild Runner : ĠBuild Runner Ċ ) Ġ{ ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlog Ġ= ĠLoggerFactory . getLogger ( End ToEnd Test :: class . java ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠRuns Ġan Ġend - to - end Ġtest Ġthat ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġrun ( os iris Version : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprofile Ġ= ĠAws Profile . default () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Runner Ġ= ĠMaven Build Runner () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠEnd ToEnd Test ( TEST _ REGION , ĠTEST _ GROUP _ ID , ĠTEST _ APP _ NAME , Ġos iris Version , Ġprofile , Ġbuild Runner ). run () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ------------------------------------------------------------------------------------------------ -- ĊĊĠĠĠ Ġprivate Ġfun Ġrun () Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete Stack ( appName , Ġprofile . cloud Formation Client ) ĊĠĠĠĠĠĠĠ ĠT mp Dir Resource (). use Ġ{ Ġtmp Dir Resource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Spec Ġ= ĠBuild Spec ( os iris Version , ĠgroupId , ĠappName , Ġtmp Dir Resource . path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Dir Ġ= Ġbuild Runner . create Project ( build Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Runner . deploy ( build Spec , Ġprofile ). use Ġ{ Ġstack Resource Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġ"${ stack Resource . api Id }. execute - api .$ region . amazonaws . com " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" dev ", Ġ" prod "). forEach Ġ{ Ġstage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Testing ĠAPI Ġstage Ġ$ stage ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Client Ġ= ĠHttp Test Client ( Protocol . HTTPS , Ġserver , ĠbasePath Ġ= Ġ"/ $ stage ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Api 1 ( test Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopy Updated Files ( project Dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Runner . deploy ( build Spec , Ġprofile ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Testing ĠAPI Ġstage Ġdev ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdev Test Client Ġ= ĠHttp Test Client ( Protocol . HTTPS , Ġserver , ĠbasePath Ġ= Ġ"/ dev ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Api 2 ( dev Test Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Testing ĠAPI Ġstage Ġprod ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtest Client Ġ= ĠHttp Test Client ( Protocol . HTTPS , Ġserver , ĠbasePath Ġ= Ġ"/ prod ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Api 1 ( test Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġthe Ġbucket Ġmust Ġbe Ġempty Ġor Ġthe Ġstack Ġcan 't Ġbe Ġdeleted ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty Bucket ( static Files Bucket Name ( appName , Ġnull , Ġprofile . accountId ), Ġprofile . s 3 Client ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelete S 3 Buckets () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdelete S 3 Buckets () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcode Bucket Name Ġ= Ġcode Bucket Name ( appName , Ġnull , Ġprofile . accountId ) ĊĠĠĠĠĠĠĠ Ġval Ġstatic Files Bucket Name Ġ= Ġstatic Files Bucket Name ( appName , Ġnull , Ġprofile . accountId ) ĊĠĠĠĠĠĠĠ Ġif Ġ( profile . s 3 Client . does Bucket Exist V 2 ( code Bucket Name )) Ġdelete Bucket ( code Bucket Name , Ġprofile . s 3 Client ) ĊĠĠĠĠĠĠĠ Ġif Ġ( profile . s 3 Client . does Bucket Exist V 2 ( static Files Bucket Name )) Ġdelete Bucket ( static Files Bucket Name , Ġprofile . s 3 Client ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Api 1 ( client : ĠTest Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġgson Ġ= ĠGson () ĊĠĠĠĠĠĠĠ Ġfun ĠAny ?. parse Json (): ĠMap < *, Ġ*> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjson Ġ= Ġthis Ġas ? ĠString Ġ?: Ġthrow ĠIllegalArgumentException (" Value Ġis Ġnot Ġa Ġstring : Ġ$ this ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġgson . fromJson ( json , ĠMap :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse 1 Ġ= Ġclient . get ("/ helloworld ") ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" message " Ġto Ġ" hello , Ġworld ! "), Ġresponse 1 . body . parse Json ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mime Types . APPLICATION _ JSON , Ġresponse 1 . headers [ HttpHeaders . CONTENT _ TYPE ]) ĊĠĠĠĠĠĠĠ ĠassertEquals ( 2 0 0 , Ġresponse 1 . status ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresponse 2 Ġ= Ġclient . get ("/ hello plain ") ĊĠĠĠĠĠĠĠ ĠassertEquals (" hello , Ġworld !", Ġresponse 2 . body ) ĊĠĠĠĠĠĠĠ ĠassertEquals ( Mime Types . TEXT _ PLAIN , Ġresponse 2 . headers [ HttpHeaders . CONTENT _ TYPE ]) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" message " Ġto Ġ" hello , ĠAlice ! "), Ġclient . get ("/ hello query param ? name = Alice "). body . parse Json ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" message " Ġto Ġ" hello , ĠPeter ! "), Ġclient . get ("/ hello / P eter "). body . parse Json ()) ĊĠĠĠĠĠĠĠ ĠassertEquals ( map Of (" message " Ġto Ġ" hello , ĠBob ! "), Ġclient . get ("/ hello env "). body . parse Json ()) ĊĊĠĠĠĠĠĠĠ Ġlog . info (" API Ġtested Ġsuccessfully ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġtest Api 2 ( client : ĠTest Client ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmax T ries Ġ= Ġ 1 0 ĊĊĠĠĠĠĠĠĠ Ġfun Ġtest Api 2 ( tri es : ĠInt , Ġsleep Ms : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert Api ( client ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( tri es Ġ< Ġmax T ries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" assert Api Ġfailed , Ġwaiting Ġfor Ġ{} ms Ġand Ġretry ing ", Ġsleep Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠThread . sleep ( sleep Ms ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtest Api 2 ( tri es Ġ+ Ġ 1 , Ġsleep Ms Ġ* Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" assert Api Ġdidn 't Ġpass Ġafter Ġ{} Ġattempts ", Ġmax T ries ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtest Api 2 ( 1 , Ġ 1 0 0 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcopy Updated Files ( project Dir : ĠPath ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġe 2 e Files Dir Ġ= ĠPaths . get (" integration / src / test / e 2 e - test ") ĊĠĠĠĠĠĠĠ Ġval Ġproject Static Dir Ġ= Ġproject Dir . resolve (" core / src / main / static ") ĊĠĠĠĠĠĠĠ Ġcopy Directory Contents ( e 2 e Files Dir . resolve (" static "), Ġproject Static Dir ) ĊĠĠĠĠĠĠĠ Ġval Ġcode Dir Ġ= Ġproject Dir . resolve (" core / src / main / kotlin / com / example / os iris / core ") ĊĠĠĠĠĠĠĠ Ġcopy Directory Contents ( e 2 e Files Dir . resolve (" code "), Ġcode Dir ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAuto - clo s able Ġresource Ġrepresenting Ġa ĠCloudFormation Ġstack ; Ġallows Ġthe Ġstack Ġto Ġbe Ġautomatically Ġdeleted Ċ Ġ* Ġwhen Ġtesting Ġis Ġcomplete . Ċ Ġ*/ Ċ internal Ġclass ĠStack Resource ( ĊĠĠĠ Ġval Ġapi Id : ĠString , ĊĠĠĠ Ġprivate Ġval ĠappName : ĠString , ĊĠĠĠ Ġprivate Ġval Ġcloud Formation Client : ĠAmazon Cloud Formation Ċ ) Ġ: ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġdelete Stack ( appName , Ġcloud Formation Client ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠAuto - clo s able Ġwrapper Ġaround Ġa Ġtemporary Ġdirectory . Ċ Ġ* Ċ Ġ* ĠWhen Ġit Ġis Ġclosed Ġthe Ġdirectory Ġand Ġits Ġcontents Ġare Ġdeleted . Ċ Ġ*/ Ċ internal Ġclass ĠT mp Dir Resource Ġ: ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġpath : ĠPath Ġ= ĠFiles . create Temp Directory (" os iris - e 2 e - test ") ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ ĠFiles . walk File Tree ( path , Ġobject Ġ: ĠSimple File Visitor < Path >() Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit File ( file : ĠPath , Ġbasic File Attributes : ĠBasic File Attributes ): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġpost Visit Directory ( directory : ĠPath , Ġio Exception : ĠIOException ?): ĠFile Visit Result Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . delete ( directory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠFile Visit Result . CONTINUE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} Ċ } Ċ Ċ // Ġ------------------------------------------------------------------------------------------------ -- Ċ Ċ /** Ċ Ġ* ĠDeletes Ġan ĠS 3 Ġbucket , Ġdeleting Ġits Ġcontents Ġfirst Ġif Ġit Ġis Ġnot Ġempty . Ċ Ġ*/ Ċ fun Ġdelete Bucket ( bucketName : ĠString , Ġs 3 Client : ĠAmazon S 3 ) Ġ{ ĊĠĠĠ Ġempty Bucket ( bucketName , Ġs 3 Client ) ĊĠĠĠ Ġs 3 Client . delete Bucket ( bucketName ) ĊĠĠĠ Ġlog . info (" Deleted Ġbucket Ġ{}", Ġbucket Name ) Ċ } Ċ Ċ /** Ċ Ġ* ĠDeletes Ġa ĠCloudFormation Ġstack , Ġblocking Ġuntil Ġthe Ġdeletion Ġhas Ġcompleted . Ċ Ġ*/ Ċ fun Ġdelete Stack ( stack : ĠString , Ġcloud Formation Client : ĠAmazon Cloud Formation ) Ġ{ ĊĠĠĠ Ġval Ġstacks Ġ= Ġcloud Formation Client . list All Stack s (). filter Ġ{ Ġit . stack Name Ġ== Ġstack Ġ} ĊĠĠĠ Ġif Ġ( stacks . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" No Ġexisting Ġstack Ġfound Ġnamed Ġ{}, Ġskipping Ġdeletion ", Ġstack ) ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġstacks [ 0 ]. stack Name ĊĠĠĠĠĠĠĠ Ġlog . info (" Deleting Ġstack Ġ'{} '", Ġname ) ĊĠĠĠĠĠĠĠ Ġval Ġdelete Wait er Ġ= Ġcloud Formation Client . wait ers (). stack Delete Complete () ĊĠĠĠĠĠĠĠ Ġcloud Formation Client . delete Stack ( Delete Stack Request (). apply Ġ{ Ġstack Name Ġ= Ġname Ġ}) ĊĠĠĠĠĠĠĠ Ġdelete Wait er . run ( Wait er Parameters ( Describe Stack sRequest (). apply Ġ{ Ġstack Name Ġ= Ġname Ġ})) ĊĠĠĠĠĠĠĠ Ġlog . info (" Deleted Ġstack Ġ'{} '", Ġname ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠDeletes Ġall Ġobjects Ġfrom Ġan ĠS 3 Ġbucket . Ċ Ġ*/ Ċ private Ġtail rec Ġfun Ġempty Bucket ( bucketName : ĠString , Ġs 3 Client : ĠAmazon S 3 ) Ġ{ ĊĠĠĠ Ġif Ġ(! s 3 Client . does Bucket Exist V 2 ( bucketName )) Ġreturn ĊĠĠĠ Ġval Ġobjects Ġ= Ġs 3 Client . list Objects ( bucketName ). object Sum maries ĊĠĠĠ Ġif Ġ( objects . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġobjects . forEach Ġ{ Ġs 3 Client . delete Object ( bucketName , Ġit . key ) Ġ} ĊĠĠĠĠĠĠĠ Ġempty Bucket ( bucketName , Ġs 3 Client ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCop ies Ġthe Ġcontents Ġof Ġ[ src ] Ġto Ġ[ dest ], Ġincluding Ġall Ġsub directories Ġand Ġtheir Ġcontents Ċ Ġ*/ Ċ fun Ġcopy Directory Contents ( src : ĠPath , Ġdest : ĠPath ) Ġ{ ĊĠĠĠ Ġif Ġ(! Files . isDirectory ( src ) Ġ|| Ġ! Files . isDirectory ( dest )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" src Ġand Ġdest Ġmust Ġbe Ġdirectories ") ĊĠĠĠ Ġ} ĊĠĠĠ ĠFiles . walk ( src ). filter Ġ{ ĠFiles . is Regular File ( it ) Ġ}. forEach Ġ{ Ġcopy File ( it , Ġsrc , Ġdest ) Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCop ies Ġa Ġfile Ġand Ġits Ġcontaining Ġdirectories Ġfrom Ġ[ base Dir ] Ġto Ġ[ dest Dir ]. Ċ Ġ* Ċ Ġ* Ġ[ base Dir ] Ġand Ġ[ dest Dir ] Ġmust Ġbe Ġdirectories Ġand Ġ[ file ] Ġmust Ġbe Ġa Ġfile Ġbelow Ġ[ base Dir ]. Ċ Ġ* Ġ[ file ] Ġis Ġcopied Ġso Ġthe Ġpath Ġof Ġthe Ġcopy Ġrelative Ġto Ġ[ dest Dir ] Ġis Ġthe Ġsame Ġas Ġthe Ġpath Ġof Ċ Ġ* Ġthe Ġoriginal Ġrelative Ġto Ġ[ base Dir ]. Ċ Ġ*/ Ċ private Ġfun Ġcopy File ( file : ĠPath , Ġbase Dir : ĠPath , Ġdest Dir : ĠPath ) Ġ{ ĊĠĠĠ Ġif Ġ(! Files . isDirectory ( base Dir ) Ġ|| Ġ! Files . isDirectory ( dest Dir )) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" base Dir Ġand Ġdest Dir Ġmust Ġbe Ġdirectories ") ĊĠĠĠ Ġ} ĊĠĠĠ Ġval Ġrelative Path Ġ= Ġbase Dir . rel ativ ize ( file ) ĊĠĠĠ Ġval Ġdest File Ġ= Ġdest Dir . resolve ( relative Path ) ĊĠĠĠ ĠFiles . create Directories ( dest File . parent ) ĊĠĠĠ ĠFiles . copy ( file , Ġdest File , ĠStandard Copy Option . REPLACE _ EXIST ING ) ĊĠĠĠ Ġlog . debug ( ĊĠĠĠĠĠĠĠ Ġ" Copied Ġfile Ġ{} Ġfrom Ġdirectory Ġ{} Ġto Ġ{}", ĊĠĠĠĠĠĠĠ Ġfile . to AbsolutePath (), ĊĠĠĠĠĠĠĠ Ġbase Dir . to AbsolutePath (), ĊĠĠĠĠĠĠĠ Ġdest File . to AbsolutePath () ĊĠĠĠ Ġ) Ċ } Ċ Ċ // Ġ------------------------------------------------------------------------------------------------ -- Ċ Ċ /** Ċ Ġ* ĠWrapper Ġaround Ġa Ġbuild Ġtool Ġthat Ġcan Ġcreate Ġa Ġnew Ġproject Ġand Ġdeploy Ġa Ġproject Ġto ĠAWS . Ċ Ġ*/ Ċ internal Ġinterface ĠBuild Runner Ġ{ ĊĊĠĠĠ Ġ/** ĠCreates Ġa Ġnew ĠOs iris Ġproject . Ġ*/ ĊĠĠĠ Ġfun Ġcreate Project ( build Spec : ĠBuild Spec ): ĠPath ĊĊĠĠĠ Ġ/** ĠDep lo ys Ġa Ġproject Ġto ĠAWS . Ġ*/ ĊĠĠĠ Ġfun Ġdeploy ( build Spec : ĠBuild Spec , Ġprofile : ĠAws Profile ): ĠStack Resource Ċ } Ċ Ċ /** Ċ Ġ* ĠMetadata Ġdescribing Ġan ĠOs iris Ġproject Ġbuild . Ċ Ġ*/ Ċ internal Ġdata Ġclass ĠBuild Spec ( ĊĠĠĠ Ġval Ġos iris Version : ĠString , ĊĠĠĠ Ġval ĠgroupId : ĠString , ĊĠĠĠ Ġval ĠappName : ĠString , ĊĠĠĠ Ġval Ġparent Dir : ĠPath Ċ ) Ċ Ċ internal Ġclass ĠMaven Build Runner Ġ: ĠBuild Runner Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Project ( build Spec : ĠBuild Spec ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Creating Ġproject Ġin Ġ{} Ġusing ĠMaven Ġar che type Ġversion Ġ{}, ĠgroupId ={}, Ġartifact Id ={ }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Spec . parent Dir . normalize (). to AbsolutePath (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Spec . os iris Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Spec . groupId , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Spec . appName ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġexit Value Ġ= ĠProcess Builder ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" mvn ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" ar che type : generate ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- Dar che type GroupId = ws . os iris ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- Dar che type Artifact Id = os iris - ar che type ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- Dar che type Version =${ build Spec . os iris Version }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- D groupId =${ build Spec . groupId }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- D artifactId =${ build Spec . appName }", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"- D interactive Mode = false ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. directory ( build Spec . parent Dir . to File ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inherit IO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. waitFor () ĊĠĠĠĠĠĠĠ Ġif Ġ( exit Value Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Project Ġcreated Ġsuccessfully ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Project Ġcreation Ġfailed , ĠMaven Ġexit Ġvalue Ġ= Ġ$ exit Value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġbuild Spec . project Dir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeploy ( build Spec : ĠBuild Spec , Ġprofile : ĠAws Profile ): ĠStack Resource Ġ{ ĊĠĠĠĠĠĠĠ Ġlog . info (" Deploy ing Ġproject Ġfrom Ġdirectory Ġ${ build Spec . project Dir }") ĊĠĠĠĠĠĠĠ Ġval Ġexit Value Ġ= ĠProcess Builder (" mvn ", Ġ" deploy ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. directory ( build Spec . project Dir . to File ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. inherit IO () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. start () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. waitFor () ĊĠĠĠĠĠĠĠ Ġif Ġ( exit Value Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Project Ġdeployed Ġsuccessfully ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Project Ġdeployment Ġfailed , ĠMaven Ġexit Ġvalue Ġ= Ġ$ exit Value ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġap is Ġ= Ġprofile . api Gateway Client . getAll Rest Apis () ĊĠĠĠĠĠĠĠ Ġval Ġapi Id Ġ= Ġap is . first OrNull Ġ{ Ġit . name Ġ== Ġbuild Spec . appName Ġ} ?. id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" No ĠREST ĠAPI Ġfound Ġnamed Ġ${ build Spec . appName }") ĊĠĠĠĠĠĠĠ Ġlog . info (" ID Ġof Ġthe Ġdeployed ĠAPI : Ġ{}", Ġapi Id ) ĊĠĠĠĠĠĠĠ Ġreturn ĠStack Resource ( api Id , Ġbuild Spec . appName , Ġprofile . cloud Formation Client ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval ĠBuild Spec . project Dir : ĠPath Ġget () Ġ= Ġparent Dir . resolve ( appName ) Ċ } Ċ Ċ // ĠTODO Ġrequirements Ġfor Ġa Ġgeneral Ġpurpose Ġend - to - end Ġtesting Ġtool Ċ // ĠĠ Ġ* Ġget Ġthe Ġproject Ġto Ġtest Ċ // ĠĠĠĠ Ġ* Ġgenerate Ġfrom Ġartifact Ċ // ĠĠĠĠ Ġ* Ġgit Ġclone Ċ // ĠĠĠĠ Ġ* Ġexisting Ġdirectory ? Ċ // ĠĠ Ġ* Ġbuild Ċ // ĠĠĠĠ Ġ* Ġmaven Ċ // ĠĠĠĠ Ġ* Ġgradle Ċ // ĠĠ Ġ* Ġcreate Ġbuckets Ġif Ġnecessary Ġ( only Ġif Ġstatic Files Bucket Ġand Ġcode Bucket Ġare Ġset ) Ċ // ĠĠ Ġ* Ġdeploy Ċ // ĠĠ Ġ* Ġtest Ċ // ĠĠĠĠ Ġ* Ġtest Ġthe ĠAPI Ġendpoints Ċ // ĠĠĠĠ Ġ* Ġcopy Ġfiles Ġover Ġthe Ġtop Ċ // ĠĠĠĠ Ġ* Ġre deploy Ċ // ĠĠĠĠ Ġ* Ġ( repeat ) Ċ // ĠĠ Ġ* Ġdelete Ġstack Ċ // ĠĠ Ġ* Ġdelete Ġbuckets Ċ