package Ġcom . netflix . spin n aker . ke el . ec 2 . resource Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . netflix . spin n aker . ke el . api . Resource Ċ import Ġcom . netflix . spin n aker . ke el . api . Resource Kind Ċ import Ġcom . netflix . spin n aker . ke el . api . ResourceId Ċ import Ġcom . netflix . spin n aker . ke el . api . SP IN NA KER _ API _ V 1 Ċ import Ġcom . netflix . spin n aker . ke el . api . ec 2 . Application LoadBalancer Ċ import Ġcom . netflix . spin n aker . ke el . api . ec 2 . LoadBalancer Type Ċ import Ġcom . netflix . spin n aker . ke el . api . ec 2 . cluster . Location Ċ import Ġcom . netflix . spin n aker . ke el . api . id Ċ import Ġcom . netflix . spin n aker . ke el . api . service Account Ċ 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 . diff . Resource Diff Ċ import Ġcom . netflix . spin n aker . ke el . ec 2 . CLOUD _ PROVIDER Ċ import Ġcom . netflix . spin n aker . ke el . events . Task Ċ import Ġcom . netflix . spin n aker . ke el . model . Job Ċ 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 . Orche stration Trigger Ċ import Ġcom . netflix . spin n aker . ke el . or ca . O rc a Service Ċ import Ġcom . netflix . spin n aker . ke el . plugin . Resource Handler Ċ import Ġcom . netflix . spin n aker . ke el . plugin . Resource Normalizer Ċ import Ġcom . netflix . spin n aker . ke el . ret rofit . is NotFound Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġretrofit 2 . HttpException Ċ Ċ class ĠApplication LoadBalancer Handler ( ĊĠ Ġprivate Ġval Ġcloud Driver Service : ĠCloud Driver Service , ĊĠ Ġprivate Ġval Ġcloud Driver Cache : ĠCloud Driver Cache , ĊĠ Ġprivate Ġval Ġor ca Service : ĠO rc a Service , ĊĠ Ġoverride Ġval ĠobjectMapper : ĠObjectMapper , ĊĠ Ġoverride Ġval Ġnormal izers : ĠList < Resource Normalizer <* >> Ċ ) Ġ: ĠResource Handler < Application LoadBalancer > Ġ{ ĊĠ Ġoverride Ġval Ġlog : ĠLogger Ġby Ġlazy Ġ{ ĠLoggerFactory . getLogger ( java Class ) Ġ} ĊĊĠ Ġoverride Ġval ĠapiVersion Ġ= ĠSP IN NA KER _ API _ V 1 . sub Api (" ec 2 ") ĊĠ Ġoverride Ġval Ġsupported Kind Ġ= ĠResource Kind ( ĊĠĠĠ ĠapiVersion . group , ĊĠĠĠ Ġ" application - load - balancer ", ĊĠĠĠ Ġ" application - load - bal ancers " ĊĠ Ġ) Ġto ĠApplication LoadBalancer :: class . java ĊĊĠ Ġoverride Ġsuspend Ġfun Ġcurrent ( resource : ĠResource < Application LoadBalancer >): ĠApplication LoadBalancer ? Ġ= ĊĠĠĠ Ġcloud Driver Service . getApplication LoadBalancer ( resource . spec , Ġresource . service Account ) ĊĊĠ Ġoverride Ġsuspend Ġfun Ġupsert ( ĊĠĠĠ Ġresource : ĠResource < Application LoadBalancer >, ĊĠĠĠ Ġresource Diff : ĠResource Diff < Application LoadBalancer > ĊĠ Ġ): ĠList < Task > Ġ{ ĊĠĠĠ Ġval Ġaction Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠ Ġresource Diff . current Ġ== Ġnull Ġ-> Ġ" Creating " ĊĠĠĠĠĠ Ġelse Ġ-> Ġ" Up ser ting " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġdescription Ġ= Ġ"$ action Ġ${ resource . kind } Ġload Ġbalancer Ġ${ resource . spec . mon iker . name } Ġin Ġ" Ġ+ ĊĠĠĠĠĠ Ġ"${ resource . spec . location . account Name }/${ resource . spec . location . region }" ĊĊĠĠĠ Ġval Ġtask Ref Ġ= ĊĠĠĠĠĠ Ġresource . spec . let Ġ{ Ġspec Ġ-> ĊĊĠĠĠĠĠĠĠ Ġor ca Service ĊĠĠĠĠĠĠĠĠĠ Ġ. orche strate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . service Account , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO rche stration Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . mon iker . app , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( spec . to Up sert Job ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO rche stration Trigger ( resource . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġlog . info (" Started Ġtask Ġ${ task Ref . ref } Ġto Ġ$ description ") ĊĠĠĠ Ġreturn ĠlistOf ( Task ( id Ġ= Ġtask Ref . taskId , Ġname Ġ= Ġdescription )) ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġdelete ( resource : ĠResource < Application LoadBalancer >) Ġ{ ĊĠĠĠ Ġval Ġdescription Ġ= Ġ" Delete Ġload Ġbalancer Ġ${ resource . spec . mon iker . name } Ġin Ġ" Ġ+ ĊĠĠĠĠĠ Ġ"${ resource . spec . location . account Name }/${ resource . spec . location . region }" ĊĊĠĠĠ Ġval Ġtask Ref Ġ= ĊĠĠĠĠĠ Ġresource . spec . let Ġ{ Ġspec Ġ-> ĊĠĠĠĠĠĠĠ Ġor ca Service ĊĠĠĠĠĠĠĠĠĠ Ġ. orche strate ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . service Account , ĊĠĠĠĠĠĠĠĠĠĠĠ ĠO rche stration Request ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspec . mon iker . app , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdescription , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf ( spec . to Delete Job ()), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠO rche stration Trigger ( resource . id . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġlog . info (" Started Ġtask Ġ${ task Ref . ref } Ġto Ġ$ description ") ĊĠ Ġ} ĊĊĠ Ġoverride Ġsuspend Ġfun Ġact uation InProgress ( id : ĠResource Id ) Ġ= ĊĠĠĠ Ġor ca Service . getC orre lated Execution s ( id . value ). isNotEmpty () ĊĊĠ Ġprivate Ġsuspend Ġfun ĠCloud Driver Service . getApplication LoadBalancer ( spec : ĠApplication LoadBalancer , Ġservice Account : ĠString ): ĊĠĠĠ ĠApplication LoadBalancer ? Ġ= ĊĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠ Ġget Application LoadBalancer ( ĊĠĠĠĠĠĠĠ Ġservice Account , ĊĠĠĠĠĠĠĠ ĠCLO UD _ PROVIDER , ĊĠĠĠĠĠĠĠ Ġspec . location . account Name , ĊĠĠĠĠĠĠĠ Ġspec . location . region , ĊĠĠĠĠĠĠĠ Ġspec . mon iker . name ĊĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. first OrNull () ĊĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġlb Ġ-> ĊĠĠĠĠĠĠĠĠĠ Ġval Ġsecurity Group Names Ġ= Ġlb . security Groups . map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcloud Driver Cache . security Group ById ( spec . location . account Name , Ġspec . location . region , Ġit ). name ĊĠĠĠĠĠĠĠĠĠ Ġ}. to Mutable Set () ĊĊĠĠĠĠĠĠĠĠĠ ĠApplication LoadBalancer ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmon iker Ġ= Ġif Ġ( lb . mon iker Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMon iker ( lb . mon iker !!. app , Ġlb . mon iker !!. stack , Ġlb . mon iker !!. detail ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparsed Named Ġ= Ġlb . load Balancer Name . split ("- ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMon iker ( app Ġ= Ġparsed Named [ 0 ], Ġstack Ġ= Ġparsed Named . get OrNull ( 1 ), Ġdetail Ġ= Ġparsed Named . get OrNull ( 2 )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= ĠLocation ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġaccount Name Ġ= Ġspec . location . account Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Ġ= Ġspec . location . region , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġavailability Zones Ġ= Ġlb . availability Zones , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubnet Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġload Balancer Type Ġ= ĠLoad Balancer Type . valueOf ( lb . load Balancer Type . toUpperCase ()), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinternal Ġ= Ġlb . scheme Ġ!= Ġnull Ġ&& Ġlb . scheme !!. contains (" internal ", Ġignore Case Ġ= Ġtrue ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvpc Name Ġ= Ġlb . vpc Id . let Ġ{ Ġcloud Driver Cache . network By ( it ). name Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubnet Type Ġ= Ġcloud Driver Cache . subnet By ( lb . subnet s . first ()). purpose , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlisteners Ġ= Ġlb . listeners . map Ġ{ Ġl Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication LoadBalancer . Listener ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġl . port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Ġ= Ġl . protocol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcertificate Arn Ġ= Ġl . certificates ?. first OrNull ()?. certificate Arn , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTODO : Ġfiltering Ġout Ġdefault Ġrules Ġseems Ġwrong , Ġsee ĠTODO Ġin ĠApplication LoadBalancer Normalizer ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrules Ġ= Ġl . rules . filter Ġ{ Ġ! it . default Ġ}. toSet (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefault Actions Ġ= Ġl . default Actions . toSet () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toSet (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecurity Group Names Ġ= Ġsecurity Group Names , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Groups Ġ= Ġlb . target Groups . map Ġ{ Ġtg Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication LoadBalancer . Target Group ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname Ġ= Ġtg . target GroupName , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtarget Type Ġ= Ġtg . target Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprotocol Ġ= Ġtg . protocol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġport Ġ= Ġtg . port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Enabled Ġ= Ġtg . health Check Enabled , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Timeout Seconds Ġ= Ġtg . health Check Timeout Seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Port Ġ= Ġtg . health Check Port , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Protocol Ġ= Ġtg . health Check Protocol , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Http Code Ġ= Ġtg . matcher . http Code , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Path Ġ= Ġtg . health Check Path , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealth Check Interval Seconds Ġ= Ġtg . health Check Interval Seconds , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhealthy Threshold Count Ġ= Ġtg . healthy Threshold Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun healthy Threshold Count Ġ= Ġtg . un healthy Threshold Count , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġattributes Ġ= Ġtg . attributes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toSet () ĊĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ġcatch Ġ( e : ĠHttp Exception ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( e . is NotFound ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠApplication LoadBalancer . to Up sert Job (): ĠJob Ġ= ĊĠĠĠ ĠJob ( ĊĠĠĠĠĠ Ġ" upsert LoadBalancer ", ĊĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" application " Ġto Ġmon iker . app , ĊĠĠĠĠĠĠĠ Ġ" credentials " Ġto Ġlocation . account Name , ĊĠĠĠĠĠĠĠ Ġ" cloud Provider " Ġto ĠCLO UD _ PROVIDER , ĊĠĠĠĠĠĠĠ Ġ" name " Ġto Ġmon iker . name , ĊĠĠĠĠĠĠĠ Ġ" region " Ġto Ġlocation . region , ĊĠĠĠĠĠĠĠ Ġ" availability Zones " Ġto Ġmap Of ( location . region Ġto Ġlocation . availability Zones ), ĊĠĠĠĠĠĠĠ Ġ" load Balancer Type " Ġto ĠLoad Balancer Type . APPLICATION . toString (). toLowerCase (), ĊĠĠĠĠĠĠĠ Ġ" vpc Id " Ġto Ġcloud Driver Cache . network By ( vpc Name , Ġlocation . account Name , Ġlocation . region ). id , ĊĠĠĠĠĠĠĠ Ġ" subnet Type " Ġto Ġsubnet Type , ĊĠĠĠĠĠĠĠ Ġ" is Internal " Ġto Ġinternal , ĊĠĠĠĠĠĠĠ Ġ" idle Timeout " Ġto Ġidle Timeout , ĊĠĠĠĠĠĠĠ Ġ" security Groups " Ġto Ġsecurity Group Names , ĊĠĠĠĠĠĠĠ Ġ" listeners " Ġto Ġlisteners , ĊĠĠĠĠĠĠĠ Ġ" target Groups " Ġto Ġtarget Groups ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠ Ġprivate Ġfun ĠApplication LoadBalancer . to Delete Job (): ĠJob Ġ= ĊĠĠĠ ĠJob ( ĊĠĠĠĠĠ Ġ" delete LoadBalancer ", ĊĠĠĠĠĠ Ġmap Of ( ĊĠĠĠĠĠĠĠ Ġ" application " Ġto Ġmon iker . app , ĊĠĠĠĠĠĠĠ Ġ" credentials " Ġto Ġlocation . account Name , ĊĠĠĠĠĠĠĠ Ġ" cloud Provider " Ġto ĠCLO UD _ PROVIDER , ĊĠĠĠĠĠĠĠ Ġ" load Balancer Name " Ġto Ġmon iker . name , ĊĠĠĠĠĠĠĠ Ġ" load Balancer Type " Ġto Ġload Balancer Type , ĊĠĠĠĠĠĠĠ Ġ" regions " Ġto ĠlistOf ( location . region ) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) Ċ } Ċ