/* Ċ Ġ* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠNet flix , ĠInc . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License ") Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ* Ċ Ġ*/ Ċ package Ġcom . netflix . spin n aker . ke el . tit us . resource Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . register Kotlin Module Ċ import Ġcom . netflix . spin n aker . ke el . api . Capacity Ċ import Ġcom . netflix . spin n aker . ke el . api . Cluster Dependencies Ċ import Ġcom . netflix . spin n aker . ke el . api . High land er Ċ import Ġcom . netflix . spin n aker . ke el . api . Red Black Ċ import Ġcom . netflix . spin n aker . ke el . api . Simple Locations Ċ import Ġcom . netflix . spin n aker . ke el . api . Simple Region Spec Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . CLOUD _ PROVIDER Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . SP IN NA KER _ TIT US _ API _ V 1 Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . Container Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . T it us Cluster Handler Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . T it us Cluster Spec Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . T it us Server Group Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . T it us Server Group Spec Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . by Region Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . mon iker Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . resolve Ċ import Ġcom . netflix . spin n aker . ke el . api . tit us . cluster . resolve Capacity Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . Cloud Driver Cache Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . Cloud Driver Service Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . model . Placement Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . model . SecurityGroup Summary Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . model . Service Job Processes Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . model . T it us Active Server Group Ċ import Ġcom . netflix . spin n aker . ke el . clo udd river . model . T it us Active Server Group Image Ċ import Ġcom . netflix . spin n aker . ke el . diff . Resource Diff Ċ import Ġcom . netflix . spin n aker . ke el . model . Mon iker Ċ import Ġcom . netflix . spin n aker . ke el . model . Orche stration Request Ċ import Ġcom . netflix . spin n aker . ke el . model . parse Mon iker Ċ import Ġcom . netflix . spin n aker . ke el . or ca . O rc a Service Ċ import Ġcom . netflix . spin n aker . ke el . or ca . Task Ref Response Ċ import Ġcom . netflix . spin n aker . ke el . persistence . memory . InMemory Delivery Config Repository Ċ import Ġcom . netflix . spin n aker . ke el . plugin . Task Launcher Ċ import Ġcom . netflix . spin n aker . ke el . plugin . Resolver Ċ import Ġcom . netflix . spin n aker . ke el . test . resource Ċ import Ġdev . min ut est . junit . JUnit 5 Min ut ests Ċ import Ġdev . min ut est . root Context Ċ import Ġio . mock k . clear All Mocks Ċ import Ġio . mock k . co Every Ċ import Ġio . mock k . co Verify Ċ import Ġio . mock k . confirm Verified Ċ import Ġio . mock k . every Ċ import Ġio . mock k . mock k Ċ import Ġio . mock k . slot Ċ import Ġkotlinx . coroutines . run Blocking Ċ import Ġokhttp 3 . MediaType Ċ import Ġokhttp 3 . ResponseBody Ċ import Ġorg . apache . commons . lang 3 . Random StringUtils Ċ import Ġorg . springframework . context . Application Event Publisher Ċ import Ġretrofit 2 . HttpException Ċ import Ġretrofit 2 . Response Ċ import Ġstri kt . api . Assertion Ċ import Ġstri kt . api . expect That Ċ import Ġstri kt . assertions . contains Exactly In Any Order Ċ import Ġstri kt . assertions . containsKey Ċ import Ġstri kt . assertions . get Ċ import Ġstri kt . assertions . has Size Ċ import Ġstri kt . assertions . is A Ċ import Ġstri kt . assertions . isEqualTo Ċ import Ġstri kt . assertions . isNotEmpty Ċ import Ġstri kt . assertions . map Ċ import Ġjava . time . Clock Ċ import Ġjava . time . Duration Ċ import Ġjava . util . UUID Ċ Ċ // Ġtodo Ġe b : Ġwe Ġcould Ġprobably Ġhave Ġgeneric Ġcluster Ġtests Ċ // Ġwhere Ġyou Ġprovide Ġthe Ġcorrect Ġinfo Ġfor Ġthe Ġspec Ġand Ġactive Ġserver Ġgroups Ċ class ĠT it us Cluster Handler Tests Ġ: ĠJ Unit 5 Min ut ests Ġ{ ĊĠ Ġval Ġcloud Driver Service Ġ= Ġmock k < Cloud Driver Service >() ĊĠ Ġval Ġcloud Driver Cache Ġ= Ġmock k < Cloud Driver Cache >() ĊĠ Ġval Ġor ca Service Ġ= Ġmock k < O rc a Service >() ĊĠ Ġval ĠobjectMapper Ġ= ĠObjectMapper (). register Kotlin Module () ĊĠ Ġval Ġresolver s Ġ= Ġempty List < Resolver < T it us Cluster Spec >>() ĊĠ Ġval Ġtask Launcher Ġ= ĠTask Launcher ( or ca Service , ĠIn Memory Delivery Config Repository ()) ĊĠ Ġval Ġpublisher : ĠApplication Event Publisher Ġ= Ġmock k ( relax Unit Fun Ġ= Ġtrue ) ĊĠ Ġval Ġclock Ġ= ĠClock . system Default Zone () ĊĊĠ Ġval Ġsg 1 West Ġ= ĠSecurity Group Summary (" ke el ", Ġ" sg - 3 2 5 2 3 4 5 3 2 ", Ġ" vpc - 1 ") ĊĠ Ġval Ġsg 2 West Ġ= ĠSecurity Group Summary (" ke el - el b ", Ġ" sg - 2 3 5 4 2 5 2 3 4 ", Ġ" vpc - 1 ") ĊĠ Ġval Ġsg 1 East Ġ= ĠSecurity Group Summary (" ke el ", Ġ" sg - 2 7 9 5 8 5 9 3 6 ", Ġ" vpc - 1 ") ĊĠ Ġval Ġsg 2 East Ġ= ĠSecurity Group Summary (" ke el - el b ", Ġ" sg - 6 1 0 2 6 4 1 2 2 ", Ġ" vpc - 1 ") ĊĊĠ Ġval Ġt it us Account Ġ= Ġ" tit ust est " ĊĠ Ġval Ġaws Account Ġ= Ġ" test " ĊĊĠ Ġval Ġspec Ġ= ĠT it us Cluster Spec ( ĊĠĠĠ Ġmon iker Ġ= ĠMon iker ( app Ġ= Ġ" ke el ", Ġstack Ġ= Ġ" test "), ĊĠĠĠ Ġlocations Ġ= ĠSimple Locations ( ĊĠĠĠĠĠ Ġaccount Ġ= Ġt it us Account , ĊĠĠĠĠĠ Ġregions Ġ= Ġset Of ( Simple Region Spec (" us - east - 1 "), ĠSimple Region Spec (" us - west - 2 ")) ĊĠĠĠ Ġ), ĊĠĠĠ Ġcontainer Ġ= ĠContainer ( ĊĠĠĠĠĠ Ġorganization Ġ= Ġ" spin n aker ", ĊĠĠĠĠĠ Ġimage Ġ= Ġ" ke el ", ĊĠĠĠĠĠ Ġdigest Ġ= Ġ" sha : 1 1 1 1 " ĊĠĠĠ Ġ), ĊĠĠĠ Ġ_ defaults Ġ= ĠT it us Server Group Spec ( ĊĠĠĠĠĠ Ġcapacity Ġ= ĠCap acity ( 1 , Ġ 6 , Ġ 4 ), ĊĠĠĠĠĠ Ġdependencies Ġ= ĠCluster Dependencies ( ĊĠĠĠĠĠĠĠ Ġload Balancer Names Ġ= Ġset Of (" ke el - test - frontend "), ĊĠĠĠĠĠĠĠ Ġsecurity Group Names Ġ= Ġset Of ( sg 1 West . name ) ĊĠĠĠĠĠ Ġ), ĊĠĠĠĠĠ Ġcontainer Ġ= ĠContainer ( ĊĠĠĠĠĠĠĠ Ġorganization Ġ= Ġ" spin n aker ", ĊĠĠĠĠĠĠĠ Ġimage Ġ= Ġ" ke el ", ĊĠĠĠĠĠĠĠ Ġdigest Ġ= Ġ" sha : 1 1 1 1 " ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠ Ġ) ĊĊĠ Ġval Ġserver Groups Ġ= Ġspec . resolve () ĊĠ Ġval Ġserver Group East Ġ= Ġserver Groups . first Ġ{ Ġit . location . region Ġ== Ġ" us - east - 1 " Ġ} ĊĠ Ġval Ġserver Group West Ġ= Ġserver Groups . first Ġ{ Ġit . location . region Ġ== Ġ" us - west - 2 " Ġ} ĊĊĠ Ġval Ġactive Server Group Response East Ġ= Ġserver Group East . to Clo udd river Response ( listOf ( sg 1 East , Ġsg 2 East )) ĊĠ Ġval Ġactive Server Group Response West Ġ= Ġserver Group West . to Clo udd river Response ( listOf ( sg 1 West , Ġsg 2 West )) ĊĊĠ Ġval Ġresource Ġ= Ġresource ( ĊĠĠĠ ĠapiVersion Ġ= ĠSP IN NA KER _ TIT US _ API _ V 1 , ĊĠĠĠ Ġkind Ġ= Ġ" cluster ", ĊĠĠĠ Ġspec Ġ= Ġspec ĊĠ Ġ) ĊĊĠ Ġprivate Ġfun ĠT it us Server Group . to Clo udd river Response ( ĊĠĠĠ Ġsecurity Groups : ĠList < SecurityGroup Summary > ĊĠ Ġ): ĠT it us Active Server Group Ġ= ĊĠĠĠ ĠRandom StringUtils . random Numeric ( 3 ). pad Start ( 3 , Ġ' 0 '). let Ġ{ Ġsequence Ġ-> ĊĠĠĠĠĠ ĠT it us Active Server Group ( ĊĠĠĠĠĠĠĠ Ġname Ġ= Ġ"$ name - v $ sequence ", ĊĠĠĠĠĠĠĠ Ġaws Account Ġ= Ġaws Account , ĊĠĠĠĠĠĠĠ Ġplacement Ġ= ĠPl acement ( location . account , Ġlocation . region , Ġempty List ()), ĊĠĠĠĠĠĠĠ Ġregion Ġ= Ġlocation . region , ĊĠĠĠĠĠĠĠ Ġimage Ġ= ĠT it us Active Server Group Image ("${ container . organization }/${ container . image }", Ġ"", Ġcontainer . digest ), ĊĠĠĠĠĠĠĠ Ġiam Profile Ġ= Ġmon iker . app Ġ+ Ġ" Instance Profile ", ĊĠĠĠĠĠĠĠ Ġentry Point Ġ= Ġentry Point , ĊĠĠĠĠĠĠĠ Ġtarget Groups Ġ= Ġdependencies . target Groups , ĊĠĠĠĠĠĠĠ Ġload Bal ancers Ġ= Ġdependencies . load Balancer Names , ĊĠĠĠĠĠĠĠ Ġsecurity Groups Ġ= Ġsecurity Groups . map ( SecurityGroup Summary :: id ). toSet (), ĊĠĠĠĠĠĠĠ Ġcapacity Ġ= Ġcapacity , ĊĠĠĠĠĠĠĠ Ġcloud Provider Ġ= ĠCLO UD _ PROVIDER , ĊĠĠĠĠĠĠĠ Ġmon iker Ġ= Ġparse Mon iker ("$ name - v $ sequence "), ĊĠĠĠĠĠĠĠ Ġenv Ġ= Ġenv , ĊĠĠĠĠĠĠĠ Ġconstraints Ġ= Ġconstraints , ĊĠĠĠĠĠĠĠ Ġmigration Policy Ġ= Ġmigration Policy , ĊĠĠĠĠĠĠĠ Ġservice Job Processes Ġ= ĠService Job Processes (), ĊĠĠĠĠĠĠĠ Ġtags Ġ= Ġempty Map (), ĊĠĠĠĠĠĠĠ Ġresources Ġ= Ġresources , ĊĠĠĠĠĠĠĠ Ġcapacity Group Ġ= Ġmon iker . app ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġtests () Ġ= Ġroot Context < T it us Cluster Handler > Ġ{ ĊĠĠĠ Ġfixture Ġ{ ĊĠĠĠĠĠ ĠT it us Cluster Handler ( ĊĠĠĠĠĠĠĠ Ġcloud Driver Service , ĊĠĠĠĠĠĠĠ Ġcloud Driver Cache , ĊĠĠĠĠĠĠĠ Ġor ca Service , ĊĠĠĠĠĠĠĠ Ġclock , ĊĠĠĠĠĠĠĠ Ġtask Launcher , ĊĠĠĠĠĠĠĠ Ġpublisher , ĊĠĠĠĠĠĠĠ ĠobjectMapper , ĊĠĠĠĠĠĠĠ Ġresolver s ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġbefore Ġ{ ĊĠĠĠĠĠ Ġwith ( cloud Driver Cache ) Ġ{ ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ById ( aws Account , Ġ" us - west - 2 ", Ġsg 1 West . id ) Ġ} Ġreturns Ġsg 1 West ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ById ( aws Account , Ġ" us - west - 2 ", Ġsg 2 West . id ) Ġ} Ġreturns Ġsg 2 West ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ByName ( aws Account , Ġ" us - west - 2 ", Ġsg 1 West . name ) Ġ} Ġreturns Ġsg 1 West ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ByName ( aws Account , Ġ" us - west - 2 ", Ġsg 2 West . name ) Ġ} Ġreturns Ġsg 2 West ĊĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ById ( aws Account , Ġ" us - east - 1 ", Ġsg 1 East . id ) Ġ} Ġreturns Ġsg 1 East ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ById ( aws Account , Ġ" us - east - 1 ", Ġsg 2 East . id ) Ġ} Ġreturns Ġsg 2 East ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ByName ( aws Account , Ġ" us - east - 1 ", Ġsg 1 East . name ) Ġ} Ġreturns Ġsg 1 East ĊĠĠĠĠĠĠĠ Ġevery Ġ{ Ġsecurity Group ByName ( aws Account , Ġ" us - east - 1 ", Ġsg 2 East . name ) Ġ} Ġreturns Ġsg 2 East ĊĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcloud Driver Service . get Account Information ( tit us Account ) Ġ} Ġreturns Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠ Ġ" aws Account " Ġto Ġaws Account , ĊĠĠĠĠĠĠĠĠĠ Ġ" registry " Ġto Ġaws Account Ġ+ Ġ" registry " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġco Every Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġany ()) Ġ} Ġreturns ĠTask Ref Response ("/ tasks /${ UUID . randomUUID () }") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġafter Ġ{ ĊĠĠĠĠĠ Ġconfirm Verified ( or ca Service ) ĊĠĠĠĠĠ Ġclear All Mocks () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcontext (" the Ġcluster Ġdoes Ġnot Ġexist Ġor Ġhas Ġno Ġactive Ġserver Ġgroups ") Ġ{ ĊĠĠĠĠĠ Ġbefore Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcloud Driver Service . tit us Active Server Group (" us - east - 1 ") Ġ} Ġreturns Ġactive Server Group Response East ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcloud Driver Service . tit us Active Server Group (" us - west - 2 ") Ġ} Ġthrows ĠRET RO FIT _ NOT _ FOUND ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtest (" the Ġcurrent Ġmodel Ġis Ġnull ") Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġcurrent ( resource ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġexpect That ( current ) ĊĠĠĠĠĠĠĠĠĠ Ġ. has Size ( 1 ) ĊĠĠĠĠĠĠĠĠĠ Ġ. not () ĊĠĠĠĠĠĠĠĠĠ Ġ. containsKey (" us - west - 2 ") ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġtest (" an ne aling Ġa Ġdiff Ġcreates Ġa Ġnew Ġserver Ġgroup ") Ġ{ ĊĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġupsert ( resource , ĠResource Diff ( server Groups . by Region (), Ġempty Map ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot < Orche stration Request >() ĊĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġcapture ( slot )) Ġ} ĊĊĠĠĠĠĠĠĠ Ġexpect That ( slot . captured . job . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġget (" type "). isEqualTo (" create Server Group ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcontext (" the Ġcluster Ġhas Ġactive Ġserver Ġgroups ") Ġ{ ĊĠĠĠĠĠ Ġbefore Ġ{ ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcloud Driver Service . tit us Active Server Group (" us - east - 1 ") Ġ} Ġreturns Ġactive Server Group Response East ĊĠĠĠĠĠĠĠ Ġco Every Ġ{ Ġcloud Driver Service . tit us Active Server Group (" us - west - 2 ") Ġ} Ġreturns Ġactive Server Group Response West ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġ// ĠTODO : Ġtest Ġfor Ġmultiple Ġserver Ġgroup Ġresponse ĊĠĠĠĠĠ Ġderived Context < Map < String , ĠT it us Server Group >> (" fetch ing Ġthe Ġcurrent Ġserver Ġgroup Ġstate ") Ġ{ ĊĠĠĠĠĠĠĠ Ġderive Fixture Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcurrent ( resource ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" the Ġcurrent Ġmodel Ġis Ġconverted Ġto Ġa Ġset Ġof Ġserver Ġgroup ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( this ). isNotEmpty () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" the Ġserver Ġgroup Ġname Ġis Ġderived Ġcorrectly ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( values ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly In Any Order ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Server Group Response East . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Server Group Response West . name ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcontext (" a Ġdiff Ġhas Ġbeen Ġdetected ") Ġ{ ĊĠĠĠĠĠ Ġcontext (" the Ġdiff Ġis Ġonly Ġin Ġcapacity ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmodified Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠ Ġserver Group East . copy ( name Ġ= Ġactive Server Group Response East . name ), ĊĠĠĠĠĠĠĠĠĠ Ġserver Group West . copy ( name Ġ= Ġactive Server Group Response West . name ). with Double Capacity () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= ĠResource Diff ( ĊĠĠĠĠĠĠĠĠĠ Ġserver Groups . by Region (), ĊĠĠĠĠĠĠĠĠĠ Ġmodified . by Region () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtest (" an ne aling Ġres izes Ġthe Ġcurrent Ġserver Ġgroup ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( resource , Ġdiff ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġcapture ( slot )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( slot . captured . job . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" type "). isEqualTo (" resize Server Group ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" capacity "). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . resolve Capacity (" us - west - 2 "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" min " Ġto Ġit . min , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max " Ġto Ġit . max , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" desired " Ġto Ġit . desired ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" server GroupName "). isEqualTo ( active Server Group Response West . name ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġcontext (" the Ġdiff Ġis Ġsomething Ġother Ġthan Ġjust Ġcapacity ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmodified Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠ Ġserver Group East . copy ( name Ġ= Ġactive Server Group Response East . name ), ĊĠĠĠĠĠĠĠĠĠ Ġserver Group West . copy ( name Ġ= Ġactive Server Group Response West . name ). with Double Capacity (). with Different Runtime Options () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= ĠResource Diff ( ĊĠĠĠĠĠĠĠĠĠ Ġserver Groups . by Region (), ĊĠĠĠĠĠĠĠĠĠ Ġmodified . by Region () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġtest (" an ne aling Ġcl ones Ġthe Ġcurrent Ġserver Ġgroup ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( resource , Ġdiff ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġcapture ( slot )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( slot . captured . job . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" type "). isEqualTo (" upsert Server Group ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" source "). isEqualTo ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" account " Ġto Ġactive Server Group Response West . placement . account , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" region " Ġto Ġactive Server Group Response West . region , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" as g Name " Ġto Ġactive Server Group Response West . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" the Ġdefault Ġdeploy Ġstrategy Ġis Ġused ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġdeploy With Ġ= ĠRed Black () ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( resource , Ġdiff ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġcapture ( slot )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( slot . captured . job . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" strategy "). isEqualTo (" red black ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" delay Before Disable Sec "). isEqualTo ( deploy With . delay Before Disable . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" delay Before Scale Down Sec "). isEqualTo ( deploy With . delay Before Scale Down . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" rollback "). is A < Map < String , ĠAny ? >> (). get (" on Failure "). isEqualTo ( deploy With . rollback On Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" scale Down "). isEqualTo ( deploy With . resize Previous To Zero ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" max Remaining As gs "). isEqualTo ( deploy With . max Server Groups ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" the Ġdeploy Ġstrategy Ġis Ġconfigured ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġdeploy With Ġ= ĠRed Black ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresize Previous To Zero Ġ= Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Before Disable Ġ= ĠDuration . of Minutes ( 1 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay Before Scale Down Ġ= ĠDuration . of Minutes ( 5 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Server Groups Ġ= Ġ 3 ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( resource . copy ( spec Ġ= Ġresource . spec . copy ( deploy With Ġ= Ġdeploy With )), Ġdiff ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġcapture ( slot )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( slot . captured . job . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" strategy "). isEqualTo (" red black ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" delay Before Disable Sec "). isEqualTo ( deploy With . delay Before Disable . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" delay Before Scale Down Sec "). isEqualTo ( deploy With . delay Before Scale Down . seconds ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" rollback "). is A < Map < String , ĠAny ? >> (). get (" on Failure "). isEqualTo ( deploy With . rollback On Failure ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" scale Down "). isEqualTo ( deploy With . resize Previous To Zero ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" max Remaining As gs "). isEqualTo ( deploy With . max Server Groups ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" a Ġdifferent Ġdeploy Ġstrategy Ġis Ġused ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( resource . copy ( spec Ġ= Ġresource . spec . copy ( deploy With Ġ= ĠHigh land er )), Ġdiff ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġslot Ġ= Ġslot < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate (" ke el @ spin n aker ", Ġcapture ( slot )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( slot . captured . job . first ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget (" strategy "). isEqualTo (" high land er ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot (). containsKey (" delay Before Disable Sec ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot (). containsKey (" delay Before Scale Down Sec ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot (). containsKey (" rollback ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot (). containsKey (" scale Down ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnot (). containsKey (" max Remaining As gs ") ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġcontext (" multiple Ġserver Ġgroups Ġhave Ġa Ġdiff ") Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġmodified Ġ= Ġset Of ( ĊĠĠĠĠĠĠĠĠĠ Ġserver Group East . copy ( name Ġ= Ġactive Server Group Response East . name ). with Different Runtime Options (), ĊĠĠĠĠĠĠĠĠĠ Ġserver Group West . copy ( name Ġ= Ġactive Server Group Response West . name ). with Double Capacity () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġval Ġdiff Ġ= ĠResource Diff ( ĊĠĠĠĠĠĠĠĠĠ Ġserver Groups . by Region (), ĊĠĠĠĠĠĠĠĠĠ Ġmodified . by Region () ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġbefore Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġrun Blocking Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġupsert ( resource , Ġdiff ) ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" an ne aling Ġla unches Ġone Ġtask Ġper Ġserver Ġgroup ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtasks Ġ= Ġmutable ListOf < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate ( any (), Ġcapture ( tasks )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Size ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . job . first ()[" type "] Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Exactly In Any Order (" upsert Server Group ", Ġ" resize Server Group ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtest (" each Ġtask Ġhas Ġa Ġdistinct Ġcorrelation Ġid ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġtasks Ġ= Ġmutable ListOf < Orche stration Request >() ĊĠĠĠĠĠĠĠĠĠ Ġco Verify Ġ{ Ġor ca Service . orche strate ( any (), Ġcapture ( tasks )) Ġ} ĊĊĠĠĠĠĠĠĠĠĠ Ġexpect That ( tasks ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. has Size ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . trigger . correlation Id Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. contains Distinct Elements () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġsuspend Ġfun ĠCloud Driver Service . tit us Active Server Group ( region : ĠString ) Ġ= Ġt it us Active Server Group ( ĊĠĠĠ Ġservice Account Ġ= Ġ" ke el @ spin n aker ", ĊĠĠĠ Ġapp Ġ= Ġspec . mon iker . app , ĊĠĠĠ Ġaccount Ġ= Ġspec . locations . account , ĊĠĠĠ Ġcluster Ġ= Ġspec . mon iker . name , ĊĠĠĠ Ġregion Ġ= Ġregion , ĊĠĠĠ Ġcloud Provider Ġ= ĠCLO UD _ PROVIDER ĊĠ Ġ) Ċ } Ċ Ċ private Ġfun ĠT it us Server Group . with Double Capacity (): ĠT it us Server Group Ġ= ĊĠ Ġcopy ( ĊĠĠĠ Ġcapacity Ġ= ĠCap acity ( ĊĠĠĠĠĠ Ġmin Ġ= Ġcapacity . min Ġ* Ġ 2 , ĊĠĠĠĠĠ Ġmax Ġ= Ġcapacity . max Ġ* Ġ 2 , ĊĠĠĠĠĠ Ġdesired Ġ= Ġcapacity . desired Ġ* Ġ 2 ĊĠĠĠ Ġ) ĊĠ Ġ) Ċ Ċ private Ġfun ĠT it us Server Group . with Different Runtime Options (): ĠT it us Server Group Ġ= ĊĠ Ġcopy ( capacity Group Ġ= Ġ" a Different Group ") Ċ Ċ private Ġfun Ġ< E , ĠT Ġ: ĠIterable < E >> ĠAssertion . Builder < T >. contains Distinct Elements () Ġ= ĊĠ Ġassert (" contains Ġdistinct Ġelements ") Ġ{ Ġsubject Ġ-> ĊĠĠĠ Ġval Ġduplicates Ġ= Ġsubject ĊĠĠĠĠĠ Ġ. associate With Ġ{ Ġelem Ġ-> Ġsubject . count Ġ{ Ġit Ġ== Ġelem Ġ} Ġ} ĊĠĠĠĠĠ Ġ. filter Values Ġ{ Ġit Ġ> Ġ 1 Ġ} ĊĠĠĠĠĠ Ġ. keys ĊĠĠĠ Ġwhen Ġ( duplicates . size ) Ġ{ ĊĠĠĠĠĠĠ 0 Ġ-> Ġpass () ĊĠĠĠĠĠĠ 1 Ġ-> Ġfail ( duplicates . first (), Ġ" The Ġelement Ġ% s Ġoccurs Ġmore Ġthan Ġonce ") ĊĠĠĠĠĠ Ġelse Ġ-> Ġfail ( duplicates , Ġ" The Ġelements Ġ% s Ġoccur Ġmore Ġthan Ġonce ") ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ Ċ val ĠRET RO FIT _ NOT _ FOUND Ġ= ĠHttp Exception ( ĊĠ ĠResponse . error < Any >( 4 0 4 , ĠResponse Body . create ( MediaType . parse (" application / json "), Ġ"")) Ċ ) Ċ