/* Ċ Ġ* Ġ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 Ġio . op entelemetry . api . metrics . Meter Ċ import Ġio . op entelemetry . api . metrics . common . Labels Ċ import Ġkotlinx . coroutines .* Ċ import Ġmu . Kotlin Logging Ċ import Ġorg . opend c . compute . api . Flavor Ċ import Ġorg . opend c . compute . api . Server Ċ import Ġorg . opend c . compute . api . Server State Ċ import Ġorg . opend c . compute . service . driver .* Ċ import Ġorg . opend c . simulator . compute .* Ċ import Ġorg . opend c . simulator . compute . cp uf req . Performance Scaling G overn or Ċ import Ġorg . opend c . simulator . compute . cp uf req . Scaling Driver Ċ import Ġorg . opend c . simulator . compute . cp uf req . Scaling G overn or Ċ import Ġorg . opend c . simulator . compute . cp uf req . Simple Scaling Driver Ċ import Ġorg . opend c . simulator . compute . inter ference . IMAGE _ PERF _ INTER FER ENCE _ MODEL Ċ import Ġorg . opend c . simulator . compute . inter ference . Performance Inter ference Model Ċ import Ġorg . opend c . simulator . compute . model . Memory Unit Ċ import Ġorg . opend c . simulator . compute . power . Constant Power Model Ċ import Ġorg . opend c . simulator . compute . power . Power Model Ċ import Ġorg . opend c . simulator . failures . Failure Domain Ċ import Ġjava . time . Clock Ċ import Ġjava . util .* Ċ import Ġkotlin . coroutines . Coroutine Context Ċ import Ġkotlin . coroutines . resume Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Host ] Ġthat Ġis Ġsim ulates Ġvirtual Ġmachines Ġon Ġa Ġphysical Ġmachine Ġusing Ġ[ Sim Hyper visor ]. Ċ Ġ*/ Ċ public Ġclass ĠSim Host ( ĊĠĠĠ Ġoverride Ġval Ġuid : ĠUUID , ĊĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠ Ġmodel : ĠSim Machine Model , ĊĠĠĠ Ġoverride Ġval Ġmeta : ĠMap < String , ĠAny >, ĊĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠ Ġclock : ĠClock , ĊĠĠĠ Ġmeter : ĠMeter , ĊĠĠĠ Ġhyper visor : ĠSim Hyper visor Provider , ĊĠĠĠ Ġscaling G overn or : ĠScaling G overn or , ĊĠĠĠ Ġscaling Driver : ĠScaling Driver , ĊĠĠĠ Ġprivate Ġval Ġmapper : ĠSim Workload Mapper Ġ= ĠSim Meta Workload Mapper (), Ċ ) Ġ: ĠHost , ĠFailure Domain , ĠAuto Closeable Ġ{ ĊĊĠĠĠ Ġpublic Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġuid : ĠUUID , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġmodel : ĠSim Machine Model , ĊĠĠĠĠĠĠĠ Ġmeta : ĠMap < String , ĠAny >, ĊĠĠĠĠĠĠĠ Ġcontext : ĠCor outine Context , ĊĠĠĠĠĠĠĠ Ġclock : ĠClock , ĊĠĠĠĠĠĠĠ Ġmeter : ĠMeter , ĊĠĠĠĠĠĠĠ Ġhyper visor : ĠSim Hyper visor Provider , ĊĠĠĠĠĠĠĠ Ġpower Model : ĠPower Model Ġ= ĠConstant Power Model ( 0 . 0 ), ĊĠĠĠĠĠĠĠ Ġmapper : ĠSim Workload Mapper Ġ= ĠSim Meta Workload Mapper (), ĊĠĠĠ Ġ) Ġ: Ġthis ( uid , Ġname , Ġmodel , Ġmeta , Ġcontext , Ġclock , Ġmeter , Ġhyper visor , ĠPerformance Scaling G overn or (), ĠSimple Scaling Driver ( power Model ), Ġmapper ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġ[ Coroutine Scope ] Ġof Ġthe Ġhost Ġbounded Ġby Ġthe Ġlifecycle Ġof Ġthe Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġscope : ĠCor outine Scope Ġ= ĠCor outine Scope ( context Ġ+ ĠJob ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġlogger Ġinstance Ġof Ġthis Ġserver . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠKotlin Logging . logger Ġ{} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġevent Ġlisteners Ġregistered Ġwith Ġthis Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġlisteners Ġ= Ġmutable ListOf < Host Listener >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCurrent Ġtotal Ġmemory Ġuse Ġof Ġthe Ġimages Ġon Ġthis Ġhyper visor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġavailable Memory : ĠLong Ġ= Ġmodel . memory . map Ġ{ Ġit . size Ġ}. sum () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġmachine Ġto Ġrun Ġon . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġmachine : ĠSim B are Metal Machine Ġ= ĠSim B are Metal Machine ( context , Ġclock , Ġmodel , Ġscaling G overn or , Ġscaling Driver ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġhyper visor Ġto Ġrun Ġmultiple Ġwork loads . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġval Ġhyper visor : ĠSim Hyper visor Ġ= Ġhyper visor . create ( ĊĠĠĠĠĠĠĠ Ġscope . coroutine Context , Ġclock , ĊĠĠĠĠĠĠĠ Ġobject Ġ: ĠSim Hyper visor . Listener Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġfun Ġon Slice Finish ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhyper visor : ĠSim Hyper visor , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequested Work : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgranted Work : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġover committed Work : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinter fer ed Work : ĠLong , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Usage : ĠDouble , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Demand : ĠDouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Work , Ġrequested Work . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Work Granted , Ġgranted Work . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Work Over commit , Ġover committed Work . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Work Inter ference , Ġinter fer ed Work . toDouble ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Usage , Ġcpu Usage ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Demand , Ġcpu Demand ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . put (_ cpu Power , Ġmachine . power Draw ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ batch . record () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġvirtual Ġmachines Ġrunning Ġon Ġthe Ġhyper visor . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġguest s Ġ= ĠHashMap < Server , ĠGuest >() ĊĊĠĠĠ Ġoverride Ġval Ġstate : ĠHost State ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ state ĊĠĠĠ Ġprivate Ġvar Ġ_ state : ĠHost State Ġ= ĠHost State . DOWN ĊĠĠĠĠĠĠĠ Ġset ( value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value Ġ!= Ġfield ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on StateChanged ( this , Ġvalue ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield Ġ= Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġmodel : ĠHost Model Ġ= ĠHost Model ( model . cpus . size , Ġmodel . memory . map Ġ{ Ġit . size Ġ}. sum ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġguest s Ġon Ġthe Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ guest s Ġ= Ġmeter . long UpDown Counter Builder (" guest s . total ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" Number Ġof Ġguest s ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" 1 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. bind ( Labels . of (" host ", Ġuid . toString ())) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġnumber Ġof Ġactive Ġguest s Ġon Ġthe Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ active Guest s Ġ= Ġmeter . long UpDown Counter Builder (" guest s . active ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" Number Ġof Ġactive Ġguest s ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" 1 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġ. bind ( Labels . of (" host ", Ġuid . toString ())) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠCPU Ġusage Ġon Ġthe Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Usage Ġ= Ġmeter . doubleValue Recorder Builder (" cpu . usage ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof ĠCPU Ġresources Ġused Ġby Ġthe Ġhost ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" MHz ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe ĠCPU Ġdemand Ġon Ġthe Ġhost . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Demand Ġ= Ġmeter . doubleValue Recorder Builder (" cpu . demand ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof ĠCPU Ġresources Ġthe Ġguest s Ġwould Ġuse Ġif Ġthere Ġwere Ġno ĠCPU Ġcontent ion Ġor ĠCPU Ġlimits ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" MHz ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġrequested Ġwork Ġfor Ġthe ĠCPU . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Power Ġ= Ġmeter . doubleValue Recorder Builder (" power . usage ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof Ġpower Ġused Ġby Ġthe ĠCPU ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" W ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġrequested Ġwork Ġfor Ġthe ĠCPU . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Work Ġ= Ġmeter . doubleValue Recorder Builder (" cpu . work . total ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof Ġwork Ġsupplied Ġto Ġthe ĠCPU ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" 1 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwork Ġactually Ġperformed Ġby Ġthe ĠCPU . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Work Granted Ġ= Ġmeter . doubleValue Recorder Builder (" cpu . work . gr anted ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof Ġwork Ġperformed Ġby Ġthe ĠCPU ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" 1 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwork Ġthat Ġcould Ġnot Ġbe Ġperformed Ġby Ġthe ĠCPU Ġdue Ġto Ġover commit ting Ġresource . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Work Over commit Ġ= Ġmeter . doubleValue Recorder Builder (" cpu . work . over commit ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof Ġwork Ġnot Ġperformed Ġby Ġthe ĠCPU Ġdue Ġto Ġover commit ment ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" 1 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġwork Ġthat Ġcould Ġnot Ġbe Ġperformed Ġby Ġthe ĠCPU Ġdue Ġto Ġinter ference . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ cpu Work Inter ference Ġ= Ġmeter . doubleValue Recorder Builder (" cpu . work . inter ference ") ĊĠĠĠĠĠĠĠ Ġ. setDescription (" The Ġamount Ġof Ġwork Ġnot Ġperformed Ġby Ġthe ĠCPU Ġdue Ġto Ġinter ference ") ĊĠĠĠĠĠĠĠ Ġ. set Unit (" 1 ") ĊĠĠĠĠĠĠĠ Ġ. build () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġbatch Ġrecorder Ġused Ġto Ġrecord Ġmultiple Ġmetrics Ġatom ically . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġ_ batch Ġ= Ġmeter . new Batch Recorder (" host ", Ġuid . toString ()) ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLaunch Ġhyper visor Ġonto Ġmachine ĊĠĠĠĠĠĠĠ Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state Ġ= ĠHost State . UP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . run ( this @ Sim Host . hyper visor , Ġempty Map ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ(_ : ĠC ancellation Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore d ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ( cause ) Ġ{ Ġ" Host Ġfailed " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġcause ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ_ state Ġ= ĠHost State . DOWN ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcan Fit ( server : ĠServer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsufficient Memory Ġ= Ġavailable Memory Ġ> Ġserver . flavor . memory Size ĊĠĠĠĠĠĠĠ Ġval Ġenough C pus Ġ= Ġmachine . model . cpus . size Ġ>= Ġserver . flavor . cpu Count ĊĠĠĠĠĠĠĠ Ġval Ġcan Fit Ġ= Ġhyper visor . can Fit ( server . flavor . to Machine Model ()) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsufficient Memory Ġ&& Ġenough C pus Ġ&& Ġcan Fit ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġspawn ( server : ĠServer , Ġstart : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠReturn Ġif Ġthe Ġserver Ġalready Ġexists Ġon Ġthis Ġhost ĊĠĠĠĠĠĠĠ Ġif Ġ( server Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrequire ( can Fit ( server )) Ġ{ Ġ" Server Ġdoes Ġnot Ġfit " Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġguest Ġ= ĠGuest ( server , Ġhyper visor . create Machine ( server . flavor . to Machine Model ())) ĊĠĠĠĠĠĠĠ Ġguest s [ server ] Ġ= Ġguest ĊĠĠĠĠĠĠĠ Ġ_ guest s . add ( 1 ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( start ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġguest . start () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġcontains ( server : ĠServer ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġserver Ġin Ġguest s ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstart ( server : ĠServer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġguest Ġ= Ġrequire NotNull ( guest s [ server ]) Ġ{ Ġ" Unknown Ġserver Ġ${ server . uid } Ġat Ġhost Ġ$ uid " Ġ} ĊĠĠĠĠĠĠĠ Ġguest . start () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġstop ( server : ĠServer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġguest Ġ= Ġrequire NotNull ( guest s [ server ]) Ġ{ Ġ" Unknown Ġserver Ġ${ server . uid } Ġat Ġhost Ġ$ uid " Ġ} ĊĠĠĠĠĠĠĠ Ġguest . stop () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġdelete ( server : ĠServer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġguest Ġ= Ġguest s . remove ( server ) Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġguest . terminate () ĊĠĠĠĠĠĠĠ Ġ_ guest s . add (- 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġadd Listener ( listener : ĠHost Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . add ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġremove Listener ( listener : ĠHost Listener ) Ġ{ ĊĠĠĠĠĠĠĠ Ġlisteners . remove ( listener ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ{ ĊĠĠĠĠĠĠĠ Ġscope . cancel () ĊĠĠĠĠĠĠĠ Ġmachine . close () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Sim Host [ uid =$ uid , name =$ name , model =$ model ]" ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠConvert Ġflavor Ġto Ġmachine Ġmodel . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠFl avor . to Machine Model (): ĠSim Machine Model Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoriginal Cpu Ġ= Ġmachine . model . cpus [ 0 ] ĊĠĠĠĠĠĠĠ Ġval Ġprocessing Node Ġ= Ġoriginal Cpu . node . copy ( core Count Ġ= Ġcpu Count ) ĊĠĠĠĠĠĠĠ Ġval Ġprocessing Units Ġ= Ġ( 0 Ġuntil Ġcpu Count ). map Ġ{ Ġoriginal Cpu . copy ( id Ġ= Ġit , Ġnode Ġ= Ġprocessing Node ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġmemory Units Ġ= ĠlistOf ( Memory Unit (" Generic ", Ġ" Generic ", Ġ 3 2 0 0 . 0 , Ġmemory Size )) ĊĊĠĠĠĠĠĠĠ Ġreturn ĠSim Machine Model ( processing Units , Ġmemory Units ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Guest Start ( vm : ĠGuest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġguest s . forEach Ġ{ Ġ(_, Ġguest ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guest . state Ġ== ĠServer State . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm . performance Inter ference Model ?. onStart ( vm . server . image . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ active Guest s . add ( 1 ) ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on StateChanged ( this , Ġvm . server , Ġvm . state ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġon Guest Stop ( vm : ĠGuest ) Ġ{ ĊĠĠĠĠĠĠĠ Ġguest s . forEach Ġ{ Ġ(_, Ġguest ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( guest . state Ġ== ĠServer State . RUNNING ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm . performance Inter ference Model ?. on Stop ( vm . server . image . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ_ active Guest s . add (- 1 ) ĊĠĠĠĠĠĠĠ Ġlisteners . forEach Ġ{ Ġit . on StateChanged ( this , Ġvm . server , Ġvm . state ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġfail () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ state Ġ= ĠHost State . DOWN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġrecover () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ state Ġ= ĠHost State . UP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġvirtual Ġmachine Ġinstance Ġthat Ġthe Ġdriver Ġmanages . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġinner Ġclass ĠGuest ( val Ġserver : ĠServer , Ġval Ġmachine : ĠSim Machine ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġperformance Inter ference Model : ĠPerformance Inter ference Model ? Ġ= Ġserver . meta [ IMAGE _ PERF _ INTER FER ENCE _ MODEL ] Ġas ? ĠPerformance Inter ference Model ? ĊĊĠĠĠĠĠĠĠ Ġvar Ġstate : ĠServer State Ġ= ĠServer State . TERMIN ATED ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġstart () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . TERMIN ATED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info Ġ{ Ġ" User Ġrequested Ġto Ġstart Ġserver Ġ${ server . uid }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlaunch () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . RUNNING Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . DELETED Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . warn Ġ{ Ġ" User Ġtried Ġto Ġstart Ġterminated Ġserver " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Server Ġis Ġterminated ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġassert ( false ) Ġ{ Ġ" Invalid Ġstate Ġtransition " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġstop () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . RUNNING , ĠServer State . ERROR Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjob Ġ= Ġjob Ġ?: Ġthrow ĠIllegalStateException (" Server Ġshould Ġbe Ġactive ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . cancel () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob . join () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . TERMIN ATED , ĠServer State . DELETED Ġ-> Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġassert ( false ) Ġ{ Ġ" Invalid Ġstate Ġtransition " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġsuspend Ġfun Ġterminate () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstop () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠServer State . DELETED ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġvar Ġjob : ĠJob ? Ġ= Ġnull ĊĊĠĠĠĠĠĠĠ Ġprivate Ġsuspend Ġfun Ġlaunch () Ġ= Ġsuspend C ancellable Coroutine < Unit > Ġ{ Ġcont Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( job Ġ== Ġnull ) Ġ{ Ġ" Concurrent Ġjob Ġrunning " Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġworkload Ġ= Ġmapper . create Workload ( server ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġscope . launch Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelay ( 1 ) Ġ// ĠTODO ĠIntro duce Ġboot Ġtime ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcont . resume ( Unit ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . run ( workload , Ġmap Of (" driver " Ġto Ġthis @ Sim Host , Ġ" server " Ġto Ġserver )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( null ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( cause : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexit ( cause ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmachine . close () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjob Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġinit () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĠServer State . RUNNING ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Guest Start ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġexit ( cause : ĠThrowable ?) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstate Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cause Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . TERMIN ATED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠServer State . ERROR ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġavailable Memory Ġ+= Ġserver . flavor . memory Size ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Guest Stop ( this ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ