/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 0 ĠAt Large ĠResearch Ċ Ġ* Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ċ Ġ* Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ċ Ġ* Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ċ Ġ* Ġto Ġuse , Ġcopy , Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ċ Ġ* Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe ĠSoftware Ġis Ċ Ġ* Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ċ Ġ* Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR Ċ Ġ* ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , Ċ Ġ* ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN ĠNO ĠEVENT ĠSHALL ĠTHE Ċ Ġ* ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER Ċ Ġ* ĠLIABILITY , ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , Ċ Ġ* ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE Ċ Ġ* ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġorg . opend c . compute . simulator Ċ Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlinx . coroutines . flow . Flow Ċ import Ġkotlinx . coroutines . flow . launch In Ċ import Ġkotlinx . coroutines . flow . on Each Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . opend c . compute . core . Flavor Ċ import Ġorg . opend c . compute . core . Server Ċ import Ġorg . opend c . compute . core . Server Event Ċ import Ġorg . opend c . compute . core . Server State Ċ import Ġorg . opend c . compute . core . image . Image Ċ import Ġorg . opend c . compute . core . metal . service . Provisioning Service Ċ import Ġorg . opend c . compute . core . virt . Hyper visor Event Ċ import Ġorg . opend c . compute . core . virt . driver . Ins ufficient Memory On Server Exception Ċ import Ġorg . opend c . compute . core . virt . driver . Virt Driver Ċ import Ġorg . opend c . compute . core . virt . service . Virt Provisioning Event Ċ import Ġorg . opend c . compute . core . virt . service . Virt Provisioning Service Ċ import Ġorg . opend c . compute . simulator . allocation . Allocation Policy Ċ import Ġorg . opend c . utils . flow . Event Flow Ċ import Ġjava . time . Clock Ċ import Ġjava . util .* Ċ import Ġkotlin . coroutines . Continuation Ċ import Ġkotlin . coroutines . resume Ċ import Ġkotlin . math . max Ċ Ċ @ Opt In ( Experimental Cor outines Api :: class ) Ċ public Ġclass ĠSim Virt Provisioning Service ( ĊĠĠĠ Ġprivate Ġval Ġcoroutine Scope : ĠCor outine Scope , ĊĠĠĠ Ġprivate Ġval Ġclock : ĠClock , ĊĠĠĠ Ġprivate Ġval Ġprovisioning Service : ĠProvisioning Service , ĊĠĠĠ Ġpublic Ġval Ġallocation Policy : ĠAl location Policy Ċ ) Ġ: ĠV irt Provisioning Service Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlogger Ġinstance Ġto Ġuse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġhyper vis ors Ġthat Ġhave Ġbeen Ġlaunched Ġby Ġthe Ġservice . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġhyper vis ors : ĠMutable Map < Server , ĠHyper visor View > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġavailable Ġhyper vis ors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġavailable Hyper vis ors : ĠMutable Set < Hyper visor View > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġincoming Ġimages Ġto Ġbe Ġprocessed Ġby Ġthe Ġprovision er . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġincoming Images : ĠMutable Set < ImageView > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġactive Ġimages Ġin Ġthe Ġsystem . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġactive Images : ĠMutable Set < ImageView > Ġ= Ġmutable Set Of () ĊĊĠĠĠ Ġpublic Ġvar Ġsubmitted V ms : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġpublic Ġvar Ġqueued V ms : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġpublic Ġvar Ġrunning V ms : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġpublic Ġvar Ġfinished V ms : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġpublic Ġvar Ġun scheduled V ms : ĠInt Ġ= Ġ 0 ĊĊĠĠĠ Ġprivate Ġvar Ġmax Co res Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmax Memory Ġ= Ġ 0 L ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġallocation Ġlogic Ġto Ġuse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġallocation Logic Ġ= Ġallocation Policy () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Event Flow ] Ġto Ġemit Ġthe Ġevents . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġval Ġevent Flow Ġ= ĠEvent Flow < Virt Provisioning Event >() ĊĊĠĠĠ Ġoverride Ġval Ġevents : ĠFlow < Virt Provisioning Event > Ġ= Ġevent Flow ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprovision ed Nodes Ġ= Ġprovisioning Service . nodes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovision ed Nodes . forEach Ġ{ Ġnode Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworkload Ġ= ĠSim Virt Driver Workload () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhyper visor Image Ġ= ĠSim Workload Image ( UUID . randomUUID (), Ġ" v mm ", Ġempty Map (), Ġworkload ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġinit Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdeployed Node Ġ= Ġprovisioning Service . deploy ( node , Ġhyper visor Image ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġdeployed Node . server !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . events . on Each Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠServer Event . StateChanged Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! init ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate Changed ( event . server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch In ( this ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġon Hyper visor Available ( server , Ġworkload . driver ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdrivers (): ĠSet < Virt Driver > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġavailable Hyper vis ors . map Ġ{ Ġit . driver Ġ}. toSet () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdeploy ( ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġimage : ĠImage , ĊĠĠĠĠĠĠĠ Ġflavor : ĠFl avor ĊĠĠĠ Ġ): ĠServer Ġ{ ĊĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ submitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ queued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsuspend C ancellable Coroutine < Server > Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvm Instance Ġ= ĠImageView ( name , Ġimage , Ġflavor , Ġcont ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Images Ġ+= Ġvm Instance ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Cycle () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġterminate () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovision ed Nodes Ġ= Ġprovisioning Service . nodes () ĊĠĠĠĠĠĠĠ Ġprovision ed Nodes . forEach Ġ{ Ġnode Ġ-> Ġprovisioning Service . stop ( node ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġcall : ĠJob ? Ġ= Ġnull ĊĊĠĠĠ Ġprivate Ġfun Ġrequest Cycle () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( call Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġquantum Ġ= Ġ 3 0 0 0 0 0 Ġ// Ġ 5 Ġminutes Ġin Ġmilliseconds ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġassume Ġthat Ġthe Ġprovision er Ġruns Ġat Ġa Ġfixed Ġslot Ġevery Ġtime Ġquantum Ġ( e . g Ġt = 0 , Ġt = 6 0 , Ġt = 1 2 0 ). ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġimportant Ġbecause Ġthe Ġslices Ġof Ġthe ĠVMs Ġneed Ġto Ġbe Ġaligned . ĊĠĠĠĠĠĠĠ Ġ// ĠWe Ġcalculate Ġhere Ġthe Ġdelay Ġuntil Ġthe Ġnext Ġscheduling Ġslot . ĊĠĠĠĠĠĠĠ Ġval Ġdelay Ġ= Ġquantum Ġ- Ġ( clock . millis () Ġ% Ġquantum ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcall Ġ= Ġcoroutine Scope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( delay ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service . call Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġschedule () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthis . call Ġ= Ġcall ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsuspend Ġfun Ġschedule () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimages ToBe Scheduled Ġ= Ġincoming Images . toSet () ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( image Instance Ġin Ġimages ToBe Scheduled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequired Memory Ġ= Ġimage Instance . image . tags [" required - memory "] Ġas ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġselected Hv Ġ= Ġallocation Logic . select ( available Hyper vis ors , Ġimage Instance ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( selected Hv Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( required Memory Ġ> Ġmax Memory Ġ|| Ġimage Instance . flavor . cpu Count Ġ> Ġmax Co res ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ un scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Images Ġ-= Ġimage Instance ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn (" Failed Ġto Ġspawn Ġ${ image Instance . image }: Ġdoes Ġnot Ġfit Ġ[ ${ clock . millis ()} ]") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"[ ${ clock . millis ()} ] ĠSp aw ning Ġ${ image Instance . image } Ġon Ġ${ selected Hv . server . uid } Ġ${ selected Hv . server . name } Ġ${ selected Hv . server . flavor }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġincoming Images Ġ-= Ġimage Instance ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSpec ul atively Ġupdate Ġthe Ġhyper visor Ġview Ġinformation Ġto Ġprevent Ġother Ġimages Ġin Ġthe Ġqueue Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdec iding Ġon Ġstale Ġvalues . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . numberOf Active Servers ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . provision ed Co res Ġ+= Ġimage Instance . flavor . cpu Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . available Memory Ġ-= Ġrequired Memory Ġ// ĠXXX ĠTemporary Ġhack ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġserver Ġ= Ġselected Hv . driver . spawn ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Instance . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Instance . image , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Instance . flavor ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Instance . server Ġ= Ġserver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage Instance . continu ation . resume ( server ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ running V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- queued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Images Ġ+= Ġimage Instance ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . events ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( event ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠServer Event . StateChanged Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event . server . state Ġ== ĠServer State . SHUT OFF ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ"[ ${ clock . millis ()} ] ĠServer Ġ${ event . server . uid } Ġ${ event . server . name } Ġ${ event . server . flavor } Ġfinished ." Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-- running V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ++ finished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactive Images Ġ-= Ġimage Instance ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . provision ed Co res Ġ-= Ġserver . flavor . cpu Count ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTry Ġto Ġre schedule Ġif Ġneeded ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( incoming Images . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Cycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. launch In ( coroutine Scope ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIns ufficient Memory On Server Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġdeploy ĠVM ", Ġe ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . numberOf Active Servers -- ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . provision ed Co res Ġ-= Ġimage Instance . flavor . cpu Count ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġselected Hv . available Memory Ġ+= Ġrequired Memory ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Failed Ġto Ġdeploy ĠVM ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġstate Changed ( server : ĠServer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( server . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . ACTIVE Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ"[ ${ clock . millis ()} ] ĠServer Ġ${ server . uid } Ġavailable : Ġ${ server . state }" Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( server Ġin Ġhyper vis ors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCor ner Ġcase Ġfor Ġwhen Ġthe Ġhyper visor Ġalready Ġexists ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors Ġ+= Ġhyper vis ors . getValue ( server ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhv Ġ= ĠHyper visor View ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . uid , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġserver . flavor . memory Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Co res Ġ= Ġmax ( max Co res , Ġserver . flavor . cpu Count ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Memory Ġ= Ġmax ( max Memory , Ġserver . flavor . memory Size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors [ server ] Ġ= Ġhv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRe - schedule Ġon Ġthe Ġnew Ġmachine ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( incoming Images . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Cycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . SHUT OFF , ĠServer State . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . debug Ġ{ Ġ"[ ${ clock . millis ()} ] ĠServer Ġ${ server . uid } Ġunavailable : Ġ${ server . state }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhv Ġ= Ġhyper vis ors [ server ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors Ġ-= Ġhv ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( incoming Images . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Cycle () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalStateException () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Hyper visor Available ( server : ĠServer , Ġhyper visor : ĠSim Virt Driver ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhv Ġ= Ġhyper vis ors [ server ] Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġhv . driver Ġ= Ġhyper visor ĊĠĠĠĠĠĠĠ Ġavailable Hyper vis ors Ġ+= Ġhv ĊĊĠĠĠĠĠĠĠ Ġevent Flow . emit ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠV irt Provisioning Event . Metrics Available ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis @ Sim Virt Provisioning Service , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Hyper vis ors . size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubmitted V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrunning V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfinished V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġqueued V ms , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun scheduled V ms ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġhv . driver . events ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. on Each Ġ{ Ġevent Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( event Ġis ĠHyper visor Event . V ms Updated ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhv . numberOf Active Servers Ġ= Ġevent . numberOf Active Servers ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhv . available Memory Ġ= Ġevent . available Memory ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. launch In ( coroutine Scope ) ĊĊĠĠĠĠĠĠĠ Ġrequest Cycle () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġdata Ġclass ĠImageView ( ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġimage : ĠImage , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġflavor : ĠFl avor , ĊĠĠĠĠĠĠĠ Ġpublic Ġval Ġcontinuation : ĠContinu ation < Server >, ĊĠĠĠĠĠĠĠ Ġpublic Ġvar Ġserver : ĠServer ? Ġ= Ġnull ĊĠĠĠ Ġ) Ċ } Ċ