/* Ċ Ġ* ĠTencent Ġis Ġplease d Ġto Ġsupport Ġthe Ġopen Ġsource Ġcommunity Ġby Ġmaking ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġavailable . Ċ Ġ* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠTH L ĠA 2 9 ĠLimited , Ġa ĠTencent Ġcompany . Ġ ĠAll Ġrights Ġreserved . Ċ Ġ* Ċ Ġ* ĠB K - CI Ġ èĵĿ é² ¸ æĮģ ç»Ń éĽĨ æĪĲ å¹³åı° Ġis Ġlicensed Ġunder Ġthe ĠMIT Ġlicense . Ċ Ġ* Ċ Ġ* ĠA Ġcopy Ġof Ġthe ĠMIT ĠLicense Ġis Ġincluded Ġin Ġthis Ġfile . Ċ Ġ* Ċ Ġ* Ċ Ġ* ĠTerms Ġof Ġthe ĠMIT ĠLicense : Ċ Ġ* Ġ------------------------------------------------ --- Ċ Ġ* ĠPermission Ġis Ġhereby Ġgranted , Ġfree Ġof Ġcharge , Ġto Ġany Ġperson Ġobtaining Ġa Ġcopy Ġof Ġthis Ġsoftware Ġand Ġassociated Ġdocumentation Ċ Ġ* Ġfiles Ġ( the Ġ" Software "), Ġto Ġdeal Ġin Ġthe ĠSoftware Ġwithout Ġrestriction , Ġincluding Ġwithout Ġlimitation Ġthe Ġrights Ġto Ġuse , Ġcopy , Ċ Ġ* Ġmodify , Ġmerge , Ġpublish , Ġdistribute , Ġsublicense , Ġand / or Ġsell Ġcopies Ġof Ġthe ĠSoftware , Ġand Ġto Ġpermit Ġpersons Ġto Ġwhom Ġthe Ċ Ġ* ĠSoftware Ġis Ġfurnished Ġto Ġdo Ġso , Ġsubject Ġto Ġthe Ġfollowing Ġconditions : Ċ Ġ* Ċ Ġ* ĠThe Ġabove Ġcopyright Ġnotice Ġand Ġthis Ġpermission Ġnotice Ġshall Ġbe Ġincluded Ġin Ġall Ġcopies Ġor Ġsubstantial Ġportions Ġof Ġthe ĠSoftware . Ċ Ġ* Ċ Ġ* ĠTHE ĠSOFTWARE ĠIS ĠPROVIDED Ġ" AS ĠIS ", ĠWITHOUT ĠWARRANTY ĠOF ĠANY ĠKIND , ĠEXPRESS ĠOR ĠIMPLIED , ĠINCLUDING ĠBUT ĠNOT Ċ Ġ* ĠLIMITED ĠTO ĠTHE ĠWARRANTIES ĠOF ĠMERCHANTABILITY , ĠFITNESS ĠFOR ĠA ĠPARTICULAR ĠPURPOSE ĠAND ĠNONINFRINGEMENT . ĠIN Ċ Ġ* ĠNO ĠEVENT ĠSHALL ĠTHE ĠAUTHORS ĠOR ĠCOPYRIGHT ĠHOLDERS ĠBE ĠLIABLE ĠFOR ĠANY ĠCLAIM , ĠDAMAGES ĠOR ĠOTHER ĠLIABILITY , Ċ Ġ* ĠWHETHER ĠIN ĠAN ĠACTION ĠOF ĠCONTRACT , ĠTORT ĠOR ĠOTHERWISE , ĠARISING ĠFROM , ĠOUT ĠOF ĠOR ĠIN ĠCONNECTION ĠWITH ĠTHE Ċ Ġ* ĠSOFTWARE ĠOR ĠTHE ĠUSE ĠOR ĠOTHER ĠDEALINGS ĠIN ĠTHE ĠSOFTWARE . Ċ Ġ*/ Ċ Ċ package Ġcom . tencent . devops . dispatch . utils Ċ Ċ import Ġcom . fasterxml . jackson . databind . ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . tencent . devops . common . api . util . Json Util Ċ import Ġcom . tencent . devops . common . redis . Redis Lock Ċ import Ġcom . tencent . devops . common . redis . Redis Operation Ċ import Ġcom . tencent . devops . dispatch . dao . Pipeline Docker Host Dao Ċ import Ġcom . tencent . devops . dispatch . dao . Pipeline Docker IP Info Dao Ċ import Ġcom . tencent . devops . dispatch . dao . Pipeline Docker Pool Dao Ċ import Ġcom . tencent . devops . dispatch . exception . Docker ServiceException Ċ import Ġcom . tencent . devops . dispatch . pojo . Docker Host Load Config Ċ import Ġcom . tencent . devops . dispatch . pojo . enums . Pipeline Task Status Ċ import Ġcom . tencent . devops . dispatch . utils . redis . Redis Utils Ċ import Ġcom . tencent . devops . model . dispatch . tables . records . T Dispatch Pipeline Docker Ip Info Record Ċ import Ġorg . jooq . DSL Context Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . beans . factory . annotation . Value Ċ import Ġorg . springframework . stereotype . Component Ċ import Ġjava . net . URL Encoder Ċ Ċ @ Component Ċ class ĠDocker Host Utils Ġ@ Autowired Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġredis Operation : ĠRedis Operation , ĊĠĠĠ Ġprivate Ġval ĠobjectMapper : ĠObjectMapper , ĊĠĠĠ Ġprivate Ġval Ġredis Utils : ĠRedis Utils , ĊĠĠĠ Ġprivate Ġval Ġpipeline Docker Ip Info Dao : ĠPipeline Docker IP Info Dao , ĊĠĠĠ Ġprivate Ġval Ġpipeline Docker Host Dao : ĠPipeline Docker Host Dao , ĊĠĠĠ Ġprivate Ġval Ġpipeline Docker Pool Dao : ĠPipeline Docker Pool Dao , ĊĠĠĠ Ġprivate Ġval Ġd sl Context : ĠDSL Context Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠLOAD _ CONFIG _ KEY Ġ= Ġ" docker host - load - config " ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlogger Ġ= ĠLoggerFactory . getLogger ( Docker Host Utils :: class . java ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġbuild PoolSize Ġ= Ġ 1 0 0 Ġ// Ġ åįķ ä¸ª æµģ æ°´ çº¿ åı¯ åĲĮæĹ¶ æī§è¡Į çļĦ ä»»åĬ¡ æķ°éĩı ĊĊĠĠĠ Ġ@ Value ("\ ${ devops Gateway . id c Proxy }") ĊĠĠĠ Ġval Ġid c Proxy : ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġfun Ġget Available Docker Ip With Special Ips ( projectId : ĠString , Ġpipeline Id : ĠString , Ġvm Seq Id : ĠString , Ġspecial Ip Set : ĠSet < String >, Ġun Available Ip List : ĠSet < String > Ġ= Ġset Of ()): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġgray Env Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġgray Ġ= ĠSystem . getProperty (" gray . project ", Ġ" none ") ĊĠĠĠĠĠĠĠ Ġif Ġ( gray Ġ== Ġ" gray project ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgray Env Ġ= Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġdocker Pair Ġ= ĠPair ("", Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġ// Ġèİ·åıĸ è´Ł è½½ éħįç½® ĊĠĠĠĠĠĠĠ Ġval Ġdocker Host Load Config Triple Ġ= Ġget Load Config () ĊĠĠĠĠĠĠĠ Ġlogger . info (" Docker Ġhost Ġload Ġconfig : Ġ${ Json Util . toJson ( docker Host Load Config Triple )} ") ĊĊĠĠĠĠĠĠĠ Ġ// ĠåĪ¤æĸŃ æµģ æ°´ çº¿ ä¸Ĭ æ¬¡ åħ³èģĶ çļĦ host Tag ï¼Į å¦Ĥæŀľ åŃĺåľ¨ å¹¶ä¸Ķ æŀĦå»º æľº å®¹ éĩı ç¬¦åĲĪ ç¬¬äºĮ æ¡£ è´Ł è½½ åĪĻ ä¼ĺåħĪ åĪĨéħį ï¼Ī åħ¼ å®¹ æĹ§ çīĪæľ¬ çŃĸçķ¥ ï¼Į éĻį ä½İ çīĪæľ¬ æĽ´æĸ° æĹ¶ è¢« éĩįæĸ° æ´ Ĺ çīĮ çļĦ æ¦Ĥ çİĩ ï¼ī ĊĠĠĠĠĠĠĠ Ġval Ġlast Host Ip Ġ= Ġredis Utils . get Docker Build Last Host ( pipeline Id , Ġvm Seq Id ) ĊĠĠĠĠĠĠĠ Ġ// Ġæ¸ ħ éĻ¤ æĹ§ åħ³ç³» ĊĠĠĠĠĠĠĠ Ġredis Utils . delete Docker Build Last Host ( pipeline Id , Ġvm Seq Id ) ĊĠĠĠĠĠĠĠ Ġif Ġ( last Host Ip Ġ!= Ġnull Ġ&& Ġlast Host Ip . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlast Host Ip Info Ġ= Ġpipeline Docker Ip Info Dao . get Docker Ip Info ( dsl Context , Ġlast Host Ip ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Host Ip Info Ġ!= Ġnull Ġ&& Ġspecial Ip Set . isNotEmpty () Ġ&& Ġspecial Ip Set . contains ( last Host Ip )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("$ projectId |$ pipeline Id |$ vm Seq Id Ġlast Host Ip : Ġ$ last Host Ip Ġin Ġspecial Ip Set : Ġ$ special Ip Set , Ġchoose Ġthe Ġlast Host Ip Info Ġas Ġavailable Docker Ip .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( last Host Ip , Ġlast Host Ip Info . docker Host Port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Host Ip Info Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Ip Set . isEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Host Ip Info . enable Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Host Ip Info . disk Load Ġ< Ġdocker Host Load Config Triple . second . disk Load Threshold Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Host Ip Info . mem Load Ġ< Ġdocker Host Load Config Triple . second . mem Load Threshold Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Host Ip Info . cpu Load Ġ< Ġdocker Host Load Config Triple . second . cpu Load Threshold ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info ("$ projectId |$ pipeline Id |$ vm Seq Id Ġlast Host Ip : Ġ$ last Host Ip Ġload Ġenable , Ġlast Host Ip Info :$ last Host Ip Info . Ġspecial Ip Set Ġis Ġempty , Ġchoose Ġthe Ġlast Host Ip Info Ġas Ġavailable Docker Ip .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( last Host Ip , Ġlast Host Ip Info . docker Host Port ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// Ġ åħĪ åıĸ å®¹ éĩı è´Ł è½½ æ¯Ķè¾ĥ å°ı çļĦ ï¼Į åĲĮæĹ¶ æ»¡è¶³ ç£ ģ çĽĺ ç©ºéĹ´ ä½¿çĶ¨ çİĩ å°ı äºİ 6 0 % å¹¶ä¸Ķ åĨħåŃĺ CPU ä½¿çĶ¨ çİĩ åĿĩ ä½İ äºİ 8 0 %( è´Ł è½½ éĺ Ī åĢ¼ åħ·ä½ĵ çĶ± OP å¹³åı° éħįç½® )ï¼Į ä»İ æ»¡è¶³ çļĦ èĬĤçĤ¹ ä¸Ń éĢīæĭ© ç£ ģ çĽĺ ç©ºéĹ´ ä½¿çĶ¨ çİĩ æľĢå°ı çļĦ ĊĠĠĠĠĠĠĠ Ġval Ġfirst Load Config Ġ= Ġdocker Host Load Config Triple . first ĊĠĠĠĠĠĠĠ Ġval Ġfirst Docker Ip List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Docker Ip Info Dao . get Available Docker Ip List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgray Env Ġ= Ġgray Env , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Load Ġ= Ġfirst Load Config . cpu Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Load Ġ= Ġfirst Load Config . mem Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Load Ġ= Ġfirst Load Config . disk Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk I OL o ad Ġ= Ġfirst Load Config . disk I OL o ad Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Ip Set Ġ= Ġspecial Ip Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġif Ġ( first Docker Ip List . isNotEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" first Docker Ip List : Ġ$ first Docker Ip List ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Pair Ġ= Ġselect Available Docker Ip ( first Docker Ip List , Ġun Available Ip List ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġæ ² ¡ æľī æ»¡è¶³ 1 çļĦ ï¼Į ä¼ĺåħĪ éĢīæĭ© ç£ ģ çĽĺ ç©ºéĹ´ ï¼Į åĨħåŃĺ ä½¿çĶ¨ çİĩ åĿĩ ä½İ äºİ 8 0 % çļĦ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Load Config Ġ= Ġdocker Host Load Config Triple . second ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Docker Ip List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Docker Ip Info Dao . get Available Docker Ip List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgray Env Ġ= Ġgray Env , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Load Ġ= Ġsecond Load Config . cpu Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Load Ġ= Ġsecond Load Config . mem Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Load Ġ= Ġsecond Load Config . disk Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk I OL o ad Ġ= Ġsecond Load Config . disk I OL o ad Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Ip Set Ġ= Ġspecial Ip Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( second Docker Ip List . isNotEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Pair Ġ= Ġselect Available Docker Ip ( second Docker Ip List , Ġun Available Ip List ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠéĢļè¿ĩ 2 ä¾Ŀ æĹ§ æ²¡æľī æī¾åĪ° æ»¡è¶³ çļĦ æŀĦå»º æľº ï¼Į éĢīæĭ© åĨħåŃĺ ä½¿çĶ¨ çİĩ å°ı äºİ 8 0 % çļĦ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthird Load Config Ġ= Ġdocker Host Load Config Triple . third ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġthird Docker Ip List Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Docker Ip Info Dao . get Available Docker Ip List ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgray Env Ġ= Ġgray Env , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Load Ġ= Ġthird Load Config . cpu Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Load Ġ= Ġthird Load Config . mem Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Load Ġ= Ġthird Load Config . disk Load Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk I OL o ad Ġ= Ġthird Load Config . disk I OL o ad Threshold , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġspecial Ip Set Ġ= Ġspecial Ip Set ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( third Docker Ip List . isNotEmpty ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Pair Ġ= Ġselect Available Docker Ip ( third Docker Ip List , Ġun Available Ip List ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( docker Pair . first . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( special Ip Set . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDocker ServiceException (" Start Ġbuild ĠDocker ĠVM Ġfailed , Ġno Ġavailable ĠDocker ĠVM Ġin Ġ$ special Ip Set ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDocker ServiceException (" Start Ġbuild ĠDocker ĠVM Ġfailed , Ġno Ġavailable ĠDocker ĠVM .") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġdocker Pair ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Available Docker Ip ( projectId : ĠString , Ġpipeline Id : ĠString , Ġvm Seq Id : ĠString , Ġun Available Ip List : ĠSet < String >): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġ åħĪ åĪ¤æĸŃ æĺ¯åĲ¦ OP å·² éħįç½® ä¸ĵ æľº ï¼Į èĭ¥ éħįç½® äºĨ ä¸ĵ æľº ï¼Į ä»İ ä¸ĵ æľº åĪĹè¡¨ ä¸Ń éĢīæĭ© ä¸Ģä¸ª å®¹ éĩı æľĢå°ı çļĦ ĊĠĠĠĠĠĠĠ Ġval Ġspecial Ip Set Ġ= Ġpipeline Docker Host Dao . getHost Ips ( dsl Context , ĠprojectId ). toSet () ĊĠĠĠĠĠĠĠ Ġlogger . info (" get Available Docker Ip ĠprojectId : Ġ$ projectId Ġ| Ġspecial Ip Set : Ġ$ special Ip Set ") ĊĠĠĠĠĠĠĠ Ġreturn Ġget Available Docker Ip With Special Ips ( projectId , Ġpipeline Id , Ġvm Seq Id , Ġspecial Ip Set , Ġun Available Ip List ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Load Config ( load ConfigMap : ĠMap < String , ĠDocker Host Load Config >) Ġ{ ĊĠĠĠĠĠĠĠ Ġredis Operation . set ( LOAD _ CONFIG _ KEY , ĠJson Util . toJson ( load ConfigMap )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġget Idle Pool No ( ĊĠĠĠĠĠĠĠ Ġpipeline Id : ĠString , ĊĠĠĠĠĠĠĠ Ġvm Seq : ĠString ĊĠĠĠ Ġ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlock Ġ= ĠRedis Lock ( redis Operation , Ġ" DISPATCH _ DE VC LO UD _ LOCK _ CONTAINER _${ pipeline Id }_ $ vm Seq ", Ġ 3 0 ) ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . try Lock () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 1 .. build PoolSize ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . info (" pool No Ġis Ġ$ i ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpool No Ġ= Ġpipeline Docker Pool Dao . get Pool No Status ( dsl Context , Ġpipeline Id , Ġvm Seq , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool No Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Docker Pool Dao . create ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġd sl Context Ġ= Ġd sl Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Id Ġ= Ġpipeline Id , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvm Seq Ġ= Ġvm Seq , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpool No Ġ= Ġi , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstatus Ġ= ĠPipeline Task Status . RUNNING . status ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pool No . status Ġ== ĠPipeline Task Status . RUNNING . status ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpipeline Docker Pool Dao . update Pool Status ( dsl Context , Ġpipeline Id , Ġvm Seq , Ġi , ĠPipeline Task Status . RUNNING . status ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDocker ServiceException (" æŀĦå»º æľº åĲ¯åĬ¨ å¤±è´¥ ï¼Į æ²¡æľī ç©º éĹ ² çļĦ æŀĦå»º æľº äºĨ ï¼ģ ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error ("$ pipeline Id |$ vm Seq Ġget Idle Pool No Ġerror .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠDocker ServiceException (" å®¹åĻ¨ å¹¶ åıĳ æ±ł åĪĨéħį å¼Ĥå¸¸ ") ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlock . unlock () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun ĠgetId c 2 Dev net Proxy Url ( ĊĠĠĠĠĠĠĠ Ġdev net Uri : ĠString , ĊĠĠĠĠĠĠĠ Ġdocker Ip : ĠString , ĊĠĠĠĠĠĠĠ Ġdocker Host Port : ĠInt Ġ= Ġ 0 ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġurl Ġ= Ġif Ġ( docker Host Port Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocker Ip Info Ġ= Ġpipeline Docker Ip Info Dao . get Docker Ip Info ( dsl Context , Ġdocker Ip ) Ġ?: Ġthrow ĠDocker ServiceException (" Docker ĠIP : Ġ$ docker Ip Ġis Ġnot Ġavailable .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// $ docker Ip :${ docker Ip Info . docker Host Port }$ dev net Uri " ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" http :// $ docker Ip :$ docker Host Port $ dev net Uri " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġ"$ id c Proxy / proxy - dev net ? url =${ url Encode ( url )}" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġurl Encode ( s : ĠString ) Ġ= ĠURL Encoder . encode ( s , Ġ" UTF - 8 ") ĊĊĠĠĠ Ġprivate Ġfun Ġget Load Config (): ĠTrip le < Docker Host Load Config , ĠDocker Host Load Config , ĠDocker Host Load Config > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġload Config Ġ= Ġredis Operation . get ( LOAD _ CONFIG _ KEY ) ĊĠĠĠĠĠĠĠ Ġif Ġ( load Config Ġ!= Ġnull Ġ&& Ġload Config . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocker Host Load Config Ġ= ĠobjectMapper . readValue < Map < String , ĠDocker Host Load Config >>( load Config ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Host Load Config [" first "] Ġ?: ĠDocker Host Load Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Load Threshold Ġ= Ġ 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Load Threshold Ġ= Ġ 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Load Threshold Ġ= Ġ 6 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk I OL o ad Threshold Ġ= Ġ 8 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Host Load Config [" second "] Ġ?: ĠDocker Host Load Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Load Threshold Ġ= Ġ 9 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Load Threshold Ġ= Ġ 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Load Threshold Ġ= Ġ 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk I OL o ad Threshold Ġ= Ġ 9 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Host Load Config [" third "] Ġ?: ĠDocker Host Load Config ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcpu Load Threshold Ġ= Ġ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmem Load Threshold Ġ= Ġ 8 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk Load Threshold Ġ= Ġ 1 0 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdisk I OL o ad Threshold Ġ= Ġ 1 0 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlogger . error (" Get Ġdocker host Ġload Ġconfig Ġfrom Ġredis Ġfail .", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠTrip le ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Ġ= ĠDocker Host Load Config ( 8 0 , Ġ 8 0 , Ġ 8 0 , Ġ 8 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsecond Ġ= ĠDocker Host Load Config ( 9 0 , Ġ 8 0 , Ġ 8 0 , Ġ 9 0 ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthird Ġ= ĠDocker Host Load Config ( 1 0 0 , Ġ 8 0 , Ġ 1 0 0 , Ġ 1 0 0 ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġselect Available Docker Ip ( ĊĠĠĠĠĠĠĠ Ġdocker Ip List : ĠList < T Dispatch Pipeline Docker Ip Info Record >, ĊĠĠĠĠĠĠĠ Ġun Available Ip List : ĠSet < String > Ġ= Ġset Of () ĊĠĠĠ Ġ): ĠPair < String , ĠInt > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( un Available Ip List . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( docker Ip List [ 0 ]. docker Ip , Ġdocker Ip List [ 0 ]. docker Host Port ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocker Ip List . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( un Available Ip List . contains ( it . docker Ip )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair ( it . docker Ip , Ġit . docker Host Port ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠPair ("", Ġ 0 ) ĊĠĠĠ Ġ} Ċ }