package Ġcn . edu . s ust c . c se . oo ad . s ust ech lambda . services Ċ Ċ import Ġcn . edu . s ust c . c se . oo ad . s ust ech lambda . entities . Task Ċ import Ġcn . edu . s ust c . c se . oo ad . s ust ech lambda . entities . Task Status Ċ import Ġcom . google . gson . Gson Builder Ċ import Ġcom . spotify . docker . client . Default Docker Client Ċ import Ġcom . spotify . docker . client . Docker Client Ċ import Ġcom . spotify . docker . client . messages . Container Config Ċ import Ġcom . spotify . docker . client . messages . Container Creation Ċ import Ġorg . springframework . stereotype . Service Ċ import Ġjava . io . File Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . util .* Ċ Ċ private Ġval Ġinfo To Status Map Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" created " Ġto ĠTask Status . QUEUE ING , ĊĠĠĠĠĠĠĠ Ġ" running " Ġto ĠTask Status . RUNNING , ĊĠĠĠĠĠĠĠ Ġ" exit ed " Ġto ĠTask Status . FINISHED , ĊĠĠĠĠĠĠĠ Ġ" dead " Ġto ĠTask Status . ERROR Ċ ) ĊĊ Ċ private Ġval Ġlanguage Images Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" python " Ġto Ġ" s ust ech _ lambda _ python 3 ", ĊĠĠĠĠĠĠĠ Ġ" javascript " Ġto Ġ" s ust ech _ lambda _ node 8 ", ĊĠĠĠĠĠĠĠ Ġ" bash " Ġto Ġ" s ust ech _ lambda _ ubuntu 1 6 " Ċ ) Ċ Ċ private Ġval Ġlanguage Extensions Ġ= Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" python " Ġto Ġ" py ", ĊĠĠĠĠĠĠĠ Ġ" javascript " Ġto Ġ" js ", ĊĠĠĠĠĠĠĠ Ġ" bash " Ġto Ġ" sh " Ċ ) Ċ Ċ @ Service Ċ class ĠTask Services Impl Ġ: ĠTask Services Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget EndTime ( task : ĠTask ): ĠDate ? Ġ= Ġif Ġ( getStatus ( task ) Ġ== ĠTask Status . FINISHED ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdocker Client . inspect Container ( task . container Id ). state (). finished At () ĊĠĠĠ Ġ} Ġelse Ġnull ĊĊĊĠĠĠ Ġprivate Ġval Ġdocker Client : ĠDocker Client Ġ= ĠDefault Docker Client (" unix :/// var / run / docker . sock ") ĊĊĊĠĠĠ Ġoverride Ġfun Ġrun Task ( task : ĠTask ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcontainer Creation Ġ= Ġcreate Container ( task ) ĊĠĠĠĠĠĠĠ Ġdocker Client . start Container ( container Creation . id ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontainer Creation . id () !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetStatus ( task : ĠTask ) Ġ= Ġdocker Client . inspect Container ( task . container Id ). state (). status (). let Ġ{ Ġinfo To Status Map [ it ] !! Ġ} ĊĊĊĠĠĠ Ġoverride Ġfun Ġget Output ( task : ĠTask ): ĠString ? Ġ= Ġif Ġ( getStatus ( task ) Ġ== ĠTask Status . FINISHED ) Ġ{ ĊĠĠĠĠĠĠĠ Ġdocker Client . logs ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtask . container Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocker Client . Logs Param . stdout (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠDocker Client . Logs Param . stderr () ĊĠĠĠĠĠĠĠ Ġ). use Ġ{ Ġit . read Fully () Ġ} ĊĠĠĠ Ġ} Ġelse Ġnull ĊĊĊĠĠĠ Ġprivate Ġfun Ġcreate Container ( task : ĠTask ): ĠContainer Creation Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimage Id Ġ= Ġlanguage Images [ task . script . content . language ] ĊĠĠĠĠĠĠĠ Ġval Ġconfig Ġ= ĠContainer Config . builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. image ( image Id ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠ Ġval Ġcreation Ġ= Ġthis . docker Client . create Container ( config ) ĊĠĠĠĠĠĠĠ Ġval Ġarchive Path Ġ= Ġcreate Temp Archive ( task ) ĊĠĠĠĠĠĠĠ Ġdocker Client . copy To Container ( archive Path , Ġcreation . id (), Ġ"/ tmp / script /") ĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠDelete Ġtemp Ġfiles Ġafter Ġcopying ĊĠĠĠĠĠĠĠ Ġreturn Ġcreation ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Temp Archive ( task : ĠTask ): ĠPath Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtemp Dir Ġ= ĠFile ("/ tmp / s ust ech - lambda / tasks /${ task . id }/ "). to Path () ĊĠĠĠĠĠĠĠ ĠFiles . create Directory ( temp Dir ) ĊĊĠĠĠĠĠĠĠ Ġval Ġparameters Json Ġ= Ġextract Parameters Json ( task ) ĊĠĠĠĠĠĠĠ ĠFile ("$ temp Dir / script .${ language Extensions [ task . script . content . language ]} "). write Text ( task . script . content . code ) ĊĠĠĠĠĠĠĠ ĠFile ("$ temp Dir / parameters . json "). write Text ( parameters Json ) ĊĠĠĠĠĠĠĠ Ġreturn Ġtemp Dir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġextract Parameters Json ( task : ĠTask ) Ġ= ĠGson Builder (). set Pretty Print ing (). create (). toJson ( task . parameters ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtmp Path Ġ= ĠFile ("/ tmp / s ust ech - lambda / "). to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( tmp Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directory ( tmp Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġt aks Tmp Path Ġ= ĠFile ("/ tmp / s ust ech - lambda / tasks / "). to Path () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! Files . exists ( t aks Tmp Path )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFiles . create Directory ( t aks Tmp Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ