package Ġcom . netflix . spin n aker . ke el . act uation Ċ Ċ import Ġcom . netflix . spin n aker . ke el . api . Delivery Config Ċ import Ġcom . netflix . spin n aker . ke el . api . Environment Ċ import Ġcom . netflix . spin n aker . ke el . constraints . Constraint Evaluator Ċ import Ġcom . netflix . spin n aker . ke el . persistence . Artifact Repository Ċ import Ġcom . netflix . spin n aker . ke el . telemetry . Artifact Version Approved Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . context . Application Event Publisher Ċ import Ġorg . springframework . stereotype . Component Ċ Ċ @ Component Ċ class ĠEnvironment Promotion Checker ( ĊĠ Ġprivate Ġval Ġartifact Repository : ĠArtifact Repository , ĊĠ Ġprivate Ġval Ġconstraints : ĠList < Constraint Evaluator <* >>, ĊĠ Ġprivate Ġval Ġpublisher : ĠApplication Event Publisher Ċ ) Ġ{ ĊĊĠ Ġsuspend Ġfun Ġcheck Environments ( delivery Config : ĠDelivery Config ) Ġ{ ĊĠĠĠ Ġdelivery Config ĊĠĠĠĠĠ Ġ. artifacts ĊĠĠĠĠĠ Ġ. associate With Ġ{ Ġartifact Repository . versions ( it ) Ġ} ĊĠĠĠĠĠ Ġ. forEach Ġ{ Ġ( artifact , Ġversions ) Ġ-> ĊĠĠĠĠĠĠĠ Ġif Ġ( versions . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġlog . warn (" No Ġversions Ġfor Ġ${ artifact . type } Ġartifact Ġ${ artifact . name } Ġare Ġknown ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġdelivery Config . environments . forEach Ġ{ Ġenvironment Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġif Ġ( environment . constraints . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversions . first OrNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversions . first OrNull Ġ{ Ġv Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints . all Ġ{ Ġconstraint Evaluator Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! environment . has Supported Constraint ( constraint Evaluator ) Ġ|| Ġconstraint Evaluator . can Prom ote ( artifact , Ġv , Ġdelivery Config , Ġenvironment . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( version Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . warn (" No Ġversion Ġof Ġ{} Ġpasses Ġconstraints Ġfor Ġenvironment Ġ{}", Ġartifact . name , Ġenvironment . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis New Version Ġ= Ġartifact Repository ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. approve Version For ( delivery Config , Ġartifact , Ġversion , Ġenvironment . name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( isNew Version ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Approved Ġ{} Ġ{} Ġversion Ġ{} Ġfor Ġ{} Ġenvironment Ġ{} Ġin Ġ{}", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelivery Config . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelivery Config . application ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpublisher . publish Event ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠArtifact Version Approved ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelivery Config . application , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdelivery Config . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenvironment . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact . name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġartifact . type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġversion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠEnvironment . has Supported Constraint ( constraint Evaluator : ĠConstraint Evaluator <* >) Ġ= ĊĠĠĠ Ġconstraints . any Ġ{ Ġit . java Class . isAssignableFrom ( constraint Evaluator . constraint Type ) Ġ} ĊĊĠ Ġprivate Ġval Ġlog Ġby Ġlazy Ġ{ ĠLoggerFactory . getLogger ( java Class ) Ġ} Ċ } Ċ