// ĠCopyright Ġ 2 0 2 1 ĠAmazon . com , Ġ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 . amazon . spin n aker . ke el . k 8 s . resolver Ċ Ċ import Ġcom . amazon . spin n aker . ke el . k 8 s .* Ċ import Ġcom . amazon . spin n aker . ke el . k 8 s . model .* Ċ import Ġcom . amazon . spin n aker . ke el . k 8 s . service . Cloud Driver K 8 s Service Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . netflix . spin n aker . ke el . api . Resource Ċ import Ġcom . netflix . spin n aker . ke el . api . Resource Diff Ċ import Ġcom . netflix . spin n aker . ke el . api . act uation . Task Ċ import Ġcom . netflix . spin n aker . ke el . api . act uation . Task Launcher Ċ import Ġcom . netflix . spin n aker . ke el . api . plugins . Resolver Ċ import Ġcom . netflix . spin n aker . ke el . api . support . Event Publisher Ċ import Ġcom . netflix . spin n aker . ke el . or ca . O rc a Service Ċ import Ġkotlinx . coroutines . coroutine Scope Ċ Ċ class ĠK 8 s Resource Handler Ġ( ĊĠĠĠ Ġoverride Ġval Ġcloud Driver K 8 s Service : ĠCloud Driver K 8 s Service , ĊĠĠĠ Ġoverride Ġval Ġtask Launcher : ĠTask Launcher , ĊĠĠĠ Ġoverride Ġval Ġevent Publisher : ĠEvent Publisher , ĊĠĠĠ Ġor ca Service : ĠO rc a Service , ĊĠĠĠ Ġoverride Ġval Ġresolver s : ĠList < Resolver <* >> Ċ ) Ġ: ĠGeneric K 8 s Resource Handler < K 8 s Resource Spec , ĠK 8 s Object Manifest >( ĊĠĠĠ Ġcloud Driver K 8 s Service , Ġtask Launcher , Ġevent Publisher , Ġor ca Service , Ġresolver s Ċ ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġsupported Kind Ġ= ĠK 8 S _ RESOURCE _ SPEC _ V 1 ĊĠĠĠ Ġprivate Ġval Ġtag Regex Ġ= Ġ""" .* :( . +) """. to Regex () ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġto Resolved Type ( resource : ĠResource < K 8 s Resource Spec >): ĠK 8 s Object Manifest Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠSp inn aker Ġversions Ġconfig Map Ġand Ġsecrets Ġby Ġdefault ĊĠĠĠĠĠĠĠ Ġif Ġ( resource . spec . template . kind Ġ== Ġ" Secret " Ġ|| Ġresource . spec . template . kind Ġ== Ġ" ConfigMap ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresource . spec . template . data ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠmetaData Ġ= Ġresource . spec . template . metadata ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( metaData . containsKey (" annotations ")) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= Ġ( metaData [" annotations "] Ġas ĠMap < String , ĠAny ?> ). to Mutable Map () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations [" strategy . spin n aker . io / versioned "] Ġ= Ġ" false " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData [" annotations "] Ġ= Ġannotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠmetaData [" annotations "] Ġ= Ġmap Of (" strategy . spin n aker . io / versioned " Ġto Ġ" false ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġsending Ġit Ġto Ġthe Ġsuper Ġclass Ġfor Ġcommon Ġlabels Ġand Ġannotations Ġto Ġbe Ġadded ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . to Resolved Type ( resource ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġcurrent ( resource : ĠResource < K 8 s Resource Spec >): ĠK 8 s Object Manifest ? Ġ= ĊĠĠĠĠĠĠĠ Ġsuper . current ( resource )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Applied Config Ġ= Ġ( it . metadata [ AN NOT ATIONS ] Ġas ĠMap < String , ĠString >) [ K 8 S _ LAST _ APP LIED _ CONFIG ] Ġas ĠString ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcleanup ( jackson ObjectMapper (). readValue ( last Applied Config )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġget K 8 s Resource ( ĊĠĠĠĠĠĠĠ Ġr : ĠResource < K 8 s Resource Spec >, ĊĠĠĠ Ġ): ĠK 8 s Object Manifest ? Ġ= ĊĠĠĠĠĠĠĠ Ġcoroutine Scope Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġdefer Ġto ĠGeneric K 8 s Resource Handler Ġto Ġget Ġthe Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfrom Ġthe Ġk 8 s Ġcluster ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanifest Ġ= Ġcloud Driver K 8 s Service . get K 8 s Resource ( r )?. manifest ?. to < K 8 s Object Manifest >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġnotify Ġchange Ġto Ġthe Ġk 8 s Ġvanilla Ġimage Ġartifact Ġbased ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġon Ġretrieved Ġdata ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġimage String Ġ= Ġfind ( it . spec Ġ?: Ġmutable Map Of (), ĠIMAGE ) Ġas ĠString ? ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġimage String ?. let Ġ{ Ġimage Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Tag ( image )?. let Ġ{ Ġtag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Deploy ed Ġartifact Ġ$ image Ġfor Ġ${ r . application }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Artifact Deploy ed ( r , Ġtag ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" image Ġvalue , Ġ$ it , Ġdoes Ġnot Ġcontain Ġa Ġvalid Ġcontainer Ġtag ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmanifest ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġupsert ( ĊĠĠĠĠĠĠĠ Ġresource : ĠResource < K 8 s Resource Spec >, ĊĠĠĠĠĠĠĠ Ġdiff : ĠResource Diff < K 8 s Object Manifest > ĊĠĠĠ Ġ): ĠList < Task > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġsend Ġa Ġnotification Ġon Ġattempt Ġto Ġdeploy Ġthe Ġimage Ġartifact ĊĠĠĠĠĠĠĠ Ġval Ġimage String Ġ= Ġfind ( resource . spec . template . spec Ġ?: Ġmutable Map Of (), Ġ" image ") Ġas ĠString ? ĊĠĠĠĠĠĠĠ Ġimage String ?. let { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Tag ( it )?. let Ġ{ Ġtag Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Deploy ing Ġartifact Ġ$ it Ġfor Ġ${ resource . application }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnotify Artifact Deploy ing ( resource , Ġtag ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" image Ġvalue , Ġ$ it , Ġdoes Ġnot Ġcontain Ġa Ġvalid Ġcontainer Ġtag ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Ġthen Ġdefer Ġto ĠGeneric K 8 s Resource Handler Ġto Ġdeploy ĊĠĠĠĠĠĠĠ Ġ// Ġk 8 s Ġresource Ġto Ġthe Ġcluster ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . upsert ( resource , Ġdiff ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Tag ( image String : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatch Result Ġ= Ġtag Regex . find ( image String ) ĊĠĠĠĠĠĠĠ Ġmatch Result ?. group Values ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsize Ġshould Ġbe Ġthe Ġnumber Ġof Ġregex Ġcapture Ġgroup Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . size Ġ== Ġ 2 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġit [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug (" regex , Ġ${ tag Regex . pattern }, Ġon Ġimage Ġ$ image String Ġdid Ġnot Ġresult Ġin Ġ 2 Ġstrings . Ġresult : Ġ$ it ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġsuspend Ġfun Ġact uation InProgress ( resource : ĠResource < K 8 s Resource Spec >): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġresource ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. spec . template . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġor ca Service . getC orre lated Execution s ( it . name ()). isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ċ Ċ }