package Ġcom . netflix . spin n aker . ke el . resources Ċ Ċ import Ġcom . fasterxml . jackson . databind . 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 Kind Ċ import Ġcom . netflix . spin n aker . ke el . api . Resource Spec Ċ import Ġde . h ux h orn . s ulk y . ul id . UL ID Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . stereotype . Component Ċ Ċ /** Ċ Ġ* ĠProvides Ġlogic Ġto Ġconstruct Ġresources Ġand Ġauto - migrate Ġtheir Ġspecs Ġto Ġthe Ġlatest Ġversion . Ċ Ġ*/ Ċ @ Component Ċ class ĠResource Factory ( ĊĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper , ĊĠ Ġprivate Ġval Ġresource Spec Identifier : ĠResource Spec Identifier , ĊĠ Ġprivate Ġval Ġspec Migr ators : ĠList < Spec Migr ator < *, Ġ* >> Ċ ) Ġ{ ĊĠ Ġprivate Ġval Ġlog Ġby Ġlazy Ġ{ ĠLoggerFactory . getLogger ( java Class ) Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ return Ġa Ġ[ Resource ] Ġof Ġthe Ġspecified Ġ[ kind ] Ġwith Ġthe Ġgiven Ġmetadata Ġand Ġspec , Ġpotentially Ġmodified ĊĠĠ Ġ* Ġby Ġrunning Ġany Ġapplicable Ġspec Ġmigrations Ġ( i . e . Ġthe Ġresource Ġmay Ġhave Ġa Ġdifferent Ġspec Ġversion Ġthan ĊĠĠ Ġ* Ġthe Ġone Ġdefined Ġin Ġthe Ġspec ĠJSON ). ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcreate ( kind : ĠString , Ġmetadata Json : ĠString , Ġspec Json : ĠString ) Ġ= ĊĠĠĠ Ġcreate Raw ( kind , Ġmetadata Json , Ġspec Json ). migrate Me () ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ return Ġa Ġ[ Resource ] Ġof Ġthe Ġspecified Ġ[ kind ] Ġwith Ġthe Ġgiven Ġmetadata Ġand Ġspec , Ġwithout Ġrunning ĊĠĠ Ġ* Ġany Ġspec Ġmigrations Ġ( i . e . Ġthe Ġresource Ġwill Ġhave Ġthe Ġexact Ġspec Ġversion Ġas Ġdefined Ġin Ġthe Ġspec ). ĊĠĠ Ġ*/ ĊĠ Ġfun Ġcreate Raw ( kind : ĠString , Ġmetadata Json : ĠString , Ġspec Json : ĠString ) Ġ= ĊĠĠĠ ĠResource Kind . parse Kind ( kind ). let Ġ{ ĊĠĠĠĠĠ ĠResource ( ĊĠĠĠĠĠĠĠ Ġit , ĊĠĠĠĠĠĠĠ ĠobjectMapper . readValue < Map < String , ĠAny ?> >( metadata Json ). as Resource Metadata (), ĊĠĠĠĠĠĠĠ ĠobjectMapper . readValue ( spec Json , Ġresource Spec Identifier . identify ( it )) ĊĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠ Ġ/** ĊĠĠ Ġ* Ġ@ return Ġthe Ġ[ Resource ] Ġafter Ġrunning Ġany Ġapplicable Ġspec Ġmigrations Ġ( i . e . Ġthe Ġreturned Ġresource Ġmay ĊĠĠ Ġ* Ġhave Ġa Ġdifferent Ġ[ Resource Spec ] Ġthan Ġthe Ġone Ġoriginally Ġin Ġthe Ġresource ). ĊĠĠ Ġ*/ ĊĠ Ġfun Ġmigrate ( resource : ĠResource < *> ): ĠResource < *> Ġ= ĊĠĠĠ Ġspec Migr ators ĊĠĠĠĠĠ Ġ. migrate ( resource . kind , Ġresource . spec ) ĊĠĠĠĠĠ Ġ. let Ġ{ Ġ( end Kind , Ġend Spec ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( resource . kind Ġ!= Ġend Kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . debug (" Migr ated Ġresource Ġ${ resource . id } Ġof Ġkind Ġ${ resource . kind } Ġto Ġ$ end Kind ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ ĠResource ( end Kind , Ġresource . metadata , Ġend Spec ) ĊĠĠĠĠĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠResource <* >. migrate Me () Ġ= Ġmigrate ( this ) ĊĊĠ Ġprivate Ġfun ĠMap < String , ĠAny ?> . as Resource Metadata (): ĠMap < String , ĠAny ?> Ġ= ĊĠĠĠ Ġmap Values Ġ{ Ġif Ġ( it . key Ġ== Ġ" uid ") ĠU L ID . parse UL ID ( it . value . toString ()) Ġelse Ġit . value Ġ} Ċ } Ċ