From 30926eed0010c753f20b21f7876c11ddbbfff853 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Wed, 21 Sep 2022 17:27:20 -0500 Subject: [PATCH 001/269] added diagrams Signed-off-by: Hao Luo --- .../scaffolder-task-broker-blocking.drawio.png | Bin 0 -> 67549 bytes .../scaffolder-task-broker-events.drawio.png | Bin 0 -> 64340 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png create mode 100644 docs/assets/architecture-overview/scaffolder-task-broker-events.drawio.png diff --git a/docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png b/docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..214de226f1e7959e9bb56f91173a6c415f74eb40 GIT binary patch literal 67549 zcmd>l2|Uzm+drB#B{7sWVyq?mo+bNEQi_y)ELq0BuSE!1B4o=}2q}eR&t4HpvXf-r zvL)(&|IAEBr#jC$&pFTYf8WpB`J9^h&2PJ}^?QA<>kiS>P$b?%vj-0kk62krP74o@ zAR7F?A5I94O@3vLrqHQ8rf!(CM0kWT7n-_b4hZpyU=El&;GV|w+ksP-9@yLS;*L67 znxY&r*KR$HkH-m(wsx|#`~IK_+SV3j;`H5#Mh*^W*Y8g=LtA6lh`pH|SO(@I>;s_# zr%a5jaqoe7Iq2wFOH(Hc%()_h+s;-(S(;nmp3KXG{l(bG#LCsqV7efCp=!uD_|94<{Up?Wz{SUTB0h zG4pTt2A+ZyGx%WRwxzhAD-r7*{|kj~XY`w8VTJyK9)2lw0YSlkDRh3EBEAUouD_)iUOueQv5Mj2$0}-@Vt7Td*=4(8gs{i{j$Ux- zd7F$;rXX=*a|PB^w`YT2#P%PonTJPEc*~l9mp^!TM2vo7`V%5TasamiCv55C#~A23wluc|k~9Gb2GWiUlwZKz ztfjF(*jSpHLeNCU0p)1vVPw1oQy{h4K@!`_%7QX1g1GpK1(&>#$^0?Y_`^t!dHo-9 z9Ul)Cf@0qToQBoYcc!#;>_?lxf)P$0E+Kv#Wd56W!pV!Z3#^@RielazXC`PfGe=;% zkTSM|mA_^oK$t(%=06e#uvrcBfbWEeedZtgqaYTZ{ipp=NK}YRP!Rmh$HOPc&ntut z4OpoQ@?%pNPVB$%PH6`RBM6n^PQ#k;Z{^kRqJWU__u3W2rs>~QiMiu%e*V`KEBGTu z(mZkMG$4<_*bG$7iz{Vtpe^Ye1y3L9MH#^q0( z3t{jd_QJoFHE~w5&5?MyzQsuJ0fbe1XNdWcLEAxa3il2C1l2u1_}hO8L2WB+w>TRJ zYyEq*?|1yocW#NxJ3n$dKgUWygd9uBK!ivyh6gFLZaW){xeSQSJ3(=l^z!1{jSpc#+hK&`ki%P4*mI{ zEhvO#*sun`hhzJ;1#MhCygg=%V6i*S_x~Mk4@ZjprI?K^QiOnr|GFSCB0h^HE+GwK zci zgA;i9?A*4;ObjW+4@Fq0TK~iFiiNDWNB+hs837_6INsLvPU!D$V&{N1K{+~F+M0j& z)Gbm90AYGpuY9x+kK#4 ze!J1uHz-tYJp=mob9U^X2q?T;S@TDG_-o4lt1wYO@cV?ok4@fKnD_%Qs;Ve+Pu{V$FA(eLFN7mg@x_gZ327f&y%%31E=5f1^-EP{El7`#PM9)m4U^6+m(S6_NNm-{_5C9{HE!HMXMJUgl#W)!&HMe-;7qW99#+6Yo#t^c{EnPptm$CaXWY zcwD;K=C6Vfa7DSHOhC^CeER=M0AK_3AHtjeG>*iW$B%aS4M*~dexKqoQ%e6sP$dTS z@bPTZFQz7e_;SGYm|`+NrVROgw#U>U4$e^GcCs*nN|~RZ$o_vgxBmyT2cIC8m4P5K zh^+tZWR9aaw;2x<4bGw+{2+C-4&$BqO)_Rx3h7v%aKWBKnOOWeG}A4vdAEP_Ez zs71dWGHxLmY=-_mcYj9<|3qfnc`J+ter+7z<8EGl+?ux`JzV#CyKr#F{+4lI5&kyO zY|TDE0~7xX5%<5Th;4%YnHBP4v-IB*G`2$e(@^nO$>Do5+zz!dznsN#s#~)o-w(Ea z8%)CJ_OF6XoEv=ywf}2q^RGf}NPd5UOZvTIRAZ$`e%(u{=dsnV}l8fPQ)Tg zVIC1Ke%^0?czzdj|74r+uM$u2J%E1BfTzouomX3Bt zP9_#VNa?pEhhv|dZNTI^U{BG|MBC5!j%@_XUx-N1N`IG1afHnGZi#ute-XAZ2Jp-L z$p?5UEK2wnft(+>$3MVS@&CwFv15jYAbt}nk1#~2<~NQL1y<+|j+PnQp-~SVvev)0LY14Ey1QE9A^Mg|DcbF;TS*y!942!e4BDBkNh$! z@{5XaiHZsWB34jTlt)u%KhG&(mVu`I%$VE!?u{Az3r=j4C1 zL*q}Oq+jU~>(w}={R@l6arJ*ok3ZHFGS+AlD-6w#O~^)$?zSc%1sg%#{2v_t$ENH* z*=+rV(y)cazpXDJA#Ansr}Xv5L75-tcUblPjOXOVQS;w9;$II*KnuU^xyF>$zwK+^ z3Jl;NZpS?C`?uZnGsIMLcz6tW%5u`D-Snp~?Cw^7y{aFpJ0{AX#=J*fevJ3j?W=Os zN0_e$knu62D5A8EP?N1Q@;8fzHi-vB9%elCrR~Y*xnBFe&;5>bZ$At;uINs=S1NiB zzJ2QPX5e$V`Ao%|vYCc(TH)Y8gdvOyU%?OjLnb$r>iZ?_!V{PFO7G9(Lp7J3Mw<}F zT&Ag##oePdl8?!ox20r#{LuC)kce`8uIlS;jwt33sXMnHTE5b12%|piIQBe-Q%|TRifPyT*5t&+_s`hApp0OB*Q#yQnEP#! zvxk_f;XDLkQh5kG%kz&NSn@ACxgliRr=(Y6n`PkhDR6P@h3cn|A1Il*&0CW$ZTQ13 z?Y*@Bwo2?(t=npcn~=fp=v?~{&rvF8`5kV zNw+c-BRYnk22E7^?|A4sr!TEWM9HNlA4-w6>yTF@y~jAC$J%g^3GvR7MmTdY9=S3- zLl_?B&G4ca!c=b@P1{LC@v=I+OTy*13%&q;s?T~3L#<73an?S% zW10o$A0zXxq?*Ihq1$x6w3ptp0xEoNB#*^QhRJ~nv5HS)iJcjWBq}$KCQ!aE&1n-c ze_Mh!xG7?fB&Oo=>v?GT&OKQNAI(rL*FoztqR&ULB`tQTTfm4O+Vl$D_RB`@aE=eFp<*ZKmROf)wPDq7B<#E65cilc66KiNUi~$df4=_{#hpQ;q};X zD=)z{20!j@H%8_>NxN|C5Ve%Z_c?ov0Eq`kBzDh5{b z@G^be@==2FYL70bK6?d*i?FbdK2u%!$Rc9#>wHBoWJx6UJNGXfDYflCh9GzBE48mB z|J1^9FZkdvss4u%)B)c|&*VA`R?KX^9>Ui*bY};$mSyNJAFS|nWq7j!{Ba_LE#=n5 z*SR4@F}Ba$KCTY>h89J99D9-Rw#YoxYY6y2=A9Iet9$md+g(5Dp8Ro;Dk7*sjrpDb zu@Y)mn45q2lij5|!la%f;KFnE8J^A2EDsH92oMhsF0k5vd~DhreL7Evw`{KRv+=-( znck9DH#qeyHrJO&8a_?FzMJFqY4LQH%7I+Xv`ga#?7Q!vpT`apK9chb$-H5P%Bp3o zCbAX@Sepy;^MT9p&2bx4s)2~b9MCS^BW)cx*YhZJ&w(RyU=?@z9y^|DO%go}{5D3^ z(X1t&mnlm<@r)b%)NM88=Id-E9xG(#)Z7=!3z~<_jh{F^ax6`qMk5B zg^;n3>5VZYG9)vkQuCSKQcK|5t#wnv(?weABM7QWnc5vx&mX!hFMqN#TINIoGev4{ z#Os5n-HnsbrB$fjLvTN3mEqc&w5HudVlC=tv?KSs-drVKquvBBmXoTk%R~fDw!&xj z2|&Eui(mD^vufh*Tf613V`|J2CP!woRe;*GLs;L`!`*gZex3?HnQg$GpfqWIs;h|r znA&ww0nLa|O@S_aXM0qi@z5`7Ng`2K_EO6L>pW3dZawub;&|oz$CL(M?OJpX3}rS6 zH6%P&%5%bv>#w#0Ys%3~lR-?42LbJ@*R7G_$03Syozh|^dhyBh=NJ4FFxbW zv3zw~B{=g!JQHJdL$Q>fnA5n_(;$+Ft9^k?(H2uPC4>6}b}v={#|v)CybmgZj znL%7<3(n(5m;!_#dn2d>VI#5Jc`Ds|LRzk(gDIqJxc_;IgqZVepYBGY211&@_M1#nbK`-F} zD{hirF+Fr5`54QWE9PN(iwY6UaLUP;-jy}9Qg5*h`XZ%oQ0F~^<5J8EUmIqeb%kOS z7hk5y?k1ZJu#?g2ZrJ62qwYXyjcnM8ojBgiAyJ3X8z1`0^IM7Xgei~C3Njh)!Z@Cl zxwYNfal||^R8*+3*BGb&p-olPQWI5@NYqlGxp;ffT1#3=OT9>2F`j;?u* zu(i^=Axy5U8`sxEcv$~|X|uYy+~wpb0gv4;KB&A%=?$v5;3YnW;JAc)FjXM zLu<0|Cg*zEgtfB1VRC((l{u_0*l%#GVsOd%UHnJcRB>r$X;bD;?h{#Y7DLtkmz03D zDBQb{Dd(`hG$Gwa)na3AZ8Z0`D9B@Vmaf#vgxP66fQI{He28gbsEEUqNcW9ngiOV) zj12dkr@Dwc(Mw7#9xV8EABTfYMUrj>B`CGzyNW80c8OaXFY{@Mvr%yuF36?!n!!dc zV_qY?EqmmQge)_QG(pHQuQfYOq-D9G@e2Dn#^~L#akBN}FFp@lCaH5NSyE{+56e`w zox2&5`H4@BJ>qt(Phv?i3xZDYVhlr~8It<2Moq9O`va;ORHn`ed3{5Za1nq8>keT= zPWu%x)<*AkMM{}h(5ox~l$)^P-Q z@E&dY56JM6JD2-=8u%NE!Wk}uR7`Hd($^)_blZ#m12sU>sGDN01><7Huix9)zAfnM zxv{_>^vK%)p*$h)=;$R|wXaTR>IISY7EJYD zV;U-PpA+_ecf5Av?GA8~@6Gr}`>ueXFV01U|CRBU@c?baGM=y{^i0D9ZBZlTeY0ttYKVSy>k&kWw3ygC+4<<}S=S(CKEI57YAweY~^hm{I{a5B0( z#50EqZl(HXr_mQR| z$;I%|-FwN!kMn#%Hk>%5S9F^Yq`UXS)$lbE{3jpv6`rnbt`1r*jy5B`3r>dV^{z=E z&6=91cV|TlHc+?5a-3zzy2m?XBhdBWE?U6Gf%+>18GVJ!!$X28b?6Dh{JxTE3eKTK z1Q{&$`kFCEk3F|icwnKyZ>6D`cI5u$Bi@_BS~~BPz|*OBpWDb2f)aQ5VO@kmH6MY- zbI*4!B~ju?(H-TH3?aep*3fnFj3&EOQDJ(+Hx39$SjZ2)Ym7K`}-Lv;@9rk)b-)xxhX4)2&sLr+w05rkO zKt-aFjP5LfOa~|oUNkht_323DezgN+mVg$#l!vjDX-p%{m{x!ASn-tH(J_V zvLoK+#ds8~Za0W0WXg^e4Ig8gZc*e*4T5r}BV9fezRau=6Wp32L7UA5z}CZyuaC4O zi@82jw-Z(HlZX~4+z5egd;FwHJ~c2rU=NA!lxRwBy+<9q1-q2+GT+AWh^~o>{(;_} z@f}Na5*`Aes<`&$(}&c=uw7&!rz<}#zW-Q!^6{#@BDkHsFup4TJv`ejtuAA*j}=r~ zauHCx=yV->p0G4}{X_>Sfnja{b&}VSRRLMhzs}b?>vmL^%HIOg0P)514IklaGl3)S zm+upV`4K>{A$wBXvsVi6alC-XL#T-)i<@hR!4?Hor3abL-qR;`J1l)v zHHIC*5bM4;I=oO1hl5vNl$vKD@bOGr>uAao0QC-^U5!G$q2I1kw!TaoQR1g`3k{_Y zymq9cmj`%Tk+`wH81hojHG4~i>QMNa&45_W9Lezw((W$}H%gdeL5aLD@^VPBR|=d? zJYSmaim-F=U*k)pelpe7vHz6=!i^4Dz#DmE{jmekj&+a>TJA`rwoIaI{Sx9?evKOGz(G=x`1eXw&xK?;bsLW`oIOJ?q~#b zy>EOMh)3S+#@IH~Z~&kCXrcYiU|MsSz}5v;>+~Xa4B!IW{<6eH-*+SXLdAe>OlUl@ zyLV8b+KMResU1M+e%xEY_(7#&1U<2}FDO|ANVVYR9H%mshC>%753uZvT2e88oEqk* z0<-NKO1npPq97DuCq|&pdZyj*ZfGUjiIlz8zQE-_vz|bK3O~dD$}@Jkp<>z%A#L~_ zM{QuaSBF*%O6}4d!|h&d)%zA_Gv;OE;TsQUBvh6=BmGA?9M&=;gKyefqOn#kBZ&nB3J&vTijm@irm9i zU3vJ(kUiI#m1RgImPk3zJq(U!RloRzxB%kRsPOv{?B`2)yw@l0oGx>+?AOi$6xAyt z?sA4}a-S}M%AZo?YyziVF@Nt5fo<~exNhjiY{GG(bN_@ZiTx?I@dEl^CfI>LU0pIEieU|~ufhoO* zNH~UApLw0T0z~A>u@=WpzbQ0&nhjLC)If{YOcb(#&$?N=zS|%o!cbpQrtrNq0>Ndj za~hx`U|k+>zida?KeY&mgi}>Mo8uL$0~z=`2sHr$ttik^`&=L#WFN#CPKYnSBtB0UA@`Hwo-hg@njQ*9Fj+j0=Y`VPaJ}bJyCTy) z_EwfN1?LZ!-+k8*o)M?-5u)$@{y?p+=8bVgce%S`^{G#dhkRi&d$e;;A6{1xP)Tt%_G{mnt^)`1apVfwa~~tah=;|?fWj8W0tErG2DLG z+z2^wa;n7ot=3-s^JPXx7*<#_6pu^TxR=WOgA|YS&`@&i&g6|xAIYQTMxQ5~@_PQ1 zBc9hpVZon-o7H%e^+ZY%!~vJqG44bN55cRc#pQQuEc7oU*@|9AcW} zSJHd5GJeowigO{b1>*dGFowhl7~-C|%%p>pcRz3iT($HUjTCWZP%4vUl8%xxBjOAo zlC$;^<7rwh#Y?A=ggjiUe%6G3JyJW{X?oRh49|{^|jbl-=e^;n@JY1B->nm zV}QI%Rh$RVN&sm!7o%~^2;a2@ue{c5-l(Ng=R=;;y!L0JWf5+Dk$v94TI~)Hbl*;r z@Du`oOJj+sMB(pI;toITq zTS-fHeo}q=u3>bRA8`BU5!J+fo^usv`)U<}>5`-ySD1ZLS=DK7@|s);9&W0I2gu&? zSf1?6)#gAP)ps>Q=J*HF3Rp0-s(|Lwe0U7z63!~!s2bhyh@HkVjM$_o70&Qe~lCm9`UT)Nxyggfnc3*x7P(u_SkWt4I zw%~g}m<-p7*jzb(&k^yH*FrMco}1=h2MlXLuwG!VG0wW%8U09)D~0Qn*!GVf8PW>F zLu6?r-@JBERE8nu7>MoRd7(T9P%SZO0RCEK9=N+@ol?`J;HAYt0MsVMqfn^cM-VLG zu{Lic%?`ccP2Ca@t48eHfRF`Wg}vSiG1cy{NQV`unM5MFR{g1=bZ0(7DN%@%PTWls zR`f)){e&Rj?kZi^W4iFB;rzZVlGa%@e5v`g)^Ll&vK2^ z%Ulh~yz-Rha0MYTjok4sYZ+I1?yGF+H(L?UKVzY`F`@XV?t^T!pVbl_0X4r_Cd3d+ zVFYrHQrC8@E%gNGr*)l{JrlYG7@Xl@hmNO=wI-{AFmmeb;WwjJFg{d^oS4fr17>Nr zyJq?x^JghVT>|V%M$VNyiY-k~l4hTO%vZ6o_^k7m^bY4(2lYw?2GDp5u+zfmOg;aJ z&!)%4j?CR4pR1lC*5%w1WhaB5GvvDmFP|k&I{)k|lOGe=@vj^F{+g3V)tCi~Z9#oB z0jl0Rpwo3RkL7Ly6n_0AV1UcvbU>2O9qZJWKYtU!!w@NGb*87>oqyN>Qb0qOywn9R z%LqELGbWt6f?JQ8X0&UQSbYg%nnspN?1Qt2I5XH@c%So|3lEK+61LpnOzbKJ*56%T zwYid5YVEi(ty{La(ks{%qiq6(AckWw3T}P13uR6SZZ8T2DHZ|%!R`Rg2m#M(t(DU< zpCUV%f9_G8uJT49HevRKNr8?BM1KYlT|ElHUQ&sjH8U8KJf;^HT)DBR8pUPbm8W~t zs%4TF$}FVR1fVQBpsPqabz(Kn+q7x^)e+LB1b#Mf@2eQyL01-Bc*45qHIkP(JL~*H zy&1aJ&lpy@HbS(%(u=kPHRe^Tu}LcYbkNXj2f~8~Xn`!7Q{?>BpaewvkfP{&6)QJM z9-SH(nts~S-mM( z_AkyuZfSpbtA`lNe)5t=swCYPBcDr%U;=+}_r;eFP|vf8y%YX{R#W+?Egh50eTM_(ky0Tu!4?aBF8FK6;g2GT+QBpB~KCP=K& z`G20PN>zxUR|kP$L2Q3sl`MSpSzH8g7CGGOTD=7QMw`<`X6gX9N1hNc6Wm%W{2E?s zK2*9F+xEARf-V|kNqCSz31!; zcw|%j67U6boV^jY=Nmn}63}f4@YYhoSRU7wGUS{mJJSF*K3Qb;f@+^a^-0+5;}7(R zX?mOmTpky)=@D38dlylUZ-|AGP#pw94M>o2Ad-s_q;-Pm$Me;05jP7kY28m+hI$@< zk~#X#CSD=CYM}e93xLY!Y*K)t`Pk4zXAEBB872m z?yWX>`o-ly|DDS@cT&=UoclV$m6j`{D9E~ztz^#f)+uA z0y?FgpFzJoWVxyIOZ5(R{>{|T2qgo0Aml7sL??#{c@^@Hse;Eyz%sIW1uNO zW)(k8*?LFTG&PJ~Ss5gjw%PbMZ>~%{w%8A6@FYuz`E5l}y5fSf$|p1BI^azDdz%g- zW?aJ0@;bV)+b=_~DDq>+RYkI?U9jFE9TJd8n8o=;Qi(5x3|=-I79D-ka1Q?gm9>>v zd`C8UCfQeH9<`)#6hAGD>`>aSeFxzi#Cjv3M??9#=_?>0f&g_d??ww^aACDF}L zB-@N!es`n5o=#wrke~-N^M`eJ`d^`6LvLI=p7QQk-QxvzKqFAI*qsSAYPT4y^sf8h z@!X(r?Llm4=6UPq&Oz%v3I^dHl1ASYMjfSTrll})XKh)_Tgtuikq2<-x|A7g)!pWw zv{SblFwt&=6VK<79TH)eUfb8V@e?_HGK<8anut^@W`-gni zYWSiAe8*KrdLBD|&?_E%UsU~U&EIN?&}Y787ybxsbC9)+UT?#?Y?SFIHGto8bnYA9 zaP>2`^t25{zyaITYzKe4@x=Yv8>Muz+@3XgG_%%PdYnO#j@!r4W~R#Nc8%XO6z@WLNbiT@`f(1$aoc~Bk9}DQ7tc1yF`7k^y zX5noRDiv=r2~xTl!JAOh_P(*SZ}A3PSBw*iZ3U-?tLE>qo={nq?~Lo#?fc0Vqw)=s+1U#8SvJv)e@xf zlY_wzjfA*bK-8Be<+)yG$PoBZ>B>6KLys?HHs_X=Xq4Gn0(*{~u;5g)V4#wS?!GM) zJ*}D9sFueP$MSxv)RR4v9b&NmPlFK$|l z5|Pok9T_xKta9+fSerl7q}uKMB509;#uvSEsilg#B;hHYc$_AUfl%~*6=dQ| zB%QVAp6jWUZ>UJLY_9<@W$2YgWe~qRU$lXep?JBg-~#PZSMkDob_0tuCfck{R6p;X%Se^x0B-M3_>G>yxBcATbkUj!BQ_;I7)>dyyWF9yAMk$*=`ayY8Sj~`fuu@Cl!I^kvW1#p38<)Fj!PYm!LP6T|lY!+;*JfYj zB15O=3O!EgW;BddB6LiNPiCocSqMAC+dy*Q9qKG8uzJ-2vRSS^d4ZzKO7x+AB{Vh( z-0d#Y-BAPXALxedV~oX5SbN=3bVw79=LhkJg*S42*OP-*8+dYqU~{Wy24G@9{lj0-K7Y zYWhB`J>k7(DneqjSFK4Mg3a=<=T>o_vP|yZ%%(R%QXjBRIh=V@=}Jpx0H;+sdAOJZ z=oJT>W{RQONt@GTg9yXdjO%LL{JT_6UpGwAnIINaq~vKu+2Nm`MMY$q-zIW}DCMnW zZwL#6>##(R<=aH2BA66ja@;E?3pTnKb_H32&MG+>U1!Lv^1e&RrD?P^Db^>jx93Kj zUDhrGTbo2*?lza)c_o@;p=kCDz*amP=V{0|6s?p_(x9|!I%?D%iWgfrgNL9%k)c~& z!@cv_L80by!SJGp2E#SYu2Lpe*Pbwa5$h=$6R&iQ^GVXBN0emZY%cjzAEk{hk9S^~ zek)aRhP!u2EsHLKnddr{;RiezS!3U*uDT-y`#Th^37!vYbV2H|KHL-<07EYk{z|hN zrP{u%(YBBFu42lgtvcc%#QSxPEyp>ORuI4Wn!s<)ellI|i`D?6O}OwJ-9@DJqcgSY zf%$b~I~s^c8xq&YPRH*SB*!ObuW$`B#K7LR-8K=+wJmaxpkX~W; zm>m25^D)(;!W?lVeRvOJ?^EWc@^QV_Ls!THmg&7$zb#L8+j=#L-qG z3ViU?=3zyKhupc^W>i2x(bQ*kIVP`+Z`uRvcyO!k#EtS~RaqMX)2Y zw-8w~m~;!(3DIYK88tppZ*JdU2Ri3HY@LA9uWz5wOtl}Uz;~+p`o%No+`Qr=2cw|k z;SQq_YB#20^dQ&1bGwL2n0Al+L!+9RtH~Zc=^oX&t%F2J#Nnl9lMTBXvY?-TxTWT`AYs8 ziI;^8fLG4XcHQAsjTId|QMiCAz8gkPdz2&OKvEiQZ5+d?-3{W?;Z)wP1MYXI92@pB zJRo+jsi9)yiT_f=XE&UF$zGDC(TM%1%%)^tw``w5@Pe`2>s;-_fPD?v7|}8iJ-)FP zMIP~Ke}Q^l;10sQq`WsFPT`oIuuOk}L6rsonpvPY*8~g&^5}~QRoJL1K5q-dA`9sr zMw59r_fU;1E>c&8`}WH5csSZRP*>A&8=BCS>avB9*>(-HFcq-{v_z9ydTLQ-1nsMm zZGuPg*WuTzQb^A&q+hp}zHDQYkyOq?6*i>&fYT&`CSotu<-I|*jZ{SYoC8~yt$h-9 zO~t7dv6iUI4$mq?M7~Y5P&3B6fSMNn=*DN>&Lhdz=>KWW@1aCP<-+ZJdvUfHYliNi zYrO6<+4jaMCJlPUg~{cQtoAx1KbW)Y5f+IyAdPpogdwBHN8UXZ8AvlJbT{0P=qce_ zxs_;rV)BwlZ9aE7Un7aX!~2%qy^>$n-YrbY?L7y^7j{HebjpE>cPFCSxQR@ZU@?h; zkEDjyI993U!zCNKmN>OSza@5apAgz9sXlJyq_9ois?xB>-A^Bx%hh{*v447n7@CY7 zu8>W-58z0&m*wR;LZ;{kGXbsjfyZRctOwPYUoh|5)Old4T+Kln=H$nqG(w$cprB=> zMt6m>Y|>`1NzuTRCCrUhdCyo?`z!0`4V>3oB#lra2<oOKXEB6{b-M@{(CS9`0|Z`FJ~bSnSTIRF9@U!GtzGj9%mi2 zCL(LAX4)gIRthi*p+u1>>zlC{)VvH$NM`#}R6~FMgm}2#{c2fT>33D(3CEbDVp66x z;csZr%g9Yv{{6@jPQfY!zQhBwspc@b4N9<*n<8A1>{i0Z?3UB#$2JP0lA>UY)vB8M9z6ONLvBlC*uNKTcKpy9Vq=o@ zOwO~Wm{^-!dBW(jVuu1ZUDEojks7oW!9s7}m%cHZW@Vfrq#2{ad-Wlp6(rD=pcee}D3L zaIUx_$Ng&i2vDXDE`BxygCg!v!#9WcqX*n7PUoIhPNLnlRgHrRoZa~;v9Wdg1}LRZ zc2(E=`9&$wJROKfpC=WZr>IjxIIpp;gbGNsi6b2H4sJ_4X*d z)hvDDOh~m*rF%MX?h&_a*c1WE3ULazv3L} z1&)&9%SP9HQo#rwL@=Ab;oq1Q@T2VeJzvlXI^PX1L9_N`J zZ5;XV2n75WdFLLfc-0hb;f5i3m=iL3EL3Z_Ro}B+zigTMzNGzq1da=_8NV{q3^-C! zf)(T~Zfx5QVl{LW@f1n*eK(ykRLG?Dg~YO99#K}QyJzyPyXxw{!ivA^^&rV zo=gweYDr54z!_G!Tg@+TRo;L}Qtyv!Cy>qpqq`PGtX!>I^d&!h2uW-!c~7^fA%U>; zi~@rS>|$rO^u5aUBi|S(f_^(O$M-F<0o*>A#rIvQ{@8Y$o8YeNba%VWg?C@p4&v9n zmTzL)xQpRI_BhFI2t+EI%3}Iw)#~t}6^AmX31~CLh#Kfl46(vUmq*{n8Qf+|ajRAD z*BYQ?jc#FleOJbfsrR9!Ea1vssq)5IIf8*-&=w)&yigV+gdRBRFg-%B-#EHCOn~cb zO;NvUH1lpi=%hG&XjKOc3Swgaefe0xzP3$fS~VWuTsj3Nf`z<4&y(IWJ}rv1dndY7&d;l6`Pa0=pbgb)F>jom{AFn$ul zeiC`Smh4or^oUW==I2!+vMTGheCuC6&+Sa86N;U6cQn~k{Gx&9_cm&5|Fd1kqU3z6h?FHv-t2L@y+9g(y?ID zQiu0@7|Gj$4*4iWNUmqEQP!of_`s(JD)ih!Pb7&Tsx<7Lg-H>>JM;D8&J|lL<1F;9 zlCbq%$&LA^wW?1?_7XHT9s@Hp!y&MfM)uqU{ZCve{nw>8oZHf-^f@*XTgV$Ft`O6X zjoCU3dWA_(LGh-jBP%ot?!DuDh6C)j zMzYEYiRBoP#@r_*(xPrxkCd+tcuo|xNoIiV14nMuT_ad0avn?;U8Q5i`Ga;g?Y>8C z3H(7|bI0w%GX;}(?^Pl*?Pb@CK!=lufnEk`NsI`wwrU!O#kgiZ4j&@#_vWf?6t3qt#^mn-KD?J1dLxA^!Ds3rEUEY!DRRccY2N`n17>~ z4@_Ojx9J=D0@`Bx-%M9c`h1=dM%dyOwhj4#itiF~PvLnjH30fLUPe62JI zY~v`U_6LM%NKt3mASZypV<*RJD}nE+!tg4=V8n%Pu{oy+a7zkvq+&SD`(zEr6SByc zpi9&9#Fcxvk2$mm&XB_9qBt}GTn}*mph>>llRWpSwnI4T|dYLXytpz`%tq#&t+o<0Q~_(_4?PC6OFImNG@=6s(QGHIaNm#v)werk({|Jj zv(lum6oJ^S=KyB0v%qw=E_dAtk3IfiqebY<3>ZPJKeg%NX^s#hGk*x?Q>Ru69KKTF z`{NBn0KiXv=mu8aw`@yw{FZ#+JL`;z{lUyd$lhI`yH|3?FLm)K!P?7Q{fc8Xp$*1| z{FSe>w%3J_%ilZ$T8mfZ+lnvd6$JgY*`Cmci85fyeP6FO7Snbatr14fQ+obgzTWS#n@ak4|4XRCd5$ z`Z8hrZ2uF>>F)b`NtlKX!%}>|xPzTWNh_3d@k$;Sb;|A)fvJvkK)Xak8`xHzTjeEk z!6@T!5PGq!iJff$g#s+_)ycX zwJY4;cCP&6K4`kYIL&~WwCI+|!Ld(=I6-_z|vuDw@RlqBGXy7>`D6?0Y;w#cm)e>w^NCWMiPm}?0!Bioe zo29pk4QnpJRTtld`H7KAnO-MjQ6a@ye}j^6z^38qUx%I_g!0h?c{z2W7c z2@LI=+I~y0!>qk2ipjD)U7pwab-y|oeZ3axO3llxONB2d?042-q9f}xfCYri_^>Pc z=v1IRjL<-iy)jHY6i+L2BuxCvz}OriE1aMS9+1HYD0Cw)D*O{nFTrp`)BrgSWSHdjg3&9v@;tCf ztg#feD!4k9i0-f{>2J8dqu=~y>8b^oku&!61Pychxlmd$AVHuLN_u7B0?**(i!B@h z)97y|v8&&%(5)^Qu>|^ajcLxS0trlt`_{p%QnpeQa&}_>YMmf_Xl)lk=h-}+c0q3k zRYg)Oaz@`s;;X<3_z1u*F4B`UxMVH7uZ+=iSFs~B|1a`z_8P1G0$iW1F4EKp>;jz! zBPqc%HeS|+8$s326ZkEgA{lE5~t;#g1xFW@w0f3>BSKIQb}rH_9o)Sz_Q0w6_UNnbzwzgVlSUPi!jt zTD^mW^wMFbE2a(wZe4^eWe^9_vT(X*oN zvf&(g2jH8RMIM4d1}=DY4!~%H-z|KCoV6VcVKTP*O>mVO!aBnE(Jt~}*}WuOz8nM^ zZwVWbg%uTGfOD`$(!BNH+BO*s&Tg^z1KBC#ux0EG}HF^^q!I+N^Y<60ig4{ z<3w-l`3W?7%)q43>APn*p^;w}<>)%fm!P24ceB2B=r~s~9*A4Xq~lkNP4{ zbK+(J0M{AJ#0W+Lix6l>>S6nly6?Q$!lb&HX@kbvHVvfW%tAR|QSdo9SL za&vC>wH&KEP#>cNhRUU^(N8(t-&}CD43*R`0EI;+7~9v>qtoT}Wts;Yi-Vh37-DSq zYtPXD9{yp0nYYX>ql4Ll4^Tv4E59D?3>d*@G*(EF^u9S;{!s(v@!QSQc};6eU1n}7 zmE_#@JL>!Kh45*>8eY>?;@g1$H>Xr$pgdwDPZ?TnWjf&A)4u8oA73Q0Y}b{G5h( zv{Wge(>9nfM+=A|)_bJvi#)@b;u=L2Fw$uO%H&$HoW$p;#|^Ak^L2|9gkS3%Qeg0t znj5H)Zvd5-@YUSqFzBXMMJMRcPhOZ2PlkR~kQ0&bmh*mXf7hN25zCmKWIu&3oX1aa zH+US0(C*M|-YFLo6->WWXe*2Eo41>LJau0RFKrH@mmvW_tG}wcKB|D+ZBfa9l)L_X zk}PT3=^Yhh=jekxb`(um9nsayxjun;UBE!rgNAznqEjhtn3Sz zo#+4tA%7GlyoX#__*^}Uw*yDid38BAQOQ~8ekQvSSgSJH}I@l;8thsl~cpyI@Ck^!N@~BvAH(2;mFQa zFvukfjf+n&M&>rtaeF!03U?LP6jQaTfH9#9nTSql0Ci<-dLBaKD()I|B?b8@J383t z6!v`rp&5)-0rhw^m^1fVTuA(XY`uj;md(07EM3yw4bt7+DG1VC3P_i9N_PrKNw<^| z(hXA54VntsI8h?W=jM*6Mc#eaNd znIVAN4vMG0KkyV5zRl6|vAuutE_gHa5z|b`OB1AYS+?Y4Bb6WJ1Q2qvlcl?RJS|C{>-deUOIRY-B z05x3~ICDRkmjSFLr>T7K#olNJ=&t-m^@M!(nUJMyAdo|Nh5W1ciHRc$z!Wb)(iAQY z%b3+tg)Z|fUiLl|0ZjzS-^fsD3H&SmuFb94qlYDz@r zD7N9w4+uij7Q<$^f<*y+xaE2t`GF;X&d^l{6g*2UML?8*?{=!|=s?y|JlL2V6kom5t-h&gMf5HwbrOtVOdvULE^=4m3``y9sbF z@owI!h3|<${r9+oqz|^|?Ax4{YRH=>ons2KMoIijyDXMA(DZh}Q7%paRx2q;A3;w% zdb1A)%k4Qp`d-okQ%2Wt66+M=bcqKVNxcG9TL{KDZ7a3>WjJ@~ll)_Ic;^?!gOQGY zD;MM0;ST7+#Q~ESKNb-jTX)p|{aLqth+2!z;-?Q9pH@KW8nnOm`xnS=5~b>eSTrYq zD6v+t1%$<>lX?w!;6YQ|qnVAH@r!=LCaAD&sOWAnH(rDboYTD2$YjnEdXtJdEVE10E$a595KUD!6*QWsztpV9;0{zMcxoIl1O?aNy?^aNmf)lUq=$sV5RbJfvYYdvZZx zq(V}^*{>UmWW*#x-oQzqW#^?B=z2r*1@cltcmnhxuYmwQM6MQe!fWYEt=>`RFR?U} zQ_m@=$AL!hr7U`BMgKtp9|Y4PosxJBTrJ&(?VJZ%cV=%mFw(_A5~XZ-$gyM zPlZX+2?vors_mu{m2VE-i7??fl=i)gM(;f10c}I06B0vWr5$xCv6$Z-3oHiTjZ@R0 z{E;}?lX*lq-2lap)|=gOsv(T7PpfHaLmydWW;d2!$$BZ$680_wQkD4vG0|X}OmH-S zB${W+Q{!2$0wn!B|2yG=7pp)+Ub$niVwdr*uj1;505Kp^JhyY_D|ol6nM*r1{`e|- znnbgvK5rJHB^v|-VW*7CcCuM$LA5^<)lI!&Dj&R{^-+M1q-XFm%8C#twu0r#xj|(ao)K>3Dak#4ug<6% zt_@Q-oGn5k=DtCJlWp3VyrKiu`zQd-(6od(D+xl<60@Z<3sE-{U=xC8(XH|L48ITMn@j&@K?{U^F=Fu%V`jJ#J; z{A38~bb;tb4-D8v3*zkjnw)%a=4=Ts_vg6SzZcA6Y~hZiS_K)_LkYlgzy@+@v;c$O* zNH$qfr%;tyjmx^y?snU{tJS5Npzj^CVXIF{BAu$_4rg&8$#tFj#hor`jRkWnsWJ^I zNA858CQA#WV6V$mhO~Offm;R4!sd}=mkToIj`Yo(&N}bgVFJwWgO!wjG@jC;xk#(yl3ukZfAV-E9QiU_=rn)#Ycql@+3X9qd!=KeY9yqgBbP$F)W`t?nr z!e)~ST_OiTHQ77K>8^6gHw_pHVk6*%lp`y=pXT^#VC%E2aRll56dH6UN-3C!&sS~hbBd@OR`8J zW1pJv?iEPSy@YC+$H0$+gA(`PsrHf~%Nz;j!)m_;!VBrEOkjfZ6OfP)O?QZZm<9T{ zS%jL%5!CM$+s)5K$d%kwm5%g0}`SN>*PLc&2sk(_gx zBdhCTnWrM9ufBU$O7%qw50Ex_T=noYz8#f4qtBL}sCqi%WnC9WUtpF5f?s!Ezr^U0 zBlp!PaRCrfLK2Y^kJBoGCEv&(xg!JO26n^eg!fM@;NW3%d)(kHy$1WN|4#d0V;*}b zWC^)t-*A)5?r;|7YKOImmrfLY4e4ogryGysn*Awc>{`$q^*f@Bl`c`Ov&fE86Qv3{ zz$3O+PQ8~uQj-)|Zc!At3xi_m{BSuZo`X4!M8H`ZLlO2EKD`HBeex5Wn+e*=U2b$B zA(LT6{V700eu5loKzykAcS&}`kAAus(Ii@`Waoc5hkv!R+Z#f!p5pVkBY9JCs6oVC zC$!lv=H4^SnGj9DSqTb056u7^8>&H5yWmJ0kXnlQVUYjPt^aHH?4@cH z6Zw|tq1n*=uX0v*(Mn$LP&&Wv%)1>`gttJmuFtU^bOeI}-dO2emf521*^N ziViw@sP@Vso+$p6`MmTT{S?E8JmR|Tr`p4y;ll&z!7>n(a9jQST=GLs9Z{f?9KhmE zb;P+rixgn^`1z^3`2Sl}hZ%p>;Qc_0;g7NNsJ1G&M8amTZ-4gkF<+;LzQ0MPvnMla zLZwUmn0wOu;VD;`9RDX**zhj^6OqkR$eQd0aeBmCfZ`$j9t%xXDH2dlpb9yXZUZ1Y zkO}`3JX)bN;cbb7_`xM`hnCf>r(^;tAK?G$Eb7Ik1T^M8@~3XYUq88nL8#7#V)CBS z*N*Jo{C-koFDo8fDcz+zg++PbVmck|H}a{>GCmf|*SEn@?xmA)Wg_~qjC`!-rCB;{ z1r}kTZB{})k;0^0`D#bUoFRU$IFtXCVKVdpe@x9Ed+-&Rf(OZ)hyCF20;i$*w4{a1 zB949W=f~o!T_JFP{bassN^7DW@Yq7)!3+mi(=#Q6P9;+w1&`r z-t3pxrDfr!ETb=>EBv3DOR2>V!lB#C#RzhMM7&~_*busubtUdIwv1|o| zNT*2npTU@{{s+(ddziP*ly=7^w@MWfv`g(X%BH^0PV(~98{MrLri!d;jN1Ttp>Z*MtGt0~@1Z?X>$EN_@!9`s6`|%}f5TJJ!z-8g|8C+e zY_?J^1h${RrAgM>xrhQ|uw46#T4=?nQ8g0$X4ISJ@pAGu@ep!Wam1jdy1}q1YaON^ zE~>HmWR_IcF6{5L44xj4`AAVz?B=?IIu{XCYW|eSJaV&D#%%VC-BKw)ta$^}FLrUV zARQm5G`2unlt|PQZVZ2fh7RXS0)rhkN)inFC~~0QiflDw-3!b@wA)pqBbb z=DC6Cw1jEN;`xs!T3VH*`zjlaDy?vWMtnHEerH{ zq%x-fJuU)buOwl?6)ST!jW2)eI=Cx)wmeY9?9zUF^Mg_`Rfu-;MRqplBB`#joMz*t zjX_$vl}VQ|5&8k*a1wi6 zfMmy>Y>lacwJHX~V5TFX%w<^99y^y{2I#|HY;N@%uCpI@UhMgf=EQJI z3VvUZR(x;CsmE?DK>F+P@C~^44Kch=x&?HJYq&`djG2M*$GV{;?+nZH8pyLKf{1bRtm) zZq3kH5+xEK0X@MnxT$A@3RKramvY-ZqmT6fx5yMW#QJe+CHq62pEuaq=Wvh;;j+^> zZgJv16YkG<2H|*`L|1Z5T(w-5*-l_(M)5L_+tt2L;N9^qV7FDddM%2jBt{i~!C9DB$2yVkB1WpRV5ZSB zs?yoc(bUY$*UV zG(^q5j^3UIW}V|Cw#NOhgU(^*yfD&8J7-r@f*Y!VJA_2@^^CqlMCR6edxLcnIzRD$ z6(yq7|IVVLrKwYc#$zaK7PZ_LV>!|&Nyjr6=}B89+I6{SH%D5@rAx%3wq*#ySm9;&ql$P~>zA9Cf2lmZ;@R&r8>lh7nrJY773?`(|O&v#LaW?frth zxL@Y4&G&jS<<#Fq3+}P#`>TUqa*0aJ8aGe}BI`vhg(*)TQK0|3WLKw(>+SH9%3hbp zWnc@GS@lAzC&*v|Ck2Gm7@fm~9oXSfuYk!d&Z?v1BoPA3Kh=wDm7oU8i)W(-9q_rp#IM!@1LbUNPb3PGW&K$oXtRmcKEh$r6^dq-*m zbbFh1115R8f!{!vFOx=*>Dx=v!(v0C9}q@3w&YH3FZDoAQ3^)U?kkzLU(@n^JzkE} z2UA39V4NV*;QZh4`&4`RE})MSpTqzB`YYe=oo%Z}PgDJ^DmEKq<~0;u4Hzv6;rX8H z6RRxr*)`RB#x4nWfy)2;7-4}&PoR`4>{RKJO z(Lz(wfAJp`H&|UW37XuuaeW`QR~dUt?Dxuezo8lXbSLImTNSH1ARl6X(E!bSEgP8F z^8dOzOaOeug(H&tS-+Z005;4F$YotB0#d1Nyod)TB}JmK&v6JOv=7}mcpVzKz9zw( zI9n{!v=`O7C$nYmOS3c`u?KAex;Frw^H>f1I$7?($avWm1<;%^^=qxh^MZcP<6@}C zuOng8NgLpr$@^W*S^mEbd3owoy=J@mSkVW#CZ%-2ke4IatV>_k7Bq@Aam!{loQ4j1 zPH20jCu()qE&Zy>kp-ewqqU+j$L2nM24rA$W@zYyt zW89HsPXN9a`0bX;MoRnP6Kp41G`v@Tr_Vp-kIUwjq_GHmr|hV*M6T)G9t*O}<6{m4 zB4YnMW_i8b$5A6zrlAf}x($13O#&iuL2Gi8^9`ICM%%*+!T3)Y*EMmVpPj^WmAsct zqg(tft3xKl>9``k+8KY?b%u?h$7Ns7;aSQTqf8@@=9-tV4@?jD z#V9*R;Voj|91v9jLE$WyWU7{(1EeUytr)&X(LA@;@ zWsx~EtmikUByS*{Q_R>K&ksWs306u?K$Ii}?i+d*Q%?Vx$@1QA$WS4rjAaR``hG&s zcTJ!8SuSPtS;PAEyrkKpP?EIDfqUDwygU8~wx%KW)y#X1#vMI*fd4?}=wK^k=Szd* zk6VAKNXk#n@4O-Jqzjkpmx2I$U$F?|jM$oe^`5&wStAhFKEAs=(jzfp0FVTbV6|lk^5o~g-BkR= zx;1-5&N4ysmd(Z>9uv)HjCK02){U$P)E~&!AMU6HKSyfavZ?sBr^)&h3_e@a_q} z-`9CEzCObH$nd(4Lq48z3m6y`0EA!9ejV^?KLaAu|LJ>4!wZ5}{)x`T^Zx&%bID(f z+7xM-@Cr}Pl_v9flpxYa?Q6<3DH5eJGJjj)o(%aLr`R$beND(xlv@k%Y@jlvsQ(Tu z^}a~M^+XtawMu|YJjr@frU=Ut>2rM4H@57jN)k5TgWxPTa0c^#ftIb0smYj;`M0r? zxxeIg&W`JX_~~9|2T#0FQ4%<@EZo1Yo0n$saH30$?bx0Bi%ULR5%@u-fV=+UqZ`H6 znN3wIUAP7C3ZOdqLwJj{1_8e1PqwD=z1wHkN?(5g_thIf3`ANDsrUidlTU;=n*TK%~M(~=AB^vJ(v{sr~T27QN3V*WxBID zBAS07G>K7@QLQf$jJ{-qLm}}A^0|^Bh`9mC_^h_21km~2w?q;6lj^;ZWa>}RTEhZ^ zPcz@F#(QTZb$eY^j80KbIwE455%a(~>0`|S3icpm?OxE;3s-?E@;c5fQf<1leb5 z1ECuMv4|PwkQ&x)9YGqWy}SKLvPd~S5pV%m)mifFz9J-M@H?3~U0@hV-aP^`bqOdv z8_v-Elg{(d5II-GYB#F{s1_Y*98RPqz&;b;VcbsI$v&sid`M(-~NgX5R3#cxPm)7n|eW$H4glBRDkhe5i}ffxSiD< zN-g|aXyvyO(I2^2icNxfqYLPfd?vPI~LhApxRF^`#-)!Tm_CZgsYpdx;>{>!~pee zH~t#tFA+?;!#(eEw9=Wk+_+*c^O4n%QC&LdiCXiY0XlL6gysGX!?&vvIMTcI&xId9 zrP`=q8)cj9==u$aLW7-npY4eH78b($K!&|Kqm}iubFTMEFkhitw+);juxKzWiEO6J zXlq-Zm~QbL8()opZ_1IP7PxuA@gqh7Y5^B8jtRQz+zaClEJ2XQvakhnw?NJ~k&Cne zKWeyaiFh^)p|61~_L-@$fiFKY6Y|(E>Uap#CIBN0m_mi5(0By|8jOOk;1YwpmtRq- zqWwCXkyV*?1Kn|8vBsuK)TDa6k`H*Seu{fYjs)>1f{9fT#jF-A)Wj+S!V^91fA~qf zw-#YuJ@vf1J@x#EjI}>Zyb0`bK}6X@4tF9Z>cNr5;cewEE5?cg4mxSObNrM#$y6AXd{r zSAF=e4Osgf@=~8G#^`p9N6=@t+KR*fUa?`izyw1Z$Y=oob11*`JkZyd+IM#z6hxRv+#TL6CTyYVva ztESGW^$ap@mwV-Lucod|D{EDEGK_kpxV@f*wg-4L$IVc<^!2##EHpG7m9RC3LuUw_Qhe?nWzU7g+nj5#JW== zHkUR3j^nJq5qwMeX?A(=$pJ1x_^h9DJOe%ZKESBz{QH$dX3D-uWy94Wtw`#t>#j|f za{`1S%mpPfk9v(4Kf)Xvi4dA*D|D&XJXb$|#qB&0Cix?K73QeVlA)FuK<>F8LoO!ldJ4GK=-->d|7;*r|-2{JSuL_He?vT0QA5BgnIEhmZt zZ*z$!W+~SrCcC6Lxw{${p*u+u0y`zP9ruXzHyYt$EFH~>QjNvWOdRg`eylhkq6DWU z=;S+f>-ClOEXQ!r9W(Drw+sR|&+v?SP9s{@ojU**nJum#HZljtOCsVINFK3D;KAVLD5(wi>m)l}=0I}_dnn>b8f}}KTg3Iv!u*X!1 z%*~c=gRbQ#pFWO@W9S|dt}$XO1{i5`l{MNpe~AfphbOoEW6r*oz?F|oGf-0>@LQg* zMK?u1rdsZ?Uyjoci%msbyvgBME&!G=XS&Fetv-jyEt^r{lR2$oR0EQN+d-s{|i(H1S9)xglu2HBkM7> zg8lNV#ypH79?>KUpV-K&M0>hE9Cxzp)1ub=nkAJ~2WovM3O3YdOb^0!axn^Zk0xJ0 zoa7r3>Y3}l0&aGB1h-chD7+5rqsJ#QEuzWS07>dagZT|L8q~QE))eB%##xRe+4`JR zP@_c|GZqfmYyxHqW>-dB6L3)+i}DBr;H^ES5&3U>fOK1fv=zimLBTD$Xd#cU(<4uF z%o!SnWP>;WYlaC3DVjZZA4D6^057=6Xc&rjr0cNeXzR#_l-IeKrL9sT=;#8Hn7~Dgp_B3WOK08B*?(3`2K!&= zsJ>sQ5fe3ARg~16+^1MO)^)o2f4TioA7IPJH8X}7eA_uoBTqUZu{wldffmJsNVDd( z+8YlpN?C>LDd`x`LtIF#W-&u$YkFEU>|S^!K@zXW|-a3!8(>#owN4&vN2C} zKE6KXm0q7Duf+hyk54>It>-iPv8~CH>AL^R^DrTf*0tR-ZCeFii^P4LeHUO7>+s1v zjUIB5A>v(sb(?DJ#{dR&OX4pra5`Ip!^p@DC;})FotG%yQ_S})c101>V6a&Y^TkUt zctn`{b{w*6bA&mmJP)kos5(AIltfey*s4Y|L4_J`1duZHIY9)CaQ-&Auqs7!+9bty zP(NXxcTIx1it0F9LH>t^DF#z2LK5AIbAl)x{o}wucbFxZt40ZN7ayOFQHu8jVFcYe zabRfkq7Sj_xoKrsWzCYgusOJ*D3Fi1hC+gMHQ?DCtQxEn2nj_i79Gp0xjlzRtnt!V zD(GiynV0N|93L*J)@=RGr?rvry2D-qT-;u;3{yc!MXdbqwBu{x+AA@<=2n4lKc9f@ zu}AdLN59F-Ql$e{Q|}LriJVvbErCa}9r@uA5ex6qqIEWEbWDQG*VbfAX%cnzfeFtG zVb3d~Rv;OKk#+`buppW>8EEy0RH!!PnDfpLfvH5WQ7AvmhsuC)!Ws&$aZ93n7c~?c zU7OXLPt4~2PNKc?G^-=xTJZ6*%={jmW(#QF^T;86QjgW&g5c2D_~VCkB0-@sBzjxO z!UusTw;xyuJdQ+X_rR#JLvYCRTneE|?DK?KSnWkc#}HN|_c;o@;^)Fr@UdMjjA(-E z3XK!Defc9!6gU?x$zUj8Ao^&SiFWTH{qPPM4bT))cT{=b#yjVlNmjD~cy_nD8&ij26WG^3JuBbwZ0ddDdY?KsCF5i4aB z$!TdrIO`0aM-98N1PO<#gnhy}tdYisWFG?ayqjbi zSYccnZW0*&^>B0)CMvE$X_t%XQk^u9Fq1o4*Fl^^nP|IV(*I1tiQnYBt;nFXw>T85 zF`jz$7G?Z|lrOI$rl%_gj%cS`{9&b)iw(%4SYPW1ICU>XJjj;iL~d!mw8!;b6||QX z*Io!n17L`D%i^Y|qEA50Vl=SRC&R>o;+I(RSVygC##KC`3?t?G2TDO~n!{??M8i56 zt;;W)JnWgdeLNyfIEIDViYbyHZFof0Ar)?CXl}w|^W7l%d@R{pv<`D0CX(X#R;#XC`Q68cz**SjQdg{`_hse8uVy7ybuXC@m_Q z50A6lDY+9Nu4?d`>h}c&>hj8BMal9~2{;P;1X#}PaXT2R8=M=g8V^mulW-x%?_AXw z>8K4|X*c!MAF9S?D=cT`E?lw~{IV^pTE+IxPr3xWtIqG++P$l`PJL!k)7=pj#qg?b zxR4dZWci>nsss6@H!d6+h7A23j@{2U4_c{s3K(gy*+Wvjq&vz}7pPryVk81;kS^E7 zDGC2vWh|L*1pouhLHuefxIH-bP3WMBxZd)IXvvAV@tE$S9KUM?*o~f4x*yYSY~@T$ zwN)>?;TlT9Kjh@F9q(>l)Wy}$_dy^;0uK8{@n@mt81Fjo6EJ8ArQ$19F4PIFD(vepg{jo?tZQF)ziABw}u{8_{F+64#{#o2;g8S`Mm#?xf zC{#IHK7T>wcXGPN^0-Bg65Fz!*jeSE^NQ~hHb2m4TFCI$(>gOj5J?wEC0^ascueQ0 z$=`5%SF^pjPR)74F_Oe4%Amc1C{;1gR=b}9_eWmavRE}{oW5(tVT%FpCYh*3T&J|O z!KP#EoPhxHh*Ex7?J4lv!t{YwOErUjs)O=tSg+`nfRRQ8d~cgmBfkC(|3N3+2t*5( zN!JPW&t&l*6Yv)ZkN2#3aT4FRgd4fF%l_8Ok4&1M zX=&c*_KSGb*Z9U7O@A7W;Pwz3uNMu3Kcrj2_Z5tp3-y#t5jBM8UC){=o=Pj0S=}1N zt}to1jx}QwN3^*rQ_Y;nboItqxbYB#SZ8N`@aq-+g?wp-Mtt$Tr!ACULMEpcZsEuQ z5-B!%ktY(fv#WpLabsPW^z6NKhwLMueZ3F)5OY>j%qWU}uhX(S_JZb~zz{#}*$a)DE60$ch0_mOb*gq_f&wnh~pH1*dVbjy%1 zEON%HpB)Gl9{B_JwOT0AY`5X2-R1UnAEcm;V2p|4?SG39z*`Cj<` z>x6;{sDMx4tU)aQ;#i#^dLh!g?8j_$Zi$oV7yZR_a+Nxa79~A3hhD7GMS*lsQj1BO zrEGI&cRxOXT{XDrpnf4%s27?r1Yl{hu`Qe-1)ghgqKL|r5v}CsNIZ_p%f)Q3_RJg_ySON*~2ixxW7b`=le)Q*q>KIYg zDBa^azhXosmcuGr&&W~+9@2|tBnDOuc~z@}bY#X4UtDAa8$;@FiN8p3OKRk8e|Y|r ztnKG+k~0MwM{VH9Tn#Ep8+Vt(7LqU!ycb5l6KAKwju@uB7zlYL;|-Z2z3r83#Mhdb zZkRtln^dHS@+s}cXZ7)PX5xoH=kQ!*o|qq(iRH(inY%ukPfj#^j0~UB9l&&tc@@X& z$6eIBv%Sy0A7VZ}jBR?9yDHoZEoVq+6J+Q2vok|d-8d>5h4TeQB2XfzV-#FDPSH#4G{uxsp#z?6 zze`yG+^7b0`L*H7nP{h5Vvo9QuXbJ=v6E!(M{pC&w*l2L?dwQ3y_+-QXwD9@eaa|m z)EcBZQD4SS@zSzb#lzc^c@&HBn%t_@T|evn|ZMz8QZd&c{#R=bNzzqnVw55Qe0>BB6tYdyMWn0Xk<|8x9BBmN{9 z#|^MwT&1k{=FO+r3>ggUZkE&AQVKN(CtUBsR~gwG3*cgygG`7QY$`*q;@zbYZ;ShU ze0A8yf<`wF+hqAiaks)Vm%!r(3YbG?o$yd)A=pClDD8W~kOK6)+pYz+@bJ4??MEz| zP#*H48{P=NeRbxfxw&4djl*T{bLZOyC80`l+x_SaZLKzEaDCXhOrLeha2frV!~6)&CH%2ugf%6H;-2T(B}K?jI_Yf%|3RA8K2L4Q~NJQC;1K>h3P0 z{h7Ftz$fj>+{S|42WLAPBhHHO9%z`>V}81+^#u~Yi(;|+(f~0Xw@8IctL`Q!F1nue z&1qt+J>n5hBb_(z>}@Ofq-HMDh#B`r!jC&cajPKOtaHvLm-alBZj_%LfA{W!byJMM`Z6Nz-Q+LeD$lY%^K#m1TG0>~fp08XiK)(n z>0G8CWa&56dI{3Y{o=KX7c5sM)V?*FPK{aa4x@!ZDATiBP&8O$Iey>rHuLgu9+&I) zaXtBgpz!ilew3g8a4+=@=}%(!^;SuzW?t;Wa-+%^8RTubSJkOB1o^7r^-$ka4{h=m zC+8aI-l0@oqC+vi@0Mg`X5~UrG4CFwdfJ`G7nU`)#qnqI@@D$aUkkreE7fM%6Tf?Z z#;2=%+7n5?A@_}ORz3fau<}dO)hC^r$lJ@E{rwd{5~&{v|0W@zrDh&Qj?>B`Z*OmJ zvF=oGmjKs;KoYColU|s{6%8jN?~2yq_?=_K=1r#l36P}k-iAH+u zZ8zQ4#SGy_hRUYl%2^CSPNu#W!Xrkz^-1Z zZ9A9Cg4IBLIBC)H&DNFf;K?SnTPJIBEs&S(vO!d>mkeyjeJDvf?T5-VCyEGRM&^gV zej@pkA*>r(?fRBrHl5JQt}6EWKq|DPSjhe3^Yb^TL?!huTe2h4^fwjhvo@4FKK|^^ zpKo*6+O8xysRvrthmx0s)Y@%+e@pi;rlhH{{0;cEMkX*$J{&z(a7%8jP=Xhs%Kf*W zUYxpKR7T8q?cGZ~qir5!!AZ51m-2WcE)8>gzR&CYo~}@;^*dZhN4=#<+`Os!yzpfYc|+N zR1Zp%b8{k>i!M|r6jjc*+iCc&cx<=2mJ9hoD>WJ zmXi}Is^jR1!s$vF_!3l?-!HaA++&Go*RX;x-*oTKQ3-$Rn3TkFoAKYk#58Pt2+I

G)`MV)WGa_Q&}=T0^d#0YbB= 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

G)`MV)WGa_Q&}=T0^d#0YbB= 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

F*wE6DYsH4XSOJDC@h8{pVMt@FD! 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 From a0d7fc396530872a17b4da2bb9a495cefb9588a8 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 13 Oct 2022 17:20:32 -0500 Subject: [PATCH 015/269] updated diagrams Signed-off-by: Hao Luo --- ...scaffolder-task-broker-blocking.drawio.png | Bin 80393 -> 82140 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png b/docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png index 4abdbb44e4462e428d8de6284abdfbfeabfd594a..34f2c31f81a715fa59775c4667b36742d5c162eb 100644 GIT binary patch literal 82140 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 X^hsA_{xp6U0)8|v>Z#?QzaIKOQtggM From 57f61203bcca314d8a68d86fc00fb0f0f2571c7e Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Mon, 17 Oct 2022 17:01:19 -0500 Subject: [PATCH 016/269] removed wait-action Signed-off-by: Hao Luo --- .../sample-templates/all-templates.yaml | 1 - .../longrunning-demo/wait-action.yaml | 43 -------- .../actions/builtin/createBuiltinActions.ts | 2 - .../actions/builtin/stress/index.ts | 17 --- .../actions/builtin/stress/waitWorkflow.ts | 102 ------------------ 5 files changed, 165 deletions(-) delete mode 100644 plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml delete mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts delete mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts diff --git a/plugins/scaffolder-backend/sample-templates/all-templates.yaml b/plugins/scaffolder-backend/sample-templates/all-templates.yaml index a3c81f8af0..6637c9479b 100644 --- a/plugins/scaffolder-backend/sample-templates/all-templates.yaml +++ b/plugins/scaffolder-backend/sample-templates/all-templates.yaml @@ -6,7 +6,6 @@ metadata: spec: targets: - ./remote-templates.yaml - - ./longrunning-demo/wait-action.yaml # For local development of a template, you can reference your local templates here. # Examples: # diff --git a/plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml b/plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml deleted file mode 100644 index 56032408b7..0000000000 --- a/plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml +++ /dev/null @@ -1,43 +0,0 @@ -apiVersion: scaffolder.backstage.io/v1beta3 -# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-template -kind: Template -metadata: - name: wait-action - title: wait-action - description: template with a waiting task for a long running action -spec: - owner: user:guest - type: service - - # These parameters are used to generate the input form in the frontend, and are - # used to gather input data for the execution of the template. - parameters: - - title: Fill in some steps - required: - - name - properties: - name: - title: Name - type: string - description: Unique name of the component - default: some value - ui:autofocus: true - ui:options: - rows: 5 - - # These steps are executed in the scaffolder backend, using data that we gathered - # via the parameters above. - steps: - - id: someAsyncCall - name: Some Async Call - action: debug:log - input: - message: Some async call that return a tickedId (guid, for instance, that identifies a process) - - - id: waitWorkflow - name: Wait Creation - action: stress:waitWorkflow - input: - name: 'test' #${{ steps.someAsyncCall.output.ticketId }} - delayMilliseconds: 1000 - maxCalls: 30 diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index 8f1fd056e0..e388a70f00 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -55,7 +55,6 @@ import { createPublishGitlabAction, createPublishGitlabMergeRequestAction, } from './publish'; -import { waitWorkflow } from './stress'; /** * The options passed to {@link createBuiltinActions} @@ -185,7 +184,6 @@ export const createBuiltinActions = ( config, githubCredentialsProvider, }), - waitWorkflow(), ]; return actions as TemplateAction[]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts deleted file mode 100644 index 9260f41e2c..0000000000 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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. - */ - -export { waitWorkflow } from './waitWorkflow'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts deleted file mode 100644 index eeb5603e19..0000000000 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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. - */ - -import { createTemplateAction } from '../../createTemplateAction'; - -export function waitWorkflow() { - type InputParameters = { - name: string; - delayMilliseconds: number; - maxCalls: number; - }; - - return createTemplateAction({ - id: 'stress:waitWorkflow', - schema: { - input: { - required: ['name'], - type: 'object', - properties: { - name: { - type: 'string', - title: 'Name', - description: - 'The Ticket Number used to check the status of the Workflow.', - }, - delayMilliseconds: { - type: 'number', - title: 'Delay', - description: - 'The amount of milliseconds to delay before the next checkStatus call.', - }, - maxCalls: { - type: 'number', - title: 'Max Calls', - description: - 'The amount of maximum calls allowed to check a status before stopping.', - }, - }, - }, - output: { - type: 'object', - properties: { - status: { - title: 'Status', - type: 'object', - properties: { - message: { - title: 'Status Message', - type: 'string', - }, - }, - }, - results: { - title: 'Results from Ticket execution', - type: 'object', - }, - }, - }, - }, - async handler(ctx) { - const { name, maxCalls, delayMilliseconds } = getParameters(ctx.input); - - ctx.logger.info(`Running the long running workflow: ${name}...`); - - let i = 1; - - for (;;) { - ctx.logger.info(`waiting... [${i}/${maxCalls}]`); - - if (i++ >= maxCalls) { - break; - } - - await new Promise(res => setTimeout(res, delayMilliseconds)); - } - - ctx.output('status.message', 'Workflow completed'); - }, - }); - - function getParameters(input: InputParameters) { - const { name, delayMilliseconds, maxCalls } = input; - return { - name, - maxCalls: maxCalls ?? 30, - delayMilliseconds: delayMilliseconds ?? 2000, - }; - } -} From 05644d862e0ff3be0c2a1db225f66288f69acc32 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Mon, 17 Oct 2022 17:10:16 -0500 Subject: [PATCH 017/269] added TSDocs for the option Signed-off-by: Hao Luo --- .../src/scaffolder/tasks/TaskWorker.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 1dc8d01aad..9af818c421 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -51,6 +51,18 @@ export type CreateWorkerOptions = { workingDirectory: string; logger: Logger; additionalTemplateFilters?: Record; + /** + * The number of tasks that can be executed at the same time by the worker + * @defaultValue 10 + * @example + * ``` + * { + * concurrentTasksLimit: 1, + * // OR + * concurrentTasksLimit: Infinity + * } + * ``` + */ concurrentTasksLimit?: number; additionalTemplateGlobals?: Record; }; @@ -75,7 +87,7 @@ export class TaskWorker { integrations, workingDirectory, additionalTemplateFilters, - concurrentTasksLimit = 2, // Or Infinity + concurrentTasksLimit = 10, // from 1 to Infinity additionalTemplateGlobals, } = options; From 20a5161f045922c3f87a8a26453e295a58da74b0 Mon Sep 17 00:00:00 2001 From: tonedef Date: Tue, 30 Aug 2022 15:11:59 -0700 Subject: [PATCH 018/269] Adding MySQL support to the catalog-backend plugin Signed-off-by: tonedef --- .changeset/nice-pants-boil.md | 6 ++ packages/backend-common/src/database/util.ts | 4 +- .../migrations/20200511113813_init.js | 2 +- .../migrations/20200702153613_entities.js | 3 +- .../20200923104503_case_insensitivity.js | 4 +- .../20201005122705_add_entity_full_name.js | 7 +- .../20201006130744_entity_data_column.js | 3 +- .../20201007201501_index_entity_search.js | 13 ++- .../20201123205611_relations_table_uniq.js | 4 +- .../20210302150147_refresh_state.js | 93 +++++++------------ ...210622104022_refresh_state_location_key.js | 4 +- ...0925102509_add_refresh_state_input_hash.js | 2 +- .../migrations/20220616202842_refresh_keys.js | 4 +- .../DefaultProcessingDatabase.test.ts | 12 ++- .../src/database/DefaultProcessingDatabase.ts | 15 ++- .../modules/core/DefaultLocationStore.test.ts | 2 +- .../service/DefaultEntitiesCatalog.test.ts | 7 +- .../src/service/DefaultEntitiesCatalog.ts | 61 ++++++++---- .../src/service/DefaultRefreshService.test.ts | 2 +- .../src/stitching/Stitcher.test.ts | 2 +- 20 files changed, 135 insertions(+), 115 deletions(-) create mode 100644 .changeset/nice-pants-boil.md diff --git a/.changeset/nice-pants-boil.md b/.changeset/nice-pants-boil.md new file mode 100644 index 0000000000..e8bdf0a00f --- /dev/null +++ b/.changeset/nice-pants-boil.md @@ -0,0 +1,6 @@ +--- +'@backstage/backend-common': patch +'@backstage/plugin-catalog-backend': patch +--- + +Adds MySQL support for the catalog-backend diff --git a/packages/backend-common/src/database/util.ts b/packages/backend-common/src/database/util.ts index 0a7d3cd7f7..a4905d54b0 100644 --- a/packages/backend-common/src/database/util.ts +++ b/packages/backend-common/src/database/util.ts @@ -29,6 +29,8 @@ export function isDatabaseConflictError(e: unknown) { typeof message === 'string' && (/SQLITE_CONSTRAINT(?:_UNIQUE)?: UNIQUE/.test(message) || /UNIQUE constraint failed:/.test(message) || - /unique constraint/.test(message)) + /unique constraint/.test(message) || + /Duplicate entry/.test(message) // MySQL uniqueness error msg + ) ); } diff --git a/plugins/catalog-backend/migrations/20200511113813_init.js b/plugins/catalog-backend/migrations/20200511113813_init.js index aa2ff6affa..a34912135e 100644 --- a/plugins/catalog-backend/migrations/20200511113813_init.js +++ b/plugins/catalog-backend/migrations/20200511113813_init.js @@ -59,7 +59,7 @@ exports.up = async function up(knex) { 'An opaque string that changes for each update operation to any part of the entity, including metadata.', ); table - .string('generation') + .integer('generation') .notNullable() .unsigned() .comment( diff --git a/plugins/catalog-backend/migrations/20200702153613_entities.js b/plugins/catalog-backend/migrations/20200702153613_entities.js index 86e0e48e40..37aee4d985 100644 --- a/plugins/catalog-backend/migrations/20200702153613_entities.js +++ b/plugins/catalog-backend/migrations/20200702153613_entities.js @@ -31,6 +31,7 @@ exports.up = async function up(knex) { } await knex.schema.alterTable('entities', table => { table.dropUnique([], 'entities_unique_name'); + table.dropForeign(['location_id']); }); // Setup temporary tables await knex.schema.renameTable('entities_search', 'tmp_entities_search'); @@ -56,7 +57,7 @@ exports.up = async function up(knex) { 'An opaque string that changes for each update operation to any part of the entity, including metadata.', ); table - .string('generation') + .integer('generation') .notNullable() .unsigned() .comment( diff --git a/plugins/catalog-backend/migrations/20200923104503_case_insensitivity.js b/plugins/catalog-backend/migrations/20200923104503_case_insensitivity.js index 01be4789d0..9f0cabac41 100644 --- a/plugins/catalog-backend/migrations/20200923104503_case_insensitivity.js +++ b/plugins/catalog-backend/migrations/20200923104503_case_insensitivity.js @@ -24,8 +24,8 @@ exports.up = async function up(knex) { .where({ namespace: null }) .update({ namespace: 'default' }); await knex('entities_search').update({ - key: knex.raw('LOWER(key)'), - value: knex.raw('LOWER(value)'), + key: knex.raw('LOWER(??)', ['key']), + value: knex.raw('LOWER(??)', ['value']), }); }; diff --git a/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js b/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js index 941b8a0a3f..8705ae26a6 100644 --- a/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js +++ b/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js @@ -21,19 +21,20 @@ */ exports.up = async function up(knex) { await knex.schema.alterTable('entities', table => { - table.text('full_name').nullable(); + table.string('full_name').nullable(); }); await knex('entities').update({ full_name: knex.raw( - "LOWER(kind) || ':' || LOWER(COALESCE(namespace, 'default')) || '/' || LOWER(name)", + "LOWER(??) || ':' || LOWER(COALESCE(??, 'default')) || '/' || LOWER(??)", + ['kind', 'namespace', 'name'], ), }); // SQLite does not support alter column if (!knex.client.config.client.includes('sqlite3')) { await knex.schema.alterTable('entities', table => { - table.text('full_name').notNullable().alter({ alterNullable: true }); + table.string('full_name').notNullable().alter(); }); } diff --git a/plugins/catalog-backend/migrations/20201006130744_entity_data_column.js b/plugins/catalog-backend/migrations/20201006130744_entity_data_column.js index 47097fc788..6e7ae9b8fe 100644 --- a/plugins/catalog-backend/migrations/20201006130744_entity_data_column.js +++ b/plugins/catalog-backend/migrations/20201006130744_entity_data_column.js @@ -31,7 +31,8 @@ exports.up = async function up(knex) { // apiVersion and kind should not contain any JSON unsafe chars, and both // metadata and spec are already valid serialized JSON data: knex.raw( - `'{"apiVersion":"' || api_version || '","kind":"' || kind || '","metadata":' || metadata || COALESCE(',"spec":' || spec, '') || '}'`, + `'{"apiVersion":"' || ?? || '","kind":"' || ?? || '","metadata":' || ?? || COALESCE(',"spec":' || ??, '') || '}'`, + ['api_version', 'kind', 'metadata', 'spec'], ), }); diff --git a/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js b/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js index 59fd34b700..3611c91b3d 100644 --- a/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js +++ b/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js @@ -21,8 +21,17 @@ */ exports.up = async function up(knex) { await knex.schema.alterTable('entities_search', table => { - table.index(['key'], 'entities_search_key'); - table.index(['value'], 'entities_search_value'); + if (knex.client.config.client.includes('mysql')) { + table.index(['key'], 'entities_search_key', { + indexType: 'FULLTEXT', + }); + table.index(['value'], 'entities_search_value', { + indexType: 'FULLTEXT', + }); + } else { + table.index(['key'], 'entities_search_key'); + table.index(['value'], 'entities_search_value'); + } }); }; diff --git a/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js b/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js index 996c69de8c..313eb88600 100644 --- a/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js +++ b/plugins/catalog-backend/migrations/20201123205611_relations_table_uniq.js @@ -24,7 +24,7 @@ exports.up = async function up(knex) { // sqlite doesn't support dropPrimary so we recreate it properly instead await knex.schema.dropTable('entities_relations'); await knex.schema.createTable('entities_relations', table => { - table.comment('All relations between entities in the catalog'); + table.comment('All relations between entities'); table .uuid('originating_entity_id') .references('id') @@ -61,7 +61,7 @@ exports.down = async function down(knex) { if (knex.client.config.client.includes('sqlite3')) { await knex.schema.dropTable('entities_relations'); await knex.schema.createTable('entities_relations', table => { - table.comment('All relations between entities in the catalog'); + table.comment('All relations between entities'); table .uuid('originating_entity_id') .references('id') diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index da276940fa..3a58196127 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -21,38 +21,28 @@ */ exports.up = async function up(knex) { await knex.schema.createTable('refresh_state', table => { - table.comment( - 'Location refresh states. Every individual location (that was ever directly or indirectly discovered) and entity has an entry in this table. It therefore represents the entire live set of things that the refresh loop considers.', - ); + table.comment('Location refresh states'); table - .text('entity_id') + .string('entity_id') .primary() .notNullable() - .comment( - 'Primary ID, which will also be used as the uid of the resulting entity', - ); + .comment('Primary ID, also used as the uid of the entity'); table - .text('entity_ref') + .string('entity_ref') .notNullable() - .comment('A reference to the entity that the refresh state is tied to'); + .comment('A reference to the entity for this refresh state'); table .text('unprocessed_entity') .notNullable() - .comment( - 'The unprocessed entity (in its source form, before being run through all of the processors) as JSON', - ); + .comment('The unprocessed entity (in original form) as JSON'); table .text('processed_entity') .nullable() - .comment( - 'The processed entity (after running through all processors, but before being stitched together with state and relations) as JSON', - ); + .comment('The processed entity (not yet stitched) as JSON'); table .text('cache') .nullable() - .comment( - 'Cache information tied to the refreshing of this entity, such as etag information or actual response caching', - ); + .comment('Cache information tied to refreshes of this entity'); table .text('errors') .notNullable() @@ -64,41 +54,28 @@ exports.up = async function up(knex) { table .dateTime('last_discovery_at') // TODO: timezone or change to epoch-millis or similar .notNullable() - .comment('The last timestamp of which this entity was discovered'); - table.unique(['entity_ref'], { - indexName: 'refresh_state_entity_ref_uniq', - }); + .comment('The last timestamp that this entity was discovered'); + table.unique(['entity_ref'], 'refresh_state_entity_ref_uniq'); table.index('entity_id', 'refresh_state_entity_id_idx'); table.index('entity_ref', 'refresh_state_entity_ref_idx'); table.index('next_update_at', 'refresh_state_next_update_at_idx'); }); await knex.schema.createTable('final_entities', table => { - table.comment( - 'This table contains the final entity result after processing and stitching', - ); + table.comment('Final entities after processing and stitching'); table - .text('entity_id') + .string('entity_id') .primary() .notNullable() .references('entity_id') .inTable('refresh_state') .onDelete('CASCADE') - .comment( - 'Entity ID which corresponds to the ID in the refresh_state table', - ); + .comment('Entity ID -> refresh_state table'); + table.text('hash').notNullable().comment('Stable hash of the entity data'); table - .text('hash') + .string('stitch_ticket') .notNullable() - .comment( - 'Stable hash of the entity data, to be used for caching and avoiding redundant work', - ); - table - .text('stitch_ticket') - .notNullable() - .comment( - 'A random value representing a unique stitch attempt ticket, that gets updated each time that a stitching attempt is made on the entity', - ); + .comment('Random value representing a unique stitch attempt ticket'); table .text('final_entity') .nullable() @@ -107,29 +84,23 @@ exports.up = async function up(knex) { }); await knex.schema.createTable('refresh_state_references', table => { - table.comment( - 'Holds edges between refresh state rows. Every time when an entity is processed and emits another entity, an edge will be stored to represent that fact. This is used to detect orphans and ultimately deletions.', - ); + table.comment('Edges between refresh state rows'); table .increments('id') .comment('Primary key to distinguish unique lines from each other'); table - .text('source_key') + .string('source_key') .nullable() - .comment( - 'When the reference source is not an entity, this is an opaque identifier for that source.', - ); + .comment('Opaque identifier for non-entity sources'); table - .text('source_entity_ref') + .string('source_entity_ref') .nullable() .references('entity_ref') .inTable('refresh_state') .onDelete('CASCADE') - .comment( - 'When the reference source is an entity, this is the EntityRef of the source entity.', - ); + .comment('EntityRef of entity sources'); table - .text('target_entity_ref') + .string('target_entity_ref') .notNullable() .references('entity_ref') .inTable('refresh_state') @@ -147,36 +118,34 @@ exports.up = async function up(knex) { }); await knex.schema.createTable('relations', table => { - table.comment('All relations between entities in the catalog'); + table.comment('All relations between entities'); table - .text('originating_entity_id') + .string('originating_entity_id') .references('entity_id') .inTable('refresh_state') .onDelete('CASCADE') .notNullable() .comment('The entity that provided the relation'); table - .text('source_entity_ref') + .string('source_entity_ref') .notNullable() - .comment('The entity reference of the source entity of the relation'); + .comment('Entity reference of the source entity of the relation'); table - .text('type') + .string('type') .notNullable() .comment('The type of the relation between the entities'); table - .text('target_entity_ref') + .string('target_entity_ref') .notNullable() - .comment('The entity reference of the target entity of the relation'); + .comment('Entity reference of the target entity of the relation'); table.index('source_entity_ref', 'relations_source_entity_ref_idx'); table.index('originating_entity_id', 'relations_source_entity_id_idx'); }); await knex.schema.createTable('search', table => { - table.comment( - 'Flattened key-values from the entities, used for quick filtering', - ); + table.comment('Flattened key-values from the entities, for filtering'); table - .text('entity_id') + .string('entity_id') .references('entity_id') .inTable('refresh_state') .onDelete('CASCADE') diff --git a/plugins/catalog-backend/migrations/20210622104022_refresh_state_location_key.js b/plugins/catalog-backend/migrations/20210622104022_refresh_state_location_key.js index 37ab5e12cb..f15e2c208c 100644 --- a/plugins/catalog-backend/migrations/20210622104022_refresh_state_location_key.js +++ b/plugins/catalog-backend/migrations/20210622104022_refresh_state_location_key.js @@ -24,9 +24,7 @@ exports.up = async function up(knex) { table .text('location_key') .nullable() - .comment( - 'An opaque key that uniquely identifies the location of an entity in order to support conflict resolution', - ); + .comment('Opaque conflict resolution key'); }); }; diff --git a/plugins/catalog-backend/migrations/20210925102509_add_refresh_state_input_hash.js b/plugins/catalog-backend/migrations/20210925102509_add_refresh_state_input_hash.js index 7d7a4ac578..136be9899e 100644 --- a/plugins/catalog-backend/migrations/20210925102509_add_refresh_state_input_hash.js +++ b/plugins/catalog-backend/migrations/20210925102509_add_refresh_state_input_hash.js @@ -24,7 +24,7 @@ exports.up = async function up(knex) { table .text('unprocessed_hash') .nullable() - .comment('A hash of the unprocessed contents, used to detect changes'); + .comment('A hash of the unprocessed contents'); }); }; diff --git a/plugins/catalog-backend/migrations/20220616202842_refresh_keys.js b/plugins/catalog-backend/migrations/20220616202842_refresh_keys.js index b1b67f68f2..ddc39d4005 100644 --- a/plugins/catalog-backend/migrations/20220616202842_refresh_keys.js +++ b/plugins/catalog-backend/migrations/20220616202842_refresh_keys.js @@ -23,14 +23,14 @@ exports.up = async function up(knex) { 'This table contains relations between entities and keys to trigger refreshes with', ); table - .text('entity_id') + .string('entity_id') .notNullable() .references('entity_id') .inTable('refresh_state') .onDelete('CASCADE') .comment('A reference to the entity that the refresh key is tied to'); table - .text('key') + .string('key') .notNullable() .comment( 'A reference to a key which should be used to trigger a refresh on this entity', diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 46b327733d..e8d538fb0b 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -36,7 +36,7 @@ import { generateStableHash } from './util'; describe('Default Processing Database', () => { const defaultLogger = getVoidLogger(); const databases = TestDatabases.create({ - ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], }); async function createDatabase( @@ -1447,10 +1447,12 @@ describe('Default Processing Database', () => { const result1 = await db.transaction(async tx => db.listParents(tx, { entityRef: 'component:default/foobar' }), ); - expect(result1.entityRefs).toEqual([ - 'location:default/root-1', - 'location:default/root-2', - ]); + expect(result1.entityRefs).toEqual( + expect.arrayContaining([ + 'location:default/root-1', + 'location:default/root-2', + ]), + ); const result2 = await db.transaction(async tx => db.listParents(tx, { entityRef: 'location:default/root-1' }), diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 3dc5325178..2ffe69725f 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -82,6 +82,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { refreshKeys, locationKey, } = options; + const configClient = tx.client.config.client; const refreshResult = await tx('refresh_state') .update({ processed_entity: JSON.stringify(processedEntity), @@ -114,10 +115,7 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { // Delete old relations // NOTE(freben): knex implemented support for returning() on update queries for sqlite, but at the current time of writing (Sep 2022) not for delete() queries. let previousRelationRows: DbRelationsRow[]; - if ( - tx.client.config.client.includes('sqlite3') || - tx.client.config.client.includes('mysql') - ) { + if (configClient.includes('sqlite3') || configClient.includes('mysql')) { previousRelationRows = await tx('relations') .select('*') .where({ originating_entity_id: id }); @@ -663,11 +661,11 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { last_discovery_at: tx.fn.now(), }); - // TODO(Rugvip): only tested towards Postgres and SQLite + // TODO(Rugvip): only tested towards MySQL, Postgres and SQLite. // We have to do this because the only way to detect if there was a conflict with // SQLite is to catch the error, while Postgres needs to ignore the conflict to not // break the ongoing transaction. - if (!tx.client.config.client.includes('sqlite3')) { + if (tx.client.config.client.includes('pg')) { query = query.onConflict('entity_ref').ignore() as any; // type here does not match runtime } @@ -675,10 +673,11 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { const result: { rowCount?: number; length?: number } = await query; return result.rowCount === 1 || result.length === 1; } catch (error) { - // SQLite reached this rather than the rowCount check above + // SQLite, or MySQL reached this rather than the rowCount check above if ( isError(error) && - error.message.includes('UNIQUE constraint failed') + (error.message.includes('UNIQUE constraint failed') || + error.message.includes('Duplicate entry')) // MySQL failure ) { return false; } diff --git a/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts b/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts index 2a9b1f8d65..9a957f8838 100644 --- a/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts +++ b/plugins/catalog-backend/src/modules/core/DefaultLocationStore.test.ts @@ -20,7 +20,7 @@ import { DefaultLocationStore } from './DefaultLocationStore'; describe('DefaultLocationStore', () => { const databases = TestDatabases.create({ - ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], }); async function createLocationStore(databaseId: TestDatabaseId) { diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 49d4fe9e19..306c141a62 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -30,7 +30,7 @@ import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; describe('DefaultEntitiesCatalog', () => { const databases = TestDatabases.create({ - ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], }); const stitch = jest.fn(); const stitcher: Stitcher = { stitch } as any; @@ -239,7 +239,10 @@ describe('DefaultEntitiesCatalog', () => { expect.arrayContaining([ { entity: expect.objectContaining({ metadata: { name: 'root' } }), - parentEntityRefs: ['k:default/parent1', 'k:default/parent2'], + parentEntityRefs: expect.arrayContaining([ + 'k:default/parent1', + 'k:default/parent2', + ]), }, { entity: expect.objectContaining({ diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index dc84b12484..90e40377f2 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -238,6 +238,8 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { } async removeEntityByUid(uid: string): Promise { + const dbConfig = this.database.client.config; + // Clear the hashed state of the immediate parents of the deleted entity. // This makes sure that when they get reprocessed, their output is written // down again. The reason for wanting to do this, is that if the user @@ -246,21 +248,49 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { // means it'll never try to write down the children again (it assumes that // they already exist). This means that without the code below, the database // never "heals" from accidental deletes. - await this.database('refresh_state') - .update({ - result_hash: 'child-was-deleted', - next_update_at: this.database.fn.now(), - }) - .whereIn('entity_ref', function parents(builder) { - return builder - .from('refresh_state') - .innerJoin('refresh_state_references', { - 'refresh_state_references.target_entity_ref': - 'refresh_state.entity_ref', - }) - .where('refresh_state.entity_id', '=', uid) - .select('refresh_state_references.source_entity_ref'); - }); + if (dbConfig.client.includes('mysql')) { + // MySQL doesn't support the syntax we need to do this in a single query, + // http://dev.mysql.com/doc/refman/5.6/en/update.html + const results = await this.database('refresh_state') + .select('entity_id') + .whereIn('entity_ref', function parents(builder) { + return builder + .from('refresh_state') + .innerJoin( + 'refresh_state_references', + { + 'refresh_state_references.target_entity_ref': + 'refresh_state.entity_ref', + }, + ) + .where('refresh_state.entity_id', '=', uid) + .select('refresh_state_references.source_entity_ref'); + }); + await this.database('refresh_state') + .update({ result_hash: 'child-was-deleted' }) + .whereIn( + 'entity_id', + results.map(key => key.entity_id), + ); + } else { + await this.database('refresh_state') + .update({ + result_hash: 'child-was-deleted', + }) + .whereIn('entity_ref', function parents(builder) { + return builder + .from('refresh_state') + .innerJoin( + 'refresh_state_references', + { + 'refresh_state_references.target_entity_ref': + 'refresh_state.entity_ref', + }, + ) + .where('refresh_state.entity_id', '=', uid) + .select('refresh_state_references.source_entity_ref'); + }); + } // Stitch the entities that the deleted one had relations to. If we do not // do this, the entities in the other end of the relations will still look @@ -285,7 +315,6 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { .select({ ref: 'relations.source_entity_ref' }), ); - // Perform the actual deletion await this.database('refresh_state') .where('entity_id', uid) .delete(); diff --git a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts index 419aedc15d..3ed4f3fe36 100644 --- a/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts +++ b/plugins/catalog-backend/src/service/DefaultRefreshService.test.ts @@ -36,7 +36,7 @@ import { DefaultRefreshService } from './DefaultRefreshService'; describe('Refresh integration', () => { const defaultLogger = getVoidLogger(); const databases = TestDatabases.create({ - ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], }); async function createDatabase( diff --git a/plugins/catalog-backend/src/stitching/Stitcher.test.ts b/plugins/catalog-backend/src/stitching/Stitcher.test.ts index 9accebf1fc..c6827892ee 100644 --- a/plugins/catalog-backend/src/stitching/Stitcher.test.ts +++ b/plugins/catalog-backend/src/stitching/Stitcher.test.ts @@ -29,7 +29,7 @@ import { Stitcher } from './Stitcher'; describe('Stitcher', () => { const databases = TestDatabases.create({ - ids: ['POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], + ids: ['MYSQL_8', 'POSTGRES_13', 'POSTGRES_9', 'SQLITE_3'], }); const logger = getVoidLogger(); From 1e62ef8675904d7148d5e675141880e22b41faff Mon Sep 17 00:00:00 2001 From: tonedef Date: Tue, 30 Aug 2022 15:51:52 -0700 Subject: [PATCH 019/269] fix parentheses Signed-off-by: tonedef --- packages/backend-common/src/database/util.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/backend-common/src/database/util.ts b/packages/backend-common/src/database/util.ts index a4905d54b0..f5abcd7fba 100644 --- a/packages/backend-common/src/database/util.ts +++ b/packages/backend-common/src/database/util.ts @@ -30,7 +30,6 @@ export function isDatabaseConflictError(e: unknown) { (/SQLITE_CONSTRAINT(?:_UNIQUE)?: UNIQUE/.test(message) || /UNIQUE constraint failed:/.test(message) || /unique constraint/.test(message) || - /Duplicate entry/.test(message) // MySQL uniqueness error msg - ) + /Duplicate entry/.test(message)) // MySQL uniqueness error msg ); } From 7a854747522c55dcdacc4bc61107e222211c40aa Mon Sep 17 00:00:00 2001 From: tonedef Date: Thu, 6 Oct 2022 15:14:57 -0700 Subject: [PATCH 020/269] address feedback Signed-off-by: tonedef --- .../20210302150147_refresh_state.js | 28 +++++++++++++------ .../DefaultProcessingDatabase.test.ts | 10 +++---- .../src/database/DefaultProcessingDatabase.ts | 12 ++++---- .../service/DefaultEntitiesCatalog.test.ts | 5 +--- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index 3a58196127..bf1611a099 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -20,6 +20,11 @@ * @param {import('knex').Knex} knex */ exports.up = async function up(knex) { + let STRING_TEXT = 'text'; + if (knex.client.config.client.includes('mysql')) { + STRING_TEXT = 'string'; + } + await knex.schema.createTable('refresh_state', table => { table.comment('Location refresh states'); table @@ -55,7 +60,9 @@ exports.up = async function up(knex) { .dateTime('last_discovery_at') // TODO: timezone or change to epoch-millis or similar .notNullable() .comment('The last timestamp that this entity was discovered'); - table.unique(['entity_ref'], 'refresh_state_entity_ref_uniq'); + table.unique(['entity_ref'], { + indexName: 'refresh_state_entity_ref_uniq', + }); table.index('entity_id', 'refresh_state_entity_id_idx'); table.index('entity_ref', 'refresh_state_entity_ref_idx'); table.index('next_update_at', 'refresh_state_next_update_at_idx'); @@ -71,9 +78,12 @@ exports.up = async function up(knex) { .inTable('refresh_state') .onDelete('CASCADE') .comment('Entity ID -> refresh_state table'); - table.text('hash').notNullable().comment('Stable hash of the entity data'); table - .string('stitch_ticket') + .string('hash') + .notNullable() + .comment('Stable hash of the entity data'); + table + .text('stitch_ticket') .notNullable() .comment('Random value representing a unique stitch attempt ticket'); table @@ -88,19 +98,19 @@ exports.up = async function up(knex) { table .increments('id') .comment('Primary key to distinguish unique lines from each other'); - table - .string('source_key') + // @ts-ignore + table[STRING_TEXT]('source_key') .nullable() .comment('Opaque identifier for non-entity sources'); - table - .string('source_entity_ref') + // @ts-ignore + table[STRING_TEXT]('source_entity_ref') .nullable() .references('entity_ref') .inTable('refresh_state') .onDelete('CASCADE') .comment('EntityRef of entity sources'); - table - .string('target_entity_ref') + // @ts-ignore + table[STRING_TEXT]('target_entity_ref') .notNullable() .references('entity_ref') .inTable('refresh_state') diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index e8d538fb0b..3375629d0b 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -1447,12 +1447,10 @@ describe('Default Processing Database', () => { const result1 = await db.transaction(async tx => db.listParents(tx, { entityRef: 'component:default/foobar' }), ); - expect(result1.entityRefs).toEqual( - expect.arrayContaining([ - 'location:default/root-1', - 'location:default/root-2', - ]), - ); + expect(result1.entityRefs).toEqual([ + 'location:default/root-1', + 'location:default/root-2', + ]); const result2 = await db.transaction(async tx => db.listParents(tx, { entityRef: 'location:default/root-1' }), diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 2ffe69725f..319ccae7f8 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -674,14 +674,14 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { return result.rowCount === 1 || result.length === 1; } catch (error) { // SQLite, or MySQL reached this rather than the rowCount check above - if ( - isError(error) && - (error.message.includes('UNIQUE constraint failed') || - error.message.includes('Duplicate entry')) // MySQL failure - ) { + if (!isDatabaseConflictError(error)) { + throw error; + } else { + this.options.logger.debug( + `Unable to insert a new refresh state row, ${error}`, + ); return false; } - throw error; } } diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 306c141a62..049619c831 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -239,10 +239,7 @@ describe('DefaultEntitiesCatalog', () => { expect.arrayContaining([ { entity: expect.objectContaining({ metadata: { name: 'root' } }), - parentEntityRefs: expect.arrayContaining([ - 'k:default/parent1', - 'k:default/parent2', - ]), + parentEntityRefs: ['k:default/parent1', 'k:default/parent2'], }, { entity: expect.objectContaining({ From 7e87a56a0f3309074ed05a2356af0b7e7b52ff51 Mon Sep 17 00:00:00 2001 From: tonedef Date: Thu, 6 Oct 2022 15:23:32 -0700 Subject: [PATCH 021/269] fix ts error Signed-off-by: tonedef --- .../catalog-backend/src/database/DefaultProcessingDatabase.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 319ccae7f8..fda65e35a1 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -15,7 +15,7 @@ */ import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { ConflictError, isError, NotFoundError } from '@backstage/errors'; +import { ConflictError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; import lodash from 'lodash'; import { v4 as uuid } from 'uuid'; From 1fdd91514a45b16d782418c3775cd007771e57fd Mon Sep 17 00:00:00 2001 From: tonedef Date: Thu, 6 Oct 2022 16:26:32 -0700 Subject: [PATCH 022/269] repush indexName change Signed-off-by: tonedef --- .../migrations/20210302150147_refresh_state.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index bf1611a099..1dd82749ed 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -60,9 +60,7 @@ exports.up = async function up(knex) { .dateTime('last_discovery_at') // TODO: timezone or change to epoch-millis or similar .notNullable() .comment('The last timestamp that this entity was discovered'); - table.unique(['entity_ref'], { - indexName: 'refresh_state_entity_ref_uniq', - }); + table.unique(['entity_ref'], { indexName: 'refresh_state_entity_ref_uniq' }); table.index('entity_id', 'refresh_state_entity_id_idx'); table.index('entity_ref', 'refresh_state_entity_ref_idx'); table.index('next_update_at', 'refresh_state_next_update_at_idx'); From 1882a59951bbdf0d4d53ecea1bf359a56f72bf24 Mon Sep 17 00:00:00 2001 From: tonedef Date: Thu, 6 Oct 2022 16:38:18 -0700 Subject: [PATCH 023/269] repush changes Signed-off-by: tonedef --- .../migrations/20210302150147_refresh_state.js | 6 ++++-- .../src/database/DefaultProcessingDatabase.test.ts | 2 +- .../src/database/DefaultProcessingDatabase.ts | 2 +- .../src/service/DefaultEntitiesCatalog.test.ts | 2 +- .../catalog-backend/src/service/DefaultEntitiesCatalog.ts | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index 1dd82749ed..dadc656e86 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -5,7 +5,7 @@ * 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 + * 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, @@ -60,7 +60,9 @@ exports.up = async function up(knex) { .dateTime('last_discovery_at') // TODO: timezone or change to epoch-millis or similar .notNullable() .comment('The last timestamp that this entity was discovered'); - table.unique(['entity_ref'], { indexName: 'refresh_state_entity_ref_uniq' }); + table.unique(['entity_ref'], { + indexName: 'refresh_state_entity_ref_uniq', + }); table.index('entity_id', 'refresh_state_entity_id_idx'); table.index('entity_ref', 'refresh_state_entity_ref_idx'); table.index('next_update_at', 'refresh_state_next_update_at_idx'); diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 3375629d0b..f10ac3df6e 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index fda65e35a1..d739c9c8ee 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 049619c831..591c69bcc7 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 90e40377f2..2b9a3f3310 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -5,7 +5,7 @@ * 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 + * 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, From 50ae38e537fc2075f5dbc06c2eec1bf7d8c311f2 Mon Sep 17 00:00:00 2001 From: tonedef Date: Fri, 7 Oct 2022 09:24:11 -0700 Subject: [PATCH 024/269] fix notice issue Signed-off-by: tonedef --- .../catalog-backend/migrations/20210302150147_refresh_state.js | 2 +- .../src/database/DefaultProcessingDatabase.test.ts | 2 +- .../catalog-backend/src/database/DefaultProcessingDatabase.ts | 2 +- .../catalog-backend/src/service/DefaultEntitiesCatalog.test.ts | 2 +- plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index dadc656e86..bf1611a099 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index f10ac3df6e..3375629d0b 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index d739c9c8ee..fda65e35a1 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 591c69bcc7..049619c831 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -5,7 +5,7 @@ * 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 + * 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, diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 2b9a3f3310..90e40377f2 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -5,7 +5,7 @@ * 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 + * 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, From cb823a809e5a45d4a64e7050411827daeba045cc Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Wed, 26 Oct 2022 11:57:24 -0500 Subject: [PATCH 025/269] added test for concurrentTasksLimit Signed-off-by: Hao Luo --- .../src/scaffolder/tasks/TaskWorker.test.ts | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index ee8ae400c4..bc09d8605e 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -127,3 +127,70 @@ describe('TaskWorker', () => { expect(event?.body.output).toEqual({ testOutput: 'testmockoutput' }); }); }); + +describe('Concurrent TaskWorker', () => { + let storage: DatabaseTaskStore; + + const integrations: ScmIntegrations = {} as ScmIntegrations; + + const actionRegistry: TemplateActionRegistry = {} as TemplateActionRegistry; + const workingDirectory = '/tmp/scaffolder'; + let asyncTasksCount = 0; + + const workflowRunner: NunjucksWorkflowRunner = { + execute: () => { + asyncTasksCount++; + return new Promise(resolve => { + setTimeout(() => { + resolve({ output: { testOutput: 'testmockoutput' } }); + }, 1000); + }); + }, + } as unknown as NunjucksWorkflowRunner; + + beforeAll(async () => { + storage = await createStore(); + }); + + beforeEach(() => { + asyncTasksCount = 0; + jest.resetAllMocks(); + MockedNunjucksWorkflowRunner.mockImplementation(() => workflowRunner); + }); + + const logger = getVoidLogger(); + + it('should be able to run multiple tasks at once', async () => { + const dispatchANewTask = () => + broker.dispatch({ + spec: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + steps: [{ id: 'test', name: 'test', action: 'not-found-action' }], + output: { + result: '{{ steps.test.output.testOutput }}', + }, + parameters: {}, + }, + }); + + const expectedConcurrentTasks = 3; + const broker = new StorageTaskBroker(storage, logger); + const taskWorker = await TaskWorker.create({ + logger, + workingDirectory, + integrations, + taskBroker: broker, + actionRegistry, + concurrentTasksLimit: expectedConcurrentTasks, + }); + + taskWorker.start(); + + await dispatchANewTask(); + await dispatchANewTask(); + await dispatchANewTask(); + await dispatchANewTask(); + + expect(asyncTasksCount).toEqual(expectedConcurrentTasks); + }); +}); From 7150d819b3eef78374f1a22bf281befe3bddea89 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Wed, 26 Oct 2022 13:05:55 -0500 Subject: [PATCH 026/269] fixed yarn.lock Signed-off-by: Hao Luo --- yarn.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/yarn.lock b/yarn.lock index 77dd94a965..ebb4f6c698 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3314,7 +3314,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/catalog-model@npm:^1.1.1, @backstage/catalog-model@npm:^1.1.2": +"@backstage/catalog-model@npm:^1.1.2": version: 1.1.2 resolution: "@backstage/catalog-model@npm:1.1.2" dependencies: @@ -3599,7 +3599,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-components@npm:^0.11.1, @backstage/core-components@npm:^0.11.2": +"@backstage/core-components@npm:^0.11.2": version: 0.11.2 resolution: "@backstage/core-components@npm:0.11.2" dependencies: @@ -3722,7 +3722,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/core-plugin-api@npm:^1.0.6, @backstage/core-plugin-api@npm:^1.0.7": +"@backstage/core-plugin-api@npm:^1.0.7": version: 1.0.7 resolution: "@backstage/core-plugin-api@npm:1.0.7" dependencies: @@ -5066,7 +5066,7 @@ __metadata: languageName: unknown linkType: soft -"@backstage/plugin-catalog-react@npm:^1.1.4, @backstage/plugin-catalog-react@npm:^1.2.0": +"@backstage/plugin-catalog-react@npm:^1.2.0": version: 1.2.0 resolution: "@backstage/plugin-catalog-react@npm:1.2.0" dependencies: From 09d0e5fc61db3152cc667256efda61dadc97a8f7 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Wed, 26 Oct 2022 14:02:32 -0500 Subject: [PATCH 027/269] fixed tests error Signed-off-by: Hao Luo --- .../scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index bc09d8605e..8903f3b6b5 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -161,6 +161,8 @@ describe('Concurrent TaskWorker', () => { const logger = getVoidLogger(); it('should be able to run multiple tasks at once', async () => { + const broker = new StorageTaskBroker(storage, logger); + const dispatchANewTask = () => broker.dispatch({ spec: { @@ -174,7 +176,6 @@ describe('Concurrent TaskWorker', () => { }); const expectedConcurrentTasks = 3; - const broker = new StorageTaskBroker(storage, logger); const taskWorker = await TaskWorker.create({ logger, workingDirectory, From 7aec2d97e61f00ef08a441a8ffb2e08d733e4407 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 27 Oct 2022 16:57:51 -0500 Subject: [PATCH 028/269] Update TaskWorker.test.ts per maintainer suggestion Co-authored-by: Johan Haals Signed-off-by: Hao Luo --- .../scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index 8903f3b6b5..cef93c9247 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -134,7 +134,7 @@ describe('Concurrent TaskWorker', () => { const integrations: ScmIntegrations = {} as ScmIntegrations; const actionRegistry: TemplateActionRegistry = {} as TemplateActionRegistry; - const workingDirectory = '/tmp/scaffolder'; + const workingDirectory = os.tmpdir(); let asyncTasksCount = 0; const workflowRunner: NunjucksWorkflowRunner = { From 5b00f413cd8558164383bb63dda331fce5edf804 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 27 Oct 2022 17:03:44 -0500 Subject: [PATCH 029/269] added os import Signed-off-by: Hao Luo --- .../scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index cef93c9247..42415f4f11 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import os from 'os'; import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; From 112c6d5605813936f044ef2ffa0995b2e49576f6 Mon Sep 17 00:00:00 2001 From: tonedef Date: Fri, 28 Oct 2022 13:54:42 -0700 Subject: [PATCH 030/269] address feedback Signed-off-by: tonedef --- .../20201005122705_add_entity_full_name.js | 2 +- .../20201007201501_index_entity_search.js | 22 +++++++++---------- .../20210302150147_refresh_state.js | 19 +++++++--------- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js b/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js index 8705ae26a6..412791d8d7 100644 --- a/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js +++ b/plugins/catalog-backend/migrations/20201005122705_add_entity_full_name.js @@ -34,7 +34,7 @@ exports.up = async function up(knex) { // SQLite does not support alter column if (!knex.client.config.client.includes('sqlite3')) { await knex.schema.alterTable('entities', table => { - table.string('full_name').notNullable().alter(); + table.string('full_name').notNullable().alter({ alterNullable: true }); }); } diff --git a/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js b/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js index 3611c91b3d..be700a324a 100644 --- a/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js +++ b/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js @@ -21,17 +21,17 @@ */ exports.up = async function up(knex) { await knex.schema.alterTable('entities_search', table => { - if (knex.client.config.client.includes('mysql')) { - table.index(['key'], 'entities_search_key', { - indexType: 'FULLTEXT', - }); - table.index(['value'], 'entities_search_value', { - indexType: 'FULLTEXT', - }); - } else { - table.index(['key'], 'entities_search_key'); - table.index(['value'], 'entities_search_value'); - } + const options = knex.client.config.client.includes('mysql') ? { indexType: 'FULLTEXT', } : {} + table.index( + ['key'], + 'entities_search_key', + options + ); + table.index( + ['value'], + 'entities_search_value', + options + ); }); }; diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index bf1611a099..c3c3dc3f12 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -20,11 +20,7 @@ * @param {import('knex').Knex} knex */ exports.up = async function up(knex) { - let STRING_TEXT = 'text'; - if (knex.client.config.client.includes('mysql')) { - STRING_TEXT = 'string'; - } - + const isMySQL = knex.client.config.client.includes('mysql'); await knex.schema.createTable('refresh_state', table => { table.comment('Location refresh states'); table @@ -94,23 +90,24 @@ exports.up = async function up(knex) { }); await knex.schema.createTable('refresh_state_references', table => { + const textColumn = isMySQL + ? table.string.bind(table) + : table.text.bind(table); + table.comment('Edges between refresh state rows'); table .increments('id') .comment('Primary key to distinguish unique lines from each other'); - // @ts-ignore - table[STRING_TEXT]('source_key') + textColumn('source_key') .nullable() .comment('Opaque identifier for non-entity sources'); - // @ts-ignore - table[STRING_TEXT]('source_entity_ref') + textColumn('source_entity_ref') .nullable() .references('entity_ref') .inTable('refresh_state') .onDelete('CASCADE') .comment('EntityRef of entity sources'); - // @ts-ignore - table[STRING_TEXT]('target_entity_ref') + textColumn('target_entity_ref') .notNullable() .references('entity_ref') .inTable('refresh_state') From 052226bd65eac21a3add863de2c5e585717709d4 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Fri, 28 Oct 2022 17:27:21 -0500 Subject: [PATCH 031/269] deprecated taskWorkers option in RouterOption Signed-off-by: Hao Luo --- .changeset/little-chairs-dance.md | 7 +++---- plugins/scaffolder-backend/src/service/router.ts | 11 +++++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.changeset/little-chairs-dance.md b/.changeset/little-chairs-dance.md index 07cbf52389..f99b3443cb 100644 --- a/.changeset/little-chairs-dance.md +++ b/.changeset/little-chairs-dance.md @@ -1,12 +1,11 @@ --- '@backstage/plugin-scaffolder-backend': minor --- +Deprecated the `taskWorkers` option in RouterOptions in favor of `concurrentTasksLimit` which sets the limit of concurrentTasks in a single TaskWorker -Added optional "concurrentTasksLimit" option to TaskWorker +TaskWorker can now run multiple (defaults to 10) tasks concurrently using the `concurrentTasksLimit` option available in both `RouterOptions` and `CreateWorkerOptions`. -TaskWorker can now run multiple (defaults to 10) tasks concurrently. - -To use the option, in `createRouter`: +To use the option to create a TaskWorker: ```diff const worker = await TaskWorker.create({ diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 9d4aa547f8..6ae54b6530 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -67,7 +67,16 @@ export interface RouterOptions { scheduler?: PluginTaskScheduler; actions?: TemplateAction[]; + /** + * @deprecated taskWorkers is deprecated in favor of concurrentTasksLimit option with a single TaskWorker + * @default 1 + */ taskWorkers?: number; + /** + * Sets the number of concurrent tasks that can be run at any given time on the TaskWorker + * @default 10 + */ + concurrentTasksLimit?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; @@ -160,6 +169,7 @@ export async function createRouter( catalogClient, actions, taskWorkers, + concurrentTasksLimit, scheduler, additionalTemplateFilters, additionalTemplateGlobals, @@ -211,6 +221,7 @@ export async function createRouter( workingDirectory, additionalTemplateFilters, additionalTemplateGlobals, + concurrentTasksLimit, }); workers.push(worker); } From e777427133404b6f15d0a8159a0b36eaf7204928 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Fri, 28 Oct 2022 17:36:29 -0500 Subject: [PATCH 032/269] fixed typo Signed-off-by: Hao Luo --- .changeset/little-chairs-dance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/little-chairs-dance.md b/.changeset/little-chairs-dance.md index f99b3443cb..fd0acc36a2 100644 --- a/.changeset/little-chairs-dance.md +++ b/.changeset/little-chairs-dance.md @@ -1,7 +1,7 @@ --- '@backstage/plugin-scaffolder-backend': minor --- -Deprecated the `taskWorkers` option in RouterOptions in favor of `concurrentTasksLimit` which sets the limit of concurrentTasks in a single TaskWorker +Deprecated the `taskWorkers` option in RouterOptions in favor of `concurrentTasksLimit` which sets the limit of concurrent tasks in a single TaskWorker TaskWorker can now run multiple (defaults to 10) tasks concurrently using the `concurrentTasksLimit` option available in both `RouterOptions` and `CreateWorkerOptions`. From 560232de3a7a34f8b952645ada34a664601b4ee7 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Fri, 28 Oct 2022 21:45:56 -0500 Subject: [PATCH 033/269] fixed linting errors Signed-off-by: Hao Luo --- .changeset/little-chairs-dance.md | 1 + 1 file changed, 1 insertion(+) diff --git a/.changeset/little-chairs-dance.md b/.changeset/little-chairs-dance.md index fd0acc36a2..c08dd3838c 100644 --- a/.changeset/little-chairs-dance.md +++ b/.changeset/little-chairs-dance.md @@ -1,6 +1,7 @@ --- '@backstage/plugin-scaffolder-backend': minor --- + Deprecated the `taskWorkers` option in RouterOptions in favor of `concurrentTasksLimit` which sets the limit of concurrent tasks in a single TaskWorker TaskWorker can now run multiple (defaults to 10) tasks concurrently using the `concurrentTasksLimit` option available in both `RouterOptions` and `CreateWorkerOptions`. From 29ba69a4ab1f891d2fc79d861ede34a04c8d4396 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Fri, 28 Oct 2022 22:52:32 -0500 Subject: [PATCH 034/269] generated api-report Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 17 +++++++++-------- .../scaffolder-backend/src/service/router.ts | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 9510c69f09..6d49df8979 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -200,7 +200,7 @@ export function createGithubRepoCreateAction(options: { requireCodeOwnerReviews?: boolean | undefined; requiredStatusCheckContexts?: string[] | undefined; requireBranchesToBeUpToDate?: boolean | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; + repoVisibility?: 'public' | 'private' | 'internal' | undefined; collaborators?: | ( | { @@ -281,7 +281,7 @@ export function createPublishBitbucketAction(options: { repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; - repoVisibility?: 'private' | 'public' | undefined; + repoVisibility?: 'public' | 'private' | undefined; sourcePath?: string | undefined; enableLFS?: boolean | undefined; token?: string | undefined; @@ -298,7 +298,7 @@ export function createPublishBitbucketCloudAction(options: { repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; - repoVisibility?: 'private' | 'public' | undefined; + repoVisibility?: 'public' | 'private' | undefined; sourcePath?: string | undefined; token?: string | undefined; }>; @@ -311,7 +311,7 @@ export function createPublishBitbucketServerAction(options: { repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; - repoVisibility?: 'private' | 'public' | undefined; + repoVisibility?: 'public' | 'private' | undefined; sourcePath?: string | undefined; enableLFS?: boolean | undefined; token?: string | undefined; @@ -369,7 +369,7 @@ export function createPublishGithubAction(options: { requireCodeOwnerReviews?: boolean | undefined; requiredStatusCheckContexts?: string[] | undefined; requireBranchesToBeUpToDate?: boolean | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; + repoVisibility?: 'public' | 'private' | 'internal' | undefined; collaborators?: | ( | { @@ -415,7 +415,7 @@ export function createPublishGitlabAction(options: { }): TemplateAction<{ repoUrl: string; defaultBranch?: string | undefined; - repoVisibility?: 'internal' | 'private' | 'public' | undefined; + repoVisibility?: 'public' | 'private' | 'internal' | undefined; sourcePath?: string | undefined; token?: string | undefined; gitCommitMessage?: string | undefined; @@ -435,7 +435,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'create' | 'delete' | undefined; + commitAction?: 'create' | 'update' | 'delete' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; @@ -552,6 +552,7 @@ export interface RouterOptions { additionalTemplateGlobals?: Record; // (undocumented) catalogClient: CatalogApi; + concurrentTasksLimit?: number; // (undocumented) config: Config; // (undocumented) @@ -566,7 +567,7 @@ export interface RouterOptions { scheduler?: PluginTaskScheduler; // (undocumented) taskBroker?: TaskBroker; - // (undocumented) + // @deprecated (undocumented) taskWorkers?: number; } diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 6ae54b6530..dbd085bf4c 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -69,12 +69,12 @@ export interface RouterOptions { actions?: TemplateAction[]; /** * @deprecated taskWorkers is deprecated in favor of concurrentTasksLimit option with a single TaskWorker - * @default 1 + * @defaultValue 1 */ taskWorkers?: number; /** * Sets the number of concurrent tasks that can be run at any given time on the TaskWorker - * @default 10 + * @defaultValue 10 */ concurrentTasksLimit?: number; taskBroker?: TaskBroker; From 6ffa47bb0ac7527730211bcb124b73f58f77965e Mon Sep 17 00:00:00 2001 From: Gustaf Lundh Date: Thu, 27 Oct 2022 19:34:58 +0200 Subject: [PATCH 035/269] Catalog kind filter fixes & clean-up Various fixes: * CatalogDefaultPage cannot handle Capitalized kinds from the kind query parameter. This breaks ownership cards and both CatalogKindHeader and EntityKindPicker turns up empty. There may be other places where the catalog expects to handle capitalized Kinds. After all, the default Kinds are capitalized in the entities. * If a non existing kind is specified, CatalogKindHeader works but not the EntityKindPicker. Well, at least as long as the non-existing kind is not capitalized(!) * The CatalogKindHeader supports allowed kinds, but not the EntityKindFilter. So depending on Catalog-setup they will list different kinds. Refactoring: * Refactored out helper functions to a util library. This ensured that similar logic can be shared between the Kind pickers (and in turn their behaviour is similar). Tests: * Relevant tests added Signed-off-by: Gustaf Lundh --- .changeset/brave-bags-sniff.md | 5 + .changeset/neat-lies-know.md | 5 + plugins/catalog-react/api-report.md | 15 +++ .../EntityKindPicker.test.tsx | 57 ++++++++++ .../EntityKindPicker/EntityKindPicker.tsx | 106 +++++------------- plugins/catalog-react/src/index.ts | 2 + plugins/catalog-react/src/utils/index.ts | 1 + .../src/utils/kindFilterUtils.ts | 82 ++++++++++++++ .../CatalogKindHeader/CatalogKindHeader.tsx | 41 ++----- 9 files changed, 207 insertions(+), 107 deletions(-) create mode 100644 .changeset/brave-bags-sniff.md create mode 100644 .changeset/neat-lies-know.md create mode 100644 plugins/catalog-react/src/utils/kindFilterUtils.ts diff --git a/.changeset/brave-bags-sniff.md b/.changeset/brave-bags-sniff.md new file mode 100644 index 0000000000..2608ca7f1e --- /dev/null +++ b/.changeset/brave-bags-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog': minor +--- + +Fixes in kind selectors (now OwnershipCards work again) diff --git a/.changeset/neat-lies-know.md b/.changeset/neat-lies-know.md new file mode 100644 index 0000000000..cb355c638f --- /dev/null +++ b/.changeset/neat-lies-know.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-react': minor +--- + +Cleanup and small fixes for the kind selector diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md index e8f0b0e6ee..ea67702c9b 100644 --- a/plugins/catalog-react/api-report.md +++ b/plugins/catalog-react/api-report.md @@ -175,6 +175,7 @@ export const EntityKindPicker: ( // @public export interface EntityKindPickerProps { + allowedKinds?: string[]; // (undocumented) hidden?: boolean; // (undocumented) @@ -431,6 +432,13 @@ export type FavoriteEntityProps = ComponentProps & { entity: Entity; }; +// @public +export function filterAndCapitalize( + allKinds: string[], + allowedKinds?: string[], + forcedKinds?: string[], +): Record; + // @public export function getEntityRelations( entity: Entity | undefined, @@ -503,6 +511,13 @@ export type UnregisterEntityDialogProps = { entity: Entity; }; +// @public +export function useAllKinds(): { + loading: boolean; + error?: Error; + allKinds: string[]; +}; + // @public export function useAsyncEntity< TEntity extends Entity = Entity, diff --git a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx index 65ad3f227a..a62669caf9 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx @@ -147,6 +147,43 @@ describe('', () => { }); }); + it('renders unknown kinds provided in query parameters', async () => { + const rendered = await renderWithEffects( + + + + + , + ); + + expect(rendered.getByText('Frob')).toBeInTheDocument(); + }); + + it('limits kinds when allowedKinds is set', async () => { + const rendered = await renderWithEffects( + + + + + , + ); + + const input = rendered.getByTestId('select'); + fireEvent.click(input); + + expect( + rendered.getByRole('option', { name: 'Component' }), + ).toBeInTheDocument(); + expect( + rendered.getByRole('option', { name: 'Domain' }), + ).toBeInTheDocument(); + expect( + rendered.queryByRole('option', { name: 'Template' }), + ).not.toBeInTheDocument(); + }); + it('responds to external queryParameters changes', async () => { const updateFilters = jest.fn(); const rendered = await renderWithEffects( @@ -180,4 +217,24 @@ describe('', () => { kind: new EntityKindFilter('domain'), }); }); + + it('renders kind from the query parameter even when not in allowedKinds', async () => { + const rendered = await renderWithEffects( + + + + + , + ); + + expect(rendered.getByText('Frob')).toBeInTheDocument(); + + const input = rendered.getByTestId('select'); + fireEvent.click(input); + expect( + rendered.getByRole('option', { name: 'Domain' }), + ).toBeInTheDocument(); + }); }); diff --git a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx index c626a68d10..89313790f5 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx +++ b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx @@ -17,64 +17,15 @@ import { Select } from '@backstage/core-components'; import { alertApiRef, useApi } from '@backstage/core-plugin-api'; import { Box } from '@material-ui/core'; -import capitalize from 'lodash/capitalize'; -import sortBy from 'lodash/sortBy'; -import React, { useEffect, useMemo, useRef, useState } from 'react'; -import useAsync from 'react-use/lib/useAsync'; -import { catalogApiRef } from '../../api'; +import React, { useEffect, useMemo, useState } from 'react'; import { EntityKindFilter } from '../../filters'; import { useEntityList } from '../../hooks'; - -function useAvailableKinds() { - const catalogApi = useApi(catalogApiRef); - - const [availableKinds, setAvailableKinds] = useState([]); - - const { - error, - loading, - value: facets, - } = useAsync(async () => { - const facet = 'kind'; - const items = await catalogApi - .getEntityFacets({ - facets: [facet], - }) - .then(response => response.facets[facet] || []); - - return items; - }, [catalogApi]); - - const facetsRef = useRef(facets); - useEffect(() => { - const oldFacets = facetsRef.current; - facetsRef.current = facets; - // Delay processing hook until facets load updates have settled to generate list of kinds; - // This prevents resetting the kind filter due to saved kind value from query params not matching the - // empty set of kind values while values are still being loaded; also only run this hook on changes - // to facets - if (loading || oldFacets === facets || !facets) { - return; - } - - const newKinds = [ - ...new Set( - sortBy(facets, f => f.value).map(f => - f.value.toLocaleLowerCase('en-US'), - ), - ), - ]; - - setAvailableKinds(newKinds); - }, [loading, facets, setAvailableKinds]); - - return { loading, error, availableKinds }; -} +import { filterAndCapitalize, useAllKinds } from '../../utils/kindFilterUtils'; function useEntityKindFilter(opts: { initialFilter: string }): { loading: boolean; error?: Error; - availableKinds: string[]; + allKinds: string[]; selectedKind: string; setSelectedKind: (kind: string) => void; } { @@ -84,23 +35,15 @@ function useEntityKindFilter(opts: { initialFilter: string }): { updateFilters, } = useEntityList(); - const flattenedQueryKind = useMemo( + const queryParamKind = useMemo( () => [kindParameter].flat()[0], [kindParameter], ); const [selectedKind, setSelectedKind] = useState( - flattenedQueryKind ?? filters.kind?.value ?? opts.initialFilter, + queryParamKind ?? filters.kind?.value ?? opts.initialFilter, ); - // Set selected kinds on query parameter updates; this happens at initial page load and from - // external updates to the page location. - useEffect(() => { - if (flattenedQueryKind) { - setSelectedKind(flattenedQueryKind); - } - }, [flattenedQueryKind]); - // Set selected kind from filters; this happens when the kind filter is // updated from another component useEffect(() => { @@ -109,18 +52,26 @@ function useEntityKindFilter(opts: { initialFilter: string }): { } }, [filters.kind]); - const { availableKinds, loading, error } = useAvailableKinds(); - useEffect(() => { updateFilters({ kind: selectedKind ? new EntityKindFilter(selectedKind) : undefined, }); }, [selectedKind, updateFilters]); + // Set selected kinds on query parameter updates; this happens at initial page load and from + // external updates to the page location. + useEffect(() => { + if (queryParamKind) { + setSelectedKind(queryParamKind); + } + }, [queryParamKind]); + + const { allKinds, loading, error } = useAllKinds(); + return { loading, error, - availableKinds, + allKinds: allKinds ?? [], selectedKind, setSelectedKind, }; @@ -132,17 +83,22 @@ function useEntityKindFilter(opts: { initialFilter: string }): { * @public */ export interface EntityKindPickerProps { + /** + * Entity kinds to show in the dropdown; by default all kinds are fetched from the catalog and + * displayed. + */ + allowedKinds?: string[]; initialFilter?: string; hidden?: boolean; } /** @public */ export const EntityKindPicker = (props: EntityKindPickerProps) => { - const { hidden, initialFilter = 'component' } = props; + const { allowedKinds, hidden, initialFilter = 'component' } = props; const alertApi = useApi(alertApiRef); - const { error, availableKinds, selectedKind, setSelectedKind } = + const { error, allKinds, selectedKind, setSelectedKind } = useEntityKindFilter({ initialFilter: initialFilter, }); @@ -156,21 +112,21 @@ export const EntityKindPicker = (props: EntityKindPickerProps) => { } }, [error, alertApi]); - if (availableKinds?.length === 0 || error) return null; + if (error) return null; - const items = [ - ...availableKinds.map((kind: string) => ({ - value: kind, - label: capitalize(kind), - })), - ]; + const options = filterAndCapitalize(allKinds, allowedKinds, [selectedKind]); + + const items = Object.keys(options).map(key => ({ + value: key, + label: options[key], + })); return hidden ? null : ( } - value={selectedKind} + input={} + value={selectedKind.toLocaleLowerCase('en-US')} onChange={e => setSelectedKind(e.target.value as string)} classes={classes} > From 1f41007d85c02db247178cb9f8dedeccd51047a1 Mon Sep 17 00:00:00 2001 From: tonedef Date: Sat, 29 Oct 2022 17:07:18 -0700 Subject: [PATCH 036/269] prettier changes Signed-off-by: tonedef --- .../20201007201501_index_entity_search.js | 16 +++++----------- .../migrations/20210302150147_refresh_state.js | 4 ++-- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js b/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js index be700a324a..ea26067a06 100644 --- a/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js +++ b/plugins/catalog-backend/migrations/20201007201501_index_entity_search.js @@ -21,17 +21,11 @@ */ exports.up = async function up(knex) { await knex.schema.alterTable('entities_search', table => { - const options = knex.client.config.client.includes('mysql') ? { indexType: 'FULLTEXT', } : {} - table.index( - ['key'], - 'entities_search_key', - options - ); - table.index( - ['value'], - 'entities_search_value', - options - ); + const options = knex.client.config.client.includes('mysql') + ? { indexType: 'FULLTEXT' } + : {}; + table.index(['key'], 'entities_search_key', options); + table.index(['value'], 'entities_search_value', options); }); }; diff --git a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js index c3c3dc3f12..1c8081c0ef 100644 --- a/plugins/catalog-backend/migrations/20210302150147_refresh_state.js +++ b/plugins/catalog-backend/migrations/20210302150147_refresh_state.js @@ -91,8 +91,8 @@ exports.up = async function up(knex) { await knex.schema.createTable('refresh_state_references', table => { const textColumn = isMySQL - ? table.string.bind(table) - : table.text.bind(table); + ? table.string.bind(table) + : table.text.bind(table); table.comment('Edges between refresh state rows'); table From ed29fad6dae02f914d6793929c8c64a3948b6f0c Mon Sep 17 00:00:00 2001 From: tonedef Date: Tue, 1 Nov 2022 10:27:33 -0700 Subject: [PATCH 037/269] Empty commit to trigger GHA Signed-off-by: tonedef From 061f19dff1a3d5be8dfef1519aa77760eea69601 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Wed, 9 Nov 2022 22:50:00 -0600 Subject: [PATCH 038/269] generated api-report without only Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 6d49df8979..9a06f24ab2 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -200,7 +200,7 @@ export function createGithubRepoCreateAction(options: { requireCodeOwnerReviews?: boolean | undefined; requiredStatusCheckContexts?: string[] | undefined; requireBranchesToBeUpToDate?: boolean | undefined; - repoVisibility?: 'public' | 'private' | 'internal' | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; collaborators?: | ( | { @@ -281,7 +281,7 @@ export function createPublishBitbucketAction(options: { repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; - repoVisibility?: 'public' | 'private' | undefined; + repoVisibility?: 'private' | 'public' | undefined; sourcePath?: string | undefined; enableLFS?: boolean | undefined; token?: string | undefined; @@ -298,7 +298,7 @@ export function createPublishBitbucketCloudAction(options: { repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; - repoVisibility?: 'public' | 'private' | undefined; + repoVisibility?: 'private' | 'public' | undefined; sourcePath?: string | undefined; token?: string | undefined; }>; @@ -311,7 +311,7 @@ export function createPublishBitbucketServerAction(options: { repoUrl: string; description?: string | undefined; defaultBranch?: string | undefined; - repoVisibility?: 'public' | 'private' | undefined; + repoVisibility?: 'private' | 'public' | undefined; sourcePath?: string | undefined; enableLFS?: boolean | undefined; token?: string | undefined; @@ -369,7 +369,7 @@ export function createPublishGithubAction(options: { requireCodeOwnerReviews?: boolean | undefined; requiredStatusCheckContexts?: string[] | undefined; requireBranchesToBeUpToDate?: boolean | undefined; - repoVisibility?: 'public' | 'private' | 'internal' | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; collaborators?: | ( | { @@ -415,7 +415,7 @@ export function createPublishGitlabAction(options: { }): TemplateAction<{ repoUrl: string; defaultBranch?: string | undefined; - repoVisibility?: 'public' | 'private' | 'internal' | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; sourcePath?: string | undefined; token?: string | undefined; gitCommitMessage?: string | undefined; @@ -435,7 +435,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'create' | 'update' | 'delete' | undefined; + commitAction?: 'update' | 'delete' | 'create' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; From 303c68d1f5fef8689c16fd26b8bc4edd16a91b2c Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 10 Nov 2022 02:31:36 -0600 Subject: [PATCH 039/269] generated api-report all Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 9a06f24ab2..771d871646 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -435,7 +435,7 @@ export const createPublishGitlabMergeRequestAction: (options: { sourcePath?: string | undefined; targetPath?: string | undefined; token?: string | undefined; - commitAction?: 'update' | 'delete' | 'create' | undefined; + commitAction?: 'update' | 'create' | 'delete' | undefined; projectid?: string | undefined; removeSourceBranch?: boolean | undefined; assignee?: string | undefined; From 2ea0b2d634bcc17b7a14fdca1d8121be24b621d4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 11 Nov 2022 15:32:25 +0100 Subject: [PATCH 040/269] scaffolder-backend: add failing test for task worker queue Signed-off-by: Patrik Oldsberg --- .../src/scaffolder/tasks/TaskWorker.test.ts | 62 ++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts index 42415f4f11..d39671cb67 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.test.ts @@ -19,10 +19,11 @@ import { getVoidLogger, DatabaseManager } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; import { DatabaseTaskStore } from './DatabaseTaskStore'; import { StorageTaskBroker } from './StorageTaskBroker'; -import { TaskWorker } from './TaskWorker'; +import { TaskWorker, TaskWorkerOptions } from './TaskWorker'; import { ScmIntegrations } from '@backstage/integration'; import { TemplateActionRegistry } from '../actions'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; +import { TaskBroker, TaskContext, WorkflowRunner } from './types'; jest.mock('./NunjucksWorkflowRunner'); const MockedNunjucksWorkflowRunner = @@ -196,3 +197,62 @@ describe('Concurrent TaskWorker', () => { expect(asyncTasksCount).toEqual(expectedConcurrentTasks); }); }); + +describe('TaskWorker internals', () => { + const TaskWorkerConstructor = TaskWorker as unknown as { + new (options: TaskWorkerOptions): TaskWorker; + }; + + it('should not pick up tasks before it is ready to execute more work', async () => { + const inflightTasks = new Array<{ + task: TaskContext; + resolve: () => void; + }>(); + const workflowRunner: WorkflowRunner = { + async execute(task) { + await new Promise(resolve => { + inflightTasks.push({ task, resolve }); + }); + return { + output: {}, + }; + }, + }; + + let claimedTaskCount = 0; + const taskWorker = new TaskWorkerConstructor({ + runners: { workflowRunner }, + taskBroker: { + async claim() { + claimedTaskCount++; + return { + spec: { + apiVersion: 'scaffolder.backstage.io/v1beta3', + }, + createdBy: `test-${claimedTaskCount}`, + async complete(_result, _metadata) {}, + } as TaskContext; + }, + } as TaskBroker, + concurrentTasksLimit: 2, + }); + + expect(claimedTaskCount).toBe(0); + taskWorker.start(); + + // This will wait for all higher priority promise ticks to complete + await new Promise(resolve => setTimeout(resolve)); + + // Once we start the worker it should pick up 2 tasks, since that's our limit + expect(claimedTaskCount).toBe(2); + expect(inflightTasks.length).toBe(2); + + // This completes the first task, making space for one more + inflightTasks.shift()?.resolve(); + await new Promise(resolve => setTimeout(resolve)); + + // We now expect one more task to have been claimed, and two tasks in the queue again + expect(claimedTaskCount).toBe(3); + expect(inflightTasks.length).toBe(2); + }); +}); From 7ddab188a0fdd7db1eec4cd01e3030962dcd3d48 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 10 Nov 2022 07:48:29 -0600 Subject: [PATCH 041/269] wait for pending to be available to claim task Signed-off-by: Hao Luo --- .../src/scaffolder/tasks/TaskWorker.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 9af818c421..e03cee846a 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -110,13 +110,26 @@ export class TaskWorker { start() { (async () => { for (;;) { - await this.taskQueue.onEmpty(); + await this.onReadyToClaimTask(); const task = await this.options.taskBroker.claim(); this.taskQueue.add(() => this.runOneTask(task)); } })(); } + onReadyToClaimTask(): Promise { + if (this.taskQueue.pending < this.options.concurrentTasksLimit) { + return Promise.resolve(); + } + return new Promise(resolve => { + // "next" event emits when a task completes + // https://github.com/sindresorhus/p-queue#next + this.taskQueue.on('next', () => { + resolve(); + }); + }); + } + async runOneTask(task: TaskContext) { try { if (task.spec.apiVersion !== 'scaffolder.backstage.io/v1beta3') { From 5f3f0f000285ecdd7535528152df10ad96850bfd Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 10 Nov 2022 09:01:39 -0600 Subject: [PATCH 042/269] added protected to onReadyToClaimTask method. regenerated api-report Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 2 ++ plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 771d871646..512c520128 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -799,6 +799,8 @@ export class TaskWorker { // (undocumented) static create(options: CreateWorkerOptions): Promise; // (undocumented) + protected onReadyToClaimTask(): Promise; + // (undocumented) runOneTask(task: TaskContext): Promise; // (undocumented) start(): void; diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index e03cee846a..005276038b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -117,7 +117,7 @@ export class TaskWorker { })(); } - onReadyToClaimTask(): Promise { + protected onReadyToClaimTask(): Promise { if (this.taskQueue.pending < this.options.concurrentTasksLimit) { return Promise.resolve(); } From 6aa0728b950a5720ff0ee65c5476c35da9511c2d Mon Sep 17 00:00:00 2001 From: ch-enfuse Date: Tue, 22 Nov 2022 14:32:11 -0800 Subject: [PATCH 043/269] Azure Spring Apps Plugin Changed icon to be shown in plugin's marketplace card. Signed-off-by: ch-enfuse --- microsite/static/img/azure-spring-apps.png | Bin 0 -> 65289 bytes microsite/static/img/enfuse.png | Bin 144895 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 microsite/static/img/azure-spring-apps.png delete mode 100644 microsite/static/img/enfuse.png diff --git a/microsite/static/img/azure-spring-apps.png b/microsite/static/img/azure-spring-apps.png new file mode 100644 index 0000000000000000000000000000000000000000..26a758c3d2d72bef8880843cf13d90866a201903 GIT binary patch literal 65289 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 #1bf*uJn_-`SHDu1d&m{ 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 F{6B9k*O&kR literal 0 HcmV?d00001 diff --git a/microsite/static/img/enfuse.png b/microsite/static/img/enfuse.png deleted file mode 100644 index 42124a4a246abc25606805d591f6d2b5cc1b94ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 144895 zcmcF~cQ{*b__sumgc31IYXm{4)~r!QVkT;Dtv#ZYT9qobsZETwRP9Y`rS>YND5|Qd ztwm`ON^Mo%e1Grn@AtnqS8|<`bIx_nb3e~LKKJLoPrQ+V&IRZtC=CtG1sqn>goXx4 z-38Ks|Jwv#(s)hXKzy*){xmeqyZ`+FJf_(d@Gj*w z%QpT#>V8#q|E>WXL41Q(5;-_OzaC7W#Kl`T2?Ij5*0*lpR}WP)%s;`Wju4Ww>4@4} z*+X~bE+wm~_59D~*8l&_h2n9yktMe@?qpT&|JT$0yG{=;cj8G`JbqX1MB;jqc5xVY zV!jsjShG7vc{)>4WW8t!npZj=|7q@Dll$@nie!T8krQG0xja+7eq zX#DuE39{6skTy?}=zqua>qqbIao?rhd``z8WwRD#p zHKBMF91~L2i@>!beY(fhdl74Z36tRw`6bXPdSvCAc*zLBM2P~Q>)I%9qFcH zF6ywm-~7+zchbFZ9Ru>;Ro(`pqg$Mn4?T6FsbjdjYn*<>HTyUTNxkt4nT+vYqD#EH z1~Nts&I`B&$O5aH-*(1#m4+5)0A7?Kd=RZEHJFfmgC5FQjYRfWI1vOa3pt$FwE~EuFGR5<=X1h#3$AN9j4!;eAY*xQ(zFf#Tan>=Y35l@aAx zGzAPyU^Ahp8J^rOLj!I8arR}Wm!bM+&4_fkE$lFwKHLxz20E`ZfsVuywmXE5|- z1wdj1F@hG#_5|Ye> z4@|-lKn%Eaf9*J_Jq#yRZrC=Wq$|I;6WMAMYcLLsR zrc++>#)3ng-a0u*V+kV&iHl-sFtbF13lF0sBl^(7LZmjlxTtXnT28+hIx)Xc@7mkuUv#2JQIOFS4JTWG=jauV}PyX>s8jRJX)=Ds^ZrOJSwq}LxlAG_sph7T8C1xZqFh5EK05{v3;wÐ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

QBQ5Ki(#e!yT05b@be(Nb)(I0Q@$zT*sK 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%0A($ZCIgZIvFDiin+C0 z|3DX}6rWX-{X(!#MFBU+mWlK2w9O-D=0dAog(xZK`oEt$ms43bK^xCDtUQX)L^FlS ziYXR!44%6MuAHmQB+%miJo9(|aG+WdcK9645KN+wxTe5hQ$W~9me+!&Lh;GGcv)j= zn?aClwWkrS{jQwNIahx}(z`_WDY?DKuLtf)ZaqA3sG7oy)=HEWhw_Co`f6YMl+uD! zTJVbT*3~&&t*a&d@;iHM;QVL>LGB*J%E}y)Ru#<~I{O(}+IJhDNk^;S2rp}FRRY#7 z=e^r|Q@`jdG*9h4TzR`!wyYnxom=H5ldn=`L4mCl^g|Gj)rxh)^u#`-K(XAmoE~>s z6{@FdY!UKoD)S{0dsg(Nn283Ke%SLm^`L6CneDydqH_C?cFz`fCzIqTH{bEHs*P0A zO6t=#vSKhYJ%^bQQ;-ysl#?^=8e|QUDr|H0K!XgpKbL;A5KM%Ec-?IHQN9KS_eBVI zVE^zoI3?ewN?C6odo}S_@Rez<=NWx}VHvV=ePLka!swH=x5Fi7cfl_xbycQ>T(FR` zv-R^QAKSH|6!$g>f;=RM5<{0wPN<-8k_fC7<6&cBj<)J83C7v!PB0ub!(xD_zFFm7 z*+uupF_dCVS)=I9<8QX(H!4`y|2eqUC~A?evAr&~p*3Dq%&s zLf%LHn#7yJ52_vJ2ZVfV3EFBkpFfsn#UJ3Y0kJY|C{Wi#5#8GbRysMG??9X%h(gJE zQ<$ujh2RlzsI!ER9v0j73Y%88r_r;_v0|`#0YKDLqPr8{S)o{=0#p+nn%RE*8V*5J#?l* zm91j;qEv9a(-W%#SEDgpUzgg8`M`LS(+-Hl*+5TX5(%*mm0b1XaW8}d>a5<5Gfyos z?R;{40Ub?wlEMSWMgPL>>T}IiLb@-HTo`q}Jn^IS@C)KRMh+%XcaMUqVUY?eo9$B>amV0ri3E2eMe&@)9PZBMDS$Z^iwXPN6vWK>w#+_`G1Ap@bE zbwn%Q2&PE?M0Y1o?S8n~y05Wzc-PZ;lI<`Ox*@F}vH4T_=;MF$WA)NU^&_tDeZ2i4 z*wBoMZc%#!ljKbh0K3B<;{X?nl0omBlV7^*D#8q7Q3bQpKy-AXwIizX*%b(tt--FX zGoJ_&JNsE|dogs5Nv&9FDCGBjezjsl3YUDoA{bRcmBBvG5!8-R$aY$I_M|eC_hIJ( z(EtGLvcXW02)C#S15iRb^QBgAJn5~gqLNQzLz!Gal0$9If=_72)X2kYQw}$JR3^1T zYZF^0oeR?9=;JDY7;Fn84U!q;|V zz4A|Bu!8I=8eunpcM zKT@t^h3&fQap=G}tjfGr?hO@@E|oAWA5$uRB;1F25DLZ`!4k=ZOxaj;n?bHuP;Kr% zJiyg96nlR8x!O0yyNBD(=56e?I1RlW5nF%C84K~zX}J28R$pdbXWEYERw_3TAR5F3 zRa)bDsd!%J>$WIJoExqR#e@yZ^O^94pdl`<*vGzddhS}PYR@Lj>^x3&!md5%qMh|e zB0$%u2^NkQNk4w$zTGeGt$kFx{`=#d_PuA9dtAOp?*DmbfAcXwuGXDzb-w4?CWjrq za{gWM%HIHUc|aB85X~@KBb|)Wip6h!zp^~L1qimY^V`f#%MsiuOxZvrU6M@_Fo8pb zu#LuFt&e$qRlguc&ctnnlP@PT>pg4Jp=Xg@&M!NkCpr$35UV9wC_Q&HOjROyz+W&J zY?p?uV{wxcp&lEGytx{mYPDXKTD(p5&dhpE{IOi~bNnCYJ?HA!ci)^vN|S4460WkQ z97_Q&7<0*>vY53JWVZ{j%qhL= z=r!b%cv(*IHBEY~^58~}+0uKmQb2KlzIN{)2fuo%$+rJx>KbgHWTf9GU?cLE* zto?7>A#UZDcpK}nEV%}DQA3s3j_U)DycmK`jgYdUtVk|0V>~z;JpA`sUeoL5`_5iE zUzbYX2T2-gk`7WMCT7Z8-!By_42_;~WH&7=XJ|ETyR{V=lgQ@l@i*Q_X!729*?|u{ z2tu;_sWhz8_|t0Tu}IJzQJclqP~u zD5tfeHKi6XiF~J?`6!w-R*2FNg$x;a;d-V1)COo!lfP(I_ST>J$I zAMvF&a-J8eG{aAvFdVA+TfO7;>*04L=LcGEPklM9-Mz6n2FMjftnO|AF)Ms?X=`uQ zaAfpsnd(46a-qzig+CI8VuWGj{4trFXECg)>X5|^d5*M4lzNESlUaluIj2vNikC96 z;qc^ZGj-I!6h%-=Fa{(KCV#<_VVF8sJk2CF#o6AgD&KcpLh}XBx{Cb$PBE(P*_2Sr zpIZ!+dwU+6R^Jzdv9wP6@yZQ!=^ZDh!0VLZA#!0{VEF8ST3h{b^`<`^yMhH+D!sIx zc46w#gQcR8QxUD&#iWTMKUCgPZ?Wkt0Q9K$RJa9* zjyO39#4TjPshqBXD6lhUYUpKsJ3lO1gE#pt;52l(wi=jdq^yEu))8Zh5cj{C{R{s( zB>E$EullW@l0NCuyTIeyODjKi%9Vb6lHU8Z1JLI_-k)Cu7UYlWf0&Ez3p7F@v|ff5 z<%~DfT`_y4aQGH#wHAaZT?2e-YZtK(g$kXNLL#M5FdD21aw}`=tW+#lh%68kGC|J- z+(k~?mcsC$7jRm}$Kw^RDy`C%uX@-WNy;zk85atic zQI$gomN&O_$4%sn)8z|kqH!p;-=hx z+&0IIN7JH^P+Lbamdb5N5_pX{#fp^os^C0}e1W7y64?sFBt|wTiCMvk=RB+FqwIu2 zdr8iHNT_tkHLFM!IaE0j8$^xsI!2`&$D5+mMB3ZV2lNE~kZiov_Sp0KkM+fw=%@L+ z4eui&_m_7>mByE^(%%vsvltQGSnV}c?f==%zi1p(Oc zBXI&qm#UHCx!hk2$f{1P3@l1LQ8HartDI1FS*0omON+xlzm1g=P&tY2*X84G1o1+Z zW1&*EanzVsc%o*kUb9(XYORj%^o8#q8>Vbp8{ho!P(Acp=E3Z^dA4Ipimz`^b!X^7 zZH*)~ln)mfE?dTGwRWu}xFw#uSiIEiz&|8&H0b(0$@HHS2wGv+13X-B>ZSMo{F=#LXD@R&A7*+|7OG~^by*{{SgiE`xg$nCnGez;U=5L0 zv_u3ln#qeJE6xUtr~8MYpkOm8VEmU!2xig*p5*ALF7%kr%i6(AlmKz=?2k2lojAJ; zTGKcm*5k&u-o1tJl-ypyod z`?v8#glB~!BMl5un9tj~&H9L$y=Ta%(B@o#lY{GlCw3B94l{_=!R<{TQM1-`iZ;Sz zK53x33JsOAY(N1}jb{dtM1T1u{Cq%{@2<()ecj!PNwYiW{;qXwh!yKU+W)o11}@mU z+}Qrpz2XwJvAe5q^K$5nqnV$GDEq0#Mjf;aS6E2OKK|TpF^MS~Ov{Q%kj%;|{RMP{ zTRn=FtP_liAhVq{FjU%x0=omTn?|1ee2+oVZt0JJ)(EnnQslI(4LecPATr*3*jNLZ zd-a}AS5wZRJtG65)ZBW*fx(7G}oIZUrUxuKNL%HT$Bl{$$c9n{U`pP zt72oW-jKSN2ns7+uj}yh#;wK1zeV1uwilk4eIc)*k{GgwWa@3@DIh5kfr1znDAtZZ z5X5A%7KfEq88KW2)5wBRo!ek+i=r0Pgw1cvZ6J^w-Nkvfb42K*V;vqAsEG9v$u~b; z^-&;muIXm-?%RJuAN2>U-kysHJF9#&dV7GKEe7W3h1@#kx5b&p8AC>atq05p;ouVL4{p+r^ZiEaYEX#Dq8o`>&AaaZmcuAz*D~91J zuaKM;9F^#jRRrRkQ8a}JFwR=1;7Va`SHPgmw#00#e_f^D#ibr8jiSzKTF3&WRkr76 zePxN(EqiANJ8GSrUz=F6Pky-J?NgYw;FtYxhW-TJ>-P1wZ!r8(I$Dm>3?I+^@R}WU zRlR<(@ZDq2+CSHQKK;z{^LCU2gAmZ17_$T%wo64)G@}#$3WMQSlu{Hh5gBe~z+vgE z{KA`b3vMAu;!Q=Oc1{dJx$Kwl<;_OSp)9VfBCA)YrKV|GQUb5M(v{h#D!r!9_H;X( z^HtXq6w1ClpyV6<{>;wm&o5TR-O^Zev zWx1y{5}{Ta6Nfct8``%}UTOd6VY<=+*Q?P zi}1QBH&VDzT|B~ugRMcSX_pg;20>tM=Qs**?G1%Qm2Rdo3o1Z{+6ViHCSI~y>19X*u0cE_tvu!vVm|@V%gCf0fFb0#6Xnf7 zhe1F#7rJa@czCRaHDqw(fo*r|(99gId-$@>l;66clW)t2i{7<=n`1-b;sD9$zlDi6 zE4^L&e=fdjym4;!ZG+Atx2@m73b2?KfOY{EgbqQhT5j4d)K3Ay$eNS4X-}s>I{K-^ zX$V+ZRKql*pC1Z{rjVs-uMJYp&a-Z7`}dC_DG8vpLV|WeTc=SXPxp0!^rW*CA{l+A zU^3}_oxspnY;>@f23v-~)m-k`P#sayJ#uDrSg*aZVJQScwa{q9R$)ZJs^u*HI_Qex zSt(xkz#8P9p6E*A26d#vI=-mBBWB-hYBtxfetZ(hU-(qKbp8&Gd&wBmH=+!@Cd#mvgR!7%c&&f5K z$!Ipl1u7vG?us{LXJG{FUZ%*c!Fmcn}0YEZC|S$ zELf0TAPmmwEQ8{bvvKqH7)Ehun5YN&byE{G<&YQ6NXEjp`dF5(=f=XHuV2#~Atg!` zI=T}h?J6U>x=#yz2LW>E)~XzBLm6|peHj#75k#BCCCUaHO4SZGa*Q{xvX$0UMOPB6 z=vDc`G$nn1E79J-?O=uC-xS>L-k^>4^uKW+Wz{Y%?}!sjEqqxZf~NV`1R{Cms0`FvZ%_VEB67f)~@ zkEvIF<~_8QfC7goaK{=<1fUUxVFlJ=|5Rnj;#?+y6>Vg|8iYbksw9}Qy4fyN5Yx(t z8=3o}#TsbS@I;1%wyz*B_Jd-up*5t#op^toyB#efl5vbbF_S7Ecv&_p^H$~5&)Ay8 zfs%o`mbLlWLYkc9W59xE5??kgkrexQ+*)p{w>f?f+xY?KB5w)P|YNK0e~ zG%<{LtQtsepsZ8s3}Q^1M>%(+TAdV*AUBU1`_Qy)sTnr*usQTa*MiQHUz5}%&B~Et z`Z;45@+#>jyGA>hnFcZs)QPhe)Mo3lsbHi@66a(P%Xq$WlQ*&1Ue3KjL`#%d{F#__ zvT>&5H;ad@)Tl7DKK{euQdHELJdoa< zwdcXAhiDKT_5m?p!WZzxab5lFSams1K->Dm#)_XpjaKV}_BZnvcKaWHF}NeFyK%X_ zH!8%=e*3WBxp#(|3avE-Bz%?U!+a-!yYL(UbS9P2UqLsJ3UcWzuir)sd0WXk>}G7R zS!5+M415imEX*=iEH!xfD_skzAcUo-fpC@$C(C0EDiv^tzX{avnkk9F(xV=2-mx{B zK-`rv54+rRHBb4df?p)(u$Z=3Vqzw->c5f!yE(IGy! zAGG)VOT7JwJC7rSSAR7qjo+S%dgssU)lRrrqn^lH;$v4$$$n|glfhD2vqYwYF|(9Y zy|~ErQ(?=I6N2o!WC}OjjX=cX%?KoP9?q2eHrPX_aGYLr?~G0BRk4m6-c#?&4M&k* za@44`aZof;-X~rJRD*!^!eobgMORNsKvmKt!15S1q;w9sEy!#lBGKGa%$5jRC!wnu z;(0gzMb)^7UdkH#cXcQH-(c`==*+js=#|xM`~BTseSlAq-J zd$K|nj~1YE!4ttuOeM>BXCJ7RikmI*k+E^S2_B~YSuq4DilecIkr6|{n70YnC7Y@t z<2qin?L7Y1Lj3*WjU{TmZ=na>Kom#MQ8}222GwK|8&NUkX(rvwg+Z{`Dg32a)jz@zI+Bc5w zE-yV_8w5i1{=~`Vy-)hfz2U3Bwo*b@1l8R_N<_TjOi-MYlGhr49<+b-n1_DLJMf~N87oNX%meBPRJ&;`TLvHFo z@>2@XlLB(AA{jjJSc0VmN&p8CcqDPcEDyq) z?Z)%(ez^WFjMi#gTD#<&rdpMByzuE$>(tJ9W490*X9_b?XEJg$)(#WYO1+0~ z>y(m_!9!m;8pl?;YS8;22|1MeZz*@R#-7w#I(pU5Xlpcu3!SU*#3t6!OKCD$hYOK$ z1x3$D#MMi6GW`+O@gUYggKLA_f;Blr0x~cI#v=nymoa_i)scXkG&uath-^2P_MrFg z-s0PR&$c^W-GPe^8~Q)P7R7-X!JN^OT|<7DOT+kTy)H%}<*M5zCB8QRy`aXj#2=5o}{L93$x zA)EC6&Z76+qto4C(OqGWBZ8LIW#wtP&K6lIG@PFciEHpJm~2#sL&tgn%xLJH0gRSF zuOBdG+8b5rHD*W5Uyzf64{{%akh3eEW->0AL>h-MO%S@_h5k`%4=~i_ct-`ul73js4t_-ETLAkLp{CA2?6% zlFA*fzStKF_Bdn`OH?ByRmLU4w)UsvI~HnQpB{SC+y3F_@~H!{c-Y+rjUOqGi&yq_ z7Tkxc8(V+F6d)-4*N>0q_KSWh3xEx1ws!A4aI$|+mtm6egxJm7m>5iy6W{Xt?PRs+ zn>EvvPHT7c5-bzUSA)SzK*g6kePrO-rQmX9bVc4}D_I=!_;aQW*$Q1-UTR9^hEonw z;D!eAS%(wmG)S{z*`*xuhg7%;t*rW)gzXDcI58M=)m_c6{?E{BqerhNzczZld+3vr zFaD|C^Mmixy}iGmvIkD|UfZ0=PrjKRX8HIu@X|gdC1zb=p4{i}rJ_M~YslelFDGDU zz=zl|!?19x@#7dA5~&eo1$^u7V@wxuZn-8bi60Gf%_vA!dh+C)GF97MDbtDFgLL*C zYpAoEcn~~}u@T6ar5fBHaSy| z2xFRp;r{Bd`J|%psH6F^0a9L{{1^M*UE2P&aKGox(rovsX?^W*mFPboe+^|P&qW6R zVLzYTTV7qwZ>hu?fT7@1yq-|leMbToZ>mKp!w#0`ayiuf!PmyfTNiRYOu_&pvkXaF z^Q_l=D8@~>`9R6euoY?3`4FZ{1t;%U30JUO;tX~{?jh0{hB7Dgu`LV8LZ~=wUy3)G-4rpJaF{SIA4SHB1kyvd_s1G7{h; zaLEKB7mUT3KhbsAG7v$KdW`S1y;BYVq5XNW2EXGSdg|ZRsjjfM%d4D^^Q%+Qk-wHc zKbP)3^^fy}^CWMh=m9c_H!cAplmNA7@#Ex^Km2$Vnu5xDnvJ0T5ID$t8&Xm!^A=c(SfK%3Q;noW8kmKf<8 zm~-}k$XzhGJp*Y?iS5VKmG&o=5gBbXGo4~V<4QD9NA9XBpNJt(d}aZQG7C!pWKCnV z`sA|i!BaPhb-b0PxC2<{%a>9{ma?{(TQzJ?uX=ae>+`$Ic|Vl`q?e8y{i(n8d(}Q# z`}FnDoj)@p^Lu~yZtIX*UuZ$>@U|q7ESS3${=r6&$Uc}%Vr+oHGz!Jvl#EtnRAOc` zz(rgnu3HRDAgRBX{@*i)h~A+BE%#(9fmLJ{N&a%*CMoZ7COD;rRvZ^cVA2b;FV^OL zcwOA|s--4|UX!Qh@YYpDf|$xA0p%1k`bL(!Of1V01($^TsY)tR`o6IkPBRrrRbFN% z?A|_pwex7fdm`^z)edbt<>$}$CO3ud6ffO5edb!|?~kk5?*Sr+p5ht13*6;Z0*I`~ zI5SX!{5(&hpMg13!k~b-!~A6+@9!f!hGA%Nk?+#PJT63o3o7uzZGHWYBenkE*OL-&r|kjp zZNOY2*Z*t^yDSx-E|OmMKe9X=CKlspgtc@(*kfHR$c-`h4_`yrBawl$&T81C6gjdV z2{r|pg4(=L0w)pj0@)a?tW93hY*vEq#g89)y0Np>=!HB^4`{6xfyG`lGD~c$sV6G( zCK9e$JyE1q6HNh#{fZ}Z|elj5%{ky93`OU@svujss<QXStT;hKLF{_T5mN3h;^i+uygLx2(nGN9C*sB7QABn>! zL5PH7a9(a}!h;ypR-Itd{#u;T+j;!oUT!bTfdT&Qt~YD6+1Lzc9UXT2{e zK5u!jbwMV-G4JJ}p-Y7wZp%J3dd*)b$EfGd`*xcRc})W2w^{XzO_Py>rp}dMBa34lM#_fL=u&$4Zxe(BT)FhV&bTx7K>G-Mr?A0<1RkK zBTG{trv0L%1oIpgy~gNvZn#&yR%*$KLn9F%MDv@>Iv(`&w6?eIe|)n1Ci^|0l|5Rb z7yj?_ll-}1uhz)~9I073JBL6ZfFKZX+Y`qaj57eb;mvd0U&|RK;N!SLEL>3-I!pio zgUR+0@D#{X3%-+I&D|Yl>7}x$EsX$a}&&&tr}anV*=AF zk74$jnB`8ZNOu+>eT%)~I_E9>i83)cTxnPC%eULLDaXy({_s7P)LjNmT%xc4TJreu2}pqe(rI@?ZW7A^sj*xT8_}!F z>t%?LJ|+W)ueP{1qTx-%3{KG&O6VlZgs+K(Cpj|!+JOMJ2`fOg7lnWdCXh-uX)Si8 zHRa!{4H=hn>5yk_*Qx@)x+BktvGs4FcJj3&^GpxGD`T=^Rf0X_gIny}Ie)NnFxaHK zuC`r+k88orN!%aKl?VDsYn%S#7n8n3ru^i&B)xn(a%c0F{?X{Q^}XkB;=ON*3m+XH zZW&R|f8g}S(T^<09jk)$t=8afvBM)s&Y8~+qZG$51PJ!39vy;`w^qSo>DDZwZ2vcz zD+))<`NqFGle`Z-{eI@q>qVynSuJ707BLUG8C(nTPaQkW_?CC86E}wW<+vA&fyjZ< zqeE>wtx+hHJe$bQ4Pra1qU2>bJUnjbK2?f8t7fxwlium2SB75D5*6vf=hR|r2&ftq zMwiA zb#zIwesY&zU?a)OG3f{IV4U^Sbp4ZYUKglA3m_h}9257(@Vq@@U z*Xa1RO5}yy9Eyr{@x<8`mm)kbyo!(070TG4Lt7BHLRy{pMoC zwx#KwXdNoS8y=mm6PATQwDu`rDy zsdzjQgz;oM&2zvV5fW|v2MTai+pm%e%Uwe(D%$Hd`KwrV+eaF$?f0=?Vo%);A-E&a3@dNNF5+(B6LI+P&?~=X=ke&u8CFwz3M9K0T{@P32u7 zf4H2nymNis`D5>td3mffM2|cfTmNjI+8VcLLW0Qy$Y` z+Va%h_D_(`;~O{r?QEs2L~ni@o!kG#nRxdhiTxMQis#G^Bs=LkeZczK_Gl)miDls9 zK-{e2|3ZAD$}5Pp2$M+~Hf|9cHeNk%pySq9x>~~22-N2FYU~rTM*{YqiRi^G^b(AQ z`FZ)!ro7-PsHnVKqm&~I;`qYAz`*=CIaVSU&poWq81TNDXhm=TWd?l@lG2I;6$Cn} z-I z0So4+5UV=RI{8j!T>QRz_IS#d`%2s2e%R~p|M|BC@N@le>D?WgdmO#>ch;#p*~G;A zuGP~aWeJZ@Xd~&CLZn6@6+f%Uvk@hNQ6&`sr17wpJP4Etzz=?zrSWBb_{^uQ82R*m zViqIQ+8E3V5ONJvoL6B``i;T!WX67a!KgKN5|mC#ATY$xtN?aWT*T~~(`BNBY-D<| zHZNE(t=n`yAHeeDq?(91{^N`q4B4EES_=gg-EwMG(p)!Qqo1b{V8TZAnWAP?de;;oxj6Hvo>~ecpSorPovVU~g^bGS*yy0O>y9+YU1(^3@ zt0_1Wp9fh4X9|CIrx(L+HuL4$y;!P>yDPaB7lg8 znUik0TK6@5f2gH|2{z~JjJoT*JJRttsj+8fZ~i|gx+$%{`^lbPSQ=onuKD@%INzvu z5w*|s5WgbKx#-m~o;&vkqVb3h9a?FyEVI8I409jQR!pAoP1S5Um{7`y{otTf8z#Q{ z^V>{{_=)|UyC?M{w|7oNpNii0>T(XB5HHGf%L!AYqM;aPk7i-)iAz`)_N-Zj1AOSD#OQQi!-|m0nVOT01K8%KhHf zj-lnF>g+3HhAZ$k7J>+pOL#{E>;r_<0(r^$QV9N#L{svqjs!n1*?A_0@xuN+#GUl7CO%%3e5ZwiY$^I@kIX zcM%5y@)Z#1C&zYW1F85yA|z3m1}OH?T($Z|Tjo`$6d0BA!n8%EK@rvp*Ao>z$#k!H z=X?yWic4nn6L+K$*%F0m_yhu2rr@2sJTObM67`E!%hh1%;{}qfusi3-=4d@C4%9D3 zQm};b<|a+o*h&(Qg_IOu>-2AJ71ZCD*Jyn+e4?%W?fbtUo^YPGRy6nO{QEsLaQ7yV zXu^br7g|MA4mINbkmu1iq&mDp;PK`ZgDgZEhkVV-AhMk0sG^Mmi-L&wRfB6*87RCn z!=gws14phKpRV^Eo*w=8ZS>Ol8ylQ2Kpa{7*&(jKcQ115Lh;@emDI~F!&ep05x?!C zhyPX8=2W3}`r4>!UHVq(W-}cQPfRVNLmh_$RAD;6T0&euRh(FgjwH_C zA8 zosUK3K5<18W51M3@xT)f^28~J)tbo}rDIbmShxX*Hwh}XA1T!Pnc|L^L^tJhA|?f? zi4w8sa8>zSyTFSfZ{r?d-_q;Ws(+r(v(&v5t{ZURuk=s-UElrZt?>$09m2xtB}erm zfBP)@+zn_Kv^`%tYtyq~ox!S{5hG-9$*of^D?;y33g}M#{D?{gF9aScB9{ZgO)}G} zoW7>ZSiD5li=GL+%H0!k{rca3>uW2$+glU$YrT7Oms}oSUmsW-%D=1EJ^ih|XL7^w zWots_hkQ2v(lwv8r!TI+U)Ne5{7x33G8t%<)JhaZ<&*NE&W&z6a}SuLyTv>+&X5W% zFV!i%+{ux^;{A~lI0!;jarHd7P6#Ju#w*W}jpO1>Nig>j!4+Ut*y{PxN_=T4g@{67 zfwnCNZ`65VIKs`sS#h$z9g$sVXPXPQaK6k`&P{%u`k>~)#2J^+6A@`=n*Blz@2 z?QVXPcUF&2{rh)Q*s|ozwZHx?-8~zw-hQJWKsVi%uGFU0`raSLm?KfZN2Ax}QTS7m zAooBFfX*O0Fyy*;Af=j~@-t$#-%|ykCW%Br>jSLDLfiG$)|8GFOP8LV)$Ns%=#AZa z`{oBOyZYjnMz4oFZmoO2@V@$-_q!XEmE&eQ!s-Vt-fK>Fs=;L$gaUeyoQ#3Htk37= zLjY!KuN_HntjP_i=}8WHHg~+#9Da1;-u~yA z<>yloqmO|AbF1gmAphX@fL3dOL?6;Nwftrk-OG?C0V!Ek>Ho}=Rb&uZviT_CSRssr zhxoDEgN!C*P!I?Ro*fn31>6tceq+@feQobe*c|ZFlkN3;P6LqGeD}&W`)h94nFtj@ zCx@322XByyFJf~K`+D88BOq~l)iAxFvm#*Ze;r?#sVbb(P^c-AZOr$&oEuzyO4%mM z3@rW%7bh zkZ8hnPp#@%L8P`EgF*B0NOgDf_EII))rDPYB$*@Rb7Q1nu3&Dssp;W5Av;V$42DwT zI!S1GQ+Uv+#&&D~_+wmeu#0CCb^gbYH1Y>jMdK}HU8wZ~k?x8&q9OZ#vHfkC)PvI{PFg(-W_eUOD0 z;K`$8_*AJ-OT(?LgFO0jR3}oX)&y&U$UFQ$N=B!~E3s?!r&kK^r0XPyH5TWd_&nSp z-mTmE{(W-v=BFo5o@6Un9ldi}Cwwy~;?mSwVNom|5m$l8P9g-$GB7BhZO#C|1X+P8 z5EE~n5JP87!vN@k90wUY=&rSu`R27K>c*I3z>Y31h(cb6IDb|EzV9Pd}}hV(JnI)uqCM8!37}`vu-o5 zHLqqu?a}f=*@#}Jrl%ObcnGy+%odIcx`^i$)R@E(Tpzv>m=<6Vu;S_CZsVb4xk-Xf z$4-p+X*pRd37>yyjg&iC$KC6_b$yL-(8Gw+Hgx_PDyesqtB^@yfSbSH@lUo;%Et~8uI z&B<&}Hy$^-bP$J|#36B*L$Et)1-kz=?*xNRIqKcR|6O|pfr-Q`RLmdrdr`zyDg|Oh z<03VPqBK3zG}lzc;VTZ#wJMAP?VQaUzBlO86aiX;Es=504k00^ApomtKq<-LzP;c& zO7*FltWx0;4^Yh;)JhH5CaeKQQh4IsWOv!c#h~CnK8w$@ff7=0ujA6us8#=sCr{Xf z0rwU}eegGw+gAdfOvvd|V{F=ztUB{(Ak+JNsJNO0BA(J9NA5YXwk%SlR!^--d(-_g)Vt$%dV^3vR?yVlW6A7z{XsL8sq;XcvQHucL@Zh!{PA$!fZnzB+5P z-i3qVa5fME5|+V2pq?wD650t1V*CWgJG3A#6bL4WUPH@cP&$W#BN8#(<@XA-<2tbl zP^gleu{GtJsPJ#Wj%#*B`N=BILhte~D1S~Fwi=w*2$*=#Iz1Ql%VTl#`IxxNnVs+T z11CzB^`bhb=l;fxcUl)APZAAE=||wPfJlQucy=~Qz6gVo;U(d0 z@Y6K0tKTLH^A<;Z)S9a%ijw4YNR5rwc1ZcG*&+_r!EWUWmUhkJ8#Xvj4sSkQi7(XUapSJkLmLG0F^Rkiotd(>!YQKgD1T2-xGwfCFf`)B^jbv@7XIp^H>xzBxK z`ddOrgZO=m?&F+FHY9a-@S8npELj53x0_X$&*z+UsA?p_!_=pcqv;VW(N$#m@89 zuB$C|ZSn*Gehdk$(+7qQ5r z5gmt+=RZxV9Ks>QspN%KOwv*|^W$bc2Z0>MT_|W|1Z9t}VO3w6|ly_M(7hA>Pn8)A0mk*g0TbA)3MMo8X zpO1V~QK>-KdQVlhUHY%`HavSagwj`zrGoa&Zzz7G=wg*-d;Af&h?4`POd+Dm>^6yxbU0&bc@{r@;KLhZKCj8|v$RSkCLv zvGx1i>;eZz{j4r;gX=kf$!cedwio4ZIEVhcHw#PgoBQo&L)(_Hobo5S4x{yyz?ha@=cf3zirmUogYmV z%WyAr?vA$jcAuyFFJ5e26u58QX|2hVl+fONo4o2;SoKzNT^IxkL)E54KX=-$y&28gEC<&JH1c>9R!4@;s-1}k@`Cr{Fn{I>P4YmA-9cjs#Jr8 z>@dErcMYe-3I`I^cV46iu2<{u8ffY>a?u)c2^W<;ROqcla6k=_)l(KfSghYInGMM9 zek^~6UM|#lVuMh4=!~B#PpJppe4KMyTyEw(0r}Gy-CVVQhsWZ}#jMBQxUNaX&YU@Q z6?YXS#RVnBcJH6de=folC;)l=Q$fL;Z=Bn!&&mZ@8R-MJ{V$(Cn_FFHDk5S+-~~9Q zSSeauT|zh(62*)nBe4)Dk}b}^vjC^iFR=`{_HkaVf<^$e>rzAul|kCB2er+=wtS@+ zc(F(MurKx|JJ`h+di?Ho1ux3YDeQLeapxMYG|5*4wT(5}nOXY@GXQQYC^wiHi$r){ zoxljiA)&b`L;~j9{eh3S9}^)8afBE(Y`|;E8x$WSpp?&Eq8%Rl;-2y28yUh=cyzbS z?LF<%?f!TQ^KffVK`tqA_qF!h=5|5+OWPLG( zHheepew@~+RIc^yZ2SGW`mfDhExR87t>4?snOYF?PD`8mvGC)^i<+M9!@qAfBbnp3 z7P^oBUi^5G+}y%t^up%d1KAfu)vLMB^8~x7%~-)vhA(Op=nRk`QBcv}h8Q+cBAV2i zWRpjgy|*Cb=%B`zzv1=4G59WySgu~Qq0dru(KN+d`y?+KE7nm{v_NPjSRdebYWRjzo4OD~>nzGQIvPdH0 z(16fUl$cnE7jayL28a*Pp`2EYSO||W385$eh&jFgtgKL?8qYCk!l1qG{l(w3swL2+ ze*vngvmLng#Gq`#DDTy$)grbS^?MT`5kR(FHLLP5_TX$hk`DRuQ6BzDc{r6dQm72H zx;&)$Pf>S=Nmep-~F=4z#B0`nIAFAn(uxf5NywTZFhWQNS8^B@&fXxLC zKM=B?2}z;P?I*ixLbzZqCC5t}=j+qrJePYb6pd$maC^Z1($cTpuHD0RMdm$8>D6~G zW+npsZkg&Q8D)co{M4-N3Buv{Wiat=Xz3DEFBGbrdQ}#oEu>$F2k_A&;9v#Z^>Bv4 z-}c{QgS9jXWU3IL7tz6{bn0U5@7v+gQwmb`_kDbE5YX*H{qpL63S%|e|uIlrBPP=q! zn-1%jnWtU{TYFO2%KK z%QGJ4k2jynPG$XPUoL&psAw|Z<-Pr>-``TH{d7OfpLu(}Gtk+Dcj^-le<*|M6DfW( zYA&KdskU|8v#(lRP3j`iWU|Ph4k^Di3G@dUeT}Y8e*?jb$oaEs3N14LrW6uO`JTZu zo~t1F_9o@UbM6N2Z>(mei|ghn`5o>_x?9HEyMM`yGgs0)$b9SAkk4#0UP;j8?<-_c zVM~A_ltTb*j^-w-C>k0qK)w(S%?lZ+UhoSw*>Y2xylWHuuv{ck0+EvwB7Q*!2E%f+ zP_mkmmY$xRQug}k) zH6h&MWRh`FaKNi1ENeAg6jdtrET8HVasv?@j)o$Iw8FhgH1LM^Cs#HC{M&9dTT)(F z&c*p+4n_4l{~#~g-zDjh`NA31 z$hWidW9yXZ!&B|didbJDgfI@aND(4|#Fk5ggC~)&fFwfh(FjApj-?sg786vIYp)DN zmP=@Uy@?EQaygAW?GLNl54!m|yT8jNzNLY6XQ zo0i9@JQfqhJyx@#oEbp^5j=b*Ei{Y(i4ZM}>^>msWeh~39*IilxSk?b{;56wGRx$@ zUZ9}S!aIMq;;V7Ey?C+qBm0W4&KA$+waq$sMw?#rZwyW|y-(w=m;Ln{fKa0M#Js=@ zr-<69gd=P~F4a|+BF3j5)i&|L%-Az_U*J|vc>(su8W+@>C5Ad*#^ou z(*EeJxvJtafh!LcxEqz+nO8Rad8FknnOkHPJ#>1NCk43aC zBCJYvV~@)r`CQoo%p-@Db)G!jh$A`bEAfXPQ_Pqp9Y;S#ctD^ z|Jy!)Tl?Rr>$jVM+_Oq|{Eq&vwDkD@JzZRE_5HolrBJbdTP5pVe&S~n79^!o<*eFC zs@K*crmClh;=-0atx62~^6LoS1T_P2xf8b(!nvySLurA0;qVZ$S|~X))`|F8+lm7- zlu)Uhb#F}0<$?Rhlbp+dlM;$)dmC7;^)Mu0U*N^jPiC2Wu)1k9s19D@t!|gcmJBhAlvPI=D6BwAJ zGvd*TdT_ewBm(M8l)g?vA*r$vlZ)_Tn~D{V3EqyZtLr1CN4MAjL zX@mY7pk{#9pd}2NAv_`ogpq3>QvMEhDNl^jRl{&-VN4J`wN#N(^cs&?p?ToPRfRJf zco@B`b(n{&u$WGKwo{d!|6NzRCcTagzu;Thx3`PhoEmI?D$e!)_;g;=)3v)V-@+5* z?X|r%Jl}Ce@SXp=Nbo~89~U?XkpKb|jhBZ*1s>Zy%jJ#;an?kKusnJbcNEV>V~F&L zxfZS#I*JP)key4sO_x*-B`=s0a!Pg^T68HLz}3~&SeJ@%4UY^r^q@kniZBLEE1Z7?+doYTtpz2jN#SjA1sTo*+sbH+dnOgKOk_@7g6VTA$5LQJBvYab?nRheR< z{`4)G(SQ&N_2r>zy+8=&IT)GCt#43!WZG*3V_=;%do18ds)hE9qvBW~&@Qw=T63CA zijk9lm(kTP>1NqePq`KncE32NDBUsH7H87gS~#8WIp2=I*tcYIU*Ke7dV3yb9gLm% zj+vS7l4ii-sp?9t^e`l{3ITuHI0+9-LWZ(D7O)UeB&d*P9Fas4L4paOr4322Ej8>_ z^(iA~bhJ>?%-MX_Ixt*d^z?u!YcEcvUDth7Q#RwYItwqHdJqlqQE)zCMFqp zv`KSq6fw^R${T(ymXHR-kji2n7|g)vV=eEYJutOuU$vN!kV*na!hjC!nHi1^>6+Y{ z!u9M$^{20~2RH6mNWGTsev;k3(DL$~chz*e|L%hP;=<+HdY13@eD~$wqp@tWDnpT$ zH9Kn!!ngrtCKpdx^s2`PA=IhLmVq!COs1s5G;%yD_b8<_4x~!dr-J>!OyPl`E0i@L z#I%X`wg+B5irLv+Cp)L}1wIUh-+~rFd40 z|D%>0pKT4>k@I!Ls2ojT9ZNLXSrdr`fuoRTSJ>!jqQm>H&>0JR@kPhOLj+LR06Pkj zIn~;6W>rj}+!dR(hI9&z5E=(4D_#?>^y(P3b$S_TZKOS%;#HHbtjZ=Jie=qQK1~P-fg&34k&3V&JhaxtgcQ5T7Ct0pT&c(UjsAnMS{@K2k*|f| zLea#y$&~n+6kWUT>YlYTQ4!1a@!LXC*L1CEO+Y|n_v0s*Z|l0-&;RtCx3~u#o`xk~ zrRd4zDse^c<1|%b^SFQ&Fk~O}u{K|RC>tR^fr_p+5kv_kNgRz#GcEsR_Mz=Y5i3$~z(vz$8i}TWT2sgoo20dWdHWa} zWGsS1)^w#HyQ-jY)|Tyt zuJ*y5mNemzXEqH9sxjF>Wr1suK8?I5Vz?jTl+g|oRSSI+6Fa^<54C9=O$ZwXJn}!J z+f#NF{4U^qRCpgNJ1+)jtzjpKWP4=zL_n2Mi%UROlkTPAyr+$agaJHH6#&y5z(D`l zqyp*CXaovGRs$qz=3x+Ekg^b%UWFATEA##P*v74gRR`|#rZw?y^WEovf9(7eT<3Ln zbXQv6|Fv52)xt$ww`5$VCF$p_g{$f%_OFHA@{)`Ui7RxqNJC<8E_MJ10|`Ge1?-eX zIn#)NA>1HF6kN*yY-Ev_JL`lMLgF)>3?wkZD&*dATf8+zhKCbHu)*lVoduBB_(j;d zB;}v+Cz)07+(t{T;a#7{Zd7iDBIVXhJ)N_VwTwqZU4Y+;yev;7!2qQF(#uDK)NhEFwWV8se5E6BbUKxZi zW(f6SOVeYHLjhm@G+~_@E6;cQcjx1;?zYwd|C5uw+1P2_oL7oL|JEY6DV77*#ul&H z-nLbAQ;afJ;ho6(-DN>FRn_W2_r5UsR(9ciI6+f8)(cZ@`vx_Bj6cJ{L4B+Z`Wvce zMOuKgV?0qA%@+cNCV<4Gel$?%!bQ^^J!?fh3z0!lR4>AS;w+&rMxDs$DlpY+!X*Ik zjDNK^Uf>~yv(-o(6z9rEvjNFu(2p>Ws@}qcZ`3J;xV}8!cW$m&JO{&*+XY`voo|#h zyPa0_H}{O){NmL0Rq1B?E3 zAo(MP0G?(Tg2XzoJs7dMaosv(Tq4C`p2L;(UR;s2{<{a>Wj_MH&iOsf*~$Ns-gNt^ zR}WL1?$+Jb(@kSv%FOyoSVv@wTP4%M$5squkut){#=dl^fJA~j;WMsjZs4(bq6liU zR(|XTWnx9qdWScIx%e2BB>`vC~_+dtBIAgL) z5!GtcW#a^8A(|Lrgrh`nF2m#4d4Ct?eu=n;Gl}qwVnrjCSgqS=&|qsFiw_PL2_yqG zneq8Ahw^Q)@K^%2h;>I*h)+`xgZ1T&Xf#rOSaG%e?(>TCpFblhUPK!U=hKufq?32! z-Oky?p4SVn-BvzK5z^1K!CYnyEE{=J1|JAovpTm`4U&ZQ@IV1;K0yl>GBc{$5aUox z(XqYN!6l0fFi1qxibW7hNwt&?+uJCQ(eE*N{Koc_Y+V2I3m2~t-*U`)C*f0S=18<* zRnynvimFoUwU^|IeL3~p)5F(0*E{2HM0UkC|GU_EGdd@~b+^;|@>7>P&pZWV9gS7> zo4?zr(K~3er!F>_AVnl8TfppKAs|&0vW}n4x`aRi(a}YdH#`Iq>(GR<(50KPOajs6 zz0ZO(iXDA)b)83VXy(493LkuR|LKR>)!Dh0?Zv=DC5i#&@!7kag`THhJ}$&h`pCK( zO%B3#`R4l5x<-Bmn4Z_)iI;q77>zo_VzJ5oBz5J?J`15g0R%W@YHpgF=H~@Kp;}ph*GsD@8V5}fuA)cO^!S=aG zqQA>M;In)XoR3e4UM=dHP&k@xiG}7ZfiHH+UdIGu2TLH}AwcW5WS|)xOh__}D!lFm z*IT)`^>Y>XlH}y%7T>L&_Q37=NkNLvz;AbX=X6?p!SzO@H8W$mvZ>=YoyoTgI&+HU znrV=_C=@F_t8wE)OfEe1kuuRDxh)^zh0V)F-WkISypMt8mw4b7OC8}NRtt%+aDN8bk78&?N`|Lj1qX@^Y zDiH1E1Bo)hqky6Hy{oo-_q3zY&eb83Dym6s9Y6y=lZG!yyEC_E$49fw6t?@{?C$Y! zFhx)I;8pjh!P&eL>VRCw9&P{GE$OQIYk{*TMz06H4cv#IG(?4w3Hewu=7@54U(0Z~kNc-6^e`v(-Z- z#q*t#$!Yhu>6iVxGJBi16)S@bX6?W7SzB2|A7ujy;88&=l!N6=)!c}ovoWeB3 z7!kc4`5|(TRVjAhqiCPFFc=}4a2(uAaTOcsWe+x9(uz7tH826Q3RSeiC04YCt4%rc zIX^!(5G9hTv57zd$q=ljo*H0)LaMIt@6d7LQAw0Y&x*a7-~bpBod_Y`HVQ3p>I?Zk zdpGgnumGjqrd|~hmL*tGcdhb}DURtdUiZNLTfol7@gV&Ji&w56KNkDV$r!#+nUmW# zZrd+2r0n4-#H?xx13*ddMbXNSi-@$!WSnX`sLLQ?sBg)hh60FGa}gwFJ2vKoxi^W4MGix5AKJIgZrPqy~B`loZ<;8@Js-O~PjzV`k5 z^4o62~X z54vZ77cERk;6P|blRyg56P!Ya4f?vwy5M|kyffWzbChC=TD-!zT0a1Al^vl>OO_ls2s~(SN2w5{pQ!OIg{9C$Aq-?{`H5-#z0jX1p)5l*hjpBh zfkV^yIR2h68-kak4IQ3uq6(PcF85Xx5ZOT2@mXk!3ejtlT8S|*1;a-!{Er3DiB4+y z$R@0fsGzH;5!c(F$$3>whllRm6w==B-``*B@BB+@EW4iVY@Cf|js9v|F`Tr^_WNfy zINs^16J4BH2%N3;u&p#wCc?@9u+(}&6yXm|-iUz#9QKLEu9sHm``?Bo>K!2(Q47@( zv4%e{+FJOq!ooIMXgvYM06Z6?8g5`Fu(!7*Rpsnu?(W>=>VNeMyJ=U+*f+V9LnH6{ zuZ#XqDe)~Uo@e1??aih}{DIrN#kGwZX68mNiOd%1hOBZ{z|~QNf?*0ML??Y9E_Xzn zt49oll~4%9BBv4(NDz8WQEtsCC~#?SYhX2^xZFs)$>#mR`QYBc#{SQD+piV5$TyqV?L|$;9b%PX^`N(vMZGf&P=TjrR}ilEb}o5qYH5JZVSSPramiW$;z{WrUGb zeeDcHQL7nFWKd>N*?~4HQ-iD$A#^yTJTu+~VHAzU^(DToE}O8C8t~G$%aSrrUv*7e z=c}H)SH7aqp&{6Dg<^#k?E7zHb!WH4UpMYhH%=x;_Ek7C>uRE8mRAv!#4F=0f+KMX z6v9Bvp&B+7bpk<9w)iAyJ%{YDXOlXK0ItwP-Gyt$B#KGZs&3lp-8R724PV&#?X1l2 zclg!>UtWIe40^J^CfWAHBZ*Iw`Enh`rg4UIO?QY%fwzoqDKn$bnh6!H6mkB#>2F7pr4Ue9{JtFAp8N)~)4 z{vXdZ-kgBb`5&J?omus4j5bLZ#O{$Ax8&an)dO?#^PmxUu%dpw z;Zd~h2b8jv1WpS4{3-~B=CcoV%q)CfNI*7=)|_-?on}>>W;Mh%^mMg9J3aX49=xj5 z>CC?E`_;4M;PjJE#qS66ma?6C)%U7zSG8LVi})F8)!|?1F)+$kWIC$AO=1jC3>a8W zrp7QvgkK;>=r~?;XPYke5=x(W86<3Z4(TgAG8OVL0rVv$s3Sc+><^9VLn-`61~n z{y2GGkB`Ae5!+3?I+BkUY`YZ}EjKoKM~W5L8%%?rJPtnAx!bn&YkxceX8X*jvQb5= zR{5;+yD~jW6Aw)6OF-R+h=>7%E?!gb=u27m30;NbIVV(;Pz+%D5sWg5m0yC427fO4 z@GNRBO@6GK(O1&3;rQ&2*Us6mVfn?o=Ld5If+Y&E+4Vi|&|u7UQD9lDlQ~minobs+ z5AO2t9vKXTN(F0>j#P(--WcI(SZC%nL)a>~d=7g)3h9V}03C&>I3Sk{K1f-aJ=$f)8IqSQAD!RTdH;mVEXB@UI zU7I@e(TVi#DqwifCf@&mq825;^7&HeTI@Q13!pKr;i@MyA}TLA#FZ)CsTP`Z0NDCpVV=w#PqLA|sX zeI5^x)ww_vry5cI_`?@7AjFtm=sF0;Z_CdI{4y;u?tcKN++=W8q|&%QhN z;H0*Me*Z2=yaQJyUWICZVn2yOG*7+%?8I4KT6@D!`dS0e zCU1DWW(>0qijd;twhB`Js~OEviB;26(M~uY7oYY$G`8m*J6zmMP98)#%jB7rLwPkx zS(A>&)FI&v!1$;{WjQ7?nx1cW2x@}lvAv#yAv4%~h8_WOYZDSihUCDK|ET*6wA;6G zMeY3OKkZy3PxjA!NMF3Xxa_{AVDUOT*=NLdR}&M{YrHY8c>#nS|%2GngWNgBvn zgp{em7ZoN+=Qjj9mDMyOORdZi-{OwQkN<7l_47Pi8vN8C=&#GJ5P6zB@3;y~=UM7ZpR4#H%XC z5GQgJM5goWH_OEZiw9?$@ip5wZd6|$q@T9btZhztnWTOjkt#{P@$LQiw=c6swGV)mP0v*|3>P9oM$)i&88f@k88{OC9K^v{V8g)i5DIh4o@(~nzvHwa`#gJe_0z@H*}u`b zifQ*7i=Ew+RXv`P-xiq**^ zr}W-@JVb7(W&9IDH%F~kqzH^G4VzKr#IO*V$jyB|)ZAsY^m-8)Opoe|Z%C)@9hzp@ z{A|}0bFOXh_4w!V>}dJum+zGlT^-BrZ^51>2X-TnA2390Vu3_VLVy0P7h>RH{EQB4 zC2=+>^h(lG+al3{F!gsDI?zyz3tb;0)GCtm5#G92z{N$v)2oP$o%4(96JP%)kB={= zvKkJzKVJMR>4=RTo%NspFU{I;%EwtJR+y3YlZIRS7i0VIP*&F37pO^+>vLRL0yrjB zv*Cqu!1dj!V7*@zmRayCQZk}Lhyp7SQCs!u1efr7Y;@ytR9>vyvYp9;YR~hnn*RBz zUz?*-PHo>rjbndKo)`4buCiz%G={9x?K1ULm#FxgLBQwF8LU;PngQ_`m*~Xf`|u%i zqLs>5C>+iYpu^*b`oY_mX{ObRynh0s8!&r7A#&266pCbrn0=Yu<5K2MuY4^GbV zA3R9o`*zs2YCfl0S!L)98!nuYV#s4KQ-zo_>E_anSHGY!vo^aTETN9Qjsvi=~_i(D5m0s6m<{g@alRMsObJ5fN=RTuMd=6+52Z=K zti#B4_(=qo{^e&x0#dy?j)VuI43lrCxar#+O162oMZ9Rs+4R~qZJAlTdwW4C&~tCJ zMfbm;jwfFA!A}tlLX+>qM4_0N`I(sO9wv9{IcUN?NUoAne2Q?Zs{ml90Ft4ZI*&F2 zOJcY&lLuw8HRpiSapen=SzMy4S@>f9Y@bXGPVHy4$h$Ajcl!q)uWWA4`gL?9K`Bsc&f^&Y@Dy^<7CLhaErJJ3oFj{1j4n8RJ1)_FR-iMkLYll)>46AxA?d!^|W0aDM7OmuRuXvnYaYuH#HN4L?e_CK`!~C@``bTKLo&-wt{n$R zp5coO3F+fchUW;8m8}Y3{AICmVzVnD8XUEQ>?vt@K77#dc|2MaeM*XOz@TILV-vG#)d4uU=+3bO5H zQeZkdI_n~i{ZSgBN*H)oe@S{5`y2#^7kDKPPy_62BhgsWX#CI&S?~7bb0A8k)T{Kf zANO?j{H%?n(yi{yvES~CDf5Hp$ELx7b!{CpmF_R)vPFd7n?0HG51W*!AI`o{=Q}u5 z|Kx*gOv;q7r;3*KMB-;JJN15{ImE-?AohZdU&@W8dMf!s-)v*iFF)HPy_EC5=RdVX zX*hgw-AqgN+YmcAWSgIK*M0r!&gp2&J8>NfNL`8SSOd;fPKPr@x*8NpG~U;E7uHzE z_Y}$b*~8jarB;9fRc*7bG^?LwxJK(y0i_|*|1_i=>G=DI1b`{@*7EuMzk~D04(9aq zn(m&!^OKWP}wQWz@}<|<7swK{bj9?+YQ!}qap zD2#F!SQ5G${WC&iDFi)-CAgZxVG~qD7}rFIe+9kFq?eS)WWL{g&F<=(H@5DVD;wvV zr@raimg3?cPe!#D+X;+Q#hG2h-}d^Unb%UI;ChD33qCVWrdniainU6%W5_Ee^I6+4 zqElk&BTRYZ8k=jfR{fH)k-m&$)Sn`@rg+UX%~(_3_QhrIkFFx?)go8kT@ep%czUvT z6nysK)9}uxhUDWn&ovuuq-B^NnE{6e;;=-jAAlWf(s78GZ7mEvLz}46dzPKR;Yg-> zXbyiv&CfzBRV49N-BCU=HA$3CJA%sP_qbT~=WmM^8QiG96ubX6p04Zgf8y=;fo92S5u9$#Ox-iRasNVdcLh`*IS~-rYBOI#R~HmKem#8Us*igI_g;5eEsT1 z_jz@ej!nsWEVm=AbQA*v22AY;2lsJ+GI$d?=m4}ky;8iIOCcE24o14kP!$|s{<2O2 zWk98H^(~*;=NLy9x`~6$+tS8|AF^VZ*|$I5u zoyIon>)PKg5cqDKbx75;oL~}Kn|f1#g>223A(lxCV3W!alT7kUxp78z?LN^h3)pui z{Cgz#pAY_6c!Nvk6ut?jD-U-dJ-)|2tHYe9Dm8NiCD=Ovia*xF8?5)*QWQmBo zPxq_$i?04kQ^_L#HLLn$)~?s*RWws|%zq2dg+>b#wSXWs2)C4*A#5H*jzkqEXz3h8 z{5koPCfW93t9dY~{>Cq#AvgPO{}Zq6;}*(|94yOU?*5ru+~B^p|3K`TS1VA8_8uE8 zXelH)@u?LSEWsO{h)uYI*MnL@L%%EAy$7pCCHkdY4dEfVa@xaTx%Xdv#^!IYPG@-r z1wQc(ytvpLoIO2_-R)rBHfFc?+qL!$Y?zeucR9%4bjTZ4;Uqkk?3jqfJpYvf zEkh4sC!6c?Zz@dRxO20it%>nb)xK9(x8=fv)wTZ7sloZd!NHwF-PbpCbaE7fk8Ljh zM6Et|!)@lPf>kpjHqtmTvs%yu9;rzmmml}bdXdpplqpF++p7scyr}vc{wr3^DM(v& zAZIL4uU7NbEHaUfx~?E$WjFhH%jI!^*WU8#o7Kq=vAe@df0xcX<{Esn*4N)mZ(T8C za@B6(F=H6Zd*m8M6gGsfX?i>vuMJPt)HlJ^lQ}pO8fO{!bo+^g&blsI@}&#j{(%oy zpG{wv=QI{G%XYr4bTPWy^)q>reUY+^%;)#&?&?nR>Kp6%vLf7g=o=Zv>)|f|AtU@D z%IaFpKo{r|%MP_3@;DR<%9(kK57%|Ex0}j^E6egT)@!Tcg-MTz*7=R~2Tc!JGV3SUUF-J+ipNzO8fcnvviF}zCL$E; zIEIJQZFx9s>sT@U*uOR4sY)OCE9E#ip$FNp|rAX5H)l{$J-G$x#=e z_&mOD0p<|*LK$oY<#f3Da;@n!X^6tum_*mQN9J%VAcbA9g!Pe>t;hlzR_Z<+f94|% zP%_cgTRywlt3TfC{ChMzYu*_Yc(6vPEah7$6jsM(`g(WjgzFl?5X0HXclSF~c*xqN zml(To?`r;R7iSWH@w&cdLYcwMxwpcqU)swiwKHAwEta=y>epfUwxhmy-sr$F4X0EM;oCn?hIX#y>W0rxz`)f7l z=a16Q3+K0;W@=nlw11DHr<1Kqod(0q=v&NgD?BpSk+3dIHypDLk~$eabhZms%5KJ$9~y7l8(;@ay26$~2N7{JaRbhI&Lj!luE` z(2B=3^UH)LWe)LEOaL!f*-S`OSIn)k*r5P}8L4;>ob46^g|Y-`VyTIvK2M%&c@<5% zC}uNGF6vx<989L9FWoWSI0`s!$!hRj|4`9wQT4SrWr;0ZvswEf&{@boU*c_A1AA4g zVapI9o>m5}GV$`8E#}jdx0zc}%Bztt-ku+9GlM!_SJqdqeQu!M7GKd2)a^c>Pj>(B z1{1UIA^WL@#{PHGa7zC5=2uchCJ=snu9d`!bl96xn+oN^Ubceo^tgaGURv)!2r zR-@qh2eks+Y|uNNl;p$h2w0UEqZJ^Vld7;xFe%Al%-D-7wbDgzWIijfZe?fTveUB5 z`R>Wfh<*IBxzawru-|gnGVS|LUjCi9<=A$-PkdbaD~*u?bwfE;^c>ElSwPL8>`}3% zIvWs(gEOg1A%}PK zQgb9{%m^?vt*`I>H?J1k5wct9HEAMxUH3J`Ak#cxceG*g>|pP>p=&T`dg^v20lTN^ z%<%6f1M!EG#beM=25PNlOEnpFEggcO=Y}|6yr?p;c7Me_5p1;wfE$HC`eG zwWPVwD51EGBs{Tydx7>bS2CsEBWa=`TDKBZP=&PyUk4bjK^_$dP!qTzMZ?^$rt-@A z^4{>sIgQGTop$$hcXhS4-|6Z68vLyN>513jABW3jhk6C^2db%B)+x=>S2P~0;$t|> zq#Zzftm;hakmR?y&>T%E;PUrGzh$YvLjb#FDpa3Vyp%pk)UVKvYpoF9@oVHC4+6{dxR-a8w%`TjMf4cK;a6!Ij-tRcz@ObxpGI{o*QeGR; zVFvlEr-rPdaI70RI)mH3yiBRN_daU32A&++> zE6v!qVmE89zhi1)f9lix{F}|qomx|Fv0{IP`O1pq>J$z}l{lBO2C_k63W$>OfdkZh zDlvLD(L2$~q~j48FxClQNC4{f#jP}^y0PKXKz1qEej(FRhll8u4z=C$?7^|souy@~ z;NUv_1K*m3vFg}4R-s3sCrjKX9X51*Zux3*O%X-K4#eA3C3X2QA%P;@w7`YiX@>n< zI++yleaH08`bgyN*k0gQ7A*KvA4?mibzdiwjc z=Cp7c6E>?y(6`8D(8@asV9|6Dl0L`sKTH5A=d#T>O4=$_Zo6+soSv@B|IZTb)pyUbqqT_5&n>f|;`=N-GT*uAI}_{`VmbZ;*GR8V7ga3P>)#MfTN z(AyP{FN0&#q#Ck09B}2sY1U!KNtmcaQ4Ee&59`7Rwt(WXe@hv|Ts77HkEAmXhw}UX zKa*ulWQ?&(Gh;ABb`n{}V8*_$mF10)JyK*J3@VJBvhT9*vM)tQlC3Nel_j$8eDBZi z=W<>C8`s?TIp_5{=RBW}XG3hXSHO>sSeR7<{)x`__(nj%?@Rp&L!W%u^Y#!i70l3?TGN++dw9~a(#SB! zR))5R#x+qy#jqErxs=#5De)^pM1`F!!b?_$^%#bAAH4!qVg|58ZUF5h?BwZ~sAWPN z`TWflqwMBrp7`nA_j09+V?a7`-d{d-z7o~emR9AiH#E07@BPr+@6+7=4QdG!0}+Pi zLMvCy7aX{BCVE_Vc7&e{Vf^wrXXX(Rki99ud_JoXXC(BG}`9IpCl3Q%BPfK z2mf`cC3wNmcuYq)BcgexQ~ItD#8F7K*p1$&%#X%Tg4iSX{pSwXGr!07Z;xFJj*X3v zhxhi*&5YU0h=hUFofCx;Dv+hP(7xJ23L%;oBl%)7*X*5|@e&L@u5`#QfbRnwzS~gJ zpw*}fp)p{>4?QP0in6>USPW+O{L6@={CHzsT~lXMlizbsZ{Lf>ow=F)?|$V&LoeMM zkTFU9?JonGT=jp?M7$$Uw9B4Z%YU@NeS^CONb5ARs&-M|p=jR}8F@rU6RiL=uU>?xE}j95@V@ zAyr#3H%eZoXG%0IDXi`;2SOtJ1O4P@7p#MCU#@Rm{##=VZo4aAzP|FQIx9)0YWVM( zX)PTc6=$v(Ug+0VTl#_SO9;qSI4JVUc7)SYs`oU)NHIDX`_-$V$6F;kosezJ5gkYR z@`ofFd`CQ}j*sW|5w-cinX2n90_A$8kuo>o7&v?Zo|F|L8a&hAK0bD@#N=GeWxcUu z{dA?e&0-;_+5gi2iKpk$-rn(q?0T`@tL%#>HRi)l9wuE=dGw@g(ltqwox7HD5dZSM zX~91{12iAR&Z&+Q>Mla5hKuDVT@fcAVN{@GJ7Z~-J!S1UBT5L(q)rnDH8{|F^@Nc% z7Ld{xPsu(^y^+-x+}?D#csiB3HUCV~!FNhViFBGq`8c z3#a^oKg|9|6VL9AvMBhvcG{U9RA9Zf$xVp{k>q;jMn26;98yRm7?~ufDT2I3&|_pV zts36wH?TSg1WYG~=ni_cj{4!mxqvsQz&bAcNNp&0Qjzx z07CQGY5+L->jXl5uW*}585r~4UP$k%$hFAaCFD=C%76aW4vzx^0vqqh&%Vw+Ik7uG zSsmG5+a4FlRtWUo`Jp1OfHJ`PCH`sVx(B8veg#AKL9tZjX@mM9%w2{sTsT^pmhch+ zLS5Zv*23c%NWx?AH_a5gN3!@D zQWA14l!hFc`^Rqft-FV*Y*Uq9mDv>Al+u~!_POkD>)?iy#fkampf+>iDCg{sVy}gt zwF@SlrEg7))CfYv_*Ybs%6v?B3!!|PcxW9O2;F^dEEJMoW@BJ`6C~6x+<&Uc6iQMS z2=T(e`4G&Z$54hdBq^YO3kuB(X(^`K&Fp)X9?=;)BNQZvUED&^#V7qQ%YqvjolO*B zL4a9VFm#shv+5Pqe`clX{LG3JRJHc-|GV!cR~fasdE)4sJTWm>{#$h69)Qr^+ZDao z+ZYnfdVX-c^RMI^sH~)5l#ItCBLh$*{@qYiY zqwn_*I$MEt&vURl8IuLJ*0cfuX*Db8ptzGq@pNf5`{HCdR#cZqaeCnOChKtj6>0zY9V6!;2P#(J#I&=s~~y~l_YeZWj^CQ{bxL{ z_J5siZBMt)MgVqkF`LH&#m=M6?@xTasyhO{ZC$&|Q{jH_N2`dM%iP2?e6nJnKVX9z z9fKNtnL`2G0~=C9;-3o8-9Xk9+F%-!V&1~79Bjp?&2bejBnZS4Zfj%$y@^!`^AvrK zr&08VT;93@iQ$FoAH{LRT!QLM0KsxkFd6-X{O=VSy=@w*0^5q#uP#A<{)oDpQd}CR zGa)Vf<$bB)(ELG4?}h(2*Y^`HzOrv_%-+9e-Qn+j{%hp#ikh_>PvFUM_h7i1l|IQ7 zhJ}br=tBw!y2i=3C&G%Wc_Y%H^0^cQe5egm7fv5bJVYnpV9HV%SNTk*g&h0uhSShP zoW(w;^!E1uJpY-WufbUP3CNOAt^WRytuUjc$dM9j+v0k~gHU38(>Me{mE=N|wXWqi#hS4l6jdzesZzAko=S)&TzWrDAH?a0>@5kcc($Ue6L=Ax| zUF%N&{j+1g^Zm?BEvvD`ougfiY#>%{^`TyN(8cPQKpdmuvwDR)7Cf6ZIai~Fr0QQV zL){vRh)(4>0?LjtcszVwlZa}hH#x&0yhK^>(}p?tJRvl!=Po6zjuTXXlw%hoLONz< z+vVDWw$Dd~ey55)c&&JOu(S_cq0PW<{A8|*J6*G}yy2)2Pg|rS)mo>bZu{}8h7=Tj zRh*gFv>Z~PX)z4pAmf+bpwARz88vN%?w{N%KY8e8-4EQEc?kHiqZoBl zP6Gy_t&F&0Ohb4P=vUYed6Xc!S3F~4)(U$|AJvbp3ncSS}UH8FLXRVnHi_e z1|nGG>{^@x0$k8=1l2aqr?P1VGli#bVH7 zB}f?7q=~wAO*~EFcX4Wm!n@}ebH`KG_k&I+=2nOH`=7acDDL|+ZPh5+`AIxQfu_2fLGwg-pc-=w1FR4>f{pUV$UuANn1r~qz8cI$R~v)#gJ26 zU=Rp!0k>oZM?p|T6usk3SLr)ckoWo%_z&A(CFx_^f7+TWPAkdX_TT&QV{A}hH0wd< zOub4}RKTd>IZzN3gU>b=mpoSuMI7+cnn|zn?1rNMHXBMpKTA@o+R}k3d#o~Y^QHyK zVn$0i*ei6-RG%)bFoLdRu`Ji5#w75y>y-z$UTDJc#^MjWF4p$;Wv#7)PDe7UE~bup zWAD9LJ#mq%jEj9ZFD!K04`O^EU6oWL(#m%QYbdcd7=|3G;a3)-L`p*OAxA8Pv)5=v zAyzP^3*3`}R|yTvgGh?xJEmz%sxp9$3)Jvv@N0^~_p}dx{A9EJh_$g5!y%v$D+zg) zC$13vG_`*D7~cQA22r)ME5eQ}L2>fpzahIC*eN8f!&%H( zwC^wN8<)8ryBoVJ>(^u^I|W1tD&9R??j96~E6MM-GZ#Kk@~hxaed z_;ceOggwae55rseV({K{V39H@zOQ`&^!+LQZ+mW}wFo#0mgnT;ObaRJQiDQ2hjEGE zF=*pzWn(Zx5p(5++^(*WAr9AtMW{dzhXZ2XBt-zGbxh@?nh`xUd zTnEem{b75tD_k3qaAUoI}XjTuW9Vb|OK@iei9p+ahFg%q#>dA6JP87t>)I_LKW)p2Mrs1Gj%s#_-qEAhuuN!-puh3X;$_Z*gIhm&z~hY6_|q(Ah!P z5+%p!CAH%9NpMtvf=Zi1qvilg-&XQ~%+^q1Se`o_lY8i#VOKN((5`_i z_KVG>cUzmf*7ucy6Jlk3eS?0C5RRL@YuOLJ?}^>qN9WgVzAe}+f~R0h%dpV}q#2?4 zXaI(UfSDT~@vhowv4;Wmlm&^|z<~`#OttCxDQ}{fU?c>DJHAi*f6a`)gAfX3V{Z#a zP%$M?vrOE78pRO=SV$3$7%x8pt2{pGRV}=pzyCT;R`$G3FDkM3{QNvT{0c+A zZZ`Q-9xI=qa+(|-Uor4vkBCR|%?qjV35MX)1l#mXW3mgn5RQ~&P##G+R1MXHBvblv z$udmTHz^6HYC5yproH%U6CJ5mMnyx8w$XsqeW9m=#%M!IY`jL5V?>alUHvK3uxpfp z2+ICZbO?wq`u(tBXqTA7V$lA{$jHph-*q6@_xb*>^{vS&>#6;Tr4tvA$B#?4$9O)7 z3~8%&-b|b@Npiv(B`2s^tbmyu9cGUT!4Y7!$gq$uJJVa6(Q%ekNR&;Zkb_DL6(k0Z z6;uqma-)R=jwO*u`bIyb z*G@{$jUYixEsU$3Ds#}Ak@)sfO*f?a0vT?ZV>;q|a9cOFgQr+t#&1ftJac<(>0smR z*Z%6nZ)=59kIVC;qcqyUmU}Kv(vKQsHwd;V)9)wW62BUoy0T5@QlZDLEmjaM@GLoL z*=ZJlVpEEQ5vxPe)g+TcK8NNqU~O6bGIgmAY%B>^U~kwp)fgNwf*a;(nt6xHczsGp zLhjQKvo{-itol=)-Gowt#2=}^Y~WamIpn*GEnK8aWe_tjga6 zF_jF03k#iH=~>V?dt`ybQGrW_O>xGqELQ!m9PEJ~F+(7zsYjQB4*HUDuuJ1pn*$S5 zHNF~3C44oy37!+8tX3eL1c6(zLh1%^q+oMmPiN9oEodWZGhHOYqEDWMM4AXFmX9=5 zy;)A}Z~KnSFUS(PH#2^ZoA7(AI;t+wIQ|HfB5$rsW&xpLP?$a_7IG*o^n3%AiA6`mQ1qLs z;A>1E;6hZ7o-mLtO##g7Sg`R?4*l~p6eaOAbq zw*SP-jg_HLD<(}!RvSgf$Z7`_3`t)se#s1VDB)oLu{#BerZl98B_SF)Z;(TkVyYdO zs)1e8*$YEuj52bgfFh!#OW(#(@ar)+y@F(+^4rYP1YugjPaGWPNK8U~u}Arht5#u? z?Z}Y>8S01Y?~-}4?uU11SV<9d$&Py;^^#{ONW2xu-rkYY8vi^htNLnvSaSvT&~ zWqodwYuggzl!2wXMfQ>o*9#3pOGOBtW`=`dunJ>cxSF{7^%r-v&kSprbHyZ0+NzFD z(-;Xw1^5)dY2um?f>6EprW7Pfwtq0>Qs;AG{>oT`^?sQI49eK z)NtCcf&n3VKUE`WDZ;<-YNS{!*uh``WsHmH)ar|a2jw1B84lmAVR2+}1f>VCY+A6e zPsa?uT0um9t<4aMK3$%7+o~wS(QgESZzSKg>_KvXI2;&CIJ}j8(YCY!8H0R&Jba*lifgrUhJE2>U)tCO7 z0`ymy2sI};t59=qWC$OcmV|uftdOWTrsQ{YMMJ4f1UWdg`Ozf4k}_7If{f`k=$GOV zqIA95dZaT5!|*-V8qU> ztzbed3rZLQYa_I5tEL|naj%Q{;^pnc_0yd54zk4!;6GUGfN zkfwqg=dfp38YA>Q?+A`yVSU131Db_h%6;=ifO3K(Bi99x1;a2f0^Z!UEQqSjpFyy#pC1Sb+T1A6oSr{XA)`S zbg#W)j8wtry2&Iaxd7V>5p$v`ZuaIKcI_8*WH1sdNk!KQ>v?r_pA2aKOUsCkZM@Qd zLX=@vAQddtv|vOY!{>ZZ1o#e~3M52jr!`FPn4*jrehZDx>3h;=$ifZV_?2P$bI#xQ z;x{5QiD1kjqK?X~pH&tW*BSYg8SAo7w zvWV!6LY#G%AagWv*jsn{o(Nl--E+D+LUAPwU6QEWh0E*8-CpE8!sC~IldE~d^7U&x zV{ZnQz{Snu1C;YX5N4IPW#(<8`cM_B#sBQZ%b{MQ67o#?1T*&QcoidpNk5vN|Nb?# z9^t@}2=0Phaia1ef9BXY+~iyQ$o#ZNv2#Of$Jg%d!{kK}ZNwy?ATKl#!Iy!di=KZ(F)Q)PB5vFzFvuTxaKGMN z?oX_go3Skf)yW04H$AxS`1sxo^M_W$FA5ACv~H}@joP0DYDbYewhw^ivL)CsB5|-|g$^S%U z{)ubGhoH4nj7s{`-@o7;H(yiTM2FuE#8(fV2MpF}W}8uH2~Dz&M-47E!7fzc)ya zL|&oe>FOJxb0LZOSSVv`??tQGHr}(b(1+W^FcP-808}U_jC4aStqB#B$KPekit9jF9u<4u8-B+e7i0gWW-dZMH9iSyYv-8}=GdGYABoG)t4_wU-nQcpiu;##j37EE(4`e+K#8`>FbpcJ}X~iPpkU>EF#;&ibV!I)g_= ztsj{%#$_SD2rxRCoC3k$R;+6Q@}CY4!D44E3RKZ_Izx zv7o3P*NE$5GeU|qtSpX;A~h5J?Igb#zcLnsMm(tbKS4wLczr%+W(40~O6ZlUm zUan{CCq)i3QuV^A4F}B!j=oI~+FRPWfIZp6)Q54|3g_#^j5mUJ{;lTsZ!cDx`?%W4 zxb&OCe82p4zmw}nh$s_ER$)O>MpGH2@iBD*u~l?f7}PN$2Ct0nv!bIU=7gZ3L5A@m zK(cr-=_=tR6;im>%}#-U7Beo;N8Wdx{EzTbMy!N0G^a9icj9;`wW{;ODBdZeK7Ac3SOdtouO-O>Hy3z`GS@hkzvA4^h&cYK|lCx&M2Mt5OMk)KdVult+ z$%DG}^6%qj#f&^1a;M{Uqe`cHqrr+nCr`J!$99h5RSFC73Go<**QonULSlT45V0^g zAAMLK2)TQcC8&^uMWgAL?lM7NAli)1`t(&0p*gvl%ouvZMHtkfR>vPQnPqoLAeNw zpA?@ulay2rBsv7Eo~Hs4{~`yFX6YaZw{;Isq#X1J@EFN;PXxYYwgw zJYOptxWIAK1&K3`YbMD>6)&_PtO--)6JhNxkMuIVeC6l4J^j*$ey)Ene^w@qFm6y(T{E~2E#-m7_O-mVTy~T!Qh$9OZ%Ejsr$5{%7QsmDq;T~^U;eC1DH^Y zY_J?yR|tBZ7h4h^qaSW}GdD*iF)6yhZkCzakVUXwEF`3TWf4l#>%!@=S!tc!`3%U? z$edym?PzVe4MdOF1)iMP>}}7_M@zW^-IZV!tA)s8S*LcJ{I^RD_Bo}#boh|km=Z%} zH3SEkh=WPe;SF<{31`~dTfoYo@_hLt5nV}PilKCC>HJ;kH1p+8-mD*03>^cU6X)8( z$>Aj89D2)6<*1teIWTHL_2I_yi2=nPvs*=8-?T;GIxd4yE>DkJdL(P-(qUsPG5y6A+mzdDhI;(7 z+wcQaa>lnWF3eDPT1otbk6%#G@mbUqz;f(uTFB}IT7&c8HjeLee|hyZl6zMjt-lpB zuEzG?E?|7o-}=Z%yKGY!hE==5kwH%!IhUW#!Z}^tmT(6CZ~8jXCpbnKn4l+6&~8MA#u5J) zCL%vGBd=i2z0t6O?aiCA8_#r_Q{AGssJCqVRvcL(;9UY~PP5R*c`3W9DGNTYh6lm7 zum1A0*kF&Tz}OAxLk=S!q}(Tun+)Un5jXXJJiu+DdS^be6CcL;)OSu>iBW_bicf4SyLMG@8s|jvEB`RZ zxU!@j3gXUUE|qqExDHkdzx%SQ^vm*8YQA@jm($T9Io&7!FqrZFfHs>kpCsyYOK-s8 z_(uD$&x-R13LH8%LEDgGKM)+2aFl7U{;SEJC?Rt7P*Gd>z%`R{2d_PJLO|3o z+Znbqq8_Y6iQ~Jn9=gD_Q?F>}>yChT&28T-FCDZpn5>vbM(P_@m4D~PEGgE9DGr9v zKErnghaC>71EMD6psILLC5Aw?&9$sRGJLw_IovbZWZ~l08i`&P2UsDfs z%6VHNm##Kb<`B@@ZX~b9F2Ijrfk{LoU=qtT)B<2y>-3MZSeQ-bsB{CrWm2xG=6!mH z0Yj_)ap%&+S{8A&p1{^rV+Eqhpn42LO#%r1{&@h|+TzSK4W2K?$c?xPV{$}mP|zWN z!f#U~Vr_2H>o_OaP*ID+qIq90z5pkzcKB6JsWxUc8p@`BbzVt~RW> zvp0AE5bksTqm8l6?hBuQV)x9!Cj!6*A*}U!Eps84=w3*xK0{f?jU$<|=24y%Lz&(;@rlD_%z@i$93xdPbu z=x6|#u}qN<8k{QL8QG~&w9;#YslF-EJ)PAY&79;@SIfwN&4@)HG~KT7UWv3XSY{SP z91T1_CkL?Juy~FfuAo{5$E&2!@hU>_GF08|UCyD*lnJg$FO0Diz!bEN$%8xey0J$p zepfbaa1RI&Se@KE|9EVB+q&vxw{EIVf_K13hDtp7894a{7|WKf&~c)U!ymtGWa$myDoF7+3l#C72coM^FYf2K`|> zU)dh)-`+mXlx5orYI(k!QC?^M;1g@=yUmB={?M|q(Yow{R_-uUkcx~tIhW9b6pDGD zBu{fSo{lS?4myY@ax{o#*B;%qy@(81mh4vFu@1AVW`A3d;o@8IaiFl0Wyn2f#lK?n zy;nHP+x#1-cV9@#PgK>AsBXYsLPga*RkZVR$j-0-{@}NUZw{aC{7s3j6^W8k-3yHE zHhIO#m$yzk0B`yNsB#nNHmSL6nRGjtSp9?*VV$CQ_dzPsOR*H7O^ffr$K%oxUPNf4 zUs1W(h2klh(AN;cDtPHX_AP_R+J?uE4AWQ`%kMFkudJ-hOc-oW5Q4pY0(aaGSI775 z0-HY$ezKMQ&hyK320;N(6PTJnFc3Mo{Ku;nhmNG@DuWsp)%p^Ky~=r%_OCzrEU{Z4 zsYPm{eAn65FI>F#7nkPrl-_g#eyzQWU+3%ltM8s!xh30Xlt+J)dN#|_l(pabxcs9o z6<50}h}H%j1D-LZoz`)LBNzd{3x&9Zl(?p%KzN8)6D;g9B4k;MaLMZkMI=MF zZr!x(Q7YY=As<*o(4V=ymLjyoxam`h9&_geS0cgdrZA$~@I{!%i+)W1U0S~+1@IL? zUT{2}4DMPXg-(H(xebxMg-RENr^m$*96v_F!6Z+}mlvQIJBiZki<~j!XX%>-Su%_( z@t^Mf&e^rTm6EzOs<^TFro+7ABy)ZLU~zwQKL6xw+lRFwyo(>1nHgnS-g72|NXSv~ z)Ur{8$N<&^UN3=T5x!17s0<2eVCl?BW}-Aem0@U@nN)-806=Gl;=5LbJ92@5ZLCV^ zerEuiEZe;-cad9%dDn57slIOOU%u5>JpPj$SXdPSTVQ?qj1#K=U z`27T8(ktX+jBb~AEfYTlK;=K*UyFq))6Yf@jUmW-qjXSRjbq}P6xFHn{Lzj(cwmZpZua^DN z61wnM8ttM;pA^iK3~;i(Ge`ME*_KsPo7~+C&$EL+J4a_r=TSp`AIg9J^bVAMRDPXN ze!Mlmu_9>AWZzH@_lTwX>Z{40^n=U`ET~IB-a{F!8 zOA32ob%|ho^!U(@BUHY8YRjXEHb9K_^5ukMXcY5RTyN!Drf3q$mTJCsRJq;XV zn;;ppO%(DbYkdz5m7=5ri-E(e1|vDBLAwofiA(v*jEODD3Q+X{U<4P4aS6uEc#;fg zG{N|LuW86|l8=~#If5%0AMsblyU1Ppp(c(kLuEb6b!PO}oX}Lc!-K3h!j{W}D+f`# z4@IkrWzC|ZqV%$rW|W@Sx4)B2*W>-F_Ce%3jF*rm8r|7{c9Sfcu4g`*D9(E`x{F*0 z?sfT7#X6L^-oLcp*#?Z-xzQ>%fzAcBv%!5|dw$ zD3Ct)x&F`hiO=rKzCIZ`jW_OQ1RuJbt_-mSpX|E6OR3!B>46uK#Z(;&J%?0ch`8wE zkH#Gm62Y-<1h8bS+8dv}#Pcgy-+7cK$Sfm$Q14bzt^8UA5-BzH^2$HRStg#rTzx6WR9XV&Q074XGkBd5fM>N~|r?ktKF8oSfh@~}Oxmi$1Vx`kJU!4ZO3T+pq`)@QJWPN@1 zQ$f!<+wJ_gAmF54K6sIBbbl#==X%nrs|163g)%Q0??glf9E82Jqq5zUi|O47$#kXH zo%T*>{!jM1A;N12!_?HL&Y>Sd_72sy>6&!EBM*vDBFiE z(S?hz*=_6Yx;GexiYN43<^~%l7$3hYV~jM;=CN#SP(<|T>zC?h^7^~@On>aV$(X&Z8v?m4SZHjdH^-Zi{3EA86HZBQVOz|B}jAZy`gRQ){25=2pclJpR5Fu=+OlMk%27aBZf${C8YOKjbIAVZs#0q7eT1KZNj=7J*=kmT z;c+o_q%l^^Fp@WUks^GV9t7L=V2yu{egAwg{-YR)_(SRCG=L+}RL5S^az*FB;z86@ zwS`FVZv+-sSVVKO;%U_OAp6{*x#PA{XWP@~zAcuFr|bI{i}{?V5HyM6u}3wFOITQe zjs1T=ZQwLzsGLwF;-x*ZtH&lI-t8rZT9rZuAW?`*NZ6KbME^of%9c+YkF0I1otzJz z0ur!)2S6&-<>A^d!=WL!${jp z8pPsCl}#6V9AK_oq&!=5gm*0H(*%p9$%AetyHaT)uIDZrT|8&7K+?7e4pzU}czWo}$o_;$JZ?t{|v z;D5b!?Z5Q^gg|1&U|E|egz$np1RdXnC=KCD!eYd&lRwISg5Do)oq7HU5Wm;8x3@Rd z1w203*%%zJo2rVtJQ0=s@S%4?tx9rPhAGwZ_ouCy&#$aP~q%0+XT5h{X8J z7s3CG^AP{tbd&u)-AXNGn}A9Ng9pR}dj^o|BJ6{xehph0Zp`s(?)Vo}Xez&?+Xy43 zU%avQy!}d+*nc;-tBkNYG6&d=b8O8Gyg79Gu8#q7wfro z8&chBE&Kf~ymeXyRh=^$K9b>xr#47QO#?8(fdi1zpHkhBgFS!Cv1PL2T1}c&^_&+4AK8Bs%6c<|E``Hy?-0Tpg;ry*N1q7CNc3cL-i;7&v z?e%3#=t~4|}m`8`CA&Qw3jP zsUTnoC$%~vlp9kR!?kqN==eQf{0p>{pcQSv_-g&#fID}dojrXNaCnrO?XIiKTKs!G zbDewALMwZH()9Ye?oFTG>P9Pn=zyRcUh1np+#!=wRtzH6=!_9|YDDzkC8$o@CH1^8 z49UMunV>?lva=T_a}+i+UrU-LKZ8CWL~Qc)#G|1h$9nKV427fwnv1Smz>tnOjz-9e z??{pEnI*y7G#@TZ&U`IOd@@&+B3pd!-_UmP?_%!L&*G@jtl-OHC7s6K?`Ti0PURER zTKht{MyYI=^uR@X#jXh;oo6ac2dH4I$nZH{ooFQj#uL)A7Zlr zCYD_TEdWPNgkT4m@K`mW#&H*^(gG&6Sr}}t+DD6tRjnX-(q>{%I2}Ew*-&hi`X%pC zOyc0C-JCm(zh2a!Y18AUM>~3PK+OAE_Qi*bp8&OsC-rZ-|Gfg8|gp( z)SchUHp*zN@Lf@%#7eSt2}7P1W0iuBn16&e^}IJ7`eK;w#-D_be*zi=pc3xsi*P4m zdJ*>49>{5RZGq^ekqtZr(l$Xc!RF8K41rWqDhB zdqgi~3#;F7Wb#=Sy2a#fH>3w8Z^1fDmym_@0T8c2H*Th>5r^snszM^*_8f% zyXC*1_PtNzt?WNusjvvdz0t2seJGACeUQ+*=5Kzlab@KAyPp++&j-GL z+?bi{o_8&ek4OL!o#IO@46alYtQzUP1%;@^rX!&==mdPNrSPB-BfGcdG7n!S(Tq&nHGCAD9rQRDsrnanXGfAUH4@&d1-6mec$;FINt{n&3}b~ z7e>ovyG?gB-IyrOB_Vim%~Y(GJ)M@4NC*pVg4XkQ9$cL8xQ}@PCCb`tk1t zODSlqM3}1)&{8Vl)E@mg7X4g$UFK`0LtjEO{*yNT;6plo$#2G#I%2jufALH@eQSe9 zAz){3rTpPS@FDQ$gI<=~-;HF$KX=Ni@1yykR77C?W|APuOAK`5Q7Zqh<@McEt&N`> znCIusQUCCEoj=jt!{gDVLDM@fdHLO9jSn^Bfw#*9-dR47xYu-{UU4<@-hFYRx5*$# z?OJTTf>SSI8FZU6u@OlW=77b~5DHZEwb|3fKys9^2`tKC5y1E0j~0s;>|w_ZDB#^A z2*@u~X;!SAe7kY+(Ak8VBNNY|rN@IBOT6ixIY~@dzSoE*{+rs5IfugkpzJifqaFTh z-)v`>8lF72GZ(Fjy!ZM|rRb+hUEN!8dfDesFP10D--Mrs59U~w>dR}Y>6Xe#f~=k( z!(SlSOI^gKIq_C9*CK>4;{6GW^*SI&_F9pt*xmJ^pLON=fHUrfZqT#fXFjvHMD2V{ zCVzi_R>yp(RA)?g<>o02KS@IC52+6pVhNYKOzg^GFSkVWpH zqLd4`+=UoC_cr}~Ri`Q}rzEX^Eq|Po-fz9B`nPs+^`iWPXjU5l(kWhOe}1yo|5HHk zm;85_++Jg$Ivop4_Vp73iqPc{8+%2*hnU2K@G9LEF0-BxuRDV&tTt*dtL+KY$%B-0cZ=&Ut28C z`H{`MyIla&N-;q}f2W1qJwQrwu|XrovG4(OlrfErfj35O(6!gb?%lF>Z(pxV)Ti|I z{gd96m9;&4-zT+-a&y6F1*hYO4omJ2KDHU!3+9$iPqPX(X|7{)m0xii+Gn68g;hpS z#u4`1R3od}SIT$SGXWTn?AEKGi{p({KUo2R_3_8n3)*$r^(*$xS-(fzE&hsYdy_Vr zdOxXOOBV?vthye~IN7R|)Kk<>mrDH#rJ%L;GzYoT`hkX1seUnnd8mH;;N6b;x_nh4 zhiH=zpaCMqx(5nEsI)2Tm{6f`+hKJGoGEQ`wmRVomIH+|uZ`t}ebI8N4A-n0j4w2^ zNVTXs{yb8-dQ0+F?Y-2sL0!LU*|~2Q3ztooKL_g`>RBt!eOq|5kSdjr zirSrPU%#{Ptj+J=#*dACy@wu6qQA%26A%BMd`#jD+`99&vgg$xE~DX|kHZ^x9?Nf# zk0d-dAYOeKR&DQcCl?J57til=Wv54T@ln4=sj&-(zi>#GF9nCII0M&#d`-*MV2NW) z$Z}TS4HQq>0v;Tc8lE8WEN9tB(>>XA2Ap*JWe8kI^R)=GLt3>o+QBk&VzjKxr7DyA z$*t< zVi`x5OW5sTgD50LW~Uk4UY%iP1@*RP`JZCnpo^G8JEIKIGCAe4`1s zce-mzycI=I=P;%j@vfEBZmhDpYyGIS8EbaUuuu zCh3>X(V&8_Cmo_Oq!=pO*$ieq6a`nP8`7OXlS|bXi9A{}?hqtX5E}W!HB~`K;q-#$ zqVJzMkzW?|yEKmQ(5@ zt(&A@;ELr{hGqZ5T%l%4qexGnckH!+d77tD3A^)U*G^Zf#G{n2b%l^=DF-nQ!k{m< z$YPeWIqtJZrbX7PvVzksB(c1>?B)_gR`FpVJ=&ilB^ zTp0q6wW1sxpmc_!iJ{uI^b8mY?Cq~`64FhUHkSm&n9iw$BZ~sx9LzoE*j3YJYv8%R zUv6mTVEJ1q0+@EWAKT`H9g1iG~JTsFw3D~87fecOtk%@Uge#e7BB2~ z1!*;r9g4{wiRjIGdvy465*7aj5J&7#SxA603E{NUbeaT=+_roI0)Wo$^g~pfsM6~P z+;3)IXW#$e6+2jF?O1u|p-9F1o-z3Qm#$A}-s8OySGB*{CP|mQk)V`lLLrkBs__w& ziKt-!LMIp@&RPIgj6sLm@FJ2!x^VGy{D^S8jQz!9YBVn`(6YXsh0w-p3RB%0V8y)X zGSp;`W>8zAF(}MQpbHM@2&=9I+hh4=fBPcbs*7C~1;4wz}^-0mG*#41;!NJVz;5+`89hbj@JLK-h z#Qt=Cur)bby8hQm(!t^G%Smayfwhhy;R?0JWFua!eiQ;13b_x1rXj>hFMpWUGAZCg zVYHXJ*Ax?=XS{<;57_m^B*3v$sxb-4$^;&8_^|pv!Ci!KW)g!12uVqPlP*-y!y2c&14UNe+XlARc&C17Vaq!eEWz*Vy+Uq;sLZ*JJ>oU9K`u>qG% zC;x`5t*@US|C=ZeXB*u)-mR4`w@M_WmthipAc7F8(iEA3dolL-uO*L~%FE0Bw&pL- z#>e!O0-qlKA4lgN&*c06ahqXV4#UVX!!W0urJROgTMn}v5`{U796mzM=ksCCRC3NK z=N!wKA|y$O2&Lqd$RXl)e}8}MpKXuFw)@_7UGLND`8xQ0y16?&5^81a^rW;-y7Mfs z&hCY9oTIbxvxmqR?IW~)xF4Kswj8P?0Ob2~J+bv9?Xs$}-k}6}ZR%p=1rU(&G3j9{fMZ!re&sD_rgd4;$h>@|wAX^ypb@RkugV#;S?Afkq7y(O`0!giOUnTXJIBPi;~ zKBGr#M1Y;s=XW~oFqfB?%q+DxA4|}a2bTFsC3qoR7DUHT`@Td^yag-JG4?I+bK6;U zt$F6UROf?^-;O;hA*zoA)Vi--yEk(Mh_1G#NA-;h$Nbt}5X$4xqf%(cV(yaKxanyh zKw)-p@OfyXFzx*Jxpnthc|oCX%}~yXk=morfXQ&j>SV4r11#FvU4l?sVOd(=yj^WB=sC8^_zK zqCuaRSM_DOgAOV*HA8nlHv{YKlE7OaqL+PUC=-b&WlMek)eezbE#wXxzi58Y z*4+H>>*U$qK$J6szUSd(BMqt6OE!-m*Ik~->Bu^Hn^Y}2IsJCd`Cv$|Hon^FMWbD2 zKlnX3jt&9_Q~O}UeF6@Gdsg6PL3SanH36NGCGn%jN=1WxT~vPayW;E_2B?_pQ!W@# ze1pO;R2+8qrgTC=BC#@Egh*X~+%`(!wdMNMBwZI|_+N+l(kF_Nriz-TM#$gK{%KD% zKRFXxUd zM!B0R6H?c?epk$gHN$H`P1mZhwti?@Nk!L-64=6qVOK{%t1-P!v|1TqQAn zjhcP8V9T@Qx=+iG`TK6=jM=_yqPk>zlS+4qZ@|zu?@$g~jGVR{JBPbnbgG^sO}_y! z1yDSQGi`V3EgtNNTUjE&WFxsCob0r4lI;x~qNt4=pO=uZ0{y_@JwSr9i)2WNzoUiK zs_k$7Y3Ly=lqszGR=icRW#n-euRfG=<8Bj2xGI~QsM+{kDeZUo4A&%|P z5Gg7_DbM4^%Up*DN=o00NAaMt(_KUjhqQYgNgavv~S<&tLO&zUOSi zIPCA#+PBef)5psJ-m}j&8$P85t=AN%?A(!lG(#KZHk;~^JpN8Cbvi*JyOFE(PC}NQ zdj>^hkSQ5r4sTS@){;pvY7~YFK)#YzQo#xd#}$>~;YUSBhf_mJa{oa&F$R1(Fda~A z-3q&&2r5>V9my`|-B4Ckrkyxk{D-I2&5F}P>T+}Y`@juHrlcsKJdv5nF!4n5Xl-NF z^UQ01bI$7sb>Wt9N{vyU56IUP$5`vBVD4$jh=M{K$Yof5Jw7RKVF^Ur;6)v?p{|m2 z!q^z9A8jYJtJPoDuMdudCtB{N&&?gsu{UPEizut-tift?%rkxeZqd{Iz~9^Z&)LNJ z%;8e#;Xj+RzuVtua(iBO|NVCVMdvlsgTGI2pLH%guHT>()R^Zc?f12~+t)W9N+ZW> zl@{>xeleU<3G~E?y!|1RS+zt&;s?dMl_KKENrD%SO&FU+i^~$nf)ewEHD=!|SkP1C z?sAdvWz^^b56RD9dC82$7xxBR@7->|G?^`ZD!qN{P0+|P#ru`l!hyhL0X0j_2cf5b zX41|^dmgI?_3sLXZ03I72|HW=-gDN|b9#Ipdic5U=Zrw^cTeX3?o-E2l!KCMl6CHz zRQ$_D)9H3vmw7?VK@z>V6;S(00JABA;KP)rCblg-k98B&rW*TO>PUdMfkZ z5mU@v)^nsuINDEM9CSdH&ttR|YWNTv2rDzIdSkCt5?QUSSbkM!BgKvQU#0sr{e#(8 zRkfAUj_ zSSu~X8fdcKg>@r5vxVs9`$}}N(YB&#Vfi1F+i^lterVRZY_GhbN+Dz~s|}kOMN2$Y z2(QbGvA*7)3Pu8I8QwK>wwgp}Rvk`>Y}L+l@_^-^koAGx!pqTv$K#LMdej1TgBPs3 z0cy&)f7tQ2dCl8hryq0cSzaZnJKt^*)sZJjPm{|IG327scsOeWN>q+SS&{Y5Lu(Za zF-GSPe9t3{8DM3(#x9D6Lzt<)2-DdNEw{3aM5{aqqxm1qED61t<<1>_>p{GA`>2)l ztJY60?eUlUPga`V&o_LUUkdX&__DsrP?7fbY@B?!XkfhQvg@(GAtHxFE4+tF+bt19l67V5EE0x z^laRxTv+q=4*%oFkGsx(PCqKV^Y8StzvlUI{dXCgdnd{v^LICfxdWMa>WAAmEk@TE z$A5lk{mW^YP$nv2f;9=8)D7J6d+2_JfHcdlCdNR7*+}B4?VO0_c(6j!SnbNgj@R%p zDHMhda7|0dD^~<%cnQNE%B4#{S<&hDA}Qq}+8@l_GY_YOoabL}IraqfsD}lex&8U) zeKNI+b^NdUAHYWbE^vC5d;ciej3&Ue1Ms zFe$xc)FJGA`vU)FcIdVK?ZKxLjhBlDhj-k~H>P*zc1xYbCVE2mS01g#v7~iB@C|4W z3wZvT2F#&!(Cv`~DlSW4joEIGR`-&GQ3p{86EJ~%nTcL?q=JF~wBKL>4zqp48$l_N zWzWpZ&xie>2#L~(uu<7W1lO}oxvh20q#v>vr?D^#s0IGsT=`R9|3u?_ba~e}>}=}M zPR_s2fx&GrKRvPVP`mR~dg?Xp^hc$5tsG%_6dg?BX(9=y`=^8#FriMQ^7_8cMx+l% zMv}-EKuEC2*t5KR%iV~MFrhke12_p(0wN&5I5t~6zNqmA1%MQp3Rz!|hHxb0VB|R7 zB!5kOPjaPLc{Drj`2{O&j(~I&G9)+&vc2`$hU7I8Ui7y6Y7s;IIjV@`RVD8 z`>JW9Wu>xx|t?xBYL@k2%L%vTBHFFGs~E z^oJ;TEe!_e%)*)}C2ya}0p^t4gJ^?ivXZR$9~5#|XRliZ9;BVgF|K3T?WNcV7Uhrp@h_;|GbmiN2owDo-!RIh40HL8|+W5{pRt)OXo8 zjmT!}X5>to*W;JPE0YpM4YV&Zr)PuVQlju7ebz(kL8TZ%g#xQU!bnL{LVs$Jq;1h4 z8XBL6#t15A$2gGd7Uj)*KABs(cFi8heYXht@qK*MUb#x}V2zafx63LbxrN(stEm&5Jo&cU>Xs~XZRfT1V9PaIKoyZ$ z0d#@X&IZoCe^2j4#ibn>rGC`czcbKZCT5mgDRte|Fq@ex*M*DBbyeI?Q7b$@#w$*H zmX&=^6TQ;S-Ci-4;w3!RkE0U=l}Y!o(!y+^u=u+mFdne|F3T&sKAs4Lqnydp6bYBB zQgL>Guf|NxYMgUTX(`}kd^AvKd?)05>%~m{<)yCLaYweon%0Xgmd`_hVMU2~N1Qv~ ztMCt`;s{@~gqiM;DO$MdfgDuC5ekmVNVV=4q?EK{bOtLJk%!a{lTF+vvZunW3zSX6 z`X!b~fIxH&h~c!Orm!h+>MfT91^BHU3U6zQ;i%iY5@}Ae8j-mh{14QYf6IP90Z4#b zL-I#U z84D2-SHsp5ofwvx94ea9o_<6%HR{HqCP0v@M9pk#+ z!Okr`=RZak=T0{iW3%Nqi!G^Oj|lXU1jkMebCj>K8yORw|dh3;03qL!bD9?1$*01 z$oNXmQ%VLakswDeZjf=uUWg$VYR)DH04Dkcp}NHl;`g#q3qi4ov*LAC;VY%@Kr#K0 z4^gxtx)7p48`D)+;Z<{_pMw#zcC~QVl`*2FK+}-%9#6H zh=j|lt{sy;^9NV9zVwfd{%+l`j;#rBKj=I2Id|Fl zx;(PynOdk3^!v3Y-;)AxzEGiK#}gcS<6}T z?WgVeudhd6M>79;3T%A&<+eMswQ}$4l%%06NThW#F$Y++i-f~ zn1hojx)^_-qfGMFbKMrdp-Q6i^xb)8qem|5?lM0-mAY-Fr`?LC;~_c*b`nLR3F!$W zMwRj+LJ11KLQ_sd7f%CN5aYRXB@7tJ@m`F+Jk1zAUF;ay7PH;*rMSA-I>7Bp{M-Tt^f9h&SF09yttfg^P!q4sVnNwz-zIzLd}5Ro68nU zeCiK^|9*9yw`t}0jFJ-7jnL7$RxDIiHOUh{YhcZ)B9cJP{eWfz%8{z@^Q`z6$nD|? z8H1vtJPxXFgQ@K{6#|aPgZ882^KZ~GaiGg#(fJTOR(sYd5=<_RrSU&pwr%O*d47vA zDCnd@4EWr$Ujr=P!$SW2uJ~W{{GxSt`KN>WGoRhip!;X{R9m~bZSAf(D3~jY9DLR; zuhBJBcFD*vCDcpvxQH;dO0Ed&fLP&!%KsXClN~ zqv0mpk3`cuKS;CmzX`9aE>dz7>_`TdGnJ;`PMyi{YOK~ z_1t%E9~-7zbQAUndL9<+<8!cC(=0ZTTKG~Wpq(*Fz8?n7G`G6lFap4dRyXa32YAC-M_e8Y1Fya{dVkd4%wM@y0x4 z;neF3;}0QjWG#tx()99~k7tNi;OW0#t6oR8Azlp+_T;~N)?L13)mnb| z%V~dFg%F!uT*XALt7d!58SMn6i-!v`vW2A;=M63tBe)Y!h=MD$uPejBLViRLC?bC8 zKTP}^>=^p;oJ!?|EG{yTEJYWU>oQ5x6vrZQAXZ%8?b=aWY@ez91xz?3l|z)7-Mbb^ z3LhS;9z+NClTc7-{2;$X|3y)!r)($`79WqV8brfD66=Cprql4;oZB0cJ07wB4qHzD zys0m_@_gJUEa2CdFTVnI-0vU!*xjq|2Ff9)KbBXcR;Px}x^t2RwZqwD`Gx4DqoYN~ za5SnQRr+jHd=CM*WNg35T5$Qz0S|^z_mU@kkC9*v8O5-SMu*ZnXy=yOr zC$^h&#kZR!mU2l@%!x^GYi$#|g&X_H1}}e9L(3yfqdrSLVs%&aHjrSv?eT%c_61^Q z^7fTn5tmm94fzPKWxXNaRzj&5^u#PA<|8vva5yp87UPB476ysPB?ybM5}>-mIF33c z&J#LyrkwKohkxHNSbRDuKQWXJtvaZQO&W4j0T7a>Lvzi}73aTy?Qc#F=%=xy8h>&d zZ;+TOj%I{ZTd;J&u0LJpA?N9iX^%-K5c+q-PoMOMG1A&F>Ua-~T~mP!;y9(b61b9Q zVg7iEJ|#mo9Y3Z&BppOGjg%fdE! zhMu#d)q}0$cK%(*r91ujRxg4FuA;t-c#VAHqDdw4W~7sgHi!ZoA}g{QURals|c2f*>}c}YDi@F1=k zU@rYR16>OIBWEFQF+pjBMv?=o6Nj5b9+Gsz(Gr4*`SF(hI0JOQ7&6p&IZRvb?t%>M zp^=M89V>B*sYLyca#;nsndHq^rWo7d1j@WNSs=$^^+guW0F? zq8g_RpEgi$rab|)QSegB=8W4pG zp=}1<0}Gh#e6k!nM#3xaz7SHdMI~qU!OYvhs+WB8XLK7jZK3nIJ9qyW>1+vHQVaci zlol57JI>RnQ2oLF{>bF|h*QUHDb88-Y4IwhsM{@OidAD+4)*Kgc9ce81UttJ#8<;@ zfqbMM^8%pmb+4T99D(C4dl3}Vu`vUKuP7%yPWWhQxOpFaS$lhr~RpH0*anbRAieY<^|(mc>8j^YOA~|TmV0m zI-nGDm)8Dud}@@C_Hq*$WHy;eVwE>6H}|m^NWImOoj>S8a;NH5aB}PF(_uEb;Eb0c zIA$a+E6+DSAzYpw2ZD?6iNc#@8?T*1biC^;fx4*y+yn)?%cf5@-L$@JTpy@xY26e$ z6L+Ph9l)%NMs)$UqQD9}Tib9BJ6+pNst|J)ONvq&{U~n524wgnLgJD*^cMmVS0zeE z*o;m|BVHf-HcwfC0V@ zTm<4|PB@yEFpB1M^Ha#Wfz{giEI!ps?2STuikOt3rGX5i&_zWpu-)J5bc01EOyyeO z-fG{;%#!EZu&P?}qfeKygo^`3+Uh*^BH9K-2$YqwCTr4uefgpGk$fI6WerNAp@nCX zonJ4I+JRT{@_41~T|}tq;TV(bB=o+KMEb*bMRt5OO!ssZYF!+sX!PN>RktQF6>Z7( zI?K$oBGB{~d?tviW1V@hxH_^sf&+-HBS^`E3#^Uy+n74wC@YU5MMeyhY#(9dGK%DD z(DkjOd*cCeYvik*Nn5`IynlcFvA;WW{;vlJd%jLuOfVa>%rGRi-YL3cVZkTWYAZ2V zLa5?-?af7xT!}Rq*eCTRpr8m86a&E^O%1F|GQ6%YFX?*MGX)bEK{~8D&Z16EPTPql z-iCJOgj}Skof8gT)qDE3Ramgb6`?b!6Q`(VJ~6A~Zb{GT<)t$nB*vKZZFeBXvOQQq{`CHh@|3`%r`J@Qvf{LmO{ z5smo~Y78R67ph}N5v9ZA$$Lw|;aYGB_G>0THWgu3MTwH8rY2r_@d-?j2=*IKk4!-n zwyRtiK30qzKqIi0(7{DS9Yqi5OKg+)Ky+)u|7ljm=T|~)p%Rl0+2Io8=^BX^9|7ydW^21qe9!CVd4i?(PFW6zZDx=fb`i-EOG?9Ak>4tf( z4Af`>xM0ckqY^4Xn+Ow5zs1Y>$u8%~^O|1H4~((NB&nOjVnNPZvl{@nG&FQ~v}Q&# z^yKrXK-QKbA*mT#^dr{IjRq9sD^oXvXgYGp2l?3D% zSrHj+M{nkoJ+pqU=A(P=1uqaq z|MmjZKY^E-osP~P+ov^#Z2oWYqsh)9E;qeunlx(8FqeE!JjG|oifO>?<0J3M*wJEX z{Xa>IGM{6IN<8axB>s5kd#v=c-cBOw_%a)QCDECnwp=_yUZ9DT!o&oQ_O;)^LMVf-)**Wq`ZzRxz1e zSj-?wUa?!Kq>(PSEkSxseiU?aHzXS0R(hyzeaE9ojjQE+apUmTZK;`^)zK$CADSf( z)n-+J+SSoo6jtghA4BfUDJPmyZ`?C%jLXpWb%0N=pL|@{OnC3sL<+JN z5I(^0#WyaeN1BktxsXC^Cbf#>sCCvA=JF!Jd&oleP@PR+%g3sq&cZGt0Mvy14CNjn z(o518rD{EuT!3CkJSs#%6=Lo(&+uu~MALd#328vH#!`<9^71=`Df)Ql8X`awv-wn$wFNB-VS}j}v9Omtj!95C54?HxNHaO8VH+{=v&6(CUxhLUK~b z$I3r&0DhNRXp@HOeAxc4UtcRZ@y|gpSzk5O3%-Wi;D?56qh=zo2Gpre z#*wk?|6il)3V!HDVPyYzfVUiuz_OuW4NTA&ukkf=2Pczc+Ya}np~=O+KYZ0f0s?*g zPJgVgTEx}-u{r-e&=z*}{P>$PCP{GKMZb7O_yDeqW%9K=C;Xqm8K}DKqvX7>*p6c09gM8-FXZfaJ`9HS-jH=tyNNBZzloX*imk9!_J(6L zWt5bNj+i60oXn8#=s3qS%by#X!PR0f{~^m%Y~5~ZAO7|9Bscx= zJtZu}>lBDXhvqV0%bfjsJ@ws2I@LJ1Vd-GTBh3wshH71NQhH#O6S93gA2&F+{{V%RxDP{??jL?u3msN;L zpxKg@%qkO8UpJ$}H%TWHpyMZ!j`?H$cLDSA$(wok;FVhuf|S=HpmH37;$)`}iHID) zAsK;Y%D@;L;%yxcm$l1SVPA{F_`qbTAFJW-1|z8eRUfZt$@4V(2f(Rn5d3 zEaJ(nx6>o=@ABxO$Aj*hhkyF|n(HsAg@vB3oU1+9Kbo8p+ZY&lX5ryEp23wL9gUU1 znV_!^4QjK2wI4>~Ab7-?AR*YO|JQg3s1ycGIxJ#H^oW+Lvs$K{tDV*z(sKJSkv zU;N3N)aXhw4rHg?6@*KKFEo73Dg(h`w{^)-q>2HNJSaAnLUAe&k6(&ELiH~fI-d!0 zsKRHEp~93B(h74FfwZgY6JLZvRLW)!8i}QxbI`5nf#7R( zp16UK6C3~+AV78{@(3OAp|LTb3__PhLu;aC?_4?ye(0XLzi+w&yO&g4tHk)q{=sI| zh^TJh-QB>vw-`gk4opxw*Zg`^Hw< z7S*Q<5rQe3IFmWqMQjsTq7hdhc0#NgGO$9iGk^JCF*lCH@>SXHB}|xvdtG0k=ArHM z7cgWBo6}HAtdOgVs6lmQ$+F!}-{0N8Uw;6&^0VFDnjL}j-&_7?%Y6XJ=h0qUr}g31 zgHbSNgR9x?kTRLMJQelicTB~&yNvG|B5k!W6~$1xN;djQq9e-5Nkbl4#FhPq#3~SN znQ)i+9KH9zPE@1(R}gTe25(CU>WJyB-5?Ydk+h1(23w3~)3Xp717nGIS8`CndKbd< zA9>V7XP1j>eeg%U0qv&h0E`gyuI5kw`7dp9ux-O-`}hm_&y;J`e%A~ zKwrP2!lSVlQ;O!)qN9TvQWO%{*+hgnZz7-|v2+M}0RcZ>7vMQEK35|Uj`*sSFhqn4 z$)NfMeQ~NmNg}PHaLe@1cN>oL^O^y`#yYt=;8}RKU!i%s`|SAVbj|Lm^lCQe#ryZW z`P)X!MqM1ZbXuQO7%h-D0G#JY^+wbP*^M@qS0oo$+xwHnD8Gk*wmmcY7OG8&*Y8>HQJK92FU zYe|4iOqdrAS+jpkw}hx4Ga4K1V-Bzpcu!ycHNTN_CD) znsk3s3)Mz_O$_{@V`~+O7|JreDKF6ipk=|)j2X!wLBG(X*f7-kQh%Y(&;cmbu1AU;@^7V^tQ<%!4)yvcE7Z*#?4(CcFFqjuU zuxd_vSYGaG_GxFMtaJfyQQm>DC^aeAzT0_4BkX1H(GW0mA)p?pqN%|nFs78s7%0{B zrMF}t#1>-2ny^WBHE2wPULbI;7(tV{%TfesU>9IxZzo)i4n=p9(7WOpM^q1P?j$V? zDk9pqiNn@P9*VayS5?q1%`&PY_~2@nFQtes0a-E z*9I>1IZ`SVjXGxa@SgBABedRqh_%8x{VoRlH`AgCyBdvl8MR-Y5WMvPY^pNZJ>f7K z1RI42ime!VPsEW?Uc(C)l7c`tzu+5z=h(q6Y*{AKn8XJB{f*5@iM#r{E+z7WmJr2v zYEz3IHualk3fmRUK3)M{2VSARe}C1VHwJsP2LH14X}GxBAOH5*$B>J+)33LiDLa@9 zsT;XNO{5S}5V-~{qcz61)qy%I8!!E+pm3&PkAccPe3KE*%0>MOvK6E)zO(#u<;SyE zhNX=q$vHNU{o_U_&(6Mjc>`uZ-$ru-|Go^{eR+Q3-_d=`*`hS_y&o@b3P7Nk_J%7! z+J|EzO@KaO4tl$s+AshHi}A8uCNv1z$7IFwAhG$(^ecOWP{MD0!md5%hzzh$g((BU zD1$^*@E&MaBP!ghL8Jl!LGQ4xsmID%Wiyrc4lfXZ)^>P9fbknUXr{K)JBhDeAH3q3 z*twY;k;$fdmZELR_X5q;)sG84btkJm{9zjw8r&Kd8v6H}%|#ZY!(9F5s3G65r`q&T z@zOFOR@+r{)E#1zP(+MLWQLY#JV1*gLwMx{-A136)Eok7E14x7pDg&Y0;~Mqx-QGE$kbp!`I4)F)TvpI60#*J9up62HRLY zNAU1V$B1K*K7j3`DXKwT3GvC37SSB0;j=}c6sWY0Tu^#?w!xh2;KB429gr!g9niC06en+;gq7zC3kTd(zsF<&Ez(o6Cm+YAPyW0Y^V3 zfgL}obk$GU?Uq#M&oR@M>}5t>Y%%?1E(a?J9B_WIbC)%$3Xd6kdu~0@qmsWgxN;@^ zxX`D_K^X85cXz+;bDxL_UsPg+msCB?m-V==ddKMC`&8G}sY#cPUje`Wo>X`~QQjC` zI}rVO-^N<6JXNH}-__jK+()E-3&$~*8I0w`458*408yB}AQKl9za3LWp%VFm zFOBGDxtB*RX^miC1xM1-L2T1kQio2+r+IwgL;8RtWEoOZ*ZpeyMIya6J-C7o%f%?Ndvo!mrB#E0!<`Cw$O1p#TZ5W&1k$!gYH1D zwxAHq3g4O>j*LXCT)a8Fd72zs5JnT{5wnYJb!XI`_P`b4!C9_TS}jSg7{wb8ojw>D zJ#-E7dVX_4bjmrXamiYvaN*^p!}>?lTlZ(`E#|JwUHnseGi`yPplPEZM(NcDKxv4m zdhUotBUDCgsqoAd>8sia+&3A?H*azwR{p#3`%+S&*j_PiL{GaR9Xe*k9Evz~6Yu|@ znhl?aq`njzii<21k${r#&B7HB0@oWk7OsnELZe|&DQK%fgl$nYb&7~}k{kfRV4!^@ zEAED?yq=`e-B)ds`&*lauQr}s8S!}ja7WhNGltSJ)ls0s4<$sL4Q2!PhoeXc8m6{7zcJq0a-jIkwI20sBvWx+Y?VZUOXI~Tkktuy1b;O+8KOy`upU2 zO;XMLyxCO!^|sb~Q9O?PKbsC}muAfrpAKk8;_Mj9WVxiq^emwI-W0sJ0UL$dZ<|i- z7s@vLt(o((^s7bYvFloGbU!}>8*g84pD|u=Z_hzWBkQyY5aGi2(oI)rA|1XUV0~#< zNq%m93nt(-qXt1fj6ryKwXLu&HZ~jqqX*-fI7W)5(4}ZY=~bgG=`E$zyD5v$e2dqv z>HYIHKe%{O;arh+NoL}0YImrb>g<#?eV6(bZcn!;3;&58v_6!AFUa{Kf&SrnH% zKNR5ivd8~rSb(4J@#e|Q#2qzY>-Bu1))RRA{>qi^&Yv?DA$3-rKdl-?WpK0f5z^xQ zM!hTi7n<#4%Um)MFi2j6U`&i|B9b#qG0EQ{G@o%q#z(f{h(pRD)Zo=hh#mRm#0r1@ zVa#!(R}(8$UL{<1$Ak@vM@?g!ve^Wne5t*W;WQcHxM+6Whp0I?6%+^1F*{vInUi(5 z%`e@av~IU{+KYXkvNpaFaK7(;_66wwlxFIuaq7Q5dA;Q#|1rRH+F#w$0jydw9G{{X zLT17Vj||m?qci2B@mg5hC|Nr;11Psxd||FTL{+oa?t8O5Z={28FBk~ZWVxPmMDz-= zTagp+tPv665*8LGhQmQ4X=T`1Mlu&Vk)SI<2UbPhxCzXQ-bA01IOR1(j;I+a{hkiHEQqxbd4DMs z$OQOvWbzSi29qUFSd15zh7*BJ^!hDqN8bdpT&KBTW#oO=M$FH3ib@xRj7?TQz-h)c(8($3+Q~5`=mzcoBnT&ya?J$*C(OJ+6F+kYrs(HfF$bQ_)U?Vke8{l?M@(v)uC!>8Nmx6~stI*-?1F zXb_e((DkG2Q7?x5S*1j_=(IV}?5^&JQY*R@?fv@l2+AE#510oN6iBiBZ-(#e!&Oa7 zJ52tonUr{{q}TQEevh$gw?WtTsG(|)_>`II#O~the&5_ho5z3(uQX09==DkSw`cjv zuPlk36A{hSWsIe;5Icgoitd#lJ%<^6tE@Q>IpMu&CR`jt!neXxI=+Wfqhm}) zPd4mTBtlWFY_mC_C`6tXghPm+%s4HfT`t``=i6bOYVX^5^Nw23AKwT2D`DqbfNJn; ze28c<-Qw|mo9AQt`W+?Hzfw()VzpX0fLP63bsi(Gh8MXM?$(lY9o*l~6_>TvcHJ*D z;+QT0Ocez8hs#@|Kw2}08E`tK2<))m`|0>$yrZa6^WCo)VrJHpVR>@}nemry$*WD0 z`JHv%`Om0N0l_T8iE~=oTLEd{w7#a9FMX)L*P5@0WYi|(@mT2pd#&>(1;O2^Uhr}< zbOZ&H8YOOXN6j7^@c5lsvtq-?3k*oHU^cdlT3bYdoVmI7Z zLES0=yW>ksfY{>i+}_5Oi_h*nd|HECP~>!|(3r8WD9DHeIE2i9pP7ogld}8E8l*=O z$`!R^we1D{&M@MM++`VsITAv1@kFKzY*2PGt1jba^~?aup#z3*`E*G)`04IRQ!z2N3=vX!3* zB1#xt$M>Ck4xWJkTXHct*f((hbZ1H9*y-%&TvCl^{l_iclvbOzjcciSWe*=-so8#N z#@P`uRu>=w)jtq~LAhfP6kB28hW>un`~uBzLBT$A%3y2^9U2I8@H!$zn3{%Xz8vD; z13nBR(bWnbqfMWY@wlH`F1(WbllrUjKdsFlewOdrKP?gX9Qf(QgZnB*F|Ve+9hWkM z{o4S*lE=Tjc77cJ)k0BeVFcBo*1;*8mMR6tH-N5#BV_ya+{?$XO(~4pIdnN(cqiK= ztxtVG{5-dLs==gsE=7j7qP2dD>(P%0_4;K$qDg${s&Hv%{IG)IbsVrFO1}jk?9UB_ z2JQYnNpd#+d!^pIW}~w^flKKhQ>WM0_Wk?~>!pvMIHq$jPaZLGCn5ZS?eNtyNRJWM zwD&q)Zs(@E2pXC76eJbL$^otLl3cDrBJcTB_31b5^5y6u*1rdfU+C3I-h z@XCXMGJ&n^$px{!k;Tm~U%&QQ*r@;gD>F5urC2)Yz_*$c%QU}Fc!R_F;W@!*jyX17 za5A+|o6$hPz1#!kpp&j;ORsF@L#bfIQ@;P_GJAYOBxeu{rj@7V#e>%F(2yTSyFk&< zc~&y2_g#)(lfRmWz30pGUq`raQfks71egQ0UK^fTA zx#KQiiJImx_N9pkP-U%Ny-CK}j`h-xl)WoL1g-wtopiZsvneocH1TS*w5vz+!Jn@q zLsQOxd*ET)#kP*>f78`>k`w1Y3hR#FcVM!j2B3Ifd~vhnkc~v#g!R33u5cKA6HSvJ zq5GRQT?@@j7R9I2U9|S<+n%w5WatjVI6jC6R=uiBBD_9Q7R%+nGH3mwYx+lyYr&-e zAK5w8PpaxRkDrX6?d{GTA1{v->uE_Qq9yRzo5K)vv{ae4EB7oX)g6j=h7Y1{cL)a# z>d~Vzm?F4uDx>VLqgxvRkK5T}fxE!%gn^uNxa1qh0CX;Ojtyln{;b_pxAGH56}|+A zUpHtNt8`8LG}(RNymi)hdgSisbKrZ<8`d1Qw{~)+{)uk&vy%j$Mde9@%9>4c5mgi; z6fN>D)@=*d2taw_94=%OOi15gUTgwq7!RXNgYe5Zp$6i_Lq<3 zJ+lv8oipRNaSdi)of(lfTpH6)TAiC)KRaHXs_#*|8aCXwI62Z((4Y*}YWity6}j1v zXj+1xgY{Ev?Or^L$f6%CqV)FXN!u%17Z;V$gWZL-u%B`o>9jY4^_Wz{BvzTK%VaZX zSSlm7f29^!MwLXm`*%r!MtT!su49A*BiJs>@$a-X|C{Wi1UK;UOU)1c{^M`F?|y#p zZED_P=wG{CZQzubaOcQhM<*N7JWkx_>B-`H_l|HAqbVPF#-KvPPeVBBNJ~f-Vhf8K z;^$6^6yf>$ETqlIe>MJn7KX0U+)&u$RtdV(BhfzabJ}H#$=u_XwcM*)4_!5R(hk;| z2fEhReRjVcuiFR|1|Pe4c3|YRRABeB-J}-YXqlPdu-Mti$mgw~5onnMswjgR-eh?8lu>R@c9N33%Z3Kbz`#AO!od zvVP@X&Bf0fGc%rd0501N8_A~l*u)pZY_b_dcIxkV9$D9ks=5pifefvLlSNe`efJE&3XmkBr zP8Jq>6PKTf_eDmSB_E4U;ZQJbS3X;1_nJg43KoE_(t}E{+7Xb*2%1SOm?BIEhN%MrL!TF>CqAF=(&tpc!@22KC@Q5>MLb5RNF5CF3e%? zJkz1Y+P7ciAqJp*qh?rA0SM!rkpE8C)-z|8LM;l%>h5&is`b1(Q)R<3V_p;g^sB^Y zV~X`c1v%QAYm{;9tpGZ~mZ}nN`UTq`A;cHnt2}Fx$Yr|lNMn?^+MV3#_da_v#lFSQ z`AJK&>3_T)Jz=w(1#d61qzZ(EoK4#RYO8=?+5FA6OU-ralg_vSC^v{gwagTPt@heJ zdxq@r?S6ns8>JRXdf7GV0A9vAs;t4;03Nxon zp}MC{8Zeu8uYPgx?^EU5H!K`Ovj4q#%Xy^|Hj=L$(EHYzlPZdf%*4L@Mzbr(Zp$8< zOqs0sI4IpHv3l*{;p%bArlsN;@t<7Iwer*2g%RLceNqsw!Ch%B#BGsPk z645fXE;=g_6Cs;U)QY4+5wp>{5;a%}E-<4YazVigB+h__Q2Y4vYroL8hJQ)zRTpSt zqI~yv1@_&9Hiuqq(LVR+7!Q~|teDu4&dEv3jnm3^x{g|On~c|zeF9JdJ03#%iiCx`J|Dxl!j8)hA5f6oq)b&T*FNXt5e^q`My0};RZSuHu^>vy+ z@bM7PJr3}^mY=p@O4NPphEfx{&cb*k8AL5(X!41;lT2yx~GlUarFgD4W!%wT# z8q3ulsk+3=QGs*(~RdX}Jcmw#tyaFAU%eS^A8XtkT=;w_Wd!)$x0F{(kzi|66B1 z(5rN2NSa(dS5plG+M|6dz7M=YRn+r{A@A=$d*5zsvD_*yEFvE=4;2A3nkkZigkH*u zm=roSeB(YdW-eB-?VjChU7#`!vy7IccK|GJjQx&vZ)pl zfGy_@9D;0hrx&D;kv5r?|H9hG5P3)kQ0&_tRw_oe3b}BruvyoB=w*dNDaJv2$ERP+ zf@JS93nWjRp1xRb_Pl6e%z35$j?%`x=bh7AhW`br|2%-!Y|xH5$v zvil(Zane-jDX*o7dYv0G>Q0$U#zzSUDojZ>Dv~E2lBMO`sV(-m@`f@P4`bj3A=%eb z$6|eId3yy-?}3l?il~x zrM*Vm?-oFOoy!)#q|N4;&<4q33vZJb@vh)bW8sV|cRgG?(T~%QV~8_;8e}2!q~~;7 z75OvMq3Z+)WE?PCJt*Q}JjT*H_ebJWKd+$-J<#+e_{N6l&z>~bV^XATdU+1;X>paf$ zI7kNX&G_%#9(28sBm!}|Ae+dYstq4t72sy@fKM2dr2tV`yzDb`6yWReJ8WdwiKwT} zxL9_uYNH(BP7>ntT5mMpVv!CY>!wd3bct0Q945K%pE8;luzZj=`v6iYy07NSwQkVs zd;Frt^o?Ng!0ge)_IBqsPeR%`VcGvV1>=N-QSM!-BqbdAkcoUKfGpeXD|A@2dx3n$ zf|!6kWQvlkx;TjD*S3#(dt)@bbIsnX?y4$I;FW-Uyu58)kk{Vl)kTF*udc1j+np@D z#TEY=_wb5$j~T4?kN#McAK__GP7r$`Vo@BEYb7O;KhV*E@0E`m$8?_v5DLf#zyS#= zP7luS!8t+!<_i!sToJ65%2_|Kl ztBp3Q+PZ9_&Ww4I00&;bjjip|?X<) zNQ9$4BIzZS!a2ji$=nUMw0WVM06w#Q%d$$0i^~uzjd<@LxgF^?lHoTZk7w2mN68HT zWLFk6y11-n@ni5UCRxhKM~Tm_xVC$*GPC>b-2~_LY5iJYwEt<{nVw~|d-mn>HKFys z%%c{u5k(aeCvjbGnk${tcG zhCfDq_Iz^B^LwK&x7vG9zne*@#T3UzM%sFWG)iJgJ@CBQYYysCJ=vVXOanxHY*n*n zm!=3EcLTZg94iux8-2OaJ>3H>-ogT+t2gVbMugJv@|`v9UeZI=d9{rc3*2a5l!6K4xhSB z*u65mP^j;?*!N%Qu7d8uXO7o+{{I;0n8u^+yR~US(F5_LzuzgZ`_u#n?d(toJNrK$ z|K2RI`)V5C`{?K59WO6eTta76@93vmrrYnlrHitd=@PwrCw^ipbohHEM@)*jp3@Wx zdNVLt0$7PYEiLg2Pe{*6OJpn!trWT$jp@X6AvIbF5ga+3U>^eryeAMAR*W~S6JwHg zCRNGcx$eesa*(4?_J(`1~Of`c(ZVDc6Oe} z?$y)3`~BaZ4}QyAc2vslRTeyN7Ft#+={5{=?7o~7HT9}TGfLxM=UxTk9_j*h?Pwf1 z1ft(+AP^GnhAL}Hj_mYCzr5-4{P{_{9&j9|%nrKry;7O2A1bj0ruoFUHTiR8gH+}6 ziRsJxuHRO3k^-HKZq~*F+3SWWa*SAAn9d7D70Ku(I30s*nb__tdqak>KnDiePDVTf zfDbbmOaR|!B(1IUFw(af+nv;uu~nx|(5O8@bJ_7ak%K<=TeG>z^_t)2OpNg+BD%F7 ze3Vuk17^3mk}`RV+h((pYlbrgWq&6m@VFGV+X1W{^JypT?QVMO_!~?hwUdv2H9BBZ z+Ss@V_!<}pc$@=7#-L;ZWmf|5-_k^OGcD`pr|6ivZs>EoVM8*!wbGKNZ`Sl2T_gzf zTJJgsD`$RBi=pmpO|?>;Y8NGp9_Y>fT-^jzD#t&_6)g$QqT=hKYuHOfEV|-98fPxy zRCGG;qYPA!UuM@vm6j^$hsfYVz}SWOh#ojFgqlk7=boaR?aSU&@aF%6>RE|etg`TV z;HNMWY%gZ-RaltD`HtuWI)_KyrVGEZX+YLCSN8k89A_$UQ%0X10(ZQ2X^NJGnEzMCH1%z5u%z;)Ske{>4E}BGPc?l}8o9 za7Or_@=11Zb!7J0=PQSt9z+jyvy)1s_8XYA6i8Cp!{=JQVgLOJ<=LkrD4R7qbPV-q zcVTJkWb-SqoRtOamIwd!_TBd04;~Hglk5B>V@R1CS+pMfq>H7wVg8HPX7fyWzlcHx zLm{Cg`JS~`^&>rF*FieuJW2=D|NGBYWj@@!l_(Pju>-t}HCF3~=W-^j`O`Tz;(FE68V(FKZKSQuEHZe7Beku4J ztc$aIukI)4yWDs5&H7ew)BwKwD=|-|(p|~zgG^eAo6!@>!cF&*kE*!1mjlKtDb%Z%r!V+3d}9vIz6eN>@HG7Sv(leuQ9v;WR{2`@ zm9Q%F!_Ym@#!=3R$q*(z`x0uu=HXC(J$IV#TI=-T-o(tQfBU&-!y4Drz67FhJuWAK7a}4Y#?31PQa%u> z62mJZ5|=J|5DIcFA#db%5gGj4;U$(%Te@Y34;^p@P#i7(t;dr*e{8X(CLL`Rnw5$= zpHZ%KLCM@ED~^4E(M6)+RrXc2s~0xcZPcH7Z+GVf?FSt#RE{kMNXg60T8WHu*=Jy+ z5r$HTi0m#!$t1x7txsdj>LTz~Ogg`LKI9Sv3xVr~L8`#FN);Vto+un$Lp3BqLlhwt zhwadc;ro~IEXce64d~x??`6(c&oer>YvWctULJp^ZFNch<)@`op$2{1$|_Tv_%>N? zO6@^>@ZoOfIY12U(9`R2`K9%mZET*R@=I5cmG<>ieuhrJkzQ(f8nA?#a#m@F_To_C z4|SZjZj!;n&P7k2XLAnQQ=IsWvEqYrxZgKTO~l+v65DUA`Y11p2M!*cPRuMV?NCb^ zg#PZYEGNwm79K79T(wX*=DOoyuC@xzvi(v#o@%1Jjv2=m?cZsV%(Q_kwSndTDCzCc zKJP?=#ZALPuqx*n&T~VhObM2CNi(T19!)~@oOu^5F_8+P%K!(*(7`<4Rd=!LP7WA! zUvu-#Qu2;HwkoNms?OFdH_zw#@|YYy__c68K@TXjsSotO_4Q<9Yuf+Bf3r9K+$!N# z!v>v;`-W6YqyRIb6H0(c09XqKHbP54sv|ER`k67vuiHY*qE!mVAoez$?TRTUN#-;8v+Trq;qqqUrDR?Kb4ya9HghMGK>+%P zBm6ME2a}%7%Bbc51DO5hZC4AK;P;ZDb$C!P?s?tEgoIVg+>JY5_@j5F z`g?nlYKCll{O?=0O8WX1C0z2pi5k6KUH$`z33gXK`x1YF-CWn8;N((~b-9(lrJud5 zrfFv>C=AzRzLN-+Ri6oo6y-9f!9bumhbmcuEZX!|X~^6|5(gZPz&8^*2)xb8+e~+J z|09BAQ(_@^63Y7q+{eW8TR zcYX{7D3oV)pw+6JN@?fsD1je5M@ z*L@27ago=hB8TI(6JIt15l#keb_nkBV;R~qCu5Mf@lGfbp!%m*lPcrleyA%w%si2J z^t7`*>;V4&!is`yzq0-&h2a13*^FF)aaFP!dSKIT*cIVR-KjYm%IV=&y0*p*cqf6+ z{m*=YHmBE?mgY|Dw;eezzPlVn!uOZp%E-o-Ik}}Z;YsFDaZfnZHKL<}&0GqgVm*w* zZ&ente$}rEjk4E+sj-2ps0N|QQ*gKU@nenlbmX^{7cxe23RT=*=S$sQQFa~-KXUZ) z3E0{Bezc~+{_JSG(B13kxOKnV_HTJ=N*<*skU(V@1#@y4!(7V{kG_SH0opMj4Jezl z)gIy3jI?h~|15i|fK|^)29lO;6?XnQc&A%&E8YZi_f1h{$-vMudc~PhkMeD|ziB*) z@$7Ue__X9N<>UwKo+B&04j9bFldB-jc|8eE7t1AW_T>8ItUVG*9JC47B@&6fQ=?{l zK_>W9(qZzEAc9sZI>FbPf>2K;;k7U5(Y&#D`61kuDp%WKs?b?L!(5)@ncdgj`S+?| z+}ZjZ^-O4WdvLyQcYc>=h{vMj(kLwhl4*AAxA1*B&uK65m zoW33eoPpYdwNXH0cc{}UAJl{sVf$5DrapPYC4<|NT|Qm`0ndDVcGl+hIsvw) zKkcvOU;Xd{wuFqLM!B)H9_bWM2Laj6IBu#x(epiGC`>7uvwZL!Zyqb2MT>b3p1p_A z+DUDVr!qrGn(V|-x7ejIf0XKp&2!g%iY*OSk!O+bzwB8jO$btx_h0!B1LO3Rw! z7>H~gk@nvZnqy>IEnY}8n}_i*v$_*B{Gq1PmMm?Z*Rap@!9(@OSP&qlLku#Rl&u{qnZOlREO(i&r~L3b=iX z>;`);YZ`xeVZc~yN7uTHkq&Edcq7u8C}oW1G`|j38OGw1NenEIyC{&rTE{R0Z50Q3 z_%6@gE@RBgQc`Yya~nR7(S#F_0MS`>F$|0-;Zv}Yx3V_=l&5ZS?`i@Sh-G@7HT?y+ za&7_PkuQO^?D1{0O5?+lCq2+N%ns=0s5qUrI5ri5_uQ!wSx^X&e8CTK2uJda61X_w zP+mq{(-h8>FKC_|9DDdQF+^XMvzc(0kbW+z_y)AAk*qECo|u)qd|zEC&SkJaNcHZT zTzrDUD~-VIZUrDr^w}i=fHwl3R6Z!;@-SP;Z|ErZgV{zbL5TPQU689jAE}%bg(*jI zf#omjCzk7mRljK=(t$wQ&^8^>Fm4Qnp(T>eNhYzG^qm;>?uBWdP08`sdDSulV>hU1 ztK{rl&89+DT1#e|`^<+_-wdC2M#>=Nh)SKv-u-rRu(;Sh_&0pH$(GM3%3ie0OxtAm zK868C7G%NdztiG<-qak)5DG1C%Hia^_X5Bc0UOKQGP znH;oP8?=2XqsgKebr^s=V*`Thms9HEH_b4(+@o)_9PB!thL|@{dadw~(m`%HlSGl1#f`&z z+)BCF4=u{w6)rVBmY1$|*XR_P+%>|ic3$QNy0-Jr+S=af-`T)}_>Hj)p*3GhvtsO=cLi z2gW>5%~)R_s;AG3Zg2RMW>IW6WBzMMI?dx+%>wG8`(&C`{|FV2Hf7?y087*f$&Y%+ zEEQ0g1=@W@g*>=SL)#W43HQoRsj^BY75J?4r&{S?@R-}ammc{3N~1ch%9}q)IdT`= zrx#E1E{*zDzrDQO>3_~>b8=km$`$o18A3fw(A9h+p1BJZgsPknuvQ}W-g!8ffd!Ft zdAK|U>irf9(vps7(F3v0qz(he1S6*{6|8#x+&M|FtptvDA-Q1Q@SfD%a?z?AOnDu@ ztc;PO4q5=2IoQvTKylN8h`15ErjI)D=y8CuQdLc@!T&5xI2b7L-mdWhpsjlA+KYm( z0P5g0fT7Q*S+^}Gnbd<>9;+>wgWkeA<#k3C!})OwsYt)N@c$y?@~B;$#@L8A-NrtC zA7R!8%P(^`O)hy07I*tBZ`_ILwoUutbm&!h)N~5W+1Bi&zqS7HLSq_r{^}FB*utcD zmGu0@{+r2oLu>(9O*~Vy9ucYudh`t;1u);^G9YRoD*XAdXH@Yo3ZgTzaUl|^`1=35 zk}`R7q6^o&u1AL-giVslNJ`9_yv#^m+J$@0hWQXZ?AmY!Kz@{04!S25dz%wE2=Se@ za#Z@@Th;)m-Nr3aj{2wP=Ssgn3pm>AKkn^5b@Lgwt5DBTSB*${ zsyffc=kS22gxJ0HB960xBg6wT>dI>V{!_(>nNG6m+juUOB88zZ-gn=AYK^Gr{)BVY zSzhTp+S^-Osy)#=*p&U=$6cs5+j_N4G)~$cN_@}cCNh+)$xtSi5k{5^g(*&HhG>Pf z$~{*Sah1fER?=1>Xrh~@Fiu+$9O(%_9^R9_pf30Wpm+VDKm&3A1{(Q`6WSD9u1`l_ zs7Zd~DeA-(I*8JdnWd_?aj^k6 ze|<{(y}CBJ_hh+l#WKzyzHt1spRj4a{q6NRqrUIL6B^Zl=xbNkoX@9~$|9KY5!UlcJzGvx zK$Dg=n})7U)4SW-c$h^n^Dbv2^IB&3>@8FY)9(h~Izb@anK^5J<|8=PrvWP>Xo6AlU0`EOImgvFt*Py8?qK$tJT>MYOl#atL=() z5VMC`4oAWed0{Am!@RFtQEY*)N4@Q0<}W+dR1POU#cNkDR|g+VZTzjTbqVy}*vQVh zb+F(o{qy^q%8SUd#ASi^mysMD_F1IIIy6-ru5|3Q3^9r*ar~V9^%OQb*McTxXfrW_ zCW#nUd_&(}6P6CRP@}i`g6{MP>qAa$qZ^yzX)e*SPn4O=3dXRBLFp-CQuHGFjm%nF zt}kxGkfdT)(cDz><@ID}#U)ICocQy>T|jWTle$`4Vypg4Xnbbnh|*n{a1z6_zTbT( zc!_|{f)cf0%>*gdg-9YD2`>Q-e|Q6Miw#b3l3t$In>DpPuagI7QbpiY z5;MpIhb?K$-Z(yyR#@AVNE$z=rC>$gJ zo6Oh4{cT;J)yIMxv&XOjX+p%h&xklEY?2IwP$SX*VT98eo>8odZGM@YSQ%vZ0L$mM zz`XF;*}!xEe4(d@o<0>kyH_X%rEVSCWJIwh15vvwR)j`|Hk39zt{TYnORnC!<@pVc zM)qI;a9te7lnd!eJ!C7890PWbNpjZ|%RO~2fM&j(x|V(r_PHm1m|QKU4i`rWGoNzP za;srb={Yo7_L*#=DP5`Sd)n}1(Aw5gqf6k)?ymQ?_hzRNrCp=fT*K&CFUg`oy`iSg z+S;hzdgy1s50|^P-cL ze!WoQ$?CJsmr{d&vwCgQ_Ph7@`-Wm-_IGMz#-|4U!!J^~AY%W8R+Eb7>a*J0KLX2VA#@p^z}644mL*I@_b` ztY5FCG)-M}&g6&X2zCbs2Ig6{SE>Qi;E~_y;oc%p);hFk^t!Sz!Qx53U9n|}-aEg% z5hdrAm73y;l}zKJR#R201WbXCNn75#qz9@eZbDO;z*$UtLoS!oe*8knUuPT(_KI8yoxQ-svgf}hbqj-bb2!=orJzfUM zg-PnH<`)zeD*paGAwJ%jLd^@;Q`q`>zv9J*qVAF7fmCX{Z*a;}<-ly|7q)q_T5|6d zKi;9t$OqaL6{A=-j!`do)g%lP?Dp1MM=bKlgC?1qn}UJ@8g+n{#-!lW1AD&!?p>+M z%o~eNqRb4}-+EMq3F>n+#d|P>_h~vQ9>%&phmyt&Jkg#^N_=rO8?yN@08nbUC7#x2 zR~PhWZ)LfpD8^#7DCV@Q+q$>r{Y8O|TwK~GU1YX_tWDbcZgcsrw*0(;V_$B^GTVfc zkA^iC$wPUj@dx7VjJwZW^jr%4zn(le+sLMNdVNlJ0W=r$xDgkIAG45>(K(+1zIrhw z-akcmfVWBa(_G_?jSGeFc|b30%6+d5cpTt;c6iuZqVVd^qMgv$VnUzL*`JkG%2#Ec zPrrs%+I-pWroESO*I!oob-yhBwA`*fUS9dr&WoRw;i$VcxSGBG`H4CqVWA*@V7a3< zoz(>b$bzT0waZ0};JBsnu?Uc2jmD(Iu=b5rNKNuTlU)C25`9MrDhfSupDL1z?Z}r) z1AwCqXWxopjj>UUt5?;Z{#jbIZ$|wqD&W#_(`uW?o%DXNigrnyLr681K)}l?$!f5Ll@*~1ESk@2kXBvK6g2n&~P$6 zXEeE~Q8y?kKXO=krzAo!RT_q?60L8-bTor5aQ^Ri0O{(Ki-D6(k$1IC!DuwUO+lzZ zNw=>cM=nJ6z7@#AD zI2_w8VZupf1`eV?rW#WLXLwmzc8GSPv`GzTE8c9$nX<7lu{U>e5;L2}6Z~}V;~(qx zlGSH@ne+SIF+)Q|OWm#I)^Rn|`?9Ssqjdc}{d^XUG_uB?0(#9F!mqOC@B7^G(Z60W zqGAy3*qyN~X(}N}%CYa3x|H=FLK8LxOcaOArYXB(V8;H&15%$o=933R^l({r#ss_u zrlJ#CVPl3d7(Y7Dc%41*CGhuDXYik$rL(6&+eSM-h%`*qM0^-VZCWCc>2mr2s$AM@zs2{CmEpBg zh8*G^2ML-}5t_^PP&1&Y&sS#=LJv3f5zD7Ks!nKJRlhv(S}?AVQ5J|hmTa$t@f7?n zTH@X8OW0V;4i5HSoZJ+C7L1k^fLL#?mM*-W#bpb{^ zpMHRs#pgG=CRN2=4<*LtP;W9>(qkzAC5w*@7N0S6oHOzIwNRaL0g+ifK zT462Miom@DN!>;}H*LZGw0P}h6X#SQd~Y7& zdJ|oqWniMk#uLqk5XD1EtEWE$De^#f&;i}Sg1m=#Z@|PbOEai#vmSOsz>$leNV*SV zR(9#`(H7IWWIn`op+oWxX9pz9uTw`52KQug63+m{%9kQ^u+q+YYT7F8~O;919pthATZR5DYRP@acdd(NN|p zJVUqw7MR0}<%c*BdC~>3>rXCw+zu}-B_Z%Q!d+fN6gMwLY!t*2dK-q~N0f>A=|IZ3 zf*Q4*6%TuW{UBH*MuVI5ryeNHON(t)bC#IngmR?I=`m*owTLr2bi*5Q_8fI$oCG3C zNtgoI>k(ityPIuwJYxpxj)+}A;!z`2gcX(p3(@y81!6xb1p28Sah@tdj7U}T2*6w} zifm+Mu*>>4Mo49cI$KgKfJA!781%J4S$}E1A~y~L<0t1hG-9KQHAyI7c**(60=R5X zYOh3({g&9j$;rqU+A2&T9T8h2dnRZ2VSb6Sv9z~i>7(PcLZXNyShIsQ4aG?mI-sULlWoof*F(+93dD=&!mh-jzI`?Z+SwA zNXmJ@EXjabO2qG-+A=j2%Hq`>_`yUa2;ts6mTrRO3KO3&oL35s9Ymz=5%H z2F85vy=GUFnzJF$4aLCiMu412aCj>QKC0!Mi6$vE z&cg#)E@py-Oei^a12>icH}*OG8=EZ;d0T|b8plXbIG%|_tVV=J5MvdkdLGgvIYOH3 z9qv{Yz;(8ilz4+^! Date: Tue, 27 Sep 2022 11:09:45 -0700 Subject: [PATCH 044/269] Changes in facets endpoint to use search table Signed-off-by: Aishwarya Manicka Ravichandran Added original value of entity to a search table Signed-off-by: Aishwarya Manicka Ravichandran Add original values while mapping to search table rows Signed-off-by: Aishwarya Manicka Ravichandran Modified facets query to use search table Signed-off-by: Aishwarya Manicka Ravichandran Added changeset Signed-off-by: Aishwarya Manicka Ravichandran Modified the related tests Signed-off-by: Aishwarya Manicka Ravichandran prettier changes and more test changes Signed-off-by: Aishwarya Manicka Ravichandran modified mapToRows function Signed-off-by: Aishwarya Manicka Ravichandran Created a new migrations file to hold the new changes Signed-off-by: Aishwarya Manicka Ravichandran Prettier changes Signed-off-by: Aishwarya Manicka Ravichandran changes in migrations file Signed-off-by: Aishwarya Manicka Ravichandran addressed comments Signed-off-by: Aishwarya Manicka Ravichandran lint changes and changes to insert rows in a better way for tests Signed-off-by: Aishwarya Manicka Ravichandran --- .changeset/strange-rocks-hide.md | 5 + ...192547_search_add_original_value_column.js | 38 +++++++ .../catalog-backend/src/database/tables.ts | 1 + .../service/DefaultEntitiesCatalog.test.ts | 34 ++---- .../src/service/DefaultEntitiesCatalog.ts | 69 +++++------- .../src/stitching/Stitcher.test.ts | 95 +++++++++++++--- .../src/stitching/buildEntitySearch.test.ts | 103 ++++++++++++++---- .../src/stitching/buildEntitySearch.ts | 27 ++++- 8 files changed, 265 insertions(+), 107 deletions(-) create mode 100644 .changeset/strange-rocks-hide.md create mode 100644 plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js diff --git a/.changeset/strange-rocks-hide.md b/.changeset/strange-rocks-hide.md new file mode 100644 index 0000000000..e171a277fb --- /dev/null +++ b/.changeset/strange-rocks-hide.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +The search table also holds the original entity value now and the facets endpoint fetches the filtered entity data from the search table. diff --git a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js new file mode 100644 index 0000000000..f931b7ef89 --- /dev/null +++ b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js @@ -0,0 +1,38 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +/** + * @param { import("knex").Knex } knex + */ +exports.up = async function up(knex) { + await knex.schema.alterTable('search', table => { + table + .string('original_value') + .nullable() + .comment('Holds the corresponding original case sensitive value'); + table.index(['original_value'], 'search_original_value_idx'); + }); +}; + +/** + * @param { import("knex").Knex } knex + */ +exports.down = async function down(knex) { + await knex.schema.alterTable('search', table => { + table.dropIndex([], 'search_original_value_idx'); + table.dropColumn('original_value') + }); +}; diff --git a/plugins/catalog-backend/src/database/tables.ts b/plugins/catalog-backend/src/database/tables.ts index b9fe12be11..c23753b267 100644 --- a/plugins/catalog-backend/src/database/tables.ts +++ b/plugins/catalog-backend/src/database/tables.ts @@ -71,5 +71,6 @@ export type DbFinalEntitiesRow = { export type DbSearchRow = { entity_id: string; key: string; + original_value: string | null; value: string | null; }; diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts index 515a862515..2c75785dad 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.test.ts @@ -26,6 +26,7 @@ import { DbSearchRow, } from '../database/tables'; import { Stitcher } from '../stitching/Stitcher'; +import { buildEntitySearch } from '../stitching/buildEntitySearch'; import { DefaultEntitiesCatalog } from './DefaultEntitiesCatalog'; describe('DefaultEntitiesCatalog', () => { @@ -100,29 +101,14 @@ describe('DefaultEntitiesCatalog', () => { stitch_ticket: '', }); - await insertSearchRow(knex, id, null, entity); - } - - async function insertSearchRow( - knex: Knex, - id: string, - previousKey: string | null, - previousValue: Object, - ) { - return Promise.all( - Object.entries(previousValue).map(async ([key, value]) => { - const currentKey = `${previousKey ? `${previousKey}.` : ``}${key}`; - if (typeof value === 'object') { - await insertSearchRow(knex, id, currentKey, value); - } else { - await knex('search').insert({ - entity_id: id, - key: currentKey, - value: value, - }); - } - }), - ); + for (const row of buildEntitySearch(id, entity)) { + await knex('search').insert({ + entity_id: id, + key: row.key, + value: row.value, + original_value: row.original_value, + }); + } } afterEach(() => { @@ -792,8 +778,8 @@ describe('DefaultEntitiesCatalog', () => { facets: { 'metadata.tags': expect.arrayContaining([ { value: 'java', count: 2 }, - { value: 'rust', count: 1 }, { value: 'node', count: 1 }, + { value: 'rust', count: 1 }, ]), }, }); diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 81de6484c3..c7e41fd631 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -21,7 +21,6 @@ import { } from '@backstage/catalog-model'; import { InputError, NotFoundError } from '@backstage/errors'; import { Knex } from 'knex'; -import lodash from 'lodash'; import { EntitiesBatchRequest, EntitiesBatchResponse, @@ -91,12 +90,13 @@ function addCondition( db: Knex, filter: EntitiesSearchFilter, negate: boolean = false, + entityIdField = 'entity_id', ) { // NOTE(freben): This used to be a set of OUTER JOIN, which may seem to // make a lot of sense. However, it had abysmal performance on sqlite // when datasets grew large, so we're using IN instead. const matchQuery = db('search') - .select('entity_id') + .select(entityIdField) .where({ key: filter.key.toLowerCase() }) .andWhere(function keyFilter() { if (filter.values) { @@ -111,7 +111,7 @@ function addCondition( } } }); - queryBuilder.andWhere('entity_id', negate ? 'not in' : 'in', matchQuery); + queryBuilder.andWhere(entityIdField, negate ? 'not in' : 'in', matchQuery); } function isEntitiesSearchFilter( @@ -137,25 +137,30 @@ function parseFilter( query: Knex.QueryBuilder, db: Knex, negate: boolean = false, + entityIdField = 'entity_id', ): Knex.QueryBuilder { if (isEntitiesSearchFilter(filter)) { return query.andWhere(function filterFunction() { - addCondition(this, db, filter, negate); + addCondition(this, db, filter, negate, entityIdField); }); } if (isNegationEntityFilter(filter)) { - return parseFilter(filter.not, query, db, !negate); + return parseFilter(filter.not, query, db, !negate, entityIdField); } return query[negate ? 'andWhereNot' : 'andWhere'](function filterFunction() { if (isOrEntityFilter(filter)) { for (const subFilter of filter.anyOf ?? []) { - this.orWhere(subQuery => parseFilter(subFilter, subQuery, db)); + this.orWhere(subQuery => + parseFilter(subFilter, subQuery, db, false, entityIdField), + ); } } else { for (const subFilter of filter.allOf ?? []) { - this.andWhere(subQuery => parseFilter(subFilter, subQuery, db)); + this.andWhere(subQuery => + parseFilter(subFilter, subQuery, db, false, entityIdField), + ); } } }); @@ -190,7 +195,6 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { } let rows = await entitiesQuery; - let pageInfo: DbPageInfo; if (limit === undefined || rows.length <= limit) { pageInfo = { hasNextPage: false }; @@ -392,47 +396,30 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { } async facets(request: EntityFacetsRequest): Promise { - const { entities } = await this.entities({ - filter: request.filter, - authorizationToken: request.authorizationToken, - }); - const facets: EntityFacetsResponse['facets'] = {}; + const db = this.database; for (const facet of request.facets) { - const values = entities - .map(entity => { - // TODO(freben): Generalize this code to handle any field that may - // have dots in its key? - if (facet.startsWith('metadata.annotations.')) { - return entity.metadata.annotations?.[ - facet.substring('metadata.annotations.'.length) - ]; - } else if (facet.startsWith('metadata.labels.')) { - return entity.metadata.labels?.[ - facet.substring('metadata.labels.'.length) - ]; - } - return lodash.get(entity, facet); + const dbQuery = db('search') + .join('final_entities', 'search.entity_id', 'final_entities.entity_id') + .where('search.key', facet.toLowerCase()) + .count('search.entity_id as count') + .select({ + value: 'search.original_value', }) - .flatMap(field => { - if (typeof field === 'string') { - return [field]; - } else if (Array.isArray(field)) { - return field.filter(i => typeof i === 'string'); - } - return []; - }) - .sort(); + .groupBy('search.original_value'); - const counts = lodash.countBy(values, lodash.identity); + if (request?.filter) { + parseFilter(request.filter, dbQuery, db, false, 'search.entity_id'); + } - facets[facet] = Object.entries(counts).map(([value, count]) => ({ - value, - count, + const result = await dbQuery; + + facets[facet] = result.map(data => ({ + value: data.value as string, + count: data.count as number, })); } - return { facets }; } } diff --git a/plugins/catalog-backend/src/stitching/Stitcher.test.ts b/plugins/catalog-backend/src/stitching/Stitcher.test.ts index 9accebf1fc..b42e68d105 100644 --- a/plugins/catalog-backend/src/stitching/Stitcher.test.ts +++ b/plugins/catalog-backend/src/stitching/Stitcher.test.ts @@ -115,13 +115,43 @@ describe('Stitcher', () => { const search = await db('search'); expect(search).toEqual( expect.arrayContaining([ - { entity_id: 'my-id', key: 'relations.looksat', value: 'k:ns/other' }, - { entity_id: 'my-id', key: 'apiversion', value: 'a' }, - { entity_id: 'my-id', key: 'kind', value: 'k' }, - { entity_id: 'my-id', key: 'metadata.name', value: 'n' }, - { entity_id: 'my-id', key: 'metadata.namespace', value: 'ns' }, - { entity_id: 'my-id', key: 'metadata.uid', value: 'my-id' }, - { entity_id: 'my-id', key: 'spec.k', value: 'v' }, + { + entity_id: 'my-id', + key: 'relations.looksat', + original_value: 'k:ns/other', + value: 'k:ns/other', + }, + { + entity_id: 'my-id', + key: 'apiversion', + original_value: 'a', + value: 'a', + }, + { entity_id: 'my-id', key: 'kind', original_value: 'k', value: 'k' }, + { + entity_id: 'my-id', + key: 'metadata.name', + original_value: 'n', + value: 'n', + }, + { + entity_id: 'my-id', + key: 'metadata.namespace', + original_value: 'ns', + value: 'ns', + }, + { + entity_id: 'my-id', + key: 'metadata.uid', + original_value: 'my-id', + value: 'my-id', + }, + { + entity_id: 'my-id', + key: 'spec.k', + original_value: 'v', + value: 'v', + }, ]), ); @@ -179,14 +209,49 @@ describe('Stitcher', () => { expect(await db('search')).toEqual( expect.arrayContaining([ - { entity_id: 'my-id', key: 'relations.looksat', value: 'k:ns/other' }, - { entity_id: 'my-id', key: 'relations.looksat', value: 'k:ns/third' }, - { entity_id: 'my-id', key: 'apiversion', value: 'a' }, - { entity_id: 'my-id', key: 'kind', value: 'k' }, - { entity_id: 'my-id', key: 'metadata.name', value: 'n' }, - { entity_id: 'my-id', key: 'metadata.namespace', value: 'ns' }, - { entity_id: 'my-id', key: 'metadata.uid', value: 'my-id' }, - { entity_id: 'my-id', key: 'spec.k', value: 'v' }, + { + entity_id: 'my-id', + key: 'relations.looksat', + original_value: 'k:ns/other', + value: 'k:ns/other', + }, + { + entity_id: 'my-id', + key: 'relations.looksat', + original_value: 'k:ns/third', + value: 'k:ns/third', + }, + { + entity_id: 'my-id', + key: 'apiversion', + original_value: 'a', + value: 'a', + }, + { entity_id: 'my-id', key: 'kind', original_value: 'k', value: 'k' }, + { + entity_id: 'my-id', + key: 'metadata.name', + original_value: 'n', + value: 'n', + }, + { + entity_id: 'my-id', + key: 'metadata.namespace', + original_value: 'ns', + value: 'ns', + }, + { + entity_id: 'my-id', + key: 'metadata.uid', + original_value: 'my-id', + value: 'my-id', + }, + { + entity_id: 'my-id', + key: 'spec.k', + original_value: 'v', + value: 'v', + }, ]), ); }, diff --git a/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts b/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts index 7364486f06..384794d230 100644 --- a/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts +++ b/plugins/catalog-backend/src/stitching/buildEntitySearch.test.ts @@ -88,19 +88,26 @@ describe('buildEntitySearch', () => { ]; const output = mapToRows(input, 'eid'); expect(output).toEqual([ - { entity_id: 'eid', key: 'a', value: 'true' }, - { entity_id: 'eid', key: 'b', value: 'false' }, - { entity_id: 'eid', key: 'c', value: '7' }, - { entity_id: 'eid', key: 'd', value: 'string' }, - { entity_id: 'eid', key: 'e', value: null }, - { entity_id: 'eid', key: 'f', value: null }, + { entity_id: 'eid', key: 'a', original_value: 'true', value: 'true' }, + { entity_id: 'eid', key: 'b', original_value: 'false', value: 'false' }, + { entity_id: 'eid', key: 'c', original_value: '7', value: '7' }, + { + entity_id: 'eid', + key: 'd', + original_value: 'string', + value: 'string', + }, + { entity_id: 'eid', key: 'e', original_value: null, value: null }, + { entity_id: 'eid', key: 'f', original_value: null, value: null }, ]); }); - it('emits lowercase version of keys and values', () => { + it('emits lowercase version of keys and values and also keeps the original value', () => { const input = [{ key: 'fOo', value: 'BaR' }]; const output = mapToRows(input, 'eid'); - expect(output).toEqual([{ entity_id: 'eid', key: 'foo', value: 'bar' }]); + expect(output).toEqual([ + { entity_id: 'eid', key: 'foo', original_value: 'BaR', value: 'bar' }, + ]); }); it('skips very large keys', () => { @@ -112,7 +119,9 @@ describe('buildEntitySearch', () => { it('replaces very large values with null', () => { const input = [{ key: 'foo', value: 'a'.repeat(10000) }]; const output = mapToRows(input, 'eid'); - expect(output).toEqual([{ entity_id: 'eid', key: 'foo', value: null }]); + expect(output).toEqual([ + { entity_id: 'eid', key: 'foo', original_value: null, value: null }, + ]); }); }); @@ -124,14 +133,35 @@ describe('buildEntitySearch', () => { metadata: { name: 'n' }, }; expect(buildEntitySearch('eid', input)).toEqual([ - { entity_id: 'eid', key: 'apiversion', value: 'a' }, - { entity_id: 'eid', key: 'kind', value: 'b' }, - { entity_id: 'eid', key: 'metadata.name', value: 'n' }, - { entity_id: 'eid', key: 'metadata.namespace', value: null }, - { entity_id: 'eid', key: 'metadata.uid', value: null }, + { + entity_id: 'eid', + key: 'apiversion', + original_value: 'a', + value: 'a', + }, + { entity_id: 'eid', key: 'kind', original_value: 'b', value: 'b' }, + { + entity_id: 'eid', + key: 'metadata.name', + original_value: 'n', + value: 'n', + }, { entity_id: 'eid', key: 'metadata.namespace', + original_value: null, + value: null, + }, + { + entity_id: 'eid', + key: 'metadata.uid', + original_value: null, + value: null, + }, + { + entity_id: 'eid', + key: 'metadata.namespace', + original_value: DEFAULT_NAMESPACE, value: DEFAULT_NAMESPACE, }, ]); @@ -154,18 +184,49 @@ describe('buildEntitySearch', () => { metadata: { name: 'n' }, }; expect(buildEntitySearch('eid', input)).toEqual([ - { entity_id: 'eid', key: 'apiversion', value: 'a' }, - { entity_id: 'eid', key: 'kind', value: 'b' }, - { entity_id: 'eid', key: 'metadata.name', value: 'n' }, - { entity_id: 'eid', key: 'metadata.namespace', value: null }, - { entity_id: 'eid', key: 'metadata.uid', value: null }, + { + entity_id: 'eid', + key: 'apiversion', + original_value: 'a', + value: 'a', + }, + { entity_id: 'eid', key: 'kind', original_value: 'b', value: 'b' }, + { + entity_id: 'eid', + key: 'metadata.name', + original_value: 'n', + value: 'n', + }, { entity_id: 'eid', key: 'metadata.namespace', + original_value: null, + value: null, + }, + { + entity_id: 'eid', + key: 'metadata.uid', + original_value: null, + value: null, + }, + { + entity_id: 'eid', + key: 'metadata.namespace', + original_value: DEFAULT_NAMESPACE, value: DEFAULT_NAMESPACE, }, - { entity_id: 'eid', key: 'relations.t1', value: 'k:ns/a' }, - { entity_id: 'eid', key: 'relations.t2', value: 'k:ns/b' }, + { + entity_id: 'eid', + key: 'relations.t1', + original_value: 'k:ns/a', + value: 'k:ns/a', + }, + { + entity_id: 'eid', + key: 'relations.t2', + original_value: 'k:ns/b', + value: 'k:ns/b', + }, ]); }); diff --git a/plugins/catalog-backend/src/stitching/buildEntitySearch.ts b/plugins/catalog-backend/src/stitching/buildEntitySearch.ts index 88a87df134..b97083f207 100644 --- a/plugins/catalog-backend/src/stitching/buildEntitySearch.ts +++ b/plugins/catalog-backend/src/stitching/buildEntitySearch.ts @@ -134,15 +134,30 @@ export function mapToRows(input: Kv[], entityId: string): DbSearchRow[] { for (const { key: rawKey, value: rawValue } of input) { const key = rawKey.toLocaleLowerCase('en-US'); if (rawValue === undefined || rawValue === null) { - result.push({ entity_id: entityId, key, value: null }); + result.push({ + entity_id: entityId, + key, + original_value: null, + value: null, + }); } else { const value = String(rawValue).toLocaleLowerCase('en-US'); if (key.length <= MAX_KEY_LENGTH) { - result.push({ - entity_id: entityId, - key, - value: value.length <= MAX_VALUE_LENGTH ? value : null, - }); + if (value.length <= MAX_VALUE_LENGTH) { + result.push({ + entity_id: entityId, + key, + original_value: String(rawValue), + value: value, + }); + } else { + result.push({ + entity_id: entityId, + key, + original_value: null, + value: null, + }); + } } } } From 94a41c2d25212e287cb22410f7e406695463afdd Mon Sep 17 00:00:00 2001 From: Aishwarya Manicka Ravichandran Date: Tue, 22 Nov 2022 18:21:13 -0800 Subject: [PATCH 045/269] fixed tsc error Signed-off-by: Aishwarya Manicka Ravichandran --- plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index c7e41fd631..97d1052deb 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -20,6 +20,7 @@ import { stringifyEntityRef, } from '@backstage/catalog-model'; import { InputError, NotFoundError } from '@backstage/errors'; +import lodash from 'lodash'; import { Knex } from 'knex'; import { EntitiesBatchRequest, From 47390f5db1534f89b3d5f79a7bc0300c85a0de20 Mon Sep 17 00:00:00 2001 From: Aishwarya Manicka Ravichandran Date: Tue, 22 Nov 2022 18:45:37 -0800 Subject: [PATCH 046/269] prettier changes Signed-off-by: Aishwarya Manicka Ravichandran --- .../20221109192547_search_add_original_value_column.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js index f931b7ef89..394591bd63 100644 --- a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js +++ b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js @@ -33,6 +33,6 @@ exports.up = async function up(knex) { exports.down = async function down(knex) { await knex.schema.alterTable('search', table => { table.dropIndex([], 'search_original_value_idx'); - table.dropColumn('original_value') + table.dropColumn('original_value'); }); }; From db00b1a91de7fdb0b9961d263f56a6c761821842 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Tue, 22 Nov 2022 23:23:55 +0100 Subject: [PATCH 047/269] add DocCodeSpanLink to allow links with backticks Signed-off-by: Juan Pablo Garcia Ripa --- .../src/commands/api-reports/api-extractor.ts | 101 ++++++++++++++++-- 1 file changed, 90 insertions(+), 11 deletions(-) diff --git a/packages/repo-tools/src/commands/api-reports/api-extractor.ts b/packages/repo-tools/src/commands/api-reports/api-extractor.ts index d434aae0a6..f74e97381c 100644 --- a/packages/repo-tools/src/commands/api-reports/api-extractor.ts +++ b/packages/repo-tools/src/commands/api-reports/api-extractor.ts @@ -39,9 +39,17 @@ import { DocNode, IDocNodeContainerParameters, TSDocTagSyntaxKind, + TSDocConfiguration, + DocPlainText, + DocLinkTag, } from '@microsoft/tsdoc'; import { TSDocConfigFile } from '@microsoft/tsdoc-config'; -import { ApiPackage, ApiModel, ApiItem } from '@microsoft/api-extractor-model'; +import { + ApiPackage, + ApiModel, + ApiItem, + ApiItemKind, +} from '@microsoft/api-extractor-model'; import { IMarkdownDocumenterOptions, MarkdownDocumenter, @@ -827,6 +835,16 @@ export async function buildDocs({ } } + // This class only propose is to have a different kind and be able to render links with backticks + class DocCodeSpanLink extends DocLinkTag { + static kind = 'DocCodeSpanLink'; + + /** @override */ + public get kind(): string { + return DocCodeSpanLink.kind; + } + } + // This is where we actually write the markdown and where we can hook // in the rendering of our own nodes. class CustomCustomMarkdownEmitter extends CustomMarkdownEmitter { @@ -845,7 +863,7 @@ export async function buildDocs({ /** @override */ protected writeNode( docNode: DocNode, - context: IMarkdownEmitterContext, + context: IMarkdownEmitterContext, docNodeSiblings: boolean, ): void { switch (docNode.kind) { @@ -861,6 +879,26 @@ export async function buildDocs({ context.writer.writeLine(); break; } + case DocCodeSpanLink.kind: { + const node = docNode as DocLinkTag; + + if (node.codeDestination) { + // TODO @sarabadu understand if we need `codeDestination` at all on this custom DocCodeSpanLink + super.writeLinkTagWithCodeDestination(node, context); + } else if (node.urlDestination) { + const linkText = + node.linkText !== undefined ? node.linkText : node.urlDestination; + const encodedLinkText = this.getEscapedText( + linkText.replace(/\s+/g, ' '), + ); + context.writer.write('['); + context.writer.write(`\`${encodedLinkText}\``); + context.writer.write(`](${node.urlDestination})`); + } else if (node.linkText) { + this.writePlainText(node.linkText, context); + } + break; + } default: super.writeNode(docNode, context, docNodeSiblings); } @@ -884,13 +922,22 @@ export async function buildDocs({ super(options); // It's a strict model, we gotta register the allowed usage of our new node - this._tsdocConfiguration.docNodeManager.registerDocNodes( - '@backstage/docs', - [{ docNodeKind: DocFrontMatter.kind, constructor: DocFrontMatter }], - ); - this._tsdocConfiguration.docNodeManager.registerAllowableChildren( - 'Paragraph', - [DocFrontMatter.kind], + ( + this._tsdocConfiguration as TSDocConfiguration + ).docNodeManager.registerDocNodes('@backstage/docs', [ + { docNodeKind: DocFrontMatter.kind, constructor: DocFrontMatter }, + ]); + ( + this._tsdocConfiguration as TSDocConfiguration + ).docNodeManager.registerDocNodes('@backstage/docs', [ + { docNodeKind: DocCodeSpanLink.kind, constructor: DocCodeSpanLink }, + ]); + ( + this._tsdocConfiguration as TSDocConfiguration + ).docNodeManager.registerAllowableChildren('Paragraph', [ + DocFrontMatter.kind, + DocCodeSpanLink.kind, + ]); ); this._markdownEmitter = new CustomCustomMarkdownEmitter(newModel); @@ -941,8 +988,40 @@ export async function buildDocs({ }), ); - // Now write the actual breadcrumbs - super._writeBreadcrumb(output, apiItem); + const configuration: TSDocConfiguration = this._tsdocConfiguration; + + output.appendNodeInParagraph( + new DocLinkTag({ + configuration, + tagName: '@link', + linkText: 'Home', + urlDestination: this._getLinkFilenameForApiItem(this._apiModel), + }), + ); + + for (const hierarchyItem of apiItem.getHierarchy()) { + switch (hierarchyItem.kind) { + case ApiItemKind.Model: + case ApiItemKind.EntryPoint: + // We don't show the model as part of the breadcrumb because it is the root-level container. + // We don't show the entry point because today API Extractor doesn't support multiple entry points; + // this may change in the future. + break; + default: + output.appendNodesInParagraph([ + new DocPlainText({ + configuration, + text: ' > ', + }), + new DocCodeSpanLink({ + configuration, + tagName: '@link', + linkText: hierarchyItem.displayName, + urlDestination: this._getLinkFilenameForApiItem(hierarchyItem), + }), + ]); + } + } // We wanna ignore the header that always gets written after the breadcrumb // This otherwise becomes more or less a duplicate of the title in the front matter From fcf5d4f4ba264c65fdb79e2e3bad4a4b4d40b7e0 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Tue, 22 Nov 2022 23:26:23 +0100 Subject: [PATCH 048/269] add @config annotation to docs Signed-off-by: Juan Pablo Garcia Ripa --- .../src/commands/api-reports/api-extractor.ts | 28 +++++++++++++++++-- plugins/proxy-backend/api-report.md | 2 +- plugins/proxy-backend/src/service/router.ts | 19 ++++++++++++- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/packages/repo-tools/src/commands/api-reports/api-extractor.ts b/packages/repo-tools/src/commands/api-reports/api-extractor.ts index f74e97381c..2b130f50e0 100644 --- a/packages/repo-tools/src/commands/api-reports/api-extractor.ts +++ b/packages/repo-tools/src/commands/api-reports/api-extractor.ts @@ -40,6 +40,8 @@ import { IDocNodeContainerParameters, TSDocTagSyntaxKind, TSDocConfiguration, + Standardization, + DocBlockTag, DocPlainText, DocLinkTag, } from '@microsoft/tsdoc'; @@ -342,7 +344,12 @@ export async function getTsDocConfig() { tagName: '@ignore', syntaxKind: TSDocTagSyntaxKind.ModifierTag, }); + tsdocConfigFile.addTagDefinition({ + tagName: '@config', + syntaxKind: TSDocTagSyntaxKind.BlockTag, + }); tsdocConfigFile.setSupportForTag('@ignore', true); + tsdocConfigFile.setSupportForTag('@config', true); return tsdocConfigFile; } @@ -879,9 +886,15 @@ export async function buildDocs({ context.writer.writeLine(); break; } + case 'BlockTag': { + const node = docNode as DocBlockTag; + if (node.tagName === '@config') { + context.writer.writeLine('## Related config '); + } + break; + } case DocCodeSpanLink.kind: { const node = docNode as DocLinkTag; - if (node.codeDestination) { // TODO @sarabadu understand if we need `codeDestination` at all on this custom DocCodeSpanLink super.writeLinkTagWithCodeDestination(node, context); @@ -938,8 +951,19 @@ export async function buildDocs({ DocFrontMatter.kind, DocCodeSpanLink.kind, ]); - ); + const def = { + tagName: '@config', + syntaxKind: TSDocTagSyntaxKind.BlockTag, + tagNameWithUpperCase: '@CONFIG', + standardization: Standardization.Extended, + allowMultiple: false, + }; + (this._tsdocConfiguration as TSDocConfiguration).addTagDefinition(def); + (this._tsdocConfiguration as TSDocConfiguration).setSupportForTag( + def, + true, + ); this._markdownEmitter = new CustomCustomMarkdownEmitter(newModel); } diff --git a/plugins/proxy-backend/api-report.md b/plugins/proxy-backend/api-report.md index b6497adbaf..581e7a904c 100644 --- a/plugins/proxy-backend/api-report.md +++ b/plugins/proxy-backend/api-report.md @@ -8,7 +8,7 @@ import express from 'express'; import { Logger } from 'winston'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; -// @public (undocumented) +// @public export function createRouter(options: RouterOptions): Promise; // @public (undocumented) diff --git a/plugins/proxy-backend/src/service/router.ts b/plugins/proxy-backend/src/service/router.ts index b7ee7014bc..224c2c6202 100644 --- a/plugins/proxy-backend/src/service/router.ts +++ b/plugins/proxy-backend/src/service/router.ts @@ -178,7 +178,24 @@ export function buildMiddleware( return createProxyMiddleware(filter, fullConfig); } -/** @public */ +/** + * Creates a new {@link https://expressjs.com/en/api.html#router | "express router"} that proxy each target configured under the `proxy` key of the config + * @example + * ```ts + * let router = await createRouter({logger, config, discovery}); + * ``` + * @config + * ```yaml + * proxy: + * simple-example: http://simple.example.com:8080 # Opt 1 Simple URL String + * '/larger-example/v1': # Opt 2 `http-proxy-middleware` compatible object + * target: http://larger.example.com:8080/svc.v1 + * headers: + * Authorization: Bearer ${EXAMPLE_AUTH_TOKEN} + *``` + * @see https://backstage.io/docs/plugins/proxying + * @public + */ export async function createRouter( options: RouterOptions, ): Promise { From 3a179efd6b825780d84410e012a251839f05eb93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 24 Nov 2022 11:45:45 +0100 Subject: [PATCH 049/269] cast count to number MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .../catalog-backend/src/service/DefaultEntitiesCatalog.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 97d1052deb..11e4b37f63 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -417,10 +417,11 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { const result = await dbQuery; facets[facet] = result.map(data => ({ - value: data.value as string, - count: data.count as number, + value: String(data.value), + count: Number(data.count), })); } + return { facets }; } } From 8fc4bd23c314638e3c629f88aa5bdc34b62a2bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 24 Nov 2022 12:00:41 +0100 Subject: [PATCH 050/269] skip index and use the correct lowercasing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- ...1109192547_search_add_original_value_column.js | 15 +++++++++++++-- .../src/service/DefaultEntitiesCatalog.ts | 6 ++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js index 394591bd63..258af5ef06 100644 --- a/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js +++ b/plugins/catalog-backend/migrations/20221109192547_search_add_original_value_column.js @@ -18,13 +18,25 @@ * @param { import("knex").Knex } knex */ exports.up = async function up(knex) { + // Start out with an original_value column that's equal to the value column await knex.schema.alterTable('search', table => { table .string('original_value') .nullable() .comment('Holds the corresponding original case sensitive value'); - table.index(['original_value'], 'search_original_value_idx'); }); + await knex('search').update({ original_value: knex.ref('value') }); + + // Make sure to reprocess everything, to make sure that the original_value + // column is populated with values with the proper casing. It's unfortunately + // not enough to just reset the final_entities hash, since stitching is driven + // only by processing resulting in data that isn't matching the refresh_state + // hash. + await knex('refresh_state').update({ + result_hash: '', + next_update_at: knex.fn.now(), + }); + await knex('final_entities').update({ hash: '' }); }; /** @@ -32,7 +44,6 @@ exports.up = async function up(knex) { */ exports.down = async function down(knex) { await knex.schema.alterTable('search', table => { - table.dropIndex([], 'search_original_value_idx'); table.dropColumn('original_value'); }); }; diff --git a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts index 11e4b37f63..c82a17cb6f 100644 --- a/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts +++ b/plugins/catalog-backend/src/service/DefaultEntitiesCatalog.ts @@ -403,11 +403,9 @@ export class DefaultEntitiesCatalog implements EntitiesCatalog { for (const facet of request.facets) { const dbQuery = db('search') .join('final_entities', 'search.entity_id', 'final_entities.entity_id') - .where('search.key', facet.toLowerCase()) + .where('search.key', facet.toLocaleLowerCase('en-US')) .count('search.entity_id as count') - .select({ - value: 'search.original_value', - }) + .select({ value: 'search.original_value' }) .groupBy('search.original_value'); if (request?.filter) { From 29ebc43a0b3b0246225e32525cc1be422cddc9a5 Mon Sep 17 00:00:00 2001 From: Phil Berryman Date: Tue, 22 Nov 2022 15:29:56 -0800 Subject: [PATCH 051/269] feat: add number of searches Signed-off-by: Phil Berryman --- .changeset/clean-seals-whisper.md | 5 +++++ .changeset/dry-melons-listen.md | 8 ++++++++ .changeset/silver-rats-rest.md | 5 +++++ docs/plugins/analytics.md | 14 +++++++------- .../src/engines/ElasticSearchSearchEngine.ts | 1 + .../src/PgSearchEngine/PgSearchEngine.test.ts | 3 +++ .../src/PgSearchEngine/PgSearchEngine.ts | 3 ++- .../src/engines/LunrSearchEngine.ts | 1 + .../src/service/AuthorizedSearchEngine.ts | 1 + plugins/search-common/api-report.md | 2 ++ plugins/search-common/src/types.ts | 1 + .../src/components/SearchTracker/SearchTracker.tsx | 10 +++++++--- 12 files changed, 43 insertions(+), 11 deletions(-) create mode 100644 .changeset/clean-seals-whisper.md create mode 100644 .changeset/dry-melons-listen.md create mode 100644 .changeset/silver-rats-rest.md diff --git a/.changeset/clean-seals-whisper.md b/.changeset/clean-seals-whisper.md new file mode 100644 index 0000000000..8891d75f8f --- /dev/null +++ b/.changeset/clean-seals-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-react': minor +--- + +The `value` of a search analytics event is now set as the total number of search results (when available) diff --git a/.changeset/dry-melons-listen.md b/.changeset/dry-melons-listen.md new file mode 100644 index 0000000000..1e09619060 --- /dev/null +++ b/.changeset/dry-melons-listen.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-search-backend': minor +'@backstage/plugin-search-backend-module-elasticsearch': minor +'@backstage/plugin-search-backend-node': minor +'@backstage/plugin-search-backend-module-pg': minor +--- + +numberOfResults is now provided alongside the query result diff --git a/.changeset/silver-rats-rest.md b/.changeset/silver-rats-rest.md new file mode 100644 index 0000000000..52bb9acd6f --- /dev/null +++ b/.changeset/silver-rats-rest.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-search-common': minor +--- + +numberOfResults (total number of results for a given query) can now be provided by each search engine and consumed as part of the search results response diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md index 46e1d354df..e04cb9c5c6 100644 --- a/docs/plugins/analytics.md +++ b/docs/plugins/analytics.md @@ -52,13 +52,13 @@ learn how to contribute the integration yourself! The following table summarizes events that, depending on the plugins you have installed, may be captured. -| Action | Subject | Other Notes | -| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------- | -| `navigate` | The URL of the page that was navigated to | | -| `click` | The text of the link that was clicked on | The `to` attribute represents the URL clicked to | -| `create` | The `name` of the software being created; if no `name` property is requested by the given Software Template, then the string `new {templateName}` is used instead. | The context holds an `entityRef`, set to the template's ref (e.g. `template:default/template-name`) | -| `search` | The search term entered in any search bar component | The context holds `searchTypes`, representing `types` constraining the search | -| `discover` | The title of the search result that was clicked on | The `value` is the result rank. A `to` attribute is also provided | +| Action | Subject | Other Notes | +| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `navigate` | The URL of the page that was navigated to | | +| `click` | The text of the link that was clicked on | The `to` attribute represents the URL clicked to | +| `create` | The `name` of the software being created; if no `name` property is requested by the given Software Template, then the string `new {templateName}` is used instead. | The context holds an `entityRef`, set to the template's ref (e.g. `template:default/template-name`) | +| `search` | The search term entered in any search bar component | - The context holds `searchTypes`, representing `types` constraining the search. The `value` represents the total number of search results for the query. This may not be visible if the permission framework is being used. | +| `discover` | The title of the search result that was clicked on | The `value` is the result rank. A `to` attribute is also provided | If there is an event you'd like to see captured, please [open an issue][add-event] describing the event you want to see and the questions it diff --git a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts index a33d8939eb..72bab5b3b6 100644 --- a/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts +++ b/plugins/search-backend-module-elasticsearch/src/engines/ElasticSearchSearchEngine.ts @@ -335,6 +335,7 @@ export class ElasticSearchSearchEngine implements SearchEngine { ), nextPageCursor, previousPageCursor, + numberOfResults: result.body.hits.total.value, }; } catch (error) { if (error.meta?.body?.error?.type === 'index_not_found_exception') { diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts index 23f8983074..c1d73c618d 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts @@ -231,6 +231,7 @@ describe('PgSearchEngine', () => { }, ], nextPageCursor: undefined, + numberOfResults: 1, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { @@ -288,6 +289,7 @@ describe('PgSearchEngine', () => { }, })), nextPageCursor: 'MQ==', + numberOfResults: 30, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { @@ -348,6 +350,7 @@ describe('PgSearchEngine', () => { })) .slice(25), previousPageCursor: 'MA==', + numberOfResults: 5, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index f53c433c2f..b0e8d0c6d2 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -194,6 +194,7 @@ export class PgSearchEngine implements SearchEngine { const previousPageCursor = hasPreviousPage ? encodePageCursor({ page: page - 1 }) : undefined; + const numberOfResults = rows.length; const results = pageRows.map( ({ type, document, highlight }, index): IndexableResult => ({ @@ -215,7 +216,7 @@ export class PgSearchEngine implements SearchEngine { }), ); - return { results, nextPageCursor, previousPageCursor }; + return { results, nextPageCursor, previousPageCursor, numberOfResults }; } } diff --git a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts index d60f9951f4..ff2c828402 100644 --- a/plugins/search-backend-node/src/engines/LunrSearchEngine.ts +++ b/plugins/search-backend-node/src/engines/LunrSearchEngine.ts @@ -238,6 +238,7 @@ export class LunrSearchEngine implements SearchEngine { }), }, })), + numberOfResults: results.length, nextPageCursor, previousPageCursor, }; diff --git a/plugins/search-backend/src/service/AuthorizedSearchEngine.ts b/plugins/search-backend/src/service/AuthorizedSearchEngine.ts index ade43280be..52c87d76c7 100644 --- a/plugins/search-backend/src/service/AuthorizedSearchEngine.ts +++ b/plugins/search-backend/src/service/AuthorizedSearchEngine.ts @@ -205,6 +205,7 @@ export class AuthorizedSearchEngine implements SearchEngine { (nextPageCursor || filteredResults.length > targetResults) ? encodePageCursor({ page: page + 1 }) : undefined, + numberOfResults: undefined, }; } diff --git a/plugins/search-common/api-report.md b/plugins/search-common/api-report.md index 61e5d22257..2006689ab9 100644 --- a/plugins/search-common/api-report.md +++ b/plugins/search-common/api-report.md @@ -73,6 +73,8 @@ export interface ResultSet { // (undocumented) nextPageCursor?: string; // (undocumented) + numberOfResults?: number; + // (undocumented) previousPageCursor?: string; // (undocumented) results: Result[]; diff --git a/plugins/search-common/src/types.ts b/plugins/search-common/src/types.ts index 54abc9e1b1..2ea4a490ca 100644 --- a/plugins/search-common/src/types.ts +++ b/plugins/search-common/src/types.ts @@ -87,6 +87,7 @@ export interface ResultSet { results: Result[]; nextPageCursor?: string; previousPageCursor?: string; + numberOfResults?: number; } /** diff --git a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx index f900e45d45..3b758a0c47 100644 --- a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx +++ b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx @@ -23,14 +23,18 @@ import { useSearch } from '../../context'; */ export const TrackSearch = ({ children }: { children: React.ReactChild }) => { const analytics = useAnalytics(); - const { term } = useSearch(); + const { term, result } = useSearch(); + + const numberOfResults = result.value?.numberOfResults ?? undefined; useEffect(() => { if (term) { // Capture analytics search event with search term provided as value - analytics.captureEvent('search', term); + analytics.captureEvent('search', term, { + value: numberOfResults, + }); } - }, [analytics, term]); + }, [analytics, term, numberOfResults]); return <>{children}; }; From ce08e1798e79c8d3e3c225d3c4897b267ea43cef Mon Sep 17 00:00:00 2001 From: Patrick Jungermann Date: Thu, 24 Nov 2022 21:41:09 +0100 Subject: [PATCH 052/269] feat(catalog/bitbucketCloud,events): improve refresh for updated catalog files Refresh (potentially) updated catalog files on `repo:push` more efficiently. Signed-off-by: Patrick Jungermann --- .changeset/beige-chairs-repair.md | 5 +++ .../package.json | 1 - .../src/BitbucketCloudEntityProvider.test.ts | 18 ++++------ .../src/BitbucketCloudEntityProvider.ts | 33 +++++++------------ yarn.lock | 1 - 5 files changed, 24 insertions(+), 34 deletions(-) create mode 100644 .changeset/beige-chairs-repair.md diff --git a/.changeset/beige-chairs-repair.md b/.changeset/beige-chairs-repair.md new file mode 100644 index 0000000000..20cad7be6e --- /dev/null +++ b/.changeset/beige-chairs-repair.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-bitbucket-cloud': patch +--- + +Refresh (potentially) updated catalog files on `repo:push` more efficiently. diff --git a/plugins/catalog-backend-module-bitbucket-cloud/package.json b/plugins/catalog-backend-module-bitbucket-cloud/package.json index f4d542f843..f58f3eec56 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/package.json +++ b/plugins/catalog-backend-module-bitbucket-cloud/package.json @@ -45,7 +45,6 @@ "@backstage/plugin-catalog-common": "workspace:^", "@backstage/plugin-catalog-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", - "p-limit": "^3.1.0", "uuid": "^8.0.0", "winston": "^3.2.1" }, diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts index 2856a26a13..367e95b99b 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.test.ts @@ -22,11 +22,7 @@ import { } from '@backstage/backend-tasks'; import { setupRequestMockHandlers } from '@backstage/backend-test-utils'; import { CatalogApi } from '@backstage/catalog-client'; -import { - Entity, - LocationEntity, - stringifyEntityRef, -} from '@backstage/catalog-model'; +import { Entity, LocationEntity } from '@backstage/catalog-model'; import { ConfigReader } from '@backstage/config'; import { EntityProviderConnection, @@ -458,7 +454,6 @@ describe('BitbucketCloudEntityProvider', () => { items: [keptModule, removedModule], }; }, - refreshEntity: jest.fn(), }; const provider = BitbucketCloudEntityProvider.fromConfig(defaultConfig, { catalogApi: catalogApi as any as CatalogApi, @@ -557,11 +552,12 @@ describe('BitbucketCloudEntityProvider', () => { }, ]; - expect(catalogApi.refreshEntity).toHaveBeenCalledTimes(1); - expect(catalogApi.refreshEntity).toHaveBeenCalledWith( - stringifyEntityRef(keptModule), - { token: 'fake-token' }, - ); + expect(entityProviderConnection.refresh).toHaveBeenCalledTimes(1); + expect(entityProviderConnection.refresh).toHaveBeenCalledWith({ + keys: [ + 'url:https://bitbucket.org/test-ws/test-repo/src/main/kept-module/catalog-custom.yaml', + ], + }); expect(entityProviderConnection.applyMutation).toHaveBeenCalledTimes(1); expect(entityProviderConnection.applyMutation).toHaveBeenCalledWith({ type: 'delta', diff --git a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts index 33b92589eb..83b6f447f2 100644 --- a/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts +++ b/plugins/catalog-backend-module-bitbucket-cloud/src/BitbucketCloudEntityProvider.ts @@ -17,11 +17,7 @@ import { TokenManager } from '@backstage/backend-common'; import { PluginTaskScheduler, TaskRunner } from '@backstage/backend-tasks'; import { CatalogApi } from '@backstage/catalog-client'; -import { - Entity, - LocationEntity, - stringifyEntityRef, -} from '@backstage/catalog-model'; +import { LocationEntity } from '@backstage/catalog-model'; import { Config } from '@backstage/config'; import { BitbucketCloudIntegration, @@ -44,7 +40,6 @@ import { BitbucketCloudEntityProviderConfig, readProviderConfigs, } from './BitbucketCloudEntityProviderConfig'; -import limiterFactory from 'p-limit'; import * as uuid from 'uuid'; import { Logger } from 'winston'; @@ -273,9 +268,7 @@ export class BitbucketCloudEntityProvider ), ); - const limiter = limiterFactory(10); - - const stillExisting: Entity[] = []; + const stillExisting: LocationEntity[] = []; const removed: DeferredEntity[] = []; existing.forEach(item => { if (targets.find(value => value.fileUrl === item.spec.target)) { @@ -288,22 +281,20 @@ export class BitbucketCloudEntityProvider } }); - const promises: Promise[] = stillExisting.map(entity => - limiter(async () => - this.catalogApi!.refreshEntity(stringifyEntityRef(entity), { token }), - ), - ); + const promises: Promise[] = [ + this.connection.refresh({ + keys: stillExisting.map(entity => `url:${entity.spec.target}`), + }), + ]; if (added.length > 0 || removed.length > 0) { const connection = this.connection; promises.push( - limiter(async () => - connection.applyMutation({ - type: 'delta', - added: added, - removed: removed, - }), - ), + connection.applyMutation({ + type: 'delta', + added: added, + removed: removed, + }), ); } diff --git a/yarn.lock b/yarn.lock index eea278d3b3..636a2c6823 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4485,7 +4485,6 @@ __metadata: "@backstage/plugin-events-node": "workspace:^" luxon: ^3.0.0 msw: ^0.49.0 - p-limit: ^3.1.0 uuid: ^8.0.0 winston: ^3.2.1 languageName: unknown From 42565b4b4b8bd06a4e6ce90e640f17429dc550d3 Mon Sep 17 00:00:00 2001 From: Maximilian Vorbrodt Date: Mon, 28 Nov 2022 11:10:21 +0100 Subject: [PATCH 053/269] change default maxDepth value Signed-off-by: Maximilian Vorbrodt --- .../components/EntityRelationsGraph/EntityRelationsGraph.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx index 72ec4b4aed..67aa230ce2 100644 --- a/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx +++ b/plugins/catalog-graph/src/components/EntityRelationsGraph/EntityRelationsGraph.tsx @@ -89,7 +89,7 @@ export const EntityRelationsGraph = (props: { }) => { const { rootEntityNames, - maxDepth = Number.POSITIVE_INFINITY, + maxDepth = 2, unidirectional = true, mergeRelations = true, kinds, From 454f2e90db179c7923f64c5ca4516abe7bcc1cd5 Mon Sep 17 00:00:00 2001 From: Maximilian Vorbrodt Date: Mon, 28 Nov 2022 11:20:49 +0100 Subject: [PATCH 054/269] add changeset Signed-off-by: Maximilian Vorbrodt --- .changeset/shy-cycles-add.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/shy-cycles-add.md diff --git a/.changeset/shy-cycles-add.md b/.changeset/shy-cycles-add.md new file mode 100644 index 0000000000..8a5e893684 --- /dev/null +++ b/.changeset/shy-cycles-add.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-graph': patch +--- + +Set the default max depth in entity relations graph to a smaller value to provide better readability. From 5aed7098bd8838a1d5f34a19a67debb44abe1951 Mon Sep 17 00:00:00 2001 From: Amritpal Nagra Date: Mon, 28 Nov 2022 16:34:51 +0530 Subject: [PATCH 055/269] fix misleading wording with hyperlink Signed-off-by: Amritpal Nagra --- docs/tutorials/configuring-plugin-databases.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/configuring-plugin-databases.md b/docs/tutorials/configuring-plugin-databases.md index 8cb78bff60..edbe2dd737 100644 --- a/docs/tutorials/configuring-plugin-databases.md +++ b/docs/tutorials/configuring-plugin-databases.md @@ -21,8 +21,8 @@ instance or cluster. With infrastructure defined as code or data (Terraform, AWS CloudFormation, etc.), you may have database credentials which lack permissions to create new databases or you do not have control over the database names. In these -instances, you can set the database name and connection information on a per -plugin basis as mentioned earlier. +instances, you can do [connection configuration per plugin basis] +(#connection-configuration-per-plugin). Backstage supports all of these use cases with the `DatabaseManager` provided by `@backstage/backend-common`. We will now cover how to use and configure From c395abb5b291205b3f3cca3382388faf7d5d40a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 28 Nov 2022 15:54:35 +0100 Subject: [PATCH 056/269] enable multi-processor validation of entity kinds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/rude-pugs-deny.md | 27 ++++++++++ plugins/catalog-backend/api-report.md | 3 +- .../catalog-backend/src/integration.test.ts | 1 + ...faultCatalogProcessingOrchestrator.test.ts | 51 +++++++++++++++++++ .../DefaultCatalogProcessingOrchestrator.ts | 19 ++++--- .../src/service/CatalogBuilder.ts | 12 +++++ 6 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 .changeset/rude-pugs-deny.md diff --git a/.changeset/rude-pugs-deny.md b/.changeset/rude-pugs-deny.md new file mode 100644 index 0000000000..b877d96285 --- /dev/null +++ b/.changeset/rude-pugs-deny.md @@ -0,0 +1,27 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +The catalog no longer stops after the first processor `validateEntityKind` +method returns `true` when validating entity kind shapes. Instead, it continues +through all registered processors that have this method, and requires that _at +least one_ of them returned true. + +The old behavior of stopping early made it harder to extend existing core kinds +with additional fields, since the `BuiltinKindsEntityProcessor` is always +present at the top of the processing chain and ensures that your additional +validation code would never be run. + +This is technically a breaking change, although it should not affect anybody +under normal circumstances, except if you had problematic validation code that +you were unaware that it was not being run. That code may now start to exhibit +those problems. + +If you need to disable this new behavior, `CatalogBuilder` as used in your +`packages/backend/src/plugins/catalog.ts` file now has a +`useLegacySingleProcessorValidation()` method to go back to the old behavior. + +```diff + const builder = await CatalogBuilder.create(env); ++builder.useLegacySingleProcessorValidation(); +``` diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index e5d464c29a..a46abda5d3 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -133,7 +133,7 @@ export class CatalogBuilder { ...permissionRules: Array< CatalogPermissionRule | Array > - ): void; + ): this; addProcessor( ...processors: Array> ): CatalogBuilder; @@ -164,6 +164,7 @@ export class CatalogBuilder { errors: Error[]; }) => Promise | void; }): void; + useLegacySingleProcessorValidation(): this; } // @alpha diff --git a/plugins/catalog-backend/src/integration.test.ts b/plugins/catalog-backend/src/integration.test.ts index dcfe9a1489..a63119bb67 100644 --- a/plugins/catalog-backend/src/integration.test.ts +++ b/plugins/catalog-backend/src/integration.test.ts @@ -245,6 +245,7 @@ class TestHarness { logger, parser: defaultEntityDataParser, policy: EntityPolicies.allOf([]), + legacySingleProcessorValidation: false, }); const stitcher = new Stitcher(db, logger); const catalog = new DefaultEntitiesCatalog(db, stitcher); diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts index cbb130d138..9731022582 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.test.ts @@ -97,6 +97,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser: defaultEntityDataParser, policy: EntityPolicies.allOf([]), rulesEnforcer: { isAllowed: () => true }, + legacySingleProcessorValidation: false, }); it('runs a minimal processing', async () => { @@ -190,6 +191,54 @@ describe('DefaultCatalogProcessingOrchestrator', () => { ok: true, }); }); + + it('runs all processor validations when asked to', async () => { + const validate = jest.fn(async () => true); + const processor1: Partial = { + validateEntityKind: validate, + }; + const processor2: Partial = { + validateEntityKind: validate, + }; + + const legacy = new DefaultCatalogProcessingOrchestrator({ + processors: [ + processor1 as CatalogProcessor, + processor2 as CatalogProcessor, + ], + integrations: ScmIntegrations.fromConfig(new ConfigReader({})), + logger: getVoidLogger(), + parser: defaultEntityDataParser, + policy: EntityPolicies.allOf([]), + rulesEnforcer: { isAllowed: () => true }, + legacySingleProcessorValidation: true, + }); + + const modern = new DefaultCatalogProcessingOrchestrator({ + processors: [ + processor1 as CatalogProcessor, + processor2 as CatalogProcessor, + ], + integrations: ScmIntegrations.fromConfig(new ConfigReader({})), + logger: getVoidLogger(), + parser: defaultEntityDataParser, + policy: EntityPolicies.allOf([]), + rulesEnforcer: { isAllowed: () => true }, + legacySingleProcessorValidation: false, + }); + + await expect(legacy.process({ entity })).resolves.toMatchObject({ + ok: true, + }); + expect(validate).toHaveBeenCalledTimes(1); + + validate.mockClear(); + + await expect(modern.process({ entity })).resolves.toMatchObject({ + ok: true, + }); + expect(validate).toHaveBeenCalledTimes(2); + }); }); describe('rules', () => { @@ -231,6 +280,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser, policy: EntityPolicies.allOf([]), rulesEnforcer, + legacySingleProcessorValidation: false, }); rulesEnforcer.isAllowed.mockReturnValueOnce(true); @@ -272,6 +322,7 @@ describe('DefaultCatalogProcessingOrchestrator', () => { parser, policy: EntityPolicies.allOf([new FailingEntityPolicy()]), rulesEnforcer, + legacySingleProcessorValidation: false, }); await expect( diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts index e95fede8b7..339469ff1d 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingOrchestrator.ts @@ -76,6 +76,7 @@ export class DefaultCatalogProcessingOrchestrator parser: CatalogProcessorParser; policy: EntityPolicy; rulesEnforcer: CatalogRulesEnforcer; + legacySingleProcessorValidation: boolean; }, ) {} @@ -253,19 +254,17 @@ export class DefaultCatalogProcessingOrchestrator ); } - let foundKind = false; + let valid = false; for (const processor of this.options.processors) { if (processor.validateEntityKind) { try { - foundKind = await processor.validateEntityKind(entity); - if (foundKind) { - // TODO(freben): It would make sense to keep running, so that - // multiple processors could have a go at making checks. For - // example, an org may want to add additional rules on top of the - // provided ones. But that would be a breaking change, so we'll - // postpone that to a future processors rewrite. - break; + const thisValid = await processor.validateEntityKind(entity); + if (thisValid) { + valid = true; + if (this.options.legacySingleProcessorValidation) { + break; + } } } catch (e) { throw new InputError( @@ -276,7 +275,7 @@ export class DefaultCatalogProcessingOrchestrator } } - if (!foundKind) { + if (!valid) { throw new InputError( `No processor recognized the entity ${context.entityRef} as valid, possibly caused by a foreign kind or apiVersion`, ); diff --git a/plugins/catalog-backend/src/service/CatalogBuilder.ts b/plugins/catalog-backend/src/service/CatalogBuilder.ts index d5bc7057dd..8aab74c4ba 100644 --- a/plugins/catalog-backend/src/service/CatalogBuilder.ts +++ b/plugins/catalog-backend/src/service/CatalogBuilder.ts @@ -154,6 +154,7 @@ export class CatalogBuilder { private locationAnalyzer: LocationAnalyzer | undefined = undefined; private readonly permissionRules: CatalogPermissionRule[]; private allowedLocationType: string[]; + private legacySingleProcessorValidation = false; /** * Creates a catalog builder. @@ -384,6 +385,7 @@ export class CatalogBuilder { > ) { this.permissionRules.push(...permissionRules.flat()); + return this; } /** @@ -396,6 +398,15 @@ export class CatalogBuilder { return this; } + /** + * Enables the legacy behaviour of canceling validation early whenever only a + * single processor declares an entity kind to be valid. + */ + useLegacySingleProcessorValidation(): this { + this.legacySingleProcessorValidation = true; + return this; + } + /** * Wires up and returns all of the component parts of the catalog */ @@ -429,6 +440,7 @@ export class CatalogBuilder { logger, parser, policy, + legacySingleProcessorValidation: this.legacySingleProcessorValidation, }); const stitcher = new Stitcher(dbClient, logger); const unauthorizedEntitiesCatalog = new DefaultEntitiesCatalog( From 9516b0c355c1bf745a4f62adbbca75a9b07eaf92 Mon Sep 17 00:00:00 2001 From: Nikita Karpukhin Date: Mon, 28 Nov 2022 16:32:51 +0100 Subject: [PATCH 057/269] Add support for sending virtual pageviews on search events Signed-off-by: Nikita Karpukhin --- .changeset/selfish-lizards-invent.md | 5 + plugins/analytics-module-ga/README.md | 25 +++++ plugins/analytics-module-ga/config.d.ts | 26 ++++++ .../AnalyticsApi/GoogleAnalytics.test.ts | 93 +++++++++++++++++++ .../AnalyticsApi/GoogleAnalytics.ts | 25 ++++- .../src/util/VirtualSearchPageView.ts | 43 +++++++++ 6 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 .changeset/selfish-lizards-invent.md create mode 100644 plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts diff --git a/.changeset/selfish-lizards-invent.md b/.changeset/selfish-lizards-invent.md new file mode 100644 index 0000000000..0eb9e110cf --- /dev/null +++ b/.changeset/selfish-lizards-invent.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-analytics-module-ga': minor +--- + +Added support for sending virtual pageviews on `search` events diff --git a/plugins/analytics-module-ga/README.md b/plugins/analytics-module-ga/README.md index 4b822ea3e3..605044f37c 100644 --- a/plugins/analytics-module-ga/README.md +++ b/plugins/analytics-module-ga/README.md @@ -169,6 +169,31 @@ export const apis: AnyApiFactory[] = [ ]; ``` +### Enabling Site Search + +If you wish to see all of the search events in the [Site Search](https://support.google.com/analytics/answer/1012264) +section of Google Analytics, you can enable sending virtual pageviews on every `search` event like so: + +```yaml +app: + analytics: + ga: + virtualSearchPageView: + mode: only # Defaults to 'disabled' + mountPath: /virtual-search # Defaults to '/search' + queryParam: term # Defaults to 'query' +``` + +Available `mode`s are: + +- `disabled` - no virtual pageviews are sent, default behavior +- `only` - sends virtual pageviews _instead_ of `search` events +- `both` - sends both virtual pageviews _and_ `search` events + +Virtual pageviews will be sent to the path specified in the `mountPath`, and the search term will be +set as the value for query parameter `queryParam`, e.g. the example config above will result in +virtual pageviews being sent to `/virtual-search?term=SearchTermHere`. + ### Debugging and Testing In pre-production environments, you may wish to set additional configurations diff --git a/plugins/analytics-module-ga/config.d.ts b/plugins/analytics-module-ga/config.d.ts index b91f5812c1..bf9c3b304b 100644 --- a/plugins/analytics-module-ga/config.d.ts +++ b/plugins/analytics-module-ga/config.d.ts @@ -53,6 +53,32 @@ export interface Config { */ identity?: 'disabled' | 'optional' | 'required'; + /** + * Controls whether to send virtual pageviews on `search` events. + * Can be used to enable Site Search in GA. + */ + virtualSearchPageView?: { + /** + * - `disabled`: (Default) no virtual pageviews are sent + * - `only`: Sends virtual pageview _instead_ of the `search` event + * - `both`: Sends both the `search` event _and_ the virtual pageview + * @visibility frontend + */ + mode?: 'disabled' | 'only' | 'both'; + /** + * Specifies on which path the main Search page is mounted. + * Defaults to `/search`. + * @visibility frontend + */ + mountPath?: string; + /** + * Specifies which query param is used in the virtual pageview URL. + * Defaults to `query`. + * @visibility frontend + */ + queryParam?: string; + }; + /** * Whether or not to log analytics debug statements to the console. * Defaults to false. diff --git a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts index c9c2a02c69..8dbf06ed0f 100644 --- a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts +++ b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.test.ts @@ -152,6 +152,99 @@ describe('GoogleAnalytics', () => { }); }); + it('captures virtual pageviews', () => { + const config = new ConfigReader({ + app: { + analytics: { + ga: { + trackingId, + testMode: true, + virtualSearchPageView: { mode: 'only' }, + }, + }, + }, + }); + const api = GoogleAnalytics.fromConfig(config); + api.captureEvent({ + action: 'search', + subject: 'test search', + context, + }); + + const [command, data] = ReactGA.testModeAPI.calls[1]; + expect(command).toBe('send'); + expect(data).toMatchObject({ + hitType: 'pageview', + page: '/search?query=test search', + }); + }); + + it('captures virtual pageviews alongside search events', () => { + const config = new ConfigReader({ + app: { + analytics: { + ga: { + trackingId, + testMode: true, + virtualSearchPageView: { mode: 'both' }, + }, + }, + }, + }); + const api = GoogleAnalytics.fromConfig(config); + api.captureEvent({ + action: 'search', + subject: 'test search', + context, + }); + + const [pageviewCommand, pageViewData] = ReactGA.testModeAPI.calls[1]; + expect(pageviewCommand).toBe('send'); + expect(pageViewData).toMatchObject({ + hitType: 'pageview', + page: '/search?query=test search', + }); + const [searchCommand, searchData] = ReactGA.testModeAPI.calls[2]; + expect(searchCommand).toBe('send'); + expect(searchData).toMatchObject({ + hitType: 'event', + eventCategory: context.extension, + eventAction: 'search', + eventLabel: 'test search', + }); + }); + + it('captures virtual pageviews on custom route with custom query param', () => { + const config = new ConfigReader({ + app: { + analytics: { + ga: { + trackingId, + testMode: true, + virtualSearchPageView: { + mode: 'only', + mountPath: '/custom', + queryParam: 'term', + }, + }, + }, + }, + }); + const api = GoogleAnalytics.fromConfig(config); + api.captureEvent({ + action: 'search', + subject: 'test search', + context, + }); + + const [command, data] = ReactGA.testModeAPI.calls[1]; + expect(command).toBe('send'); + expect(data).toMatchObject({ + hitType: 'pageview', + page: '/custom?term=test search', + }); + }); + it('captures configured custom dimensions/metrics on events', () => { const api = GoogleAnalytics.fromConfig(advancedConfig); diff --git a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts index 498b118d0d..16e4807008 100644 --- a/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts +++ b/plugins/analytics-module-ga/src/apis/implementations/AnalyticsApi/GoogleAnalytics.ts @@ -18,12 +18,16 @@ import ReactGA from 'react-ga'; import { AnalyticsApi, AnalyticsContextValue, - AnalyticsEventAttributes, AnalyticsEvent, + AnalyticsEventAttributes, IdentityApi, } from '@backstage/core-plugin-api'; import { Config } from '@backstage/config'; import { DeferredCapture } from '../../../util'; +import { + parseVirtualSearchPageViewConfig, + VirtualSearchPageViewConfig, +} from '../../../util/VirtualSearchPageView'; type CustomDimensionOrMetricConfig = { type: 'dimension' | 'metric'; @@ -40,6 +44,7 @@ export class GoogleAnalytics implements AnalyticsApi { private readonly cdmConfig: CustomDimensionOrMetricConfig[]; private customUserIdTransform?: (userEntityRef: string) => Promise; private readonly capture: DeferredCapture; + private readonly virtualSearchPageView: VirtualSearchPageViewConfig; /** * Instantiate the implementation and initialize ReactGA. @@ -51,6 +56,7 @@ export class GoogleAnalytics implements AnalyticsApi { identity: string; trackingId: string; scriptSrc?: string; + virtualSearchPageView: VirtualSearchPageViewConfig; testMode: boolean; debug: boolean; }) { @@ -61,11 +67,13 @@ export class GoogleAnalytics implements AnalyticsApi { identityApi, userIdTransform = 'sha-256', scriptSrc, + virtualSearchPageView, testMode, debug, } = options; this.cdmConfig = cdmConfig; + this.virtualSearchPageView = virtualSearchPageView; // Initialize Google Analytics. ReactGA.initialize(trackingId, { @@ -105,6 +113,9 @@ export class GoogleAnalytics implements AnalyticsApi { const scriptSrc = config.getOptionalString('app.analytics.ga.scriptSrc'); const identity = config.getOptionalString('app.analytics.ga.identity') || 'disabled'; + const virtualSearchPageView = parseVirtualSearchPageViewConfig( + config.getOptionalConfig('app.analytics.ga.virtualSearchPageView'), + ); const debug = config.getOptionalBoolean('app.analytics.ga.debug') ?? false; const testMode = config.getOptionalBoolean('app.analytics.ga.testMode') ?? false; @@ -134,6 +145,7 @@ export class GoogleAnalytics implements AnalyticsApi { identity, trackingId, scriptSrc, + virtualSearchPageView, cdmConfig, testMode, debug, @@ -154,6 +166,17 @@ export class GoogleAnalytics implements AnalyticsApi { return; } + if (this.virtualSearchPageView.mode !== 'disabled' && action === 'search') { + const { mountPath, queryParam } = this.virtualSearchPageView; + this.capture.pageview( + `${mountPath}?${queryParam}=${subject}`, + customMetadata, + ); + if (this.virtualSearchPageView.mode === 'only') { + return; + } + } + this.capture.event({ category: context.extension || 'App', action, diff --git a/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts b/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts new file mode 100644 index 0000000000..8da2eebca3 --- /dev/null +++ b/plugins/analytics-module-ga/src/util/VirtualSearchPageView.ts @@ -0,0 +1,43 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ +import { Config } from '@backstage/config'; + +type VirtualSearchPageViewType = 'disabled' | 'only' | 'both'; + +export type VirtualSearchPageViewConfig = { + mode: VirtualSearchPageViewType; + mountPath: string; + queryParam: string; +}; + +function isVirtualSearchPageViewType( + value: string | undefined, +): value is VirtualSearchPageViewType { + return value === 'disabled' || value === 'only' || value === 'both'; +} + +export function parseVirtualSearchPageViewConfig( + config: Config | undefined, +): VirtualSearchPageViewConfig { + const vspvModeString = config?.getOptionalString('mode'); + return { + mode: isVirtualSearchPageViewType(vspvModeString) + ? vspvModeString + : 'disabled', + mountPath: config?.getOptionalString('mountPath') ?? '/search', + queryParam: config?.getOptionalString('queryParam') ?? 'query', + }; +} From 61d4efe9787afbe9beb0b53f0808dad45a0f6e18 Mon Sep 17 00:00:00 2001 From: Damon Kaswell Date: Mon, 28 Nov 2022 07:50:31 -0800 Subject: [PATCH 058/269] Update changeset Signed-off-by: Damon Kaswell --- .changeset/sharp-shoes-bathe.md | 5 +++ .../IncrementalIngestionDatabaseManager.ts | 30 ++++++++++++----- .../src/engine/IncrementalIngestionEngine.ts | 33 ++++++++++++++++--- 3 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 .changeset/sharp-shoes-bathe.md diff --git a/.changeset/sharp-shoes-bathe.md b/.changeset/sharp-shoes-bathe.md new file mode 100644 index 0000000000..7c44559e2c --- /dev/null +++ b/.changeset/sharp-shoes-bathe.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend-module-incremental-ingestion': minor +--- + +Make incremental providers more resilient to failures diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts index 3c91b24e2c..c6d5fe795b 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts @@ -287,6 +287,15 @@ export class IncrementalIngestionDatabaseManager { */ async computeRemoved(provider: string, ingestionId: string) { return await this.client.transaction(async tx => { + const rows = await tx('final_entities') + .count({ total: '*' }) + .join('search', 'search.entity_id', 'final_entities.entity_id') + .where( + 'search.key', + `metadata.annotations.${INCREMENTAL_ENTITY_PROVIDER_ANNOTATION}`, + ) + .andWhere('search.value', provider); + const total = rows.reduce((acc, cur) => acc + (cur.total as number), 0); const removed: { entity: string; ref: string }[] = await tx( 'final_entities', ) @@ -302,23 +311,26 @@ export class IncrementalIngestionDatabaseManager { .join('search', 'search.entity_id', 'final_entities.entity_id') .whereNotIn( 'entity_ref', - tx('ingestion_marks') + tx('ingestion.ingestion_marks') .join( - 'ingestion_mark_entities', - 'ingestion_marks.id', - 'ingestion_mark_entities.ingestion_mark_id', + 'ingestion.ingestion_mark_entities', + 'ingestion.ingestion_marks.id', + 'ingestion.ingestion_mark_entities.ingestion_mark_id', ) - .select('ingestion_mark_entities.ref') - .where('ingestion_marks.ingestion_id', ingestionId), + .select('ingestion.ingestion_mark_entities.ref') + .where('ingestion.ingestion_marks.ingestion_id', ingestionId), ) .andWhere( 'search.key', `metadata.annotations.${INCREMENTAL_ENTITY_PROVIDER_ANNOTATION}`, ) .andWhere('search.value', provider); - return removed.map(entity => { - return { entity: JSON.parse(entity.entity) }; - }); + return { + total, + removed: removed.map(entity => { + return { entity: JSON.parse(entity.entity) }; + }), + }; }); } diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts index a742f63045..36b683fa9a 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts @@ -27,6 +27,8 @@ import { Duration, DurationObjectUnits } from 'luxon'; import { v4 } from 'uuid'; import { stringifyError } from '@backstage/errors'; +const REMOVAL_THRESHOLD = 5; + export class IncrementalIngestionEngine implements IterationEngine { private readonly restLength: Duration; private readonly backoff: DurationObjectUnits[]; @@ -279,12 +281,33 @@ export class IncrementalIngestionEngine implements IterationEngine { const removed: DeferredEntity[] = []; if (done) { - removed.push( - ...(await this.manager.computeRemoved( - this.options.provider.getProviderName(), - id, - )), + this.options.logger.info( + `incremental-engine: Ingestion '${id}': Final page reached, calculating removed entities`, ); + const result = await this.manager.computeRemoved( + this.options.provider.getProviderName(), + id, + ); + const total = result.total + added.length; + const percentRemoved = + total > 0 ? (result.removed.length / total) * 100 : 0; + if (percentRemoved <= REMOVAL_THRESHOLD) { + this.options.logger.info( + `incremental-engine: Ingestion '${id}': Removing ${result.removed.length} entities that have no matching assets`, + ); + removed.push(...result.removed); + } else { + const notice = `Attempted to remove ${percentRemoved}% of ${total} matching entities!`; + this.options.logger.error( + `incremental-engine: Ingestion '${id}': ${notice}`, + ); + await this.manager.updateIngestionRecordById({ + ingestionId: id, + update: { + last_error: `REMOVAL_THRESHOLD exceeded on ingestion mark ${markId}: ${notice}`, + }, + }); + } } await this.options.connection.applyMutation({ From 77c207ccba33b5d80f3d06e5d5f513ddaa62f4dc Mon Sep 17 00:00:00 2001 From: Damon Kaswell Date: Mon, 28 Nov 2022 08:03:35 -0800 Subject: [PATCH 059/269] Remove reference to unused schema Signed-off-by: Damon Kaswell --- .../IncrementalIngestionDatabaseManager.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts index c6d5fe795b..0fd560544d 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts @@ -311,14 +311,14 @@ export class IncrementalIngestionDatabaseManager { .join('search', 'search.entity_id', 'final_entities.entity_id') .whereNotIn( 'entity_ref', - tx('ingestion.ingestion_marks') + tx('ingestion_marks') .join( - 'ingestion.ingestion_mark_entities', - 'ingestion.ingestion_marks.id', - 'ingestion.ingestion_mark_entities.ingestion_mark_id', + 'ingestion_mark_entities', + 'ingestion_marks.id', + 'ingestion_mark_entities.ingestion_mark_id', ) - .select('ingestion.ingestion_mark_entities.ref') - .where('ingestion.ingestion_marks.ingestion_id', ingestionId), + .select('ingestion_mark_entities.ref') + .where('ingestion_marks.ingestion_id', ingestionId), ) .andWhere( 'search.key', @@ -463,7 +463,7 @@ export class IncrementalIngestionDatabaseManager { } /** - * Starts the cancel process for the current ingestion. + * Starts the cancel process for the current * @param ingestionId - string * @param message - string (optional) */ @@ -478,7 +478,7 @@ export class IncrementalIngestionDatabaseManager { } /** - * Completes the cancel process and triggers a new ingestion. + * Completes the cancel process and triggers a new * @param ingestionId - string */ async setProviderCanceled(ingestionId: string) { From de8a97591130749c4354b3eafef53cf062162f9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Mon, 28 Nov 2022 17:04:49 +0100 Subject: [PATCH 060/269] remove usages of node-abort-controller MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/light-snakes-exercise.md | 16 +++++++++ packages/backend-common/api-report.md | 12 +++---- packages/backend-common/package.json | 1 - .../src/context/AbortContext.test.ts | 1 - .../src/context/AbortContext.ts | 1 - .../src/context/Contexts.test.ts | 1 - .../backend-common/src/context/Contexts.ts | 1 - .../backend-common/src/context/RootContext.ts | 33 +++++++++++-------- .../src/context/ValueContext.ts | 1 - packages/backend-common/src/context/types.ts | 2 -- packages/backend-common/src/reading/types.ts | 1 - packages/backend-tasks/api-report.md | 5 ++- packages/backend-tasks/package.json | 1 - .../src/tasks/LocalTaskWorker.test.ts | 1 - .../src/tasks/LocalTaskWorker.ts | 1 - .../src/tasks/PluginTaskSchedulerImpl.test.ts | 1 - .../src/tasks/PluginTaskSchedulerJanitor.ts | 1 - .../src/tasks/TaskWorker.test.ts | 1 - .../backend-tasks/src/tasks/TaskWorker.ts | 1 - packages/backend-tasks/src/tasks/types.ts | 1 - packages/backend-tasks/src/tasks/util.test.ts | 1 - packages/backend-tasks/src/tasks/util.ts | 1 - .../src/engine/IncrementalIngestionEngine.ts | 1 - plugins/search-backend-node/package.json | 1 - plugins/search-backend-node/src/Scheduler.ts | 1 - yarn.lock | 3 -- 26 files changed, 43 insertions(+), 48 deletions(-) create mode 100644 .changeset/light-snakes-exercise.md diff --git a/.changeset/light-snakes-exercise.md b/.changeset/light-snakes-exercise.md new file mode 100644 index 0000000000..45bd37cf27 --- /dev/null +++ b/.changeset/light-snakes-exercise.md @@ -0,0 +1,16 @@ +--- +'@backstage/backend-common': minor +'@backstage/backend-tasks': minor +'@backstage/plugin-catalog-backend-module-incremental-ingestion': patch +'@backstage/plugin-search-backend-node': patch +--- + +Changed to use native `AbortController` and `AbortSignal` from Node.js, instead +of the one from `node-abort-controller`. This is possible now that the minimum +supported Node.js version of the project is 16. + +Note that their interfaces are very slightly different, but typically not in a +way that matters to consumers. If you see any typescript errors as a direct +result from this, they are compatible with each other in the ways that we +interact with them, and should be possible to type-cast across without ill +effects. diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index a063815056..784f3295c6 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -6,8 +6,6 @@ /// /// -import { AbortController as AbortController_2 } from 'node-abort-controller'; -import { AbortSignal as AbortSignal_2 } from 'node-abort-controller'; import aws from 'aws-sdk'; import { AwsS3Integration } from '@backstage/integration'; import { AzureIntegration } from '@backstage/integration'; @@ -200,7 +198,7 @@ export interface ContainerRunner { // @alpha export interface Context { - readonly abortSignal: AbortSignal_2; + readonly abortSignal: AbortSignal; readonly deadline: Date | undefined; value(key: string): T | undefined; } @@ -210,7 +208,7 @@ export class Contexts { static root(): Context; static withAbort( parentCtx: Context, - source: AbortController_2 | AbortSignal_2, + source: AbortController | AbortSignal, ): Context; static withTimeoutDuration(parentCtx: Context, timeout: Duration): Context; static withTimeoutMillis(parentCtx: Context, timeout: number): Context; @@ -544,7 +542,7 @@ export type ReadTreeOptions = { }, ): boolean; etag?: string; - signal?: AbortSignal_2; + signal?: AbortSignal; }; // @public @@ -598,7 +596,7 @@ export type ReadTreeResponseFile = { // @public export type ReadUrlOptions = { etag?: string; - signal?: AbortSignal_2; + signal?: AbortSignal; }; // @public @@ -657,7 +655,7 @@ export type RunContainerOptions = { // @public export type SearchOptions = { etag?: string; - signal?: AbortSignal_2; + signal?: AbortSignal; }; // @public diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 9fadc0aeb7..2d9f02d576 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -73,7 +73,6 @@ "minimatch": "^5.0.0", "minimist": "^1.2.5", "morgan": "^1.10.0", - "node-abort-controller": "^3.0.1", "node-fetch": "^2.6.7", "node-forge": "^1.3.1", "raw-body": "^2.4.1", diff --git a/packages/backend-common/src/context/AbortContext.test.ts b/packages/backend-common/src/context/AbortContext.test.ts index f69e282d28..a6c522ffcf 100644 --- a/packages/backend-common/src/context/AbortContext.test.ts +++ b/packages/backend-common/src/context/AbortContext.test.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { AbortController } from 'node-abort-controller'; import { AbortContext } from './AbortContext'; import { RootContext } from './RootContext'; diff --git a/packages/backend-common/src/context/AbortContext.ts b/packages/backend-common/src/context/AbortContext.ts index 8a119358a6..92735fbcc6 100644 --- a/packages/backend-common/src/context/AbortContext.ts +++ b/packages/backend-common/src/context/AbortContext.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { AbortController, AbortSignal } from 'node-abort-controller'; import { Context } from './types'; /** diff --git a/packages/backend-common/src/context/Contexts.test.ts b/packages/backend-common/src/context/Contexts.test.ts index cbd61d20a9..c895b3bb49 100644 --- a/packages/backend-common/src/context/Contexts.test.ts +++ b/packages/backend-common/src/context/Contexts.test.ts @@ -15,7 +15,6 @@ */ import { Duration } from 'luxon'; -import { AbortController } from 'node-abort-controller'; import { Contexts } from './Contexts'; describe('Contexts', () => { diff --git a/packages/backend-common/src/context/Contexts.ts b/packages/backend-common/src/context/Contexts.ts index e22a76f673..4eeb56b029 100644 --- a/packages/backend-common/src/context/Contexts.ts +++ b/packages/backend-common/src/context/Contexts.ts @@ -15,7 +15,6 @@ */ import { Duration } from 'luxon'; -import { AbortController, AbortSignal } from 'node-abort-controller'; import { AbortContext } from './AbortContext'; import { RootContext } from './RootContext'; import { Context } from './types'; diff --git a/packages/backend-common/src/context/RootContext.ts b/packages/backend-common/src/context/RootContext.ts index 61962380a4..aa2213ccab 100644 --- a/packages/backend-common/src/context/RootContext.ts +++ b/packages/backend-common/src/context/RootContext.ts @@ -14,29 +14,36 @@ * limitations under the License. */ -import { AbortSignal } from 'node-abort-controller'; import { Context } from './types'; /** - * Since the root context can never abort, and since nobody is every meant to - * dispatch events through it, we can use a static dummy instance for + * Since the root context can never abort, and since nobody is ever meant to + * dispatch events through it, we can use a static fake instance for * efficiency. */ -const dummyAbortSignal: AbortSignal = Object.freeze({ - aborted: false, - addEventListener() {}, - removeEventListener() {}, - dispatchEvent() { - return true; - }, - onabort: null, -}); +const fakeAbortController = new AbortController(); +const fakeAbortSignal: AbortSignal = Object.freeze( + Object.assign( + { + aborted: false, + reason: undefined, + throwIfAborted() {}, + onabort() {}, + addEventListener() {}, + removeEventListener() {}, + dispatchEvent() { + return true; + }, + }, + fakeAbortController.signal, + ), +); /** * An empty root context. */ export class RootContext implements Context { - readonly abortSignal = dummyAbortSignal; + readonly abortSignal = fakeAbortSignal; readonly deadline = undefined; value(_key: string): T | undefined { diff --git a/packages/backend-common/src/context/ValueContext.ts b/packages/backend-common/src/context/ValueContext.ts index 441aaec984..c8e4426d05 100644 --- a/packages/backend-common/src/context/ValueContext.ts +++ b/packages/backend-common/src/context/ValueContext.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { AbortSignal } from 'node-abort-controller'; import { Context } from './types'; /** diff --git a/packages/backend-common/src/context/types.ts b/packages/backend-common/src/context/types.ts index 664745bbf6..3b53225163 100644 --- a/packages/backend-common/src/context/types.ts +++ b/packages/backend-common/src/context/types.ts @@ -14,8 +14,6 @@ * limitations under the License. */ -import { AbortSignal } from 'node-abort-controller'; - /** * A context that is meant to be passed as a ctx variable down the call chain, * to pass along scoped information and abort signals. diff --git a/packages/backend-common/src/reading/types.ts b/packages/backend-common/src/reading/types.ts index 2ebf38c08a..bce737f3c7 100644 --- a/packages/backend-common/src/reading/types.ts +++ b/packages/backend-common/src/reading/types.ts @@ -17,7 +17,6 @@ import { Readable } from 'stream'; import { Logger } from 'winston'; import { Config } from '@backstage/config'; -import { AbortSignal } from 'node-abort-controller'; /** * A generic interface for fetching plain data from URLs. diff --git a/packages/backend-tasks/api-report.md b/packages/backend-tasks/api-report.md index 8f53d1e5ae..f7b4782263 100644 --- a/packages/backend-tasks/api-report.md +++ b/packages/backend-tasks/api-report.md @@ -3,7 +3,6 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { AbortSignal as AbortSignal_2 } from 'node-abort-controller'; import { Config } from '@backstage/config'; import { DatabaseManager } from '@backstage/backend-common'; import { Duration } from 'luxon'; @@ -29,14 +28,14 @@ export function readTaskScheduleDefinitionFromConfig( // @public export type TaskFunction = - | ((abortSignal: AbortSignal_2) => void | Promise) + | ((abortSignal: AbortSignal) => void | Promise) | (() => void | Promise); // @public export interface TaskInvocationDefinition { fn: TaskFunction; id: string; - signal?: AbortSignal_2; + signal?: AbortSignal; } // @public diff --git a/packages/backend-tasks/package.json b/packages/backend-tasks/package.json index 1e209a4d10..78a29c122a 100644 --- a/packages/backend-tasks/package.json +++ b/packages/backend-tasks/package.json @@ -41,7 +41,6 @@ "knex": "^2.0.0", "lodash": "^4.17.21", "luxon": "^3.0.0", - "node-abort-controller": "^3.0.1", "uuid": "^8.0.0", "winston": "^3.2.1", "zod": "^3.9.5" diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts index b81f7ab1c2..c46743ae59 100644 --- a/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.test.ts @@ -15,7 +15,6 @@ */ import { getVoidLogger } from '@backstage/backend-common'; -import { AbortController } from 'node-abort-controller'; import { LocalTaskWorker } from './LocalTaskWorker'; describe('LocalTaskWorker', () => { diff --git a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts index be30988aa8..0edec5e84e 100644 --- a/packages/backend-tasks/src/tasks/LocalTaskWorker.ts +++ b/packages/backend-tasks/src/tasks/LocalTaskWorker.ts @@ -17,7 +17,6 @@ import { ConflictError } from '@backstage/errors'; import { CronTime } from 'cron'; import { DateTime, Duration } from 'luxon'; -import { AbortController, AbortSignal } from 'node-abort-controller'; import { Logger } from 'winston'; import { TaskFunction, TaskSettingsV2 } from './types'; import { delegateAbortController, sleep } from './util'; diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts index d61948a929..1847370d2b 100644 --- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts +++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerImpl.test.ts @@ -18,7 +18,6 @@ import { getVoidLogger } from '@backstage/backend-common'; import { TestDatabaseId, TestDatabases } from '@backstage/backend-test-utils'; import { ConflictError, NotFoundError } from '@backstage/errors'; import { Duration } from 'luxon'; -import { AbortSignal } from 'node-abort-controller'; import { migrateBackendTasks } from '../database/migrateBackendTasks'; import { parseDuration, diff --git a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts index bedf03d08a..81b0345c2c 100644 --- a/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts +++ b/packages/backend-tasks/src/tasks/PluginTaskSchedulerJanitor.ts @@ -16,7 +16,6 @@ import { Knex } from 'knex'; import { Duration } from 'luxon'; -import { AbortSignal } from 'node-abort-controller'; import { Logger } from 'winston'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; import { sleep } from './util'; diff --git a/packages/backend-tasks/src/tasks/TaskWorker.test.ts b/packages/backend-tasks/src/tasks/TaskWorker.test.ts index e631dcce54..28dbcc4337 100644 --- a/packages/backend-tasks/src/tasks/TaskWorker.test.ts +++ b/packages/backend-tasks/src/tasks/TaskWorker.test.ts @@ -17,7 +17,6 @@ import { getVoidLogger } from '@backstage/backend-common'; import { TestDatabases } from '@backstage/backend-test-utils'; import { Duration } from 'luxon'; -import { AbortController } from 'node-abort-controller'; import waitForExpect from 'wait-for-expect'; import { migrateBackendTasks } from '../database/migrateBackendTasks'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; diff --git a/packages/backend-tasks/src/tasks/TaskWorker.ts b/packages/backend-tasks/src/tasks/TaskWorker.ts index f56c03c3d5..483fb1a02d 100644 --- a/packages/backend-tasks/src/tasks/TaskWorker.ts +++ b/packages/backend-tasks/src/tasks/TaskWorker.ts @@ -18,7 +18,6 @@ import { ConflictError, NotFoundError } from '@backstage/errors'; import { CronTime } from 'cron'; import { Knex } from 'knex'; import { DateTime, Duration } from 'luxon'; -import { AbortSignal } from 'node-abort-controller'; import { v4 as uuid } from 'uuid'; import { Logger } from 'winston'; import { DbTasksRow, DB_TASKS_TABLE } from '../database/tables'; diff --git a/packages/backend-tasks/src/tasks/types.ts b/packages/backend-tasks/src/tasks/types.ts index dbf2595e1d..6ec5165aec 100644 --- a/packages/backend-tasks/src/tasks/types.ts +++ b/packages/backend-tasks/src/tasks/types.ts @@ -17,7 +17,6 @@ import { HumanDuration } from '@backstage/types'; import { CronTime } from 'cron'; import { Duration } from 'luxon'; -import { AbortSignal } from 'node-abort-controller'; import { z } from 'zod'; /** diff --git a/packages/backend-tasks/src/tasks/util.test.ts b/packages/backend-tasks/src/tasks/util.test.ts index ceeeba14d6..e17cf1ef1f 100644 --- a/packages/backend-tasks/src/tasks/util.test.ts +++ b/packages/backend-tasks/src/tasks/util.test.ts @@ -16,7 +16,6 @@ import knexFactory, { Knex } from 'knex'; import { Duration } from 'luxon'; -import { AbortController } from 'node-abort-controller'; import { delegateAbortController, nowPlus, sleep, validateId } from './util'; class KnexBuilder { diff --git a/packages/backend-tasks/src/tasks/util.ts b/packages/backend-tasks/src/tasks/util.ts index 2561203318..70d67a9fbe 100644 --- a/packages/backend-tasks/src/tasks/util.ts +++ b/packages/backend-tasks/src/tasks/util.ts @@ -17,7 +17,6 @@ import { InputError } from '@backstage/errors'; import { Knex } from 'knex'; import { DateTime, Duration } from 'luxon'; -import { AbortController, AbortSignal } from 'node-abort-controller'; // Keep the IDs compatible with e.g. Prometheus labels export function validateId(id: string) { diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts index a742f63045..86c58b0082 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/engine/IncrementalIngestionEngine.ts @@ -21,7 +21,6 @@ import { IterationEngineOptions, } from '../types'; import { IncrementalIngestionDatabaseManager } from '../database/IncrementalIngestionDatabaseManager'; -import type { AbortSignal } from 'node-abort-controller'; import { performance } from 'perf_hooks'; import { Duration, DurationObjectUnits } from 'luxon'; import { v4 } from 'uuid'; diff --git a/plugins/search-backend-node/package.json b/plugins/search-backend-node/package.json index 8a15127040..0122af5ae3 100644 --- a/plugins/search-backend-node/package.json +++ b/plugins/search-backend-node/package.json @@ -33,7 +33,6 @@ "lodash": "^4.17.21", "lunr": "^2.3.9", "ndjson": "^2.0.0", - "node-abort-controller": "^3.0.1", "uuid": "^8.3.2", "winston": "^3.2.1" }, diff --git a/plugins/search-backend-node/src/Scheduler.ts b/plugins/search-backend-node/src/Scheduler.ts index 82d45df090..39c423263c 100644 --- a/plugins/search-backend-node/src/Scheduler.ts +++ b/plugins/search-backend-node/src/Scheduler.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -import { AbortController } from 'node-abort-controller'; import { Logger } from 'winston'; import { TaskFunction, TaskRunner } from '@backstage/backend-tasks'; diff --git a/yarn.lock b/yarn.lock index bc9afbb479..c41d9800c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3590,7 +3590,6 @@ __metadata: morgan: ^1.10.0 msw: ^0.49.0 mysql2: ^2.2.5 - node-abort-controller: ^3.0.1 node-fetch: ^2.6.7 node-forge: ^1.3.1 raw-body: ^2.4.1 @@ -3654,7 +3653,6 @@ __metadata: knex: ^2.0.0 lodash: ^4.17.21 luxon: ^3.0.0 - node-abort-controller: ^3.0.1 uuid: ^8.0.0 wait-for-expect: ^3.0.2 winston: ^3.2.1 @@ -7676,7 +7674,6 @@ __metadata: lodash: ^4.17.21 lunr: ^2.3.9 ndjson: ^2.0.0 - node-abort-controller: ^3.0.1 uuid: ^8.3.2 winston: ^3.2.1 languageName: unknown From 6eefcb878076ef2324b371c4cf94cd6f369704e1 Mon Sep 17 00:00:00 2001 From: Damon Kaswell Date: Mon, 28 Nov 2022 08:05:22 -0800 Subject: [PATCH 061/269] Typos Signed-off-by: Damon Kaswell --- .../src/database/IncrementalIngestionDatabaseManager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts index 0fd560544d..03a749d70c 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts @@ -463,7 +463,7 @@ export class IncrementalIngestionDatabaseManager { } /** - * Starts the cancel process for the current + * Starts the cancel process for the current ingestion. * @param ingestionId - string * @param message - string (optional) */ @@ -478,7 +478,7 @@ export class IncrementalIngestionDatabaseManager { } /** - * Completes the cancel process and triggers a new + * Completes the cancel process and triggers a new ingestion. * @param ingestionId - string */ async setProviderCanceled(ingestionId: string) { From 02cac8572fdfb801c550d8af25f933daf7b5dd13 Mon Sep 17 00:00:00 2001 From: Amritpal Nagra Date: Mon, 28 Nov 2022 22:00:17 +0530 Subject: [PATCH 062/269] Apply suggestions from code review Co-authored-by: Patrik Oldsberg Signed-off-by: Amritpal Nagra --- docs/tutorials/configuring-plugin-databases.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/configuring-plugin-databases.md b/docs/tutorials/configuring-plugin-databases.md index edbe2dd737..ed550f1801 100644 --- a/docs/tutorials/configuring-plugin-databases.md +++ b/docs/tutorials/configuring-plugin-databases.md @@ -21,7 +21,7 @@ instance or cluster. With infrastructure defined as code or data (Terraform, AWS CloudFormation, etc.), you may have database credentials which lack permissions to create new databases or you do not have control over the database names. In these -instances, you can do [connection configuration per plugin basis] +instances, you can set the database connection configuration on a [per plugin basis] (#connection-configuration-per-plugin). Backstage supports all of these use cases with the `DatabaseManager` provided by From 4dec6f16be04bd8f6005823db876b1f6d13a4dca Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Mon, 28 Nov 2022 13:43:28 -0500 Subject: [PATCH 063/269] feat: add explore-backend plugin Signed-off-by: Andrew Thauer --- .changeset/rude-sloths-cross.md | 8 ++ .../app/src/components/search/SearchModal.tsx | 17 +++ .../app/src/components/search/SearchPage.tsx | 12 ++ packages/backend/package.json | 2 + packages/backend/src/index.ts | 3 + packages/backend/src/plugins/explore.ts | 33 +++++ packages/backend/src/plugins/search.ts | 9 ++ plugins/explore-backend/.eslintrc.js | 1 + plugins/explore-backend/README.md | 93 ++++++++++++++ plugins/explore-backend/api-report.md | 59 +++++++++ plugins/explore-backend/package.json | 46 +++++++ .../src/example/getExampleTools.ts | 44 +++++++ plugins/explore-backend/src/example/tools.ts | 98 +++++++++++++++ plugins/explore-backend/src/index.ts | 30 +++++ plugins/explore-backend/src/run.ts | 33 +++++ .../src/search/ToolDocumentCollatorFactory.ts | 99 +++++++++++++++ plugins/explore-backend/src/search/index.ts | 17 +++ .../src/service/router.test.ts | 66 ++++++++++ plugins/explore-backend/src/service/router.ts | 59 +++++++++ .../src/service/standaloneServer.ts | 67 +++++++++++ plugins/explore-backend/src/service/types.ts | 33 +++++ plugins/explore-backend/src/setupTests.ts | 17 +++ plugins/explore-common/.eslintrc.js | 1 + plugins/explore-common/README.md | 3 + plugins/explore-common/api-report.md | 37 ++++++ plugins/explore-common/package.json | 39 ++++++ plugins/explore-common/src/api.ts | 46 +++++++ plugins/explore-common/src/index.ts | 25 ++++ plugins/explore-common/src/types.ts | 27 +++++ plugins/explore-react/api-report.md | 16 +-- plugins/explore-react/package.json | 3 +- plugins/explore-react/src/tools/api.ts | 31 +++-- plugins/explore/package.json | 4 + plugins/explore/src/api/client.ts | 66 ++++++++++ plugins/explore/src/api/index.ts | 19 +++ plugins/explore/src/api/types.ts | 39 ++++++ .../ToolSearchResultListItem.tsx | 113 ++++++++++++++++++ .../ToolSearchResultListItem/index.ts | 17 +++ plugins/explore/src/components/index.ts | 1 + plugins/explore/src/index.ts | 1 + plugins/explore/src/plugin.ts | 36 ++++-- yarn.lock | 72 +++++++++++ 42 files changed, 1411 insertions(+), 31 deletions(-) create mode 100644 .changeset/rude-sloths-cross.md create mode 100644 packages/backend/src/plugins/explore.ts create mode 100644 plugins/explore-backend/.eslintrc.js create mode 100644 plugins/explore-backend/README.md create mode 100644 plugins/explore-backend/api-report.md create mode 100644 plugins/explore-backend/package.json create mode 100644 plugins/explore-backend/src/example/getExampleTools.ts create mode 100644 plugins/explore-backend/src/example/tools.ts create mode 100644 plugins/explore-backend/src/index.ts create mode 100644 plugins/explore-backend/src/run.ts create mode 100644 plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts create mode 100644 plugins/explore-backend/src/search/index.ts create mode 100644 plugins/explore-backend/src/service/router.test.ts create mode 100644 plugins/explore-backend/src/service/router.ts create mode 100644 plugins/explore-backend/src/service/standaloneServer.ts create mode 100644 plugins/explore-backend/src/service/types.ts create mode 100644 plugins/explore-backend/src/setupTests.ts create mode 100644 plugins/explore-common/.eslintrc.js create mode 100644 plugins/explore-common/README.md create mode 100644 plugins/explore-common/api-report.md create mode 100644 plugins/explore-common/package.json create mode 100644 plugins/explore-common/src/api.ts create mode 100644 plugins/explore-common/src/index.ts create mode 100644 plugins/explore-common/src/types.ts create mode 100644 plugins/explore/src/api/client.ts create mode 100644 plugins/explore/src/api/index.ts create mode 100644 plugins/explore/src/api/types.ts create mode 100644 plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx create mode 100644 plugins/explore/src/components/ToolSearchResultListItem/index.ts diff --git a/.changeset/rude-sloths-cross.md b/.changeset/rude-sloths-cross.md new file mode 100644 index 0000000000..8e22070662 --- /dev/null +++ b/.changeset/rude-sloths-cross.md @@ -0,0 +1,8 @@ +--- +'@backstage/plugin-explore': patch +'@backstage/plugin-explore-backend': patch +'@backstage/plugin-explore-common': patch +'@backstage/plugin-explore-react': patch +--- + +Updated to use new @backstage/plugin-explore-backend diff --git a/packages/app/src/components/search/SearchModal.tsx b/packages/app/src/components/search/SearchModal.tsx index 218ead9b82..2aed970e75 100644 --- a/packages/app/src/components/search/SearchModal.tsx +++ b/packages/app/src/components/search/SearchModal.tsx @@ -25,6 +25,7 @@ import { Paper, useTheme, } from '@material-ui/core'; +import BuildIcon from '@material-ui/icons/Build'; import LaunchIcon from '@material-ui/icons/Launch'; import { CatalogIcon, @@ -38,6 +39,7 @@ import { catalogApiRef, CATALOG_FILTER_EXISTS, } from '@backstage/plugin-catalog-react'; +import { ToolSearchResultListItem } from '@backstage/plugin-explore'; import { searchPlugin, SearchType } from '@backstage/plugin-search'; import { DefaultResultListItem, @@ -110,6 +112,10 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { value: 'techdocs', name: 'Documentation', }, + { + value: 'tools', + name: 'Tools', + }, ]} /> @@ -209,6 +215,17 @@ export const SearchModal = ({ toggleModal }: { toggleModal: () => void }) => { /> ); break; + case 'tools': + resultItem = ( + } + key={document.location} + result={document} + highlight={highlight} + rank={rank} + /> + ); + break; default: resultItem = ( ({ bar: { @@ -155,6 +157,16 @@ const SearchPage = () => { rank={rank} /> ); + case 'tools': + return ( + } + key={document.location} + result={document} + highlight={highlight} + rank={rank} + /> + ); default: return ( createEnv('permission')); const playlistEnv = useHotMemoize(module, () => createEnv('playlist')); const eventsEnv = useHotMemoize(module, () => createEnv('events')); + const exploreEnv = useHotMemoize(module, () => createEnv('explore')); const eventBasedEntityProviders = await catalogEventBasedProviders( catalogEnv, @@ -172,6 +174,7 @@ async function main() { apiRouter.use('/jenkins', await jenkins(jenkinsEnv)); apiRouter.use('/permission', await permission(permissionEnv)); apiRouter.use('/playlist', await playlist(playlistEnv)); + apiRouter.use('/explore', await explore(exploreEnv)); apiRouter.use(notFoundHandler()); const service = createServiceBuilder(module) diff --git a/packages/backend/src/plugins/explore.ts b/packages/backend/src/plugins/explore.ts new file mode 100644 index 0000000000..6793213dd3 --- /dev/null +++ b/packages/backend/src/plugins/explore.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2020 The Backstage Authors + * + * 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. + */ + +import { + createRouter, + getExampleTools, +} from '@backstage/plugin-explore-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + return await createRouter({ + logger: env.logger, + toolProvider: { + getTools: getExampleTools, + }, + }); +} diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 084b1a54e5..0e6982545f 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -16,6 +16,7 @@ import { useHotCleanup } from '@backstage/backend-common'; import { DefaultCatalogCollatorFactory } from '@backstage/plugin-catalog-backend'; +import { ToolDocumentCollatorFactory } from '@backstage/plugin-explore-backend'; import { createRouter } from '@backstage/plugin-search-backend'; import { ElasticSearchSearchEngine } from '@backstage/plugin-search-backend-module-elasticsearch'; import { PgSearchEngine } from '@backstage/plugin-search-backend-module-pg'; @@ -84,6 +85,14 @@ export default async function createPlugin( }), }); + indexBuilder.addCollator({ + schedule, + factory: ToolDocumentCollatorFactory.fromConfig(env.config, { + discovery: env.discovery, + logger: env.logger, + }), + }); + // The scheduler controls when documents are gathered from collators and sent // to the search engine for indexing. const { scheduler } = await indexBuilder.build(); diff --git a/plugins/explore-backend/.eslintrc.js b/plugins/explore-backend/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/explore-backend/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md new file mode 100644 index 0000000000..ed065c19a4 --- /dev/null +++ b/plugins/explore-backend/README.md @@ -0,0 +1,93 @@ +# explore-backend + +Welcome to the explore-backend backend plugin! + +_This plugin was created through the Backstage CLI_ + +## Getting started + +### Install the Package + +```bash +# From your Backstage root directory +yarn add --cwd packages/backend @backstage/plugin-explore-backend +``` + +### Create a ToolProvider + +Create a `ToolProvider` to provide `ExploreTool` objects. + +```ts +import { + GetExploreToolsRequest, + GetExploreToolsResponse, +} from '@backstage/plugin-explore-common'; + +export async function getExploreTools( + request: GetExploreToolsRequest, +): Promise { + const { filter } = request ?? {}; + + // Get tool data from a file or some other source + const toolData = getToolData(); + + // Populate ExploreTool[] objects & use filter to filter them + const tools = [...toolData].filter(filterToolPredicate); + + return { + tools, + }; +} +``` + +**NOTE: You can see the `plugins/explore-backend/src/example/getExampleTools.ts` +as a simple hardcoded example.** + +### Adding the plugin to your `packages/backend` + +You'll need to add the plugin to the router in your `backend` package. You can +do this by creating a file called `packages/backend/src/plugins/explore.ts` + +```ts +import { + createRouter, + getExampleTools, +} from '@backstage/plugin-explore-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; +import { getExploreTools } from '../data/explore'; + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + return await createRouter({ + logger: env.logger, + toolProvider: { + getTools: getExploreTools, + }, + }); +} +``` + +With the `explore.ts` router setup in place, add the router to +`packages/backend/src/index.ts`: + +```diff ++import explore from './plugins/explore'; + +async function main() { + ... + const createEnv = makeCreateEnv(config); + + const catalogEnv = useHotMemoize(module, () => createEnv('catalog')); ++ const exploreEnv = useHotMemoize(module, () => createEnv('explore')); + + const apiRouter = Router(); ++ apiRouter.use('/explore', await explore(exploreEnv)); + ... + apiRouter.use(notFoundHandler()); +``` + +### Wire up the Frontend + +See [the explore plugin README](../explore/README.md) for more information. diff --git a/plugins/explore-backend/api-report.md b/plugins/explore-backend/api-report.md new file mode 100644 index 0000000000..7ab37bb598 --- /dev/null +++ b/plugins/explore-backend/api-report.md @@ -0,0 +1,59 @@ +## API Report File for "@backstage/plugin-explore-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { Config } from '@backstage/config'; +import { DocumentCollatorFactory } from '@backstage/plugin-search-common'; +import { ExploreTool } from '@backstage/plugin-explore-common'; +import express from 'express'; +import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; +import { GetExploreToolsResponse } from '@backstage/plugin-explore-common'; +import { IndexableDocument } from '@backstage/plugin-search-common'; +import { Logger } from 'winston'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { Readable } from 'stream'; + +// Warning: (ae-forgotten-export) The symbol "RouterOptions" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function createRouter(options: RouterOptions): Promise; + +// @public (undocumented) +export interface ExploreToolProvider { + // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen + // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-explore-backend" does not have an export "GetExploreToolsRequest" + // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-explore-backend" does not have an export "GetExploreToolsResponse" + getTools(request: GetExploreToolsRequest): Promise; +} + +// Warning: (tsdoc-undefined-tag) The TSDoc tag "@private" is not defined in this configuration +// Warning: (ae-missing-release-tag) "getExampleTools" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export function getExampleTools( + request: GetExploreToolsRequest, +): Promise; + +// @public +export class ToolDocumentCollatorFactory implements DocumentCollatorFactory { + // Warning: (ae-forgotten-export) The symbol "ToolDocument" needs to be exported by the entry point index.d.ts + // + // (undocumented) + execute(): AsyncGenerator; + // Warning: (ae-forgotten-export) The symbol "ToolDocumentCollatorFactoryOptions" needs to be exported by the entry point index.d.ts + // + // (undocumented) + static fromConfig( + _config: Config, + options: ToolDocumentCollatorFactoryOptions, + ): ToolDocumentCollatorFactory; + // (undocumented) + getCollator(): Promise; + // (undocumented) + readonly type: string; +} +``` diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json new file mode 100644 index 0000000000..17072e261e --- /dev/null +++ b/plugins/explore-backend/package.json @@ -0,0 +1,46 @@ +{ + "name": "@backstage/plugin-explore-backend", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "backend-plugin" + }, + "scripts": { + "start": "backstage-cli package start", + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "dependencies": { + "@backstage/backend-common": "workspace:^", + "@backstage/config": "workspace:^", + "@backstage/plugin-explore-common": "workspace:^", + "@backstage/plugin-search-common": "workspace:^", + "@types/express": "*", + "express": "^4.18.1", + "express-promise-router": "^4.1.0", + "lodash": "^4.17.21", + "node-fetch": "^2.6.7", + "winston": "^3.2.1", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/cli": "workspace:^", + "@types/supertest": "^2.0.8", + "msw": "^0.47.0", + "supertest": "^6.2.4" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/explore-backend/src/example/getExampleTools.ts b/plugins/explore-backend/src/example/getExampleTools.ts new file mode 100644 index 0000000000..8d26c8073a --- /dev/null +++ b/plugins/explore-backend/src/example/getExampleTools.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2020 The Backstage Authors + * + * 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. + */ + +import { + GetExploreToolsRequest, + GetExploreToolsResponse, +} from '@backstage/plugin-explore-common'; +import { intersection, isEmpty } from 'lodash'; +import { exampleTools } from './tools'; + +const anyOf = (prop: T | T[], matches: T[]) => + isEmpty(matches) + ? true + : intersection([...[prop]].flat(), matches)?.length > 0; + +/** + * @private Example only - do not use in production + */ +export async function getExampleTools( + request: GetExploreToolsRequest, +): Promise { + const { filter } = request ?? {}; + const tags = filter?.tags ?? []; + const lifecycles = filter?.lifecycle ?? []; + + return { + tools: exampleTools.filter( + t => anyOf(t.tags ?? [], tags) && anyOf(t.lifecycle ?? [], lifecycles), + ), + }; +} diff --git a/plugins/explore-backend/src/example/tools.ts b/plugins/explore-backend/src/example/tools.ts new file mode 100644 index 0000000000..3726e4c5dd --- /dev/null +++ b/plugins/explore-backend/src/example/tools.ts @@ -0,0 +1,98 @@ +/* + * Copyright 2020 The Backstage Authors + * + * 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. + */ + +import { ExploreTool } from '@backstage/plugin-explore-common'; + +/** + * @private Example only - do not use in production + */ +export const exampleTools: ExploreTool[] = [ + { + title: 'New Relic', + description: + 'Observability platform built to help engineers create and monitor their software', + url: '/newrelic', + image: 'https://i.imgur.com/L37ikrX.jpg', + tags: ['newrelic', 'performance', 'monitoring', 'errors', 'alerting'], + }, + { + title: 'CircleCI', + description: + 'Provides builds overview, detailed build info and retriggering functionality for CircleCI.', + url: '/circleci', + image: 'https://miro.medium.com/max/1200/1*hkTBp22vLAqlIHkrkZHPnw.png', + tags: ['circleci', 'ci', 'dev'], + }, + { + title: 'Sentry', + description: + 'Self-hosted and cloud-based error monitoring that helps software teams discover, triage, and prioritize errors in real-time.', + url: '/sentry', + image: 'https://sentry-brand.storage.googleapis.com/sentry-logo-black.png', + tags: ['sentry', 'monitoring', 'errors'], + }, + { + title: 'Lighthouse', + description: + "Google's Lighthouse tool is a great resource for benchmarking and improving the accessibility, performance, SEO, and best practices of your website.", + url: '/lighthouse', + image: + 'https://raw.githubusercontent.com/GoogleChrome/lighthouse/8b3d7f052b2e64dd857e741d7395647f487697e7/assets/lighthouse-logo.png', + tags: ['web', 'seo', 'accessibility', 'performance'], + }, + { + title: 'Tech Radar', + description: + 'Tech Radar is a list of technologies, complemented by an assessment result, called ring assignment.', + url: '/tech-radar', + image: + 'https://storage.googleapis.com/wf-blogs-engineering-media/2018/09/fe13bb32-wf-tech-radar-hero-1024x597.png', + tags: ['standards', 'landscape'], + }, + { + title: 'Cost Insights', + description: 'Insights into cloud costs for your organization.', + url: '/cost-insights', + image: 'https://cloud.google.com/images/press/logo-cloud.png', + tags: ['cloud', 'finops'], + }, + { + title: 'GraphiQL', + description: + 'Integrates GraphiQL as a tool to browse GraphiQL endpoints inside Backstage.', + url: '/graphiql', + image: + 'https://camo.githubusercontent.com/517398c3fbe0687d3d4dcbe05da82970b882e75a/68747470733a2f2f64337676366c703535716a6171632e636c6f756466726f6e742e6e65742f6974656d732f33413061324e314c3346324f304c3377326e316a2f477261706869514c382e706e673f582d436c6f75644170702d56697369746f722d49643d3433363432', + tags: ['graphql', 'dev'], + }, + { + title: 'GitOps Clusters', + description: + 'Create GitOps-managed clusters with Backstage. Currently supports EKS flavors and profiles like Machine Learning Ops (MLOps)', + url: '/gitops-clusters', + image: 'https://miro.medium.com/max/801/1*R28u8gj-hVdDFISoYqPhrQ.png', + tags: ['gitops', 'dev'], + }, + { + title: 'Rollbar', + description: + 'Error monitoring and crash reporting for agile development and continuous delivery', + url: '/rollbar', + image: + 'https://images.ctfassets.net/cj4mgtttlyx7/4DfiWj9CbuHBi10uWK7JHn/5e94a6c5dbd5d50bdcd8d9e78f88689b/rollbar-seo.png', + tags: ['rollbar', 'monitoring', 'errors'], + }, +]; diff --git a/plugins/explore-backend/src/index.ts b/plugins/explore-backend/src/index.ts new file mode 100644 index 0000000000..af9347377d --- /dev/null +++ b/plugins/explore-backend/src/index.ts @@ -0,0 +1,30 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +/** + * A Backstage plugin for building an exploration page of your software ecosystem + * + * @packageDocumentation + */ + +export * from './search'; +export { createRouter } from './service/router'; +export * from './service/types'; + +/** + * @private Example only - do not use in production + */ +export { getExampleTools } from './example/getExampleTools'; diff --git a/plugins/explore-backend/src/run.ts b/plugins/explore-backend/src/run.ts new file mode 100644 index 0000000000..d945aa13f0 --- /dev/null +++ b/plugins/explore-backend/src/run.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { getRootLogger } from '@backstage/backend-common'; +import yn from 'yn'; +import { startStandaloneServer } from './service/standaloneServer'; + +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; +const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); +const logger = getRootLogger(); + +startStandaloneServer({ port, enableCors, logger }).catch(err => { + logger.error(err); + process.exit(1); +}); + +process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); +}); diff --git a/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts b/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts new file mode 100644 index 0000000000..895eae43be --- /dev/null +++ b/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts @@ -0,0 +1,99 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { + IndexableDocument, + DocumentCollatorFactory, +} from '@backstage/plugin-search-common'; +import { Config } from '@backstage/config'; +import { Readable } from 'stream'; +import { Logger } from 'winston'; +import { ExploreTool } from '@backstage/plugin-explore-common'; +import fetch from 'node-fetch'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; + +/** + * Extended IndexableDocument with explore tool specific properties + * + * @public + */ +export interface ToolDocument extends IndexableDocument, ExploreTool {} + +/** + * The options for the {@link CatalogClient.ToolDocumentCollatorFactory}. + */ +type ToolDocumentCollatorFactoryOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger; +}; + +/** + * Search collator responsible for collecting explore tools to index. + * + * @public + */ +export class ToolDocumentCollatorFactory implements DocumentCollatorFactory { + public readonly type: string = 'tools'; + + private readonly discovery: PluginEndpointDiscovery; + private readonly logger: Logger; + + private constructor(options: ToolDocumentCollatorFactoryOptions) { + this.discovery = options.discovery; + this.logger = options.logger; + } + + static fromConfig( + _config: Config, + options: ToolDocumentCollatorFactoryOptions, + ) { + return new ToolDocumentCollatorFactory(options); + } + + async getCollator() { + return Readable.from(this.execute()); + } + + async *execute(): AsyncGenerator { + this.logger.info('Starting collation of explore tools'); + + const tools = await this.fetchTools(); + + for (const tool of tools) { + yield { + ...tool, + text: tool.description, + location: tool.url, + }; + } + + this.logger.info('Finished collation of explore tools'); + } + + private async fetchTools() { + const baseUrl = await this.discovery.getBaseUrl('explore'); + const response = await fetch(`${baseUrl}/tools`); + + if (!response.ok) { + throw new Error( + `Failed to explore fetch tools, ${response.status}: ${response.statusText}`, + ); + } + + const data = await response.json(); + return data.tools; + } +} diff --git a/plugins/explore-backend/src/search/index.ts b/plugins/explore-backend/src/search/index.ts new file mode 100644 index 0000000000..9201518a3d --- /dev/null +++ b/plugins/explore-backend/src/search/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +export { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory'; diff --git a/plugins/explore-backend/src/service/router.test.ts b/plugins/explore-backend/src/service/router.test.ts new file mode 100644 index 0000000000..6f8a7b1110 --- /dev/null +++ b/plugins/explore-backend/src/service/router.test.ts @@ -0,0 +1,66 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import { + ExploreTool, + GetExploreToolsRequest, +} from '@backstage/plugin-explore-common'; +import express from 'express'; +import request from 'supertest'; + +import { createRouter } from './router'; +import { ExploreToolProvider } from './types'; + +const mockTools: ExploreTool[] = [ + { title: 'Tool 1', url: 'https://example.com/tool1', image: '' }, + { title: 'Tool 2', url: 'https://example.com/tool2', image: '' }, + { title: 'Tool 3', url: 'https://example.com/tool2', image: '' }, +]; + +describe('createRouter', () => { + let app: express.Express; + const toolProvider: ExploreToolProvider = { + getTools: async ({}: GetExploreToolsRequest) => { + return { + tools: mockTools, + }; + }, + }; + + beforeAll(async () => { + const router = await createRouter({ + logger: getVoidLogger(), + toolProvider, + }); + app = express().use(router); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('GET /tools', () => { + it('returns ok', async () => { + const response = await request(app).get('/tools'); + + expect(response.status).toEqual(200); + expect(response.body).toEqual( + expect.objectContaining({ tools: mockTools }), + ); + }); + }); +}); diff --git a/plugins/explore-backend/src/service/router.ts b/plugins/explore-backend/src/service/router.ts new file mode 100644 index 0000000000..22ffcb54c9 --- /dev/null +++ b/plugins/explore-backend/src/service/router.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { errorHandler } from '@backstage/backend-common'; +import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Logger } from 'winston'; +import { ExploreToolProvider } from './types'; + +export interface RouterOptions { + logger: Logger; + toolProvider: ExploreToolProvider; +} + +export async function createRouter( + options: RouterOptions, +): Promise { + const { toolProvider } = options; + + const router = Router(); + router.use(express.json()); + + router.get('/tools', async (request, response) => { + const requestQuery = parseExploreToolRequestQuery(request.query); + const result = await toolProvider.getTools(requestQuery); + response.json(result); + }); + + router.use(errorHandler()); + + return router; +} + +function parseExploreToolRequestQuery( + params: Record, +): GetExploreToolsRequest { + // TODO: Implement proper query parsing for the filters + // Also consider using a `filter` query string like catalog client does + return { + filter: { + tags: [...[(params?.tag as any) ?? []]].flat(), + lifecycle: [...[(params?.lifecycle as any) ?? []]].flat(), + }, + }; +} diff --git a/plugins/explore-backend/src/service/standaloneServer.ts b/plugins/explore-backend/src/service/standaloneServer.ts new file mode 100644 index 0000000000..6cf5852f18 --- /dev/null +++ b/plugins/explore-backend/src/service/standaloneServer.ts @@ -0,0 +1,67 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { createServiceBuilder } from '@backstage/backend-common'; +import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; +import { Server } from 'http'; +import { Logger } from 'winston'; +import { createRouter } from './router'; + +export interface ServerOptions { + port: number; + enableCors: boolean; + logger: Logger; +} + +export async function startStandaloneServer( + options: ServerOptions, +): Promise { + const logger = options.logger.child({ + service: 'explore-backend', + }); + + logger.debug('Starting application server...'); + + const router = await createRouter({ + logger, + toolProvider: { + getTools: async ({}: GetExploreToolsRequest) => { + return { + filter: undefined, + tools: [ + { title: 'Tool 1', url: 'https://example.com/tool1', image: '' }, + { title: 'Tool 2', url: 'https://example.com/tool2', image: '' }, + { title: 'Tool 3', url: 'https://example.com/tool2', image: '' }, + ], + }; + }, + }, + }); + + let service = createServiceBuilder(module) + .setPort(options.port) + .addRouter('/explore-backend', router); + if (options.enableCors) { + service = service.enableCors({ origin: 'http://localhost:3000' }); + } + + return await service.start().catch(err => { + logger.error(err); + process.exit(1); + }); +} + +module.hot?.accept(); diff --git a/plugins/explore-backend/src/service/types.ts b/plugins/explore-backend/src/service/types.ts new file mode 100644 index 0000000000..c2bccaa478 --- /dev/null +++ b/plugins/explore-backend/src/service/types.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { + GetExploreToolsRequest, + GetExploreToolsResponse, +} from '@backstage/plugin-explore-common'; + +/** + * @public + */ +export interface ExploreToolProvider { + /** + * Gets a list of explore tools filtered by the request options. + * + * @param request The request options {@link GetExploreToolsRequest}. + * @returns The response {@link GetExploreToolsResponse}. + */ + getTools(request: GetExploreToolsRequest): Promise; +} diff --git a/plugins/explore-backend/src/setupTests.ts b/plugins/explore-backend/src/setupTests.ts new file mode 100644 index 0000000000..813cdeaae3 --- /dev/null +++ b/plugins/explore-backend/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +export {}; diff --git a/plugins/explore-common/.eslintrc.js b/plugins/explore-common/.eslintrc.js new file mode 100644 index 0000000000..e2a53a6ad2 --- /dev/null +++ b/plugins/explore-common/.eslintrc.js @@ -0,0 +1 @@ +module.exports = require('@backstage/cli/config/eslint-factory')(__dirname); diff --git a/plugins/explore-common/README.md b/plugins/explore-common/README.md new file mode 100644 index 0000000000..dfd99ae24a --- /dev/null +++ b/plugins/explore-common/README.md @@ -0,0 +1,3 @@ +# explore-common + +Shared types for the `explore*` plugins. diff --git a/plugins/explore-common/api-report.md b/plugins/explore-common/api-report.md new file mode 100644 index 0000000000..79cf80186c --- /dev/null +++ b/plugins/explore-common/api-report.md @@ -0,0 +1,37 @@ +## API Report File for "@backstage/plugin-explore-common" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +// @public (undocumented) +export type ExploreTool = { + title: string; + description?: string; + url: string; + image: string; + tags?: string[]; + lifecycle?: string; +}; + +// @public (undocumented) +export type ExploreToolFilter = { + tags?: string[]; + lifecycle?: string[]; +}; + +// @public (undocumented) +export type GetExploreToolsRequest = { + filter?: ExploreToolFilter; +}; + +// @public (undocumented) +export type GetExploreToolsResponse = { + tools: ExploreTool[]; +}; + +// Warnings were encountered during analysis: +// +// src/index.d.ts:2:1 - (ae-misplaced-package-tag) The @packageDocumentation comment must appear at the top of entry point *.d.ts file + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/explore-common/package.json b/plugins/explore-common/package.json new file mode 100644 index 0000000000..6365eca8e5 --- /dev/null +++ b/plugins/explore-common/package.json @@ -0,0 +1,39 @@ +{ + "name": "@backstage/plugin-explore-common", + "description": "Common functionalities for the explore plugin", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "backstage": { + "role": "common-library" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/explore-common" + }, + "keywords": [ + "backstage" + ], + "scripts": { + "build": "backstage-cli package build", + "lint": "backstage-cli package lint", + "test": "backstage-cli package test", + "clean": "backstage-cli package clean", + "prepack": "backstage-cli package prepack", + "postpack": "backstage-cli package postpack" + }, + "devDependencies": { + "@backstage/cli": "workspace:^" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/explore-common/src/api.ts b/plugins/explore-common/src/api.ts new file mode 100644 index 0000000000..256671c1af --- /dev/null +++ b/plugins/explore-common/src/api.ts @@ -0,0 +1,46 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { ExploreTool } from './types'; + +/** + * @public + */ +export type ExploreToolFilter = { + /** + * Filter by a list of tags + */ + tags?: string[]; + + /** + * Filter by a list of lifecycle strings + */ + lifecycle?: string[]; +}; + +/** + * @public + */ +export type GetExploreToolsRequest = { + filter?: ExploreToolFilter; +}; + +/** + * @public + */ +export type GetExploreToolsResponse = { + tools: ExploreTool[]; +}; diff --git a/plugins/explore-common/src/index.ts b/plugins/explore-common/src/index.ts new file mode 100644 index 0000000000..b5721d9f57 --- /dev/null +++ b/plugins/explore-common/src/index.ts @@ -0,0 +1,25 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +/***/ +/** + * Common functionalities for the explore plugin. + * + * @packageDocumentation + */ + +export * from './api'; +export * from './types'; diff --git a/plugins/explore-common/src/types.ts b/plugins/explore-common/src/types.ts new file mode 100644 index 0000000000..25f995f807 --- /dev/null +++ b/plugins/explore-common/src/types.ts @@ -0,0 +1,27 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +/** + * @public + */ +export type ExploreTool = { + title: string; + description?: string; + url: string; + image: string; + tags?: string[]; + lifecycle?: string; +}; diff --git a/plugins/explore-react/api-report.md b/plugins/explore-react/api-report.md index 8a9d2b8b13..61b3cbee2d 100644 --- a/plugins/explore-react/api-report.md +++ b/plugins/explore-react/api-report.md @@ -4,23 +4,17 @@ ```ts import { ApiRef } from '@backstage/core-plugin-api'; +import * as common from '@backstage/plugin-explore-common'; -// @public (undocumented) -export type ExploreTool = { - title: string; - description?: string; - url: string; - image: string; - tags?: string[]; - lifecycle?: string; -}; +// @public @deprecated (undocumented) +export type ExploreTool = common.ExploreTool; -// @public (undocumented) +// @public @deprecated (undocumented) export interface ExploreToolsConfig { // (undocumented) getTools: () => Promise; } -// @public (undocumented) +// @public @deprecated (undocumented) export const exploreToolsConfigRef: ApiRef; ``` diff --git a/plugins/explore-react/package.json b/plugins/explore-react/package.json index 879a00daa9..c20679de78 100644 --- a/plugins/explore-react/package.json +++ b/plugins/explore-react/package.json @@ -32,7 +32,8 @@ "start": "backstage-cli package start" }, "dependencies": { - "@backstage/core-plugin-api": "workspace:^" + "@backstage/core-plugin-api": "workspace:^", + "@backstage/plugin-explore-common": "workspace:^" }, "devDependencies": { "@backstage/cli": "workspace:^", diff --git a/plugins/explore-react/src/tools/api.ts b/plugins/explore-react/src/tools/api.ts index 0fae2ce0fb..32dccfb5dd 100644 --- a/plugins/explore-react/src/tools/api.ts +++ b/plugins/explore-react/src/tools/api.ts @@ -16,22 +16,29 @@ import { createApiRef } from '@backstage/core-plugin-api'; -/** @public */ +/** + * Deprecated types moved to `@backstage/plugin-explore-common` + */ +import * as common from '@backstage/plugin-explore-common'; + +/** + * @deprecated Use ExploreTool from `@backstage/plugin-explore-common` + * @public + */ +export type ExploreTool = common.ExploreTool; + +/** + * @deprecated Use exploreApiRef from `@backstage/plugin-explore` & the `@backstage/plugin-explore-backend` + * @public + */ export const exploreToolsConfigRef = createApiRef({ id: 'plugin.explore.toolsconfig', }); -/** @public */ -export type ExploreTool = { - title: string; - description?: string; - url: string; - image: string; - tags?: string[]; - lifecycle?: string; -}; - -/** @public */ +/** + * @deprecated Use ExploreApi from `@backstage/plugin-explore` & the `@backstage/plugin-explore-backend` + * @public + */ export interface ExploreToolsConfig { getTools: () => Promise; } diff --git a/plugins/explore/package.json b/plugins/explore/package.json index f8388df6e8..cbd8d37932 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -35,8 +35,12 @@ "@backstage/catalog-model": "workspace:^", "@backstage/core-components": "workspace:^", "@backstage/core-plugin-api": "workspace:^", + "@backstage/errors": "workspace:^", "@backstage/plugin-catalog-react": "workspace:^", + "@backstage/plugin-explore-common": "workspace:^", "@backstage/plugin-explore-react": "workspace:^", + "@backstage/plugin-search-common": "workspace:^", + "@backstage/plugin-search-react": "workspace:^", "@backstage/theme": "workspace:^", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", diff --git a/plugins/explore/src/api/client.ts b/plugins/explore/src/api/client.ts new file mode 100644 index 0000000000..56f8dd4167 --- /dev/null +++ b/plugins/explore/src/api/client.ts @@ -0,0 +1,66 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { DiscoveryApi, FetchApi } from '@backstage/core-plugin-api'; +import { ResponseError } from '@backstage/errors'; +import { + GetExploreToolsRequest, + GetExploreToolsResponse, +} from '@backstage/plugin-explore-common'; +import { ExploreApi } from './types'; + +/** + * Default implementation of the ExploreApi. + * + * @public + */ +export class ExploreClient implements ExploreApi { + private readonly discoveryApi: DiscoveryApi; + private readonly fetchApi: FetchApi; + + constructor({ + discoveryApi, + fetchApi, + }: { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; + }) { + this.discoveryApi = discoveryApi; + this.fetchApi = fetchApi; + } + + async getTools( + request: GetExploreToolsRequest = {}, + ): Promise { + const { fetch } = this.fetchApi; + + const filter = request.filter ?? {}; + const baseUrl = await this.discoveryApi.getBaseUrl('explore'); + + const tags = filter?.tags?.map(t => `tag=${encodeURIComponent(t)}`) ?? []; + const lifecycles = + filter?.lifecycle?.map(l => `lifecycle=${encodeURIComponent(l)}`) ?? []; + const query = [...tags, ...lifecycles].join('&'); + + const response = await fetch(`${baseUrl}/tools?${query}`); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return response.json() as Promise; + } +} diff --git a/plugins/explore/src/api/index.ts b/plugins/explore/src/api/index.ts new file mode 100644 index 0000000000..a7ac3aa8c1 --- /dev/null +++ b/plugins/explore/src/api/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +export { ExploreClient } from './client'; +export { exploreApiRef } from './types'; +export type { ExploreApi } from './types'; diff --git a/plugins/explore/src/api/types.ts b/plugins/explore/src/api/types.ts new file mode 100644 index 0000000000..0d9eb4ac07 --- /dev/null +++ b/plugins/explore/src/api/types.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { createApiRef } from '@backstage/core-plugin-api'; +import { + GetExploreToolsRequest, + GetExploreToolsResponse, +} from '@backstage/plugin-explore-common'; + +/** + * Interface for the explore plugin. + * + * @public + */ +export interface ExploreApi { + /** + * Returns a list of explore tools. + * + * @param request - The The request query options + */ + getTools(request?: GetExploreToolsRequest): Promise; +} + +export const exploreApiRef = createApiRef({ + id: 'plugin.explore.service', +}); diff --git a/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx b/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx new file mode 100644 index 0000000000..9084f91507 --- /dev/null +++ b/plugins/explore/src/components/ToolSearchResultListItem/ToolSearchResultListItem.tsx @@ -0,0 +1,113 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import React, { ReactNode } from 'react'; +import { + Box, + Chip, + Divider, + ListItem, + ListItemIcon, + ListItemText, + makeStyles, +} from '@material-ui/core'; +import { Link } from '@backstage/core-components'; +import { useAnalytics } from '@backstage/core-plugin-api'; +import { + IndexableDocument, + ResultHighlight, +} from '@backstage/plugin-search-common'; +import { HighlightedSearchResultText } from '@backstage/plugin-search-react'; + +const useStyles = makeStyles({ + flexContainer: { + flexWrap: 'wrap', + }, + itemText: { + width: '100%', + wordBreak: 'break-all', + marginBottom: '1rem', + }, +}); + +/** + * Props for {@link ToolSearchResultListItem}. + * + * @public + */ +export interface ToolSearchResultListItemProps { + icon?: ReactNode; + result: IndexableDocument; + highlight?: ResultHighlight; + rank?: number; +} + +/** @public */ +export function ToolSearchResultListItem(props: ToolSearchResultListItemProps) { + const result = props.result as any; + + const classes = useStyles(); + const analytics = useAnalytics(); + const handleClick = () => { + analytics.captureEvent('discover', result.title, { + attributes: { to: result.location }, + value: props.rank, + }); + }; + + return ( + + + {props.icon && {props.icon}} +

+ + + + ); +} diff --git a/plugins/explore/src/components/ToolSearchResultListItem/index.ts b/plugins/explore/src/components/ToolSearchResultListItem/index.ts new file mode 100644 index 0000000000..1dfdd64b5b --- /dev/null +++ b/plugins/explore/src/components/ToolSearchResultListItem/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +export * from './ToolSearchResultListItem'; diff --git a/plugins/explore/src/components/index.ts b/plugins/explore/src/components/index.ts index f8fba16910..d3af1b99c2 100644 --- a/plugins/explore/src/components/index.ts +++ b/plugins/explore/src/components/index.ts @@ -16,3 +16,4 @@ export * from './DomainCard'; export * from './ExploreLayout'; +export * from './ToolSearchResultListItem'; diff --git a/plugins/explore/src/index.ts b/plugins/explore/src/index.ts index 04f0240968..24591211f7 100644 --- a/plugins/explore/src/index.ts +++ b/plugins/explore/src/index.ts @@ -20,6 +20,7 @@ * @packageDocumentation */ +export * from './api'; export * from './components'; export * from './extensions'; export { explorePlugin, explorePlugin as plugin } from './plugin'; diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts index a4bb538265..7ea9733054 100644 --- a/plugins/explore/src/plugin.ts +++ b/plugins/explore/src/plugin.ts @@ -16,21 +16,43 @@ import { exploreToolsConfigRef } from '@backstage/plugin-explore-react'; import { catalogEntityRouteRef, exploreRouteRef } from './routes'; -import { exampleTools } from './util/examples'; -import { createApiFactory, createPlugin } from '@backstage/core-plugin-api'; +import { + createApiFactory, + createPlugin, + discoveryApiRef, + fetchApiRef, +} from '@backstage/core-plugin-api'; +import { ExploreClient, exploreApiRef } from './api'; /** @public */ export const explorePlugin = createPlugin({ id: 'explore', apis: [ - // Register a default for exploreToolsConfigRef, you may want to override - // the API locally in your app. + createApiFactory({ + api: exploreApiRef, + deps: { + discoveryApi: discoveryApiRef, + fetchApi: fetchApiRef, + }, + factory: ({ discoveryApi, fetchApi }) => + new ExploreClient({ discoveryApi, fetchApi }), + }), + /** + * @deprecated Use ExploreApi from `@backstage/plugin-explore` instead + * + * Register a default for exploreToolsConfigRef, you may want to override + * the API locally in your app. + */ createApiFactory({ api: exploreToolsConfigRef, - deps: {}, - factory: () => ({ + deps: { + exploreApi: exploreApiRef, + }, + factory: ({ exploreApi }) => ({ async getTools() { - return exampleTools; + // TODO: Can we make this backwards compatible so it works off the static frontend example tools? + // return exampleTools; + return (await exploreApi.getTools()).tools; }, }), }), diff --git a/yarn.lock b/yarn.lock index acb2e147e2..fe3feb9581 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5988,6 +5988,36 @@ __metadata: languageName: unknown linkType: soft +"@backstage/plugin-explore-backend@workspace:^, @backstage/plugin-explore-backend@workspace:plugins/explore-backend": + version: 0.0.0-use.local + resolution: "@backstage/plugin-explore-backend@workspace:plugins/explore-backend" + dependencies: + "@backstage/backend-common": "workspace:^" + "@backstage/cli": "workspace:^" + "@backstage/config": "workspace:^" + "@backstage/plugin-explore-common": "workspace:^" + "@backstage/plugin-search-common": "workspace:^" + "@types/express": "*" + "@types/supertest": ^2.0.8 + express: ^4.18.1 + express-promise-router: ^4.1.0 + lodash: ^4.17.21 + msw: ^0.47.0 + node-fetch: ^2.6.7 + supertest: ^6.2.4 + winston: ^3.2.1 + yn: ^4.0.0 + languageName: unknown + linkType: soft + +"@backstage/plugin-explore-common@workspace:^, @backstage/plugin-explore-common@workspace:plugins/explore-common": + version: 0.0.0-use.local + resolution: "@backstage/plugin-explore-common@workspace:plugins/explore-common" + dependencies: + "@backstage/cli": "workspace:^" + languageName: unknown + linkType: soft + "@backstage/plugin-explore-react@workspace:^, @backstage/plugin-explore-react@workspace:plugins/explore-react": version: 0.0.0-use.local resolution: "@backstage/plugin-explore-react@workspace:plugins/explore-react" @@ -5995,6 +6025,7 @@ __metadata: "@backstage/cli": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" + "@backstage/plugin-explore-common": "workspace:^" "@backstage/test-utils": "workspace:^" "@testing-library/jest-dom": ^5.10.1 "@testing-library/react": ^12.1.3 @@ -6015,9 +6046,13 @@ __metadata: "@backstage/core-components": "workspace:^" "@backstage/core-plugin-api": "workspace:^" "@backstage/dev-utils": "workspace:^" + "@backstage/errors": "workspace:^" "@backstage/plugin-catalog": "workspace:^" "@backstage/plugin-catalog-react": "workspace:^" + "@backstage/plugin-explore-common": "workspace:^" "@backstage/plugin-explore-react": "workspace:^" + "@backstage/plugin-search-common": "workspace:^" + "@backstage/plugin-search-react": "workspace:^" "@backstage/test-utils": "workspace:^" "@backstage/theme": "workspace:^" "@material-ui/core": ^4.12.2 @@ -21866,6 +21901,8 @@ __metadata: "@backstage/plugin-code-coverage-backend": "workspace:^" "@backstage/plugin-events-backend": "workspace:^" "@backstage/plugin-events-node": "workspace:^" + "@backstage/plugin-explore-backend": "workspace:^" + "@backstage/plugin-explore-common": "workspace:^" "@backstage/plugin-graphql-backend": "workspace:^" "@backstage/plugin-jenkins-backend": "workspace:^" "@backstage/plugin-kafka-backend": "workspace:^" @@ -29054,6 +29091,41 @@ __metadata: languageName: node linkType: hard +"msw@npm:^0.47.0": + version: 0.47.4 + resolution: "msw@npm:0.47.4" + dependencies: + "@mswjs/cookies": ^0.2.2 + "@mswjs/interceptors": ^0.17.5 + "@open-draft/until": ^1.0.3 + "@types/cookie": ^0.4.1 + "@types/js-levenshtein": ^1.1.1 + chalk: 4.1.1 + chokidar: ^3.4.2 + cookie: ^0.4.2 + graphql: ^15.0.0 || ^16.0.0 + headers-polyfill: ^3.1.0 + inquirer: ^8.2.0 + is-node-process: ^1.0.1 + js-levenshtein: ^1.1.6 + node-fetch: ^2.6.7 + outvariant: ^1.3.0 + path-to-regexp: ^6.2.0 + statuses: ^2.0.0 + strict-event-emitter: ^0.2.6 + type-fest: ^2.19.0 + yargs: ^17.3.1 + peerDependencies: + typescript: ">= 4.2.x <= 4.8.x" + peerDependenciesMeta: + typescript: + optional: true + bin: + msw: cli/index.js + checksum: 10ff632641d40384d6622abf4df6399e4ae649db0f676b5d1ee2d0a515ec96f33abe9d4fecba08cdba4b2e43255af419da9eefc020d40a7e10669d0906457197 + languageName: node + linkType: hard + "msw@npm:^0.49.0": version: 0.49.1 resolution: "msw@npm:0.49.1" From 3eaa4bdfbcc44a3f710023414cf76ced4db71bc2 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Fri, 4 Nov 2022 05:56:56 -0400 Subject: [PATCH 064/269] update api report & intial package versions Signed-off-by: Andrew Thauer --- plugins/explore-backend/api-report.md | 31 +++++++++---------- plugins/explore-backend/package.json | 2 +- plugins/explore-backend/src/index.ts | 5 ++- .../src/search/ToolDocumentCollatorFactory.ts | 20 ++++++------ plugins/explore-backend/src/search/index.ts | 4 +++ plugins/explore-backend/src/service/index.ts | 19 ++++++++++++ plugins/explore-backend/src/service/router.ts | 6 ++++ plugins/explore-backend/src/service/types.ts | 4 +-- plugins/explore-common/README.md | 2 +- plugins/explore-common/api-report.md | 6 ---- plugins/explore-common/package.json | 2 +- plugins/explore-common/src/index.ts | 1 - 12 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 plugins/explore-backend/src/service/index.ts diff --git a/plugins/explore-backend/api-report.md b/plugins/explore-backend/api-report.md index 7ab37bb598..89dd256cd9 100644 --- a/plugins/explore-backend/api-report.md +++ b/plugins/explore-backend/api-report.md @@ -16,36 +16,29 @@ import { Logger } from 'winston'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { Readable } from 'stream'; -// Warning: (ae-forgotten-export) The symbol "RouterOptions" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public (undocumented) export function createRouter(options: RouterOptions): Promise; // @public (undocumented) export interface ExploreToolProvider { - // Warning: (tsdoc-param-tag-missing-hyphen) The @param block should be followed by a parameter name and then a hyphen - // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-explore-backend" does not have an export "GetExploreToolsRequest" - // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-explore-backend" does not have an export "GetExploreToolsResponse" getTools(request: GetExploreToolsRequest): Promise; } -// Warning: (tsdoc-undefined-tag) The TSDoc tag "@private" is not defined in this configuration -// Warning: (ae-missing-release-tag) "getExampleTools" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// +// @public (undocumented) +export interface RouterOptions { + // (undocumented) + logger: Logger; + // (undocumented) + toolProvider: ExploreToolProvider; +} + // @public -export function getExampleTools( - request: GetExploreToolsRequest, -): Promise; +export interface ToolDocument extends IndexableDocument, ExploreTool {} // @public export class ToolDocumentCollatorFactory implements DocumentCollatorFactory { - // Warning: (ae-forgotten-export) The symbol "ToolDocument" needs to be exported by the entry point index.d.ts - // // (undocumented) execute(): AsyncGenerator; - // Warning: (ae-forgotten-export) The symbol "ToolDocumentCollatorFactoryOptions" needs to be exported by the entry point index.d.ts - // // (undocumented) static fromConfig( _config: Config, @@ -56,4 +49,10 @@ export class ToolDocumentCollatorFactory implements DocumentCollatorFactory { // (undocumented) readonly type: string; } + +// @public +export type ToolDocumentCollatorFactoryOptions = { + discovery: PluginEndpointDiscovery; + logger: Logger; +}; ``` diff --git a/plugins/explore-backend/package.json b/plugins/explore-backend/package.json index 17072e261e..704eb8c7f5 100644 --- a/plugins/explore-backend/package.json +++ b/plugins/explore-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-explore-backend", - "version": "0.1.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-backend/src/index.ts b/plugins/explore-backend/src/index.ts index af9347377d..ca0daaa8c4 100644 --- a/plugins/explore-backend/src/index.ts +++ b/plugins/explore-backend/src/index.ts @@ -21,10 +21,9 @@ */ export * from './search'; -export { createRouter } from './service/router'; -export * from './service/types'; +export * from './service'; /** - * @private Example only - do not use in production + * @internal Example only - do not use in production */ export { getExampleTools } from './example/getExampleTools'; diff --git a/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts b/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts index 895eae43be..dd9872acec 100644 --- a/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts +++ b/plugins/explore-backend/src/search/ToolDocumentCollatorFactory.ts @@ -14,16 +14,16 @@ * limitations under the License. */ -import { - IndexableDocument, - DocumentCollatorFactory, -} from '@backstage/plugin-search-common'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { Config } from '@backstage/config'; +import { ExploreTool } from '@backstage/plugin-explore-common'; +import { + DocumentCollatorFactory, + IndexableDocument, +} from '@backstage/plugin-search-common'; +import fetch from 'node-fetch'; import { Readable } from 'stream'; import { Logger } from 'winston'; -import { ExploreTool } from '@backstage/plugin-explore-common'; -import fetch from 'node-fetch'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; /** * Extended IndexableDocument with explore tool specific properties @@ -33,9 +33,11 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common'; export interface ToolDocument extends IndexableDocument, ExploreTool {} /** - * The options for the {@link CatalogClient.ToolDocumentCollatorFactory}. + * The options for the {@link ToolDocumentCollatorFactory}. + * + * @public */ -type ToolDocumentCollatorFactoryOptions = { +export type ToolDocumentCollatorFactoryOptions = { discovery: PluginEndpointDiscovery; logger: Logger; }; diff --git a/plugins/explore-backend/src/search/index.ts b/plugins/explore-backend/src/search/index.ts index 9201518a3d..70e9414652 100644 --- a/plugins/explore-backend/src/search/index.ts +++ b/plugins/explore-backend/src/search/index.ts @@ -15,3 +15,7 @@ */ export { ToolDocumentCollatorFactory } from './ToolDocumentCollatorFactory'; +export type { + ToolDocument, + ToolDocumentCollatorFactoryOptions, +} from './ToolDocumentCollatorFactory'; diff --git a/plugins/explore-backend/src/service/index.ts b/plugins/explore-backend/src/service/index.ts new file mode 100644 index 0000000000..376a2bb98c --- /dev/null +++ b/plugins/explore-backend/src/service/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +export { createRouter } from './router'; +export type { RouterOptions } from './router'; +export * from './types'; diff --git a/plugins/explore-backend/src/service/router.ts b/plugins/explore-backend/src/service/router.ts index 22ffcb54c9..22b5afbc87 100644 --- a/plugins/explore-backend/src/service/router.ts +++ b/plugins/explore-backend/src/service/router.ts @@ -21,11 +21,17 @@ import Router from 'express-promise-router'; import { Logger } from 'winston'; import { ExploreToolProvider } from './types'; +/** + * @public + */ export interface RouterOptions { logger: Logger; toolProvider: ExploreToolProvider; } +/** + * @public + */ export async function createRouter( options: RouterOptions, ): Promise { diff --git a/plugins/explore-backend/src/service/types.ts b/plugins/explore-backend/src/service/types.ts index c2bccaa478..3870924a50 100644 --- a/plugins/explore-backend/src/service/types.ts +++ b/plugins/explore-backend/src/service/types.ts @@ -26,8 +26,8 @@ export interface ExploreToolProvider { /** * Gets a list of explore tools filtered by the request options. * - * @param request The request options {@link GetExploreToolsRequest}. - * @returns The response {@link GetExploreToolsResponse}. + * @param request - The request options {@link @backstage/plugin-explore-common#GetExploreToolsRequest}. + * @returns The response {@link @backstage/plugin-explore-common#GetExploreToolsResponse}. */ getTools(request: GetExploreToolsRequest): Promise; } diff --git a/plugins/explore-common/README.md b/plugins/explore-common/README.md index dfd99ae24a..7e8c835660 100644 --- a/plugins/explore-common/README.md +++ b/plugins/explore-common/README.md @@ -1,3 +1,3 @@ # explore-common -Shared types for the `explore*` plugins. +Shared types for the `explore` plugin. diff --git a/plugins/explore-common/api-report.md b/plugins/explore-common/api-report.md index 79cf80186c..c9a552267c 100644 --- a/plugins/explore-common/api-report.md +++ b/plugins/explore-common/api-report.md @@ -28,10 +28,4 @@ export type GetExploreToolsRequest = { export type GetExploreToolsResponse = { tools: ExploreTool[]; }; - -// Warnings were encountered during analysis: -// -// src/index.d.ts:2:1 - (ae-misplaced-package-tag) The @packageDocumentation comment must appear at the top of entry point *.d.ts file - -// (No @packageDocumentation comment for this package) ``` diff --git a/plugins/explore-common/package.json b/plugins/explore-common/package.json index 6365eca8e5..b1af0db63c 100644 --- a/plugins/explore-common/package.json +++ b/plugins/explore-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-explore-common", "description": "Common functionalities for the explore plugin", - "version": "0.1.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", diff --git a/plugins/explore-common/src/index.ts b/plugins/explore-common/src/index.ts index b5721d9f57..50a9b9f649 100644 --- a/plugins/explore-common/src/index.ts +++ b/plugins/explore-common/src/index.ts @@ -14,7 +14,6 @@ * limitations under the License. */ -/***/ /** * Common functionalities for the explore plugin. * From ce34320d919f8467bbdd9a58d85f4a643c690059 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Fri, 11 Nov 2022 07:14:43 -0500 Subject: [PATCH 065/269] fix api reports + create StaticExploreToolProvider Signed-off-by: Andrew Thauer --- packages/backend/package.json | 1 - packages/backend/src/plugins/explore.ts | 7 +- plugins/explore-backend/api-report.md | 8 ++ .../src/example/{tools.ts => exampleTools.ts} | 0 plugins/explore-backend/src/index.ts | 3 +- plugins/explore-backend/src/service/index.ts | 1 - .../src/service/router.test.ts | 3 +- plugins/explore-backend/src/service/router.ts | 2 +- plugins/explore-backend/src/tools/index.ts | 18 ++++ .../src/tools/providers.test.ts | 85 +++++++++++++++++++ .../getExampleTools.ts => tools/providers.ts} | 41 ++++++--- .../src/{service => tools}/types.ts | 0 plugins/explore/api-report.md | 46 ++++++++++ plugins/explore/src/api/types.ts | 3 + .../ToolExplorerContent.tsx | 5 ++ yarn.lock | 1 - 16 files changed, 200 insertions(+), 24 deletions(-) rename plugins/explore-backend/src/example/{tools.ts => exampleTools.ts} (100%) create mode 100644 plugins/explore-backend/src/tools/index.ts create mode 100644 plugins/explore-backend/src/tools/providers.test.ts rename plugins/explore-backend/src/{example/getExampleTools.ts => tools/providers.ts} (55%) rename plugins/explore-backend/src/{service => tools}/types.ts (100%) diff --git a/packages/backend/package.json b/packages/backend/package.json index 614de918e0..9b376fab67 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -44,7 +44,6 @@ "@backstage/plugin-events-backend": "workspace:^", "@backstage/plugin-events-node": "workspace:^", "@backstage/plugin-explore-backend": "workspace:^", - "@backstage/plugin-explore-common": "workspace:^", "@backstage/plugin-graphql-backend": "workspace:^", "@backstage/plugin-jenkins-backend": "workspace:^", "@backstage/plugin-kafka-backend": "workspace:^", diff --git a/packages/backend/src/plugins/explore.ts b/packages/backend/src/plugins/explore.ts index 6793213dd3..131f9461fa 100644 --- a/packages/backend/src/plugins/explore.ts +++ b/packages/backend/src/plugins/explore.ts @@ -16,7 +16,8 @@ import { createRouter, - getExampleTools, + exampleTools, + StaticExploreToolProvider, } from '@backstage/plugin-explore-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; @@ -26,8 +27,6 @@ export default async function createPlugin( ): Promise { return await createRouter({ logger: env.logger, - toolProvider: { - getTools: getExampleTools, - }, + toolProvider: StaticExploreToolProvider.fromData(exampleTools), }); } diff --git a/plugins/explore-backend/api-report.md b/plugins/explore-backend/api-report.md index 89dd256cd9..cc112ed3cc 100644 --- a/plugins/explore-backend/api-report.md +++ b/plugins/explore-backend/api-report.md @@ -32,6 +32,14 @@ export interface RouterOptions { toolProvider: ExploreToolProvider; } +// @public +export class StaticExploreToolProvider implements ExploreToolProvider { + // (undocumented) + static fromData(tools: ExploreTool[]): StaticExploreToolProvider; + // (undocumented) + getTools(request: GetExploreToolsRequest): Promise; +} + // @public export interface ToolDocument extends IndexableDocument, ExploreTool {} diff --git a/plugins/explore-backend/src/example/tools.ts b/plugins/explore-backend/src/example/exampleTools.ts similarity index 100% rename from plugins/explore-backend/src/example/tools.ts rename to plugins/explore-backend/src/example/exampleTools.ts diff --git a/plugins/explore-backend/src/index.ts b/plugins/explore-backend/src/index.ts index ca0daaa8c4..a0e7216621 100644 --- a/plugins/explore-backend/src/index.ts +++ b/plugins/explore-backend/src/index.ts @@ -22,8 +22,9 @@ export * from './search'; export * from './service'; +export * from './tools'; /** * @internal Example only - do not use in production */ -export { getExampleTools } from './example/getExampleTools'; +export { exampleTools } from './example/exampleTools'; diff --git a/plugins/explore-backend/src/service/index.ts b/plugins/explore-backend/src/service/index.ts index 376a2bb98c..8727bd620b 100644 --- a/plugins/explore-backend/src/service/index.ts +++ b/plugins/explore-backend/src/service/index.ts @@ -16,4 +16,3 @@ export { createRouter } from './router'; export type { RouterOptions } from './router'; -export * from './types'; diff --git a/plugins/explore-backend/src/service/router.test.ts b/plugins/explore-backend/src/service/router.test.ts index 6f8a7b1110..5fe5b6c6a3 100644 --- a/plugins/explore-backend/src/service/router.test.ts +++ b/plugins/explore-backend/src/service/router.test.ts @@ -21,9 +21,8 @@ import { } from '@backstage/plugin-explore-common'; import express from 'express'; import request from 'supertest'; - +import { ExploreToolProvider } from '../tools'; import { createRouter } from './router'; -import { ExploreToolProvider } from './types'; const mockTools: ExploreTool[] = [ { title: 'Tool 1', url: 'https://example.com/tool1', image: '' }, diff --git a/plugins/explore-backend/src/service/router.ts b/plugins/explore-backend/src/service/router.ts index 22b5afbc87..393736529a 100644 --- a/plugins/explore-backend/src/service/router.ts +++ b/plugins/explore-backend/src/service/router.ts @@ -19,7 +19,7 @@ import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; import express from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; -import { ExploreToolProvider } from './types'; +import { ExploreToolProvider } from '../tools'; /** * @public diff --git a/plugins/explore-backend/src/tools/index.ts b/plugins/explore-backend/src/tools/index.ts new file mode 100644 index 0000000000..7c34ce56b8 --- /dev/null +++ b/plugins/explore-backend/src/tools/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +export { StaticExploreToolProvider } from './providers'; +export type { ExploreToolProvider } from './types'; diff --git a/plugins/explore-backend/src/tools/providers.test.ts b/plugins/explore-backend/src/tools/providers.test.ts new file mode 100644 index 0000000000..7a219e49fd --- /dev/null +++ b/plugins/explore-backend/src/tools/providers.test.ts @@ -0,0 +1,85 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { ExploreTool } from '@backstage/plugin-explore-common'; +import { StaticExploreToolProvider } from './providers'; + +describe('StaticExploreToolProvider', () => { + const tool1: ExploreTool = { + title: 'Tool 1', + image: 'https://example/image.png', + url: 'https://example.com', + lifecycle: 'production', + tags: ['tag1', 'tag2'], + }; + const tool2: ExploreTool = { + ...tool1, + title: 'Tool 2', + lifecycle: 'production', + tags: ['tag1'], + }; + const tool3: ExploreTool = { + ...tool1, + title: 'Tool 3', + lifecycle: 'experimental', + tags: ['tag2'], + }; + const allTools: ExploreTool[] = [tool1, tool2, tool3]; + + describe('getTools', () => { + it('returns a list of all tools', async () => { + const provider = StaticExploreToolProvider.fromData(allTools); + + await expect(provider.getTools({})).resolves.toEqual({ + tools: allTools, + }); + }); + + it.each([ + [['tag1'], [tool1, tool2]], + [['tag2'], [tool1, tool3]], + [[], allTools], + ])( + 'returns % when filtered by tags %', + async (tagFilter, expectedTools) => { + const provider = StaticExploreToolProvider.fromData(allTools); + + await expect( + provider.getTools({ filter: { tags: tagFilter } }), + ).resolves.toEqual({ + tools: expectedTools, + }); + }, + ); + + it.each([ + [['production'], [tool1, tool2]], + [['experimental'], [tool3]], + [[], allTools], + ])( + 'returns % when filtered by lifecycle %', + async (lifecycleFilter, expectedTools) => { + const provider = StaticExploreToolProvider.fromData(allTools); + + await expect( + provider.getTools({ filter: { lifecycle: lifecycleFilter } }), + ).resolves.toEqual({ + tools: expectedTools, + }); + }, + ); + }); +}); diff --git a/plugins/explore-backend/src/example/getExampleTools.ts b/plugins/explore-backend/src/tools/providers.ts similarity index 55% rename from plugins/explore-backend/src/example/getExampleTools.ts rename to plugins/explore-backend/src/tools/providers.ts index 8d26c8073a..7a87824776 100644 --- a/plugins/explore-backend/src/example/getExampleTools.ts +++ b/plugins/explore-backend/src/tools/providers.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * Copyright 2022 The Backstage Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,11 +15,12 @@ */ import { + ExploreTool, GetExploreToolsRequest, GetExploreToolsResponse, } from '@backstage/plugin-explore-common'; import { intersection, isEmpty } from 'lodash'; -import { exampleTools } from './tools'; +import { ExploreToolProvider } from './types'; const anyOf = (prop: T | T[], matches: T[]) => isEmpty(matches) @@ -27,18 +28,32 @@ const anyOf = (prop: T | T[], matches: T[]) => : intersection([...[prop]].flat(), matches)?.length > 0; /** - * @private Example only - do not use in production + * A basic ExploreToolProvider implementation using static data. + * + * @public */ -export async function getExampleTools( - request: GetExploreToolsRequest, -): Promise { - const { filter } = request ?? {}; - const tags = filter?.tags ?? []; - const lifecycles = filter?.lifecycle ?? []; +export class StaticExploreToolProvider implements ExploreToolProvider { + private readonly tools: ExploreTool[]; - return { - tools: exampleTools.filter( + static fromData(tools: ExploreTool[]) { + return new StaticExploreToolProvider(tools); + } + + private constructor(tools: ExploreTool[]) { + this.tools = tools; + } + + async getTools( + request: GetExploreToolsRequest, + ): Promise { + const { filter } = request ?? {}; + const tags = filter?.tags ?? []; + const lifecycles = filter?.lifecycle ?? []; + + const tools = this.tools.filter( t => anyOf(t.tags ?? [], tags) && anyOf(t.lifecycle ?? [], lifecycles), - ), - }; + ); + + return { tools }; + } } diff --git a/plugins/explore-backend/src/service/types.ts b/plugins/explore-backend/src/tools/types.ts similarity index 100% rename from plugins/explore-backend/src/service/types.ts rename to plugins/explore-backend/src/tools/types.ts diff --git a/plugins/explore/api-report.md b/plugins/explore/api-report.md index 9653c0fb63..6151f1ea0e 100644 --- a/plugins/explore/api-report.md +++ b/plugins/explore/api-report.md @@ -5,10 +5,18 @@ ```ts /// +import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; import { default as default_2 } from 'react'; +import { DiscoveryApi } from '@backstage/core-plugin-api'; import { DomainEntity } from '@backstage/catalog-model'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; +import { FetchApi } from '@backstage/core-plugin-api'; +import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; +import { GetExploreToolsResponse } from '@backstage/plugin-explore-common'; +import { IndexableDocument } from '@backstage/plugin-search-common'; +import { ReactNode } from 'react'; +import { ResultHighlight } from '@backstage/plugin-search-common'; import { RouteRef } from '@backstage/core-plugin-api'; import { TabProps } from '@material-ui/core'; @@ -30,6 +38,27 @@ export const DomainExplorerContent: (props: { title?: string | undefined; }) => JSX.Element; +// @public +export interface ExploreApi { + getTools(request?: GetExploreToolsRequest): Promise; +} + +// @public (undocumented) +export const exploreApiRef: ApiRef; + +// @public +export class ExploreClient implements ExploreApi { + constructor({ + discoveryApi, + fetchApi, + }: { + discoveryApi: DiscoveryApi; + fetchApi: FetchApi; + }); + // (undocumented) + getTools(request?: GetExploreToolsRequest): Promise; +} + // @public export const ExploreLayout: { (props: ExploreLayoutProps): JSX.Element; @@ -91,4 +120,21 @@ export type SubRoute = { export const ToolExplorerContent: (props: { title?: string | undefined; }) => JSX.Element; + +// @public (undocumented) +export function ToolSearchResultListItem( + props: ToolSearchResultListItemProps, +): JSX.Element; + +// @public +export interface ToolSearchResultListItemProps { + // (undocumented) + highlight?: ResultHighlight; + // (undocumented) + icon?: ReactNode; + // (undocumented) + rank?: number; + // (undocumented) + result: IndexableDocument; +} ``` diff --git a/plugins/explore/src/api/types.ts b/plugins/explore/src/api/types.ts index 0d9eb4ac07..ef9eb646b7 100644 --- a/plugins/explore/src/api/types.ts +++ b/plugins/explore/src/api/types.ts @@ -34,6 +34,9 @@ export interface ExploreApi { getTools(request?: GetExploreToolsRequest): Promise; } +/** + * @public + */ export const exploreApiRef = createApiRef({ id: 'plugin.explore.service', }); diff --git a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx index 5404c67393..3e26cab857 100644 --- a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx +++ b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx @@ -28,15 +28,20 @@ import { WarningPanel, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; +// import { exploreApiRef } from '../../api'; const Body = () => { const exploreToolsConfigApi = useApi(exploreToolsConfigRef); + // const exploreApi = useApi(exploreApiRef); + const { value: tools, loading, error, } = useAsync(async () => { return await exploreToolsConfigApi.getTools(); + // TODO: Enable the backend ExploreClient + // return (await exploreApi.getTools())?.tools; }, [exploreToolsConfigApi]); if (loading) { diff --git a/yarn.lock b/yarn.lock index fe3feb9581..0f9031d749 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21902,7 +21902,6 @@ __metadata: "@backstage/plugin-events-backend": "workspace:^" "@backstage/plugin-events-node": "workspace:^" "@backstage/plugin-explore-backend": "workspace:^" - "@backstage/plugin-explore-common": "workspace:^" "@backstage/plugin-graphql-backend": "workspace:^" "@backstage/plugin-jenkins-backend": "workspace:^" "@backstage/plugin-kafka-backend": "workspace:^" From 25fe5da05d34ba37aae92a2cc8684712fc196b1c Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Sat, 19 Nov 2022 09:04:42 -0500 Subject: [PATCH 066/269] update explore-backend readme Signed-off-by: Andrew Thauer --- plugins/explore-backend/README.md | 68 ++++++++++++++----------------- 1 file changed, 30 insertions(+), 38 deletions(-) diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md index ed065c19a4..db7d7c7bc6 100644 --- a/plugins/explore-backend/README.md +++ b/plugins/explore-backend/README.md @@ -1,8 +1,9 @@ # explore-backend -Welcome to the explore-backend backend plugin! - -_This plugin was created through the Backstage CLI_ +The `explore-backend` plugin provides a backend service for the Explore plugin. +This allows your organizations tools to be surfaced in the Explore plugin +through an API. It also provides a search collator to make it possible to search +for these tools. ## Getting started @@ -13,36 +14,6 @@ _This plugin was created through the Backstage CLI_ yarn add --cwd packages/backend @backstage/plugin-explore-backend ``` -### Create a ToolProvider - -Create a `ToolProvider` to provide `ExploreTool` objects. - -```ts -import { - GetExploreToolsRequest, - GetExploreToolsResponse, -} from '@backstage/plugin-explore-common'; - -export async function getExploreTools( - request: GetExploreToolsRequest, -): Promise { - const { filter } = request ?? {}; - - // Get tool data from a file or some other source - const toolData = getToolData(); - - // Populate ExploreTool[] objects & use filter to filter them - const tools = [...toolData].filter(filterToolPredicate); - - return { - tools, - }; -} -``` - -**NOTE: You can see the `plugins/explore-backend/src/example/getExampleTools.ts` -as a simple hardcoded example.** - ### Adding the plugin to your `packages/backend` You'll need to add the plugin to the router in your `backend` package. You can @@ -51,20 +22,18 @@ do this by creating a file called `packages/backend/src/plugins/explore.ts` ```ts import { createRouter, - getExampleTools, + StaticExploreToolProvider, } from '@backstage/plugin-explore-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; -import { getExploreTools } from '../data/explore'; +import { exploreTools } from '../path/to/your/exploreTools'; export default async function createPlugin( env: PluginEnvironment, ): Promise { return await createRouter({ logger: env.logger, - toolProvider: { - getTools: getExploreTools, - }, + toolProvider: StaticExploreToolProvider.fromData(exploreTools), }); } ``` @@ -88,6 +57,29 @@ async function main() { apiRouter.use(notFoundHandler()); ``` +### Wire up Search Indexing + +To index explore tools you will need to register the search collator in the +`packages/backend/src/plugins/search.ts` file. + +```diff ++import { ToolDocumentCollatorFactory } from '@backstage/plugin-explore-backend'; + +async function createSearchEngine( + env: PluginEnvironment, +): Promise { + ... ++ indexBuilder.addCollator({ ++ schedule, ++ factory: ToolDocumentCollatorFactory.fromConfig(env.config, { ++ discovery: env.discovery, ++ logger: env.logger, ++ }), ++ }); + ... +} +``` + ### Wire up the Frontend See [the explore plugin README](../explore/README.md) for more information. From ed3e7a1d864bdb1c586e81911ce9623ff5806bc8 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Sat, 19 Nov 2022 10:03:05 -0500 Subject: [PATCH 067/269] make explore client backwards compatible Signed-off-by: Andrew Thauer --- plugins/explore/api-report.md | 3 +++ plugins/explore/src/api/client.ts | 18 +++++++++++++++ .../ToolExplorerContent.tsx | 12 ++++------ plugins/explore/src/plugin.ts | 22 +++++++++++-------- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/plugins/explore/api-report.md b/plugins/explore/api-report.md index 6151f1ea0e..d184ce01a4 100644 --- a/plugins/explore/api-report.md +++ b/plugins/explore/api-report.md @@ -10,6 +10,7 @@ import { BackstagePlugin } from '@backstage/core-plugin-api'; import { default as default_2 } from 'react'; import { DiscoveryApi } from '@backstage/core-plugin-api'; import { DomainEntity } from '@backstage/catalog-model'; +import { ExploreToolsConfig } from '@backstage/plugin-explore-react'; import { ExternalRouteRef } from '@backstage/core-plugin-api'; import { FetchApi } from '@backstage/core-plugin-api'; import { GetExploreToolsRequest } from '@backstage/plugin-explore-common'; @@ -51,9 +52,11 @@ export class ExploreClient implements ExploreApi { constructor({ discoveryApi, fetchApi, + exploreToolsConfig, }: { discoveryApi: DiscoveryApi; fetchApi: FetchApi; + exploreToolsConfig?: ExploreToolsConfig; }); // (undocumented) getTools(request?: GetExploreToolsRequest): Promise; diff --git a/plugins/explore/src/api/client.ts b/plugins/explore/src/api/client.ts index 56f8dd4167..d51b554879 100644 --- a/plugins/explore/src/api/client.ts +++ b/plugins/explore/src/api/client.ts @@ -20,6 +20,7 @@ import { GetExploreToolsRequest, GetExploreToolsResponse, } from '@backstage/plugin-explore-common'; +import { ExploreToolsConfig } from '@backstage/plugin-explore-react'; import { ExploreApi } from './types'; /** @@ -30,21 +31,38 @@ import { ExploreApi } from './types'; export class ExploreClient implements ExploreApi { private readonly discoveryApi: DiscoveryApi; private readonly fetchApi: FetchApi; + // NOTE: This will be removed in the future as it is replaced by the ExploreApi.getTools method + private readonly exploreToolsConfig: ExploreToolsConfig | undefined; + /** + * @remarks The exploreToolsConfig is for backwards compatibility with the exporeToolsConfigRef + * and will be removed in the future. + */ constructor({ discoveryApi, fetchApi, + exploreToolsConfig = undefined, }: { discoveryApi: DiscoveryApi; fetchApi: FetchApi; + exploreToolsConfig?: ExploreToolsConfig; }) { this.discoveryApi = discoveryApi; this.fetchApi = fetchApi; + this.exploreToolsConfig = exploreToolsConfig; } async getTools( request: GetExploreToolsRequest = {}, ): Promise { + // NOTE: This will be removed in the future as it is replaced by the ExploreApi.getTools method + if (this.exploreToolsConfig) { + const tools = await this.exploreToolsConfig.getTools(); + if (tools) { + return { tools }; + } + } + const { fetch } = this.fetchApi; const filter = request.filter ?? {}; diff --git a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx index 3e26cab857..d9cd3a512c 100644 --- a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx +++ b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.tsx @@ -14,7 +14,6 @@ * limitations under the License. */ -import { exploreToolsConfigRef } from '@backstage/plugin-explore-react'; import React from 'react'; import useAsync from 'react-use/lib/useAsync'; import { ToolCard } from '../ToolCard'; @@ -28,21 +27,18 @@ import { WarningPanel, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; -// import { exploreApiRef } from '../../api'; +import { exploreApiRef } from '../../api'; const Body = () => { - const exploreToolsConfigApi = useApi(exploreToolsConfigRef); - // const exploreApi = useApi(exploreApiRef); + const exploreApi = useApi(exploreApiRef); const { value: tools, loading, error, } = useAsync(async () => { - return await exploreToolsConfigApi.getTools(); - // TODO: Enable the backend ExploreClient - // return (await exploreApi.getTools())?.tools; - }, [exploreToolsConfigApi]); + return (await exploreApi.getTools())?.tools; + }, [exploreApi]); if (loading) { return ; diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts index 7ea9733054..b6bf7238e3 100644 --- a/plugins/explore/src/plugin.ts +++ b/plugins/explore/src/plugin.ts @@ -23,6 +23,7 @@ import { fetchApiRef, } from '@backstage/core-plugin-api'; import { ExploreClient, exploreApiRef } from './api'; +import { exampleTools } from './util/examples'; /** @public */ export const explorePlugin = createPlugin({ @@ -33,9 +34,11 @@ export const explorePlugin = createPlugin({ deps: { discoveryApi: discoveryApiRef, fetchApi: fetchApiRef, + exploreToolsConfig: exploreToolsConfigRef, }, - factory: ({ discoveryApi, fetchApi }) => - new ExploreClient({ discoveryApi, fetchApi }), + factory: ({ discoveryApi, fetchApi, exploreToolsConfig }) => + // NOTE: The exploreToolsConfig is for backwards compatibility and will be removed in the future + new ExploreClient({ discoveryApi, fetchApi, exploreToolsConfig }), }), /** * @deprecated Use ExploreApi from `@backstage/plugin-explore` instead @@ -45,14 +48,15 @@ export const explorePlugin = createPlugin({ */ createApiFactory({ api: exploreToolsConfigRef, - deps: { - exploreApi: exploreApiRef, - }, - factory: ({ exploreApi }) => ({ + deps: {}, + factory: () => ({ async getTools() { - // TODO: Can we make this backwards compatible so it works off the static frontend example tools? - // return exampleTools; - return (await exploreApi.getTools()).tools; + // TODO: Determine if this should return undefined or exampleTools + // - `undefined` will enable the explore-backend to be used via the ExploreClient backwards compatibility + // which is likely the desired behavior for anyone that has not yet overriden this API + // return undefined as any; + // - `exampleTools` will disable the explore-backend fetching for users that have not yet overriden this API + return exampleTools; }, }), }), From 2b69088c120a9c8017e1b49c3ad335efe34b075d Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Sun, 20 Nov 2022 09:29:36 -0500 Subject: [PATCH 068/269] add explore client tests & rename files Signed-off-by: Andrew Thauer --- plugins/explore-common/src/index.ts | 3 +- plugins/explore-common/src/{ => tools}/api.ts | 0 plugins/explore-common/src/tools/index.ts | 24 ++++ .../explore-common/src/{ => tools}/types.ts | 0 .../src/api/{types.ts => ExploreApi.ts} | 0 plugins/explore/src/api/ExploreClient.test.ts | 114 ++++++++++++++++++ .../src/api/{client.ts => ExploreClient.ts} | 2 +- plugins/explore/src/api/index.ts | 6 +- .../ToolExplorerContent.test.tsx | 16 ++- 9 files changed, 150 insertions(+), 15 deletions(-) rename plugins/explore-common/src/{ => tools}/api.ts (100%) create mode 100644 plugins/explore-common/src/tools/index.ts rename plugins/explore-common/src/{ => tools}/types.ts (100%) rename plugins/explore/src/api/{types.ts => ExploreApi.ts} (100%) create mode 100644 plugins/explore/src/api/ExploreClient.test.ts rename plugins/explore/src/api/{client.ts => ExploreClient.ts} (98%) diff --git a/plugins/explore-common/src/index.ts b/plugins/explore-common/src/index.ts index 50a9b9f649..d829a62e63 100644 --- a/plugins/explore-common/src/index.ts +++ b/plugins/explore-common/src/index.ts @@ -20,5 +20,4 @@ * @packageDocumentation */ -export * from './api'; -export * from './types'; +export * from './tools'; diff --git a/plugins/explore-common/src/api.ts b/plugins/explore-common/src/tools/api.ts similarity index 100% rename from plugins/explore-common/src/api.ts rename to plugins/explore-common/src/tools/api.ts diff --git a/plugins/explore-common/src/tools/index.ts b/plugins/explore-common/src/tools/index.ts new file mode 100644 index 0000000000..50a9b9f649 --- /dev/null +++ b/plugins/explore-common/src/tools/index.ts @@ -0,0 +1,24 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +/** + * Common functionalities for the explore plugin. + * + * @packageDocumentation + */ + +export * from './api'; +export * from './types'; diff --git a/plugins/explore-common/src/types.ts b/plugins/explore-common/src/tools/types.ts similarity index 100% rename from plugins/explore-common/src/types.ts rename to plugins/explore-common/src/tools/types.ts diff --git a/plugins/explore/src/api/types.ts b/plugins/explore/src/api/ExploreApi.ts similarity index 100% rename from plugins/explore/src/api/types.ts rename to plugins/explore/src/api/ExploreApi.ts diff --git a/plugins/explore/src/api/ExploreClient.test.ts b/plugins/explore/src/api/ExploreClient.test.ts new file mode 100644 index 0000000000..bbec568a09 --- /dev/null +++ b/plugins/explore/src/api/ExploreClient.test.ts @@ -0,0 +1,114 @@ +/* + * Copyright 2022 The Backstage Authors + * + * 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. + */ + +import { + ExploreTool, + GetExploreToolsResponse, +} from '@backstage/plugin-explore-common'; +import { MockFetchApi, setupRequestMockHandlers } from '@backstage/test-utils'; +import { rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { ExploreClient } from './ExploreClient'; + +const server = setupServer(); + +describe('ExploreClient', () => { + setupRequestMockHandlers(server); + + const mockBaseUrl = 'http://backstage/api/explore'; + const discoveryApi = { getBaseUrl: async () => mockBaseUrl }; + const fetchApi = new MockFetchApi(); + + let client: ExploreClient; + beforeEach(() => { + client = new ExploreClient({ discoveryApi, fetchApi }); + }); + + describe('getTools', () => { + const mockTools: ExploreTool[] = [ + { + title: 'Tool 1', + image: 'https://example.com/image.png', + url: 'https://example.com', + }, + { + title: 'Tool 2', + image: 'https://example.com/image.png', + url: 'https://example.com', + }, + ]; + + it('should fetch data from the explore-backend', async () => { + const expectedResponse: GetExploreToolsResponse = { + tools: mockTools, + }; + + server.use( + rest.get(`${mockBaseUrl}/tools`, (_, res, ctx) => + res(ctx.json(expectedResponse)), + ), + ); + + const response = await client.getTools(); + expect(response).toEqual(expectedResponse); + }); + + it('should request explore tools with specific filters', async () => { + const expectedResponse: GetExploreToolsResponse = { + tools: mockTools, + }; + + server.use( + rest.get(`${mockBaseUrl}/tools`, (req, res, ctx) => { + expect(req.url.search).toBe('?tag=a&tag=b&lifecycle=alpha'); + return res(ctx.json(expectedResponse)); + }), + ); + + const response = await client.getTools({ + filter: { tags: ['a', 'b'], lifecycle: ['alpha'] }, + }); + expect(response).toEqual(expectedResponse); + }); + }); + + describe('when using exploreToolsConfig for backwards compatibility', () => { + const mockExploreToolsConfig = { + getTools: jest.fn(), + }; + + beforeEach(() => { + client = new ExploreClient({ + discoveryApi, + fetchApi, + exploreToolsConfig: mockExploreToolsConfig, + }); + }); + + it('should return data from the deprecated api', async () => { + mockExploreToolsConfig.getTools.mockResolvedValue([ + { + title: 'Some Tool', + image: 'https://example.com/image.png', + url: 'https://example.com', + }, + ]); + + await client.getTools(); + expect(mockExploreToolsConfig.getTools).toHaveBeenCalled(); + }); + }); +}); diff --git a/plugins/explore/src/api/client.ts b/plugins/explore/src/api/ExploreClient.ts similarity index 98% rename from plugins/explore/src/api/client.ts rename to plugins/explore/src/api/ExploreClient.ts index d51b554879..e913aeb041 100644 --- a/plugins/explore/src/api/client.ts +++ b/plugins/explore/src/api/ExploreClient.ts @@ -21,7 +21,7 @@ import { GetExploreToolsResponse, } from '@backstage/plugin-explore-common'; import { ExploreToolsConfig } from '@backstage/plugin-explore-react'; -import { ExploreApi } from './types'; +import { ExploreApi } from './ExploreApi'; /** * Default implementation of the ExploreApi. diff --git a/plugins/explore/src/api/index.ts b/plugins/explore/src/api/index.ts index a7ac3aa8c1..387393f231 100644 --- a/plugins/explore/src/api/index.ts +++ b/plugins/explore/src/api/index.ts @@ -14,6 +14,6 @@ * limitations under the License. */ -export { ExploreClient } from './client'; -export { exploreApiRef } from './types'; -export type { ExploreApi } from './types'; +export { ExploreClient } from './ExploreClient'; +export { exploreApiRef } from './ExploreApi'; +export type { ExploreApi } from './ExploreApi'; diff --git a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx index da35c9fa39..f3cca5642f 100644 --- a/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx +++ b/plugins/explore/src/components/ToolExplorerContent/ToolExplorerContent.test.tsx @@ -14,25 +14,23 @@ * limitations under the License. */ -import { - ExploreTool, - exploreToolsConfigRef, -} from '@backstage/plugin-explore-react'; +import { ExploreTool } from '@backstage/plugin-explore-common'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { lightTheme } from '@backstage/theme'; import { ThemeProvider } from '@material-ui/core'; import { waitFor } from '@testing-library/react'; import React from 'react'; +import { exploreApiRef } from '../../api'; import { ToolExplorerContent } from './ToolExplorerContent'; describe('', () => { - const exploreToolsConfigApi: jest.Mocked = { + const exploreApi: jest.Mocked = { getTools: jest.fn(), }; const Wrapper = ({ children }: { children?: React.ReactNode }) => ( - + {children} @@ -63,7 +61,7 @@ describe('', () => { tags: ['standards', 'landscape'], }, ]; - exploreToolsConfigApi.getTools.mockResolvedValue(tools); + exploreApi.getTools.mockResolvedValue({ tools }); const { getByText } = await renderInTestApp( @@ -78,7 +76,7 @@ describe('', () => { }); it('renders a custom title', async () => { - exploreToolsConfigApi.getTools.mockResolvedValue([]); + exploreApi.getTools.mockResolvedValue({ tools: [] }); const { getByText } = await renderInTestApp( @@ -90,7 +88,7 @@ describe('', () => { }); it('renders empty state', async () => { - exploreToolsConfigApi.getTools.mockResolvedValue([]); + exploreApi.getTools.mockResolvedValue({ tools: [] }); const { getByText } = await renderInTestApp( From fb9991e9d280e703db6ea7c804a6fef3b018e114 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Sun, 20 Nov 2022 14:38:10 -0500 Subject: [PATCH 069/269] update explore readmes Signed-off-by: Andrew Thauer --- plugins/explore-backend/README.md | 61 +++++++- plugins/explore-backend/src/tools/index.ts | 4 +- .../StaticExploreToolProvider.test.ts} | 2 +- .../StaticExploreToolProvider.ts} | 2 +- plugins/explore/README.md | 137 +++++++++++------- 5 files changed, 146 insertions(+), 60 deletions(-) rename plugins/explore-backend/src/tools/{providers.test.ts => providers/StaticExploreToolProvider.test.ts} (97%) rename plugins/explore-backend/src/tools/{providers.ts => providers/StaticExploreToolProvider.ts} (97%) diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md index db7d7c7bc6..927cc47fd7 100644 --- a/plugins/explore-backend/README.md +++ b/plugins/explore-backend/README.md @@ -26,7 +26,18 @@ import { } from '@backstage/plugin-explore-backend'; import { Router } from 'express'; import { PluginEnvironment } from '../types'; -import { exploreTools } from '../path/to/your/exploreTools'; + +// List of tools you want to surface in the Explore plugin "Tools" page. +const tools: ExploreTool[] = [ + { + title: 'New Relic', + description:'new relic plugin', + url: '/newrelic', + image: 'https://i.imgur.com/L37ikrX.jpg', + tags: ['newrelic', 'proxy', 'nerdGraph'], + }, + ... +]; export default async function createPlugin( env: PluginEnvironment, @@ -83,3 +94,51 @@ async function createSearchEngine( ### Wire up the Frontend See [the explore plugin README](../explore/README.md) for more information. + +## Explore Tool Customization + +The `explore-backend` uses the `ExploreToolProvider` interface to provide a list +of tools used in your organization and/or within your Backstage instance. This +can be overriden to provide tools from any source. For example you could create +a `CustomExploreToolProvider` that queries an internal for tools in your +`packages/backend/src/plugins/explore.ts` file. + +```ts +import { + createRouter, + StaticExploreToolProvider, +} from '@backstage/plugin-explore-backend'; +import { Router } from 'express'; +import { PluginEnvironment } from '../types'; + +class CustomExploreToolProvider implements ExploreToolProvider { + async getTools( + request: GetExploreToolsRequest, + ): Promise { + const externalTools = await queryExternalTools(request); + + const tools: ExploreTool[] = [ + ...externalTools, + // Backstage Tools + { + title: 'New Relic', + description: 'new relic plugin', + url: '/newrelic', + image: 'https://i.imgur.com/L37ikrX.jpg', + tags: ['newrelic', 'proxy', 'nerdGraph'], + }, + ]; + + return { tools }; + } +} + +export default async function createPlugin( + env: PluginEnvironment, +): Promise { + return await createRouter({ + logger: env.logger, + toolProvider: new CustomExploreToolProvider(), + }); +} +``` diff --git a/plugins/explore-backend/src/tools/index.ts b/plugins/explore-backend/src/tools/index.ts index 7c34ce56b8..5e605e0142 100644 --- a/plugins/explore-backend/src/tools/index.ts +++ b/plugins/explore-backend/src/tools/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { StaticExploreToolProvider } from './providers'; -export type { ExploreToolProvider } from './types'; +export { StaticExploreToolProvider } from './providers/StaticExploreToolProvider'; +export * from './types'; diff --git a/plugins/explore-backend/src/tools/providers.test.ts b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.test.ts similarity index 97% rename from plugins/explore-backend/src/tools/providers.test.ts rename to plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.test.ts index 7a219e49fd..626426eed9 100644 --- a/plugins/explore-backend/src/tools/providers.test.ts +++ b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.test.ts @@ -15,7 +15,7 @@ */ import { ExploreTool } from '@backstage/plugin-explore-common'; -import { StaticExploreToolProvider } from './providers'; +import { StaticExploreToolProvider } from './StaticExploreToolProvider'; describe('StaticExploreToolProvider', () => { const tool1: ExploreTool = { diff --git a/plugins/explore-backend/src/tools/providers.ts b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.ts similarity index 97% rename from plugins/explore-backend/src/tools/providers.ts rename to plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.ts index 7a87824776..ad8bcafada 100644 --- a/plugins/explore-backend/src/tools/providers.ts +++ b/plugins/explore-backend/src/tools/providers/StaticExploreToolProvider.ts @@ -20,7 +20,7 @@ import { GetExploreToolsResponse, } from '@backstage/plugin-explore-common'; import { intersection, isEmpty } from 'lodash'; -import { ExploreToolProvider } from './types'; +import { ExploreToolProvider } from '../types'; const anyOf = (prop: T | T[], matches: T[]) => isEmpty(matches) diff --git a/plugins/explore/README.md b/plugins/explore/README.md index 94ab0984a0..e8bd4446d9 100644 --- a/plugins/explore/README.md +++ b/plugins/explore/README.md @@ -1,42 +1,105 @@ # explore Welcome to the explore plugin! + This plugin helps to visualize the domains and tools in your ecosystem. -## Getting started +## Setup -To install the plugin, add and bind the route in `App.tsx`: +The following sections will help you get the Explore plugin setup and running. -```typescript -import { ExplorePage, explorePlugin } from '@backstage/plugin-explore'; +### Backend -... +You need to setup the +[Explore backend plugin](https://github.com/backstage/backstage/tree/master/plugins/explore-backend) +before you move forward with any of these steps if you haven't already. -bindRoutes({ bind }) { - ... - bind(explorePlugin.externalRoutes, { - catalogEntity: catalogPlugin.routes.catalogEntity, - }); -}, +### Installation -... +Install this plugin: -} /> +```bash +# From your Backstage root directory +yarn --cwd packages/app add @backstage/plugin-explore ``` -And add a link to the sidebar in `Root.tsx`: +### Add the plugin to your `packages/app` -```typescript -import LayersIcon from '@material-ui/icons/Layers'; +Add the root page that the playlist plugin provides to your app. You can choose +any path for the route, but we recommend the following: + +```diff +// packages/app/src/App.tsx ++ import { ExplorePage, explorePlugin } from '@backstage/plugin-explore'; ... - + + } /> + }> + {entityPage} + ++ } /> + ... + +``` + +You may also want to add a link to the playlist page to your application +sidebar: + +```diff +// packages/app/src/components/Root/Root.tsx ++import LayersIcon from '@material-ui/icons/Layers'; + +export const Root = ({ children }: PropsWithChildren<{}>) => ( + + ++ + ... + +``` + +### Use earch result list item for Explore Tools + +When you have your `packages/app/src/components/search/SearchPage.tsx` file +ready to make modifications, add the following code snippet to add the +`ToolSearchResultListItem` when the type of the search results are +`tool`. + +```diff ++import { ToolSearchResultListItem } from '@backstage/plugin-explore'; + +const SearchPage = () => { + ... + + {({ results }) => ( + + {results.map(({ type, document, highlight, rank }) => { + switch (type) { + ... ++ case 'tools': ++ return ( ++ } ++ key={document.location} ++ result={document} ++ highlight={highlight} ++ rank={rank} ++ /> ++ ); + } + })} + + )} + ... + +... ``` ## Customization -Create a custom explore page in `packages/app/src/components/explore/ExplorePage.tsx`. +Create a custom explore page in +`packages/app/src/components/explore/ExplorePage.tsx`. ```tsx import { @@ -68,7 +131,7 @@ export const explorePage = ; Now register the new explore page in `packages/app/src/App.tsx`. ```diff -+ import { explorePage } from './components/explore/ExplorePage'; ++import { explorePage } from './components/explore/ExplorePage'; const routes = ( @@ -79,39 +142,3 @@ const routes = ( ); ``` - -## ToolExplorer Content Customization - -Override the `exploreToolsConfigRef` API in `/packages/app/src/apis.ts`. - -```tsx -import { exploreToolsConfigRef } from '@backstage/plugin-explore-react'; - -export const apis: AnyApiFactory[] = [ - ... - - createApiFactory({ - api: exploreToolsConfigRef, - deps: {}, - factory: () => ({ - async getTools() { - return tools; - }, - /* e.g. tools = [ - { - title: 'New Relic', - description:'new relic plugin, - url: '/newrelic', - image: 'https://i.imgur.com/L37ikrX.jpg', - tags: ['newrelic', 'proxy', 'nerdGraph'], - }, - ] - */ - }), - }), - - .... - -]; - -``` From 8f032ac45000a36ee4bf45096105cee93799707e Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Sun, 20 Nov 2022 15:14:05 -0500 Subject: [PATCH 070/269] update changeset Signed-off-by: Andrew Thauer --- .changeset/rude-sloths-cross.md | 8 +++++++- plugins/explore-backend/README.md | 2 +- plugins/explore/README.md | 2 +- plugins/explore/src/plugin.ts | 6 +++--- 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/.changeset/rude-sloths-cross.md b/.changeset/rude-sloths-cross.md index 8e22070662..8d3fc486e8 100644 --- a/.changeset/rude-sloths-cross.md +++ b/.changeset/rude-sloths-cross.md @@ -5,4 +5,10 @@ '@backstage/plugin-explore-react': patch --- -Updated to use new @backstage/plugin-explore-backend +Added new `@backstage/plugin-explore-backend` & `@backstage/plugin-explore-common` packages. + +This deprecates the `ExploreToolsConfig` API (in `@backstage/plugin-explore-react`) which is replaced by the `ExploreApi` & `ExploreClient`. The list of `ExploreTool` data can now be provided on the backend by either using the supplied `StaticExploreToolProvider` or by implementing a custom `ExploreToolProvider`. See the [explore-backend README](https://github.com/backstage/backstage/blob/master/plugins/explore-backend/README.md) for full details. + +NOTE: Existing installations that have customized the `ExploreToolConfig` will continue to work through the new `ExploreClient`. However, existing data should be migrated over to new `explore-backend` plugin as `ExploreToolConfig` will be removed in the future. + +BREAKING CHANGE: If you have previously installed the `explore` plugin, but not yet customized the `ExploreToolConfig` API in your `packages/app`, this will result in an empty list of tools. diff --git a/plugins/explore-backend/README.md b/plugins/explore-backend/README.md index 927cc47fd7..d1714806f4 100644 --- a/plugins/explore-backend/README.md +++ b/plugins/explore-backend/README.md @@ -99,7 +99,7 @@ See [the explore plugin README](../explore/README.md) for more information. The `explore-backend` uses the `ExploreToolProvider` interface to provide a list of tools used in your organization and/or within your Backstage instance. This -can be overriden to provide tools from any source. For example you could create +can be customized to provide tools from any source. For example you could create a `CustomExploreToolProvider` that queries an internal for tools in your `packages/backend/src/plugins/explore.ts` file. diff --git a/plugins/explore/README.md b/plugins/explore/README.md index e8bd4446d9..0204f34714 100644 --- a/plugins/explore/README.md +++ b/plugins/explore/README.md @@ -59,7 +59,7 @@ export const Root = ({ children }: PropsWithChildren<{}>) => ( ``` -### Use earch result list item for Explore Tools +### Use search result list item for Explore Tools When you have your `packages/app/src/components/search/SearchPage.tsx` file ready to make modifications, add the following code snippet to add the diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts index b6bf7238e3..f1869ae849 100644 --- a/plugins/explore/src/plugin.ts +++ b/plugins/explore/src/plugin.ts @@ -23,7 +23,7 @@ import { fetchApiRef, } from '@backstage/core-plugin-api'; import { ExploreClient, exploreApiRef } from './api'; -import { exampleTools } from './util/examples'; +// import { exampleTools } from './util/examples'; /** @public */ export const explorePlugin = createPlugin({ @@ -54,9 +54,9 @@ export const explorePlugin = createPlugin({ // TODO: Determine if this should return undefined or exampleTools // - `undefined` will enable the explore-backend to be used via the ExploreClient backwards compatibility // which is likely the desired behavior for anyone that has not yet overriden this API - // return undefined as any; + return undefined as any; // - `exampleTools` will disable the explore-backend fetching for users that have not yet overriden this API - return exampleTools; + // return exampleTools; }, }), }), From 03843259b4941b727ffaf07886865617e8076ee6 Mon Sep 17 00:00:00 2001 From: Juan Pablo Garcia Ripa Date: Mon, 28 Nov 2022 20:58:51 +0100 Subject: [PATCH 071/269] add changeset and prettier Signed-off-by: Juan Pablo Garcia Ripa --- .changeset/slow-eggs-grab.md | 8 ++++++++ .changeset/warm-parents-notice.md | 5 +++++ .../repo-tools/src/commands/api-reports/api-extractor.ts | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changeset/slow-eggs-grab.md create mode 100644 .changeset/warm-parents-notice.md diff --git a/.changeset/slow-eggs-grab.md b/.changeset/slow-eggs-grab.md new file mode 100644 index 0000000000..e4c537687f --- /dev/null +++ b/.changeset/slow-eggs-grab.md @@ -0,0 +1,8 @@ +--- +'@backstage/repo-tools': minor +--- + +Api reference documentation improvements + +- breadcrumbs links semantics as code spans +- new `@config` annotation to describe related config keys diff --git a/.changeset/warm-parents-notice.md b/.changeset/warm-parents-notice.md new file mode 100644 index 0000000000..9ea14e2068 --- /dev/null +++ b/.changeset/warm-parents-notice.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-proxy-backend': patch +--- + +Add documentation to de api reference diff --git a/packages/repo-tools/src/commands/api-reports/api-extractor.ts b/packages/repo-tools/src/commands/api-reports/api-extractor.ts index 2b130f50e0..bae62ccc7e 100644 --- a/packages/repo-tools/src/commands/api-reports/api-extractor.ts +++ b/packages/repo-tools/src/commands/api-reports/api-extractor.ts @@ -1037,7 +1037,7 @@ export async function buildDocs({ configuration, text: ' > ', }), - new DocCodeSpanLink({ + new DocCodeSpanLink({ configuration, tagName: '@link', linkText: hierarchyItem.displayName, From f506a945753e5b2a8045bf41a7c5ad602f4e00cb Mon Sep 17 00:00:00 2001 From: Damon Kaswell Date: Mon, 28 Nov 2022 12:25:37 -0800 Subject: [PATCH 072/269] Use last ingestion cycle to generate total Signed-off-by: Damon Kaswell --- .../IncrementalIngestionDatabaseManager.ts | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts index 03a749d70c..fd99f1207d 100644 --- a/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts +++ b/plugins/catalog-backend-module-incremental-ingestion/src/database/IncrementalIngestionDatabaseManager.ts @@ -113,6 +113,25 @@ export class IncrementalIngestionDatabaseManager { }); } + /** + * Finds the last ingestion record for the named provider. + * @param provider - string + * @returns IngestionRecord | undefined + */ + async getPreviousIngestionRecord(provider: string) { + return await this.client.transaction(async tx => { + const record = await tx('ingestions') + .where('provider_name', provider) + .andWhereNot('completion_ticket', 'open') + .first(); + if (!record) { + // This is the first time this entity provider has run. Return the current record. + return await this.getCurrentIngestionRecord(provider); + } + return record; + }); + } + /** * Removes all entries from `ingestion_marks_entities`, `ingestion_marks`, and `ingestions` * for prior ingestions that completed (i.e., have a `completion_ticket` value other than 'open'). @@ -286,16 +305,24 @@ export class IncrementalIngestionDatabaseManager { * @returns All entities to remove for this burst. */ async computeRemoved(provider: string, ingestionId: string) { + const previousIngestion = (await this.getPreviousIngestionRecord( + provider, + )) as IngestionRecord; return await this.client.transaction(async tx => { - const rows = await tx('final_entities') - .count({ total: '*' }) - .join('search', 'search.entity_id', 'final_entities.entity_id') - .where( - 'search.key', - `metadata.annotations.${INCREMENTAL_ENTITY_PROVIDER_ANNOTATION}`, - ) - .andWhere('search.value', provider); - const total = rows.reduce((acc, cur) => acc + (cur.total as number), 0); + let total = 0; + if (previousIngestion.id !== ingestionId) { + const rows = await tx('ingestion_mark_entities') + .count({ total: '*' }) + .join( + 'ingestion_marks', + 'ingestion_marks.id', + 'ingestion_mark_entities.ingestion_mark_id', + ) + .join('ingestions', 'ingestions.id', 'ingestion_marks.ingestion_id') + .where('ingestions.id', previousIngestion.id); + + total = rows.reduce((acc, cur) => acc + (cur.total as number), 0); + } const removed: { entity: string; ref: string }[] = await tx( 'final_entities', ) From 54ba2b70cf9f0ad4e084ba10a9db268c0275bd09 Mon Sep 17 00:00:00 2001 From: Andrew Thauer Date: Mon, 28 Nov 2022 15:20:47 -0500 Subject: [PATCH 073/269] update comment for explore plugin api usage Signed-off-by: Andrew Thauer --- plugins/explore/src/plugin.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/plugins/explore/src/plugin.ts b/plugins/explore/src/plugin.ts index f1869ae849..ab8eedf7ef 100644 --- a/plugins/explore/src/plugin.ts +++ b/plugins/explore/src/plugin.ts @@ -51,12 +51,9 @@ export const explorePlugin = createPlugin({ deps: {}, factory: () => ({ async getTools() { - // TODO: Determine if this should return undefined or exampleTools - // - `undefined` will enable the explore-backend to be used via the ExploreClient backwards compatibility - // which is likely the desired behavior for anyone that has not yet overriden this API + // Returning `undefined` will enable the explore-backend to be used via the ExploreClient. + // If this API has been customized and returns data it will be respected first. return undefined as any; - // - `exampleTools` will disable the explore-backend fetching for users that have not yet overriden this API - // return exampleTools; }, }), }), From 8ec75c5082d028f05fac9927b264061f13ded104 Mon Sep 17 00:00:00 2001 From: ch-enfuse Date: Mon, 28 Nov 2022 13:07:25 -0800 Subject: [PATCH 074/269] Fix iconUrl for azure-spring-apps plugin Signed-off-by: ch-enfuse --- microsite/data/plugins/azure-spring-apps.yml | 2 +- microsite/static/img/azure-spring-apps.png | Bin 65289 -> 0 bytes microsite/static/img/enfuse.png | Bin 0 -> 144895 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 microsite/static/img/azure-spring-apps.png create mode 100644 microsite/static/img/enfuse.png diff --git a/microsite/data/plugins/azure-spring-apps.yml b/microsite/data/plugins/azure-spring-apps.yml index cefb0e2824..5b41885ac4 100644 --- a/microsite/data/plugins/azure-spring-apps.yml +++ b/microsite/data/plugins/azure-spring-apps.yml @@ -5,6 +5,6 @@ authorUrl: https://enfuse.io/ category: Discovery description: Easily view your Azure Spring Apps service resources documentation: https://github.com/enfuse/asae-backstage-plugin/blob/main/README.md -iconUrl: img/azure-spring-apps.png +iconUrl: img/enfuse.png npmPackageName: '@enfuse/plugin-azure-spring-apps' addedDate: '2022-11-21' diff --git a/microsite/static/img/azure-spring-apps.png b/microsite/static/img/azure-spring-apps.png deleted file mode 100644 index 26a758c3d2d72bef8880843cf13d90866a201903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65289 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 #1bf*uJn_-`SHDu1d&m{ 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 F{6B9k*O&kR diff --git a/microsite/static/img/enfuse.png b/microsite/static/img/enfuse.png new file mode 100644 index 0000000000000000000000000000000000000000..42124a4a246abc25606805d591f6d2b5cc1b94ce GIT binary patch literal 144895 zcmcF~cQ{*b__sumgc31IYXm{4)~r!QVkT;Dtv#ZYT9qobsZETwRP9Y`rS>YND5|Qd ztwm`ON^Mo%e1Grn@AtnqS8|<`bIx_nb3e~LKKJLoPrQ+V&IRZtC=CtG1sqn>goXx4 z-38Ks|Jwv#(s)hXKzy*){xmeqyZ`+FJf_(d@Gj*w z%QpT#>V8#q|E>WXL41Q(5;-_OzaC7W#Kl`T2?Ij5*0*lpR}WP)%s;`Wju4Ww>4@4} z*+X~bE+wm~_59D~*8l&_h2n9yktMe@?qpT&|JT$0yG{=;cj8G`JbqX1MB;jqc5xVY zV!jsjShG7vc{)>4WW8t!npZj=|7q@Dll$@nie!T8krQG0xja+7eq zX#DuE39{6skTy?}=zqua>qqbIao?rhd``z8WwRD#p zHKBMF91~L2i@>!beY(fhdl74Z36tRw`6bXPdSvCAc*zLBM2P~Q>)I%9qFcH zF6ywm-~7+zchbFZ9Ru>;Ro(`pqg$Mn4?T6FsbjdjYn*<>HTyUTNxkt4nT+vYqD#EH z1~Nts&I`B&$O5aH-*(1#m4+5)0A7?Kd=RZEHJFfmgC5FQjYRfWI1vOa3pt$FwE~EuFGR5<=X1h#3$AN9j4!;eAY*xQ(zFf#Tan>=Y35l@aAx zGzAPyU^Ahp8J^rOLj!I8arR}Wm!bM+&4_fkE$lFwKHLxz20E`ZfsVuywmXE5|- z1wdj1F@hG#_5|Ye> z4@|-lKn%Eaf9*J_Jq#yRZrC=Wq$|I;6WMAMYcLLsR zrc++>#)3ng-a0u*V+kV&iHl-sFtbF13lF0sBl^(7LZmjlxTtXnT28+hIx)Xc@7mkuUv#2JQIOFS4JTWG=jauV}PyX>s8jRJX)=Ds^ZrOJSwq}LxlAG_sph7T8C1xZqFh5EK05{v3;wÐ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

QBQ5Ki(#e!yT05b@be(Nb)(I0Q@$zT*sK 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%0A($ZCIgZIvFDiin+C0 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 Date: Fri, 25 Nov 2022 12:15:27 -0800 Subject: [PATCH 075/269] chore: remove addition of numberOfResults from PgSearchEngine Signed-off-by: Phil Berryman --- .changeset/dry-melons-listen.md | 1 - .../src/PgSearchEngine/PgSearchEngine.test.ts | 3 --- .../src/PgSearchEngine/PgSearchEngine.ts | 3 +-- .../components/SearchTracker/SearchTracker.tsx | 16 +++++++++++++--- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/.changeset/dry-melons-listen.md b/.changeset/dry-melons-listen.md index 1e09619060..07342fb88e 100644 --- a/.changeset/dry-melons-listen.md +++ b/.changeset/dry-melons-listen.md @@ -2,7 +2,6 @@ '@backstage/plugin-search-backend': minor '@backstage/plugin-search-backend-module-elasticsearch': minor '@backstage/plugin-search-backend-node': minor -'@backstage/plugin-search-backend-module-pg': minor --- numberOfResults is now provided alongside the query result diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts index c1d73c618d..23f8983074 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.test.ts @@ -231,7 +231,6 @@ describe('PgSearchEngine', () => { }, ], nextPageCursor: undefined, - numberOfResults: 1, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { @@ -289,7 +288,6 @@ describe('PgSearchEngine', () => { }, })), nextPageCursor: 'MQ==', - numberOfResults: 30, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { @@ -350,7 +348,6 @@ describe('PgSearchEngine', () => { })) .slice(25), previousPageCursor: 'MA==', - numberOfResults: 5, }); expect(database.transaction).toHaveBeenCalledTimes(1); expect(database.query).toHaveBeenCalledWith(tx, { diff --git a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts index b0e8d0c6d2..f53c433c2f 100644 --- a/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts +++ b/plugins/search-backend-module-pg/src/PgSearchEngine/PgSearchEngine.ts @@ -194,7 +194,6 @@ export class PgSearchEngine implements SearchEngine { const previousPageCursor = hasPreviousPage ? encodePageCursor({ page: page - 1 }) : undefined; - const numberOfResults = rows.length; const results = pageRows.map( ({ type, document, highlight }, index): IndexableResult => ({ @@ -216,7 +215,7 @@ export class PgSearchEngine implements SearchEngine { }), ); - return { results, nextPageCursor, previousPageCursor, numberOfResults }; + return { results, nextPageCursor, previousPageCursor }; } } diff --git a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx index 3b758a0c47..b19af6eef8 100644 --- a/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx +++ b/plugins/search-react/src/components/SearchTracker/SearchTracker.tsx @@ -17,24 +17,34 @@ import React, { useEffect } from 'react'; import { useAnalytics } from '@backstage/core-plugin-api'; import { useSearch } from '../../context'; +import usePrevious from 'react-use/lib/usePrevious'; /** * Capture search event on term change. */ export const TrackSearch = ({ children }: { children: React.ReactChild }) => { + const useHasChanged = (value: any) => { + const previousVal = usePrevious(value); + return previousVal !== value; + }; + const analytics = useAnalytics(); const { term, result } = useSearch(); const numberOfResults = result.value?.numberOfResults ?? undefined; + // Stops the analtyics event from firing before the new search engine response is returned + const hasStartedLoading = useHasChanged(result.loading); + const hasFinishedLoading = hasStartedLoading && !result.loading; + useEffect(() => { - if (term) { - // Capture analytics search event with search term provided as value + if (term && hasFinishedLoading) { + // Capture analytics search event with search term and numberOfResults (provided as value) analytics.captureEvent('search', term, { value: numberOfResults, }); } - }, [analytics, term, numberOfResults]); + }, [analytics, term, numberOfResults, hasFinishedLoading]); return <>{children}; }; From 8ba66bd0ac044759e1ca70ba4566cfbe1af9897b Mon Sep 17 00:00:00 2001 From: Gustaf Lundh Date: Sun, 20 Nov 2022 22:53:31 +0100 Subject: [PATCH 076/269] Fixed review comments * Now we don't react on external changes to the query kindParameter * Casing is always correct (APIs instead of Apis etc) Signed-off-by: Gustaf Lundh --- .changeset/brave-bags-sniff.md | 1 + .changeset/neat-lies-know.md | 2 +- plugins/catalog-react/api-report.md | 6 ++ .../EntityKindPicker.test.tsx | 62 ++++--------------- .../EntityKindPicker/EntityKindPicker.tsx | 12 +--- plugins/catalog-react/src/index.ts | 2 +- plugins/catalog-react/src/utils/index.ts | 2 +- .../src/utils/kindFilterUtils.ts | 43 +++++++------ .../CatalogKindHeader.test.tsx | 38 +----------- .../CatalogKindHeader/CatalogKindHeader.tsx | 12 +--- 10 files changed, 51 insertions(+), 129 deletions(-) diff --git a/.changeset/brave-bags-sniff.md b/.changeset/brave-bags-sniff.md index 2608ca7f1e..3fa542a4e3 100644 --- a/.changeset/brave-bags-sniff.md +++ b/.changeset/brave-bags-sniff.md @@ -3,3 +3,4 @@ --- Fixes in kind selectors (now OwnershipCards work again) +EntityKindPicker now accepts an optional allowedKinds prop, just like CatalogKindHeader. diff --git a/.changeset/neat-lies-know.md b/.changeset/neat-lies-know.md index cb355c638f..01fc002668 100644 --- a/.changeset/neat-lies-know.md +++ b/.changeset/neat-lies-know.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-catalog-react': minor +'@backstage/plugin-catalog-react': patch --- Cleanup and small fixes for the kind selector diff --git a/plugins/catalog-react/api-report.md b/plugins/catalog-react/api-report.md index ea67702c9b..91c57c3498 100644 --- a/plugins/catalog-react/api-report.md +++ b/plugins/catalog-react/api-report.md @@ -432,6 +432,9 @@ export type FavoriteEntityProps = ComponentProps & { entity: Entity; }; +// Warning: (tsdoc-undefined-tag) The TSDoc tag "@private" is not defined in this configuration +// Warning: (ae-missing-release-tag) "filterAndCapitalize" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// // @public export function filterAndCapitalize( allKinds: string[], @@ -511,6 +514,9 @@ export type UnregisterEntityDialogProps = { entity: Entity; }; +// Warning: (tsdoc-undefined-tag) The TSDoc tag "@private" is not defined in this configuration +// Warning: (ae-missing-release-tag) "useAllKinds" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// // @public export function useAllKinds(): { loading: boolean; diff --git a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx index 784580b636..04d8df3d16 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx +++ b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.test.tsx @@ -148,21 +148,21 @@ describe('', () => { }); it('renders unknown kinds provided in query parameters', async () => { - const rendered = await renderWithEffects( + await renderWithEffects( , ); - expect(rendered.getByText('Frob')).toBeInTheDocument(); + expect(screen.getByText('FROb')).toBeInTheDocument(); }); it('limits kinds when allowedKinds is set', async () => { - const rendered = await renderWithEffects( + await renderWithEffects( @@ -170,56 +170,20 @@ describe('', () => { , ); - const input = rendered.getByTestId('select'); + const input = screen.getByTestId('select'); fireEvent.click(input); expect( - rendered.getByRole('option', { name: 'Component' }), + screen.getByRole('option', { name: 'Component' }), ).toBeInTheDocument(); + expect(screen.getByRole('option', { name: 'Domain' })).toBeInTheDocument(); expect( - rendered.getByRole('option', { name: 'Domain' }), - ).toBeInTheDocument(); - expect( - rendered.queryByRole('option', { name: 'Template' }), + screen.queryByRole('option', { name: 'Template' }), ).not.toBeInTheDocument(); }); - it('responds to external queryParameters changes', async () => { - const updateFilters = jest.fn(); - const rendered = await renderWithEffects( - - - - - , - ); - expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('component'), - }); - rendered.rerender( - - - - - , - ); - expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('domain'), - }); - }); - it('renders kind from the query parameter even when not in allowedKinds', async () => { - const rendered = await renderWithEffects( + await renderWithEffects( ', () => { , ); - expect(rendered.getByText('Frob')).toBeInTheDocument(); + expect(screen.getByText('Frob')).toBeInTheDocument(); - const input = rendered.getByTestId('select'); + const input = screen.getByTestId('select'); fireEvent.click(input); - expect( - rendered.getByRole('option', { name: 'Domain' }), - ).toBeInTheDocument(); + expect(screen.getByRole('option', { name: 'Domain' })).toBeInTheDocument(); }); }); diff --git a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx index 89313790f5..b0d1565cfb 100644 --- a/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx +++ b/plugins/catalog-react/src/components/EntityKindPicker/EntityKindPicker.tsx @@ -20,7 +20,7 @@ import { Box } from '@material-ui/core'; import React, { useEffect, useMemo, useState } from 'react'; import { EntityKindFilter } from '../../filters'; import { useEntityList } from '../../hooks'; -import { filterAndCapitalize, useAllKinds } from '../../utils/kindFilterUtils'; +import { filterKinds, useAllKinds } from '../../utils/kindFilterUtils'; function useEntityKindFilter(opts: { initialFilter: string }): { loading: boolean; @@ -58,14 +58,6 @@ function useEntityKindFilter(opts: { initialFilter: string }): { }); }, [selectedKind, updateFilters]); - // Set selected kinds on query parameter updates; this happens at initial page load and from - // external updates to the page location. - useEffect(() => { - if (queryParamKind) { - setSelectedKind(queryParamKind); - } - }, [queryParamKind]); - const { allKinds, loading, error } = useAllKinds(); return { @@ -114,7 +106,7 @@ export const EntityKindPicker = (props: EntityKindPickerProps) => { if (error) return null; - const options = filterAndCapitalize(allKinds, allowedKinds, [selectedKind]); + const options = filterKinds(allKinds, allowedKinds, selectedKind); const items = Object.keys(options).map(key => ({ value: key, diff --git a/plugins/catalog-react/src/index.ts b/plugins/catalog-react/src/index.ts index 783b9c1959..de8b32282a 100644 --- a/plugins/catalog-react/src/index.ts +++ b/plugins/catalog-react/src/index.ts @@ -36,6 +36,6 @@ export { getEntitySourceLocation, isOwnerOf, useAllKinds, - filterAndCapitalize, + filterKinds, } from './utils'; export type { EntitySourceLocation } from './utils'; diff --git a/plugins/catalog-react/src/utils/index.ts b/plugins/catalog-react/src/utils/index.ts index 197eff3a55..8262d1cc81 100644 --- a/plugins/catalog-react/src/utils/index.ts +++ b/plugins/catalog-react/src/utils/index.ts @@ -18,4 +18,4 @@ export { getEntityRelations } from './getEntityRelations'; export { getEntitySourceLocation } from './getEntitySourceLocation'; export type { EntitySourceLocation } from './getEntitySourceLocation'; export { isOwnerOf } from './isOwnerOf'; -export { useAllKinds, filterAndCapitalize } from './kindFilterUtils'; +export { useAllKinds, filterKinds } from './kindFilterUtils'; diff --git a/plugins/catalog-react/src/utils/kindFilterUtils.ts b/plugins/catalog-react/src/utils/kindFilterUtils.ts index 939c7296dd..a0441db33f 100644 --- a/plugins/catalog-react/src/utils/kindFilterUtils.ts +++ b/plugins/catalog-react/src/utils/kindFilterUtils.ts @@ -15,14 +15,12 @@ */ import { useApi } from '@backstage/core-plugin-api'; -import { capitalize } from '@material-ui/core'; import useAsync from 'react-use/lib/useAsync'; import { catalogApiRef } from '../api'; /** * Fetch and return all availible kinds. - * - * @public + * @internal */ export function useAllKinds(): { loading: boolean; @@ -48,35 +46,40 @@ export function useAllKinds(): { /** * Filter and capitalize accessible kinds. * - * @public + * @internal */ -export function filterAndCapitalize( +export function filterKinds( allKinds: string[], allowedKinds?: string[], - forcedKinds?: string[], + forcedKinds?: string, ): Record { // Before allKinds is loaded, or when a kind is entered manually in the URL, selectedKind may not // be present in allKinds. It should still be shown in the dropdown, but may not have the nice // enforced casing from the catalog-backend. This makes a key/value record for the Select options, // including selectedKind if it's unknown - but allows the selectedKind to get clobbered by the // more proper catalog kind if it exists. - const availableKinds = allKinds - .concat(forcedKinds ?? []) - .filter(k => - allowedKinds - ? allowedKinds.some( - a => a.toLocaleLowerCase('en-US') === k.toLocaleLowerCase('en-US'), - ) || - forcedKinds?.some( - f => f.toLocaleLowerCase('en-US') === k.toLocaleLowerCase('en-US'), - ) - : true, + let availableKinds = allKinds; + if (allowedKinds) { + availableKinds = availableKinds.filter(k => + allowedKinds.some( + a => a.toLocaleLowerCase('en-US') === k.toLocaleLowerCase('en-US'), + ), ); + } + if ( + forcedKinds && + !allKinds.some( + a => + a.toLocaleLowerCase('en-US') === forcedKinds.toLocaleLowerCase('en-US'), + ) + ) { + availableKinds = availableKinds.concat([forcedKinds]); + } - const capitalizedKinds = availableKinds.sort().reduce((acc, kind) => { - acc[kind.toLocaleLowerCase('en-US')] = capitalize(kind); + const kindsMap = availableKinds.sort().reduce((acc, kind) => { + acc[kind.toLocaleLowerCase('en-US')] = kind; return acc; }, {} as Record); - return capitalizedKinds; + return kindsMap; } diff --git a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx index 9f68252ca7..acff9e3cda 100644 --- a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx +++ b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.test.tsx @@ -105,14 +105,14 @@ describe('', () => { await renderWithEffects( , ); - expect(screen.getByText('Frobs')).toBeInTheDocument(); + expect(screen.getByText('FRObs')).toBeInTheDocument(); }); it('updates the kind filter', async () => { @@ -136,40 +136,6 @@ describe('', () => { }); }); - it('responds to external queryParameters changes', async () => { - const updateFilters = jest.fn(); - const rendered = await renderWithEffects( - - - - - , - ); - expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('components'), - }); - rendered.rerender( - - - - - , - ); - expect(updateFilters).toHaveBeenLastCalledWith({ - kind: new EntityKindFilter('template'), - }); - }); - it('limits kinds when allowedKinds is set', async () => { await renderWithEffects( diff --git a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx index 7de842abe6..5a69f89106 100644 --- a/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx +++ b/plugins/catalog/src/components/CatalogKindHeader/CatalogKindHeader.tsx @@ -25,7 +25,7 @@ import { } from '@material-ui/core'; import { EntityKindFilter, - filterAndCapitalize, + filterKinds, useAllKinds, useEntityList, } from '@backstage/plugin-catalog-react'; @@ -90,15 +90,7 @@ export function CatalogKindHeader(props: CatalogKindHeaderProps) { }); }, [selectedKind, updateFilters]); - // Set selected Kind on query parameter updates; this happens at initial page load and from - // external updates to the page location. - useEffect(() => { - if (queryParamKind) { - setSelectedKind(queryParamKind); - } - }, [queryParamKind]); - - const options = filterAndCapitalize(allKinds, allowedKinds, [selectedKind]); + const options = filterKinds(allKinds, allowedKinds, selectedKind); return ( - + ); } diff --git a/packages/core-components/src/components/Select/static/ClosedDropdown.tsx b/packages/core-components/src/components/Select/static/ClosedDropdown.tsx index 7b0516d017..812afe34eb 100644 --- a/packages/core-components/src/components/Select/static/ClosedDropdown.tsx +++ b/packages/core-components/src/components/Select/static/ClosedDropdown.tsx @@ -21,11 +21,11 @@ import SvgIcon from '@material-ui/core/SvgIcon'; export type ClosedDropdownClassKey = 'icon'; const useStyles = makeStyles( - () => + theme => createStyles({ icon: { position: 'absolute', - right: '4px', + right: theme.spacing(0.5), pointerEvents: 'none', }, }), diff --git a/packages/core-components/src/components/Select/static/OpenedDropdown.tsx b/packages/core-components/src/components/Select/static/OpenedDropdown.tsx index 617288ded6..b87a00c26a 100644 --- a/packages/core-components/src/components/Select/static/OpenedDropdown.tsx +++ b/packages/core-components/src/components/Select/static/OpenedDropdown.tsx @@ -20,11 +20,11 @@ import SvgIcon from '@material-ui/core/SvgIcon'; export type OpenedDropdownClassKey = 'icon'; const useStyles = makeStyles( - () => + theme => createStyles({ icon: { position: 'absolute', - right: '4px', + right: theme.spacing(0.5), pointerEvents: 'none', }, }), diff --git a/packages/core-components/src/components/SimpleStepper/SimpleStepperFooter.tsx b/packages/core-components/src/components/SimpleStepper/SimpleStepperFooter.tsx index 0f7d604eb0..224b66533a 100644 --- a/packages/core-components/src/components/SimpleStepper/SimpleStepperFooter.tsx +++ b/packages/core-components/src/components/SimpleStepper/SimpleStepperFooter.tsx @@ -13,11 +13,13 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useContext, ReactNode, PropsWithChildren } from 'react'; -import { makeStyles } from '@material-ui/core/styles'; +import Box from '@material-ui/core/Box'; import Button from '@material-ui/core/Button'; -import { StepActions } from './types'; +import { makeStyles } from '@material-ui/core/styles'; +import React, { PropsWithChildren, ReactNode, useContext } from 'react'; + import { VerticalStepperContext } from './SimpleStepper'; +import { StepActions } from './types'; export type SimpleStepperFooterClassKey = 'root'; @@ -145,7 +147,7 @@ export const SimpleStepperFooter = ({ }; return ( -

+ {[undefined, true].includes(actions.showBack) && stepIndex !== 0 && ( )} {children} -
+ ); }; diff --git a/packages/core-components/src/components/SimpleStepper/SimpleStepperStep.tsx b/packages/core-components/src/components/SimpleStepper/SimpleStepperStep.tsx index bb46163105..911ad2e73e 100644 --- a/packages/core-components/src/components/SimpleStepper/SimpleStepperStep.tsx +++ b/packages/core-components/src/components/SimpleStepper/SimpleStepperStep.tsx @@ -13,12 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { PropsWithChildren } from 'react'; -import { makeStyles } from '@material-ui/core/styles'; +import Box from '@material-ui/core/Box'; import MuiStep from '@material-ui/core/Step'; import StepContent from '@material-ui/core/StepContent'; import StepLabel from '@material-ui/core/StepLabel'; +import { makeStyles } from '@material-ui/core/styles'; import Typography from '@material-ui/core/Typography'; +import React, { PropsWithChildren } from 'react'; + import { SimpleStepperFooter } from './SimpleStepperFooter'; import { StepProps } from './types'; @@ -40,11 +42,11 @@ export function SimpleStepperStep(props: PropsWithChildren) { // The end step is not a part of the stepper // It simply is the final screen with an option to have buttons such as reset or back return end ? ( -
+ {title} {children} -
+ ) : ( diff --git a/packages/core-components/src/components/Status/Status.tsx b/packages/core-components/src/components/Status/Status.tsx index a855fe3ebe..364193e383 100644 --- a/packages/core-components/src/components/Status/Status.tsx +++ b/packages/core-components/src/components/Status/Status.tsx @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import { makeStyles } from '@material-ui/core/styles'; import { BackstageTheme } from '@backstage/theme'; +import { makeStyles } from '@material-ui/core/styles'; +import Typography from '@material-ui/core/Typography'; import classNames from 'classnames'; import React, { PropsWithChildren } from 'react'; @@ -31,12 +31,12 @@ export type StatusClassKey = const useStyles = makeStyles( theme => ({ status: { - fontWeight: 500, + fontWeight: theme.typography.fontWeightMedium, '&::before': { width: '0.7em', height: '0.7em', display: 'inline-block', - marginRight: 8, + marginRight: theme.spacing(1), borderRadius: '50%', content: '""', }, @@ -78,7 +78,8 @@ const useStyles = makeStyles( export function StatusOK(props: PropsWithChildren<{}>) { const classes = useStyles(props); return ( -

F*wE6DYsH4XSOJDC@h8{pVMt@FD! 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 literal 0 HcmV?d00001 From 7e0a0ed6992ee69df589606cc3e952508ef8a79f Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 22 Sep 2022 14:35:47 -0500 Subject: [PATCH 002/269] added long-running action and example template Signed-off-by: Hao Luo --- .../sample-templates/all-templates.yaml | 1 + .../longrunning-demo/wait-action.yaml | 43 ++++++++++ .../actions/builtin/createBuiltinActions.ts | 2 + .../actions/builtin/stress/index.ts | 1 + .../actions/builtin/stress/waitWorkflow.ts | 86 +++++++++++++++++++ 5 files changed, 133 insertions(+) create mode 100644 plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts create mode 100644 plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts diff --git a/plugins/scaffolder-backend/sample-templates/all-templates.yaml b/plugins/scaffolder-backend/sample-templates/all-templates.yaml index 6637c9479b..a3c81f8af0 100644 --- a/plugins/scaffolder-backend/sample-templates/all-templates.yaml +++ b/plugins/scaffolder-backend/sample-templates/all-templates.yaml @@ -6,6 +6,7 @@ metadata: spec: targets: - ./remote-templates.yaml + - ./longrunning-demo/wait-action.yaml # For local development of a template, you can reference your local templates here. # Examples: # diff --git a/plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml b/plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml new file mode 100644 index 0000000000..56032408b7 --- /dev/null +++ b/plugins/scaffolder-backend/sample-templates/longrunning-demo/wait-action.yaml @@ -0,0 +1,43 @@ +apiVersion: scaffolder.backstage.io/v1beta3 +# https://backstage.io/docs/features/software-catalog/descriptor-format#kind-template +kind: Template +metadata: + name: wait-action + title: wait-action + description: template with a waiting task for a long running action +spec: + owner: user:guest + type: service + + # These parameters are used to generate the input form in the frontend, and are + # used to gather input data for the execution of the template. + parameters: + - title: Fill in some steps + required: + - name + properties: + name: + title: Name + type: string + description: Unique name of the component + default: some value + ui:autofocus: true + ui:options: + rows: 5 + + # These steps are executed in the scaffolder backend, using data that we gathered + # via the parameters above. + steps: + - id: someAsyncCall + name: Some Async Call + action: debug:log + input: + message: Some async call that return a tickedId (guid, for instance, that identifies a process) + + - id: waitWorkflow + name: Wait Creation + action: stress:waitWorkflow + input: + name: 'test' #${{ steps.someAsyncCall.output.ticketId }} + delayMilliseconds: 1000 + maxCalls: 30 diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts index fcddf127e2..68e8e4cef0 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/createBuiltinActions.ts @@ -55,6 +55,7 @@ import { createPublishGitlabAction, createPublishGitlabMergeRequestAction, } from './publish'; +import { waitWorkflow } from './stress'; /** * The options passed to {@link createBuiltinActions} @@ -181,6 +182,7 @@ export const createBuiltinActions = ( config, githubCredentialsProvider, }), + waitWorkflow(), ]; return actions as TemplateAction[]; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts new file mode 100644 index 0000000000..d6b15d0f2a --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts @@ -0,0 +1 @@ +export { waitWorkflow } from './waitWorkflow'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts new file mode 100644 index 0000000000..317d4ee4aa --- /dev/null +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts @@ -0,0 +1,86 @@ +import { createTemplateAction } from '@backstage/plugin-scaffolder-backend'; + +export function waitWorkflow() { + type InputParameters = { + name: string; + delayMilliseconds: number; + maxCalls: number; + }; + + return createTemplateAction({ + id: 'stress:waitWorkflow', + schema: { + input: { + required: ['name'], + type: 'object', + properties: { + name: { + type: 'string', + title: 'Name', + description: + 'The Ticket Number used to check the status of the Workflow.', + }, + delayMilliseconds: { + type: 'number', + title: 'Delay', + description: + 'The amount of milliseconds to delay before the next checkStatus call.', + }, + maxCalls: { + type: 'number', + title: 'Max Calls', + description: + 'The amount of maximum calls allowed to check a status before stopping.', + }, + }, + }, + output: { + type: 'object', + properties: { + status: { + title: 'Status', + type: 'object', + properties: { + message: { + title: 'Status Message', + type: 'string', + }, + }, + }, + results: { + title: 'Results from Ticket execution', + type: 'object', + }, + }, + }, + }, + async handler(ctx) { + const { name, maxCalls, delayMilliseconds } = getParameters(ctx.input); + + ctx.logger.info(`Running the long running workflow: ${name}...`); + + let i = 1; + + for (;;) { + ctx.logger.info(`waiting... [${i}/${maxCalls}]`); + + if (i++ >= maxCalls) { + break; + } + + await new Promise(res => setTimeout(res, delayMilliseconds)); + } + + ctx.output('status.message', 'Workflow completed'); + }, + }); + + function getParameters(input: InputParameters) { + const { name, delayMilliseconds, maxCalls } = input; + return { + name, + maxCalls: maxCalls ?? 30, + delayMilliseconds: delayMilliseconds ?? 2000, + }; + } +} From 6fa7fc3118304a5d197c34174060d3d1f664758a Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Mon, 3 Oct 2022 23:59:24 -0500 Subject: [PATCH 003/269] implemented concurrentTasksLimit on worker Signed-off-by: Hao Luo --- .../src/scaffolder/tasks/TaskWorker.ts | 42 ++++++++++++++++++- .../scaffolder-backend/src/service/router.ts | 2 +- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 9defd71c49..b18f06f1f6 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -32,6 +32,7 @@ export type TaskWorkerOptions = { runners: { workflowRunner: WorkflowRunner; }; + concurrentTasksLimit: number; }; /** @@ -46,8 +47,18 @@ export type CreateWorkerOptions = { workingDirectory: string; logger: Logger; additionalTemplateFilters?: Record; + concurrentTasksLimit?: number; }; +// Same implementation as StorageTaskBroker +function makeLock() { + let unlock = () => {}; + const promise = new Promise(_ => { + unlock = _; + }); + return { promise, unlock }; +} + /** * TaskWorker * @@ -56,6 +67,29 @@ export type CreateWorkerOptions = { export class TaskWorker { private constructor(private readonly options: TaskWorkerOptions) {} + private runningTasks: number = 0; + + private workerLock = makeLock(); + + private get isWorkerAvailable() { + return this.runningTasks < this.options.concurrentTasksLimit; + } + + private completeTask() { + this.runningTasks--; + if (this.runningTasks === this.options.concurrentTasksLimit - 1) { + this.workerLock.unlock(); + this.workerLock = makeLock(); + } + } + + private async waitWorkerToBeAvailable() { + if (this.isWorkerAvailable) { + return; + } + await this.workerLock.promise; + } + static async create(options: CreateWorkerOptions): Promise { const { taskBroker, @@ -64,6 +98,7 @@ export class TaskWorker { integrations, workingDirectory, additionalTemplateFilters, + concurrentTasksLimit = 10, // Or Infinity } = options; const workflowRunner = new NunjucksWorkflowRunner({ @@ -77,14 +112,17 @@ export class TaskWorker { return new TaskWorker({ taskBroker: taskBroker, runners: { workflowRunner }, + concurrentTasksLimit, }); } start() { (async () => { for (;;) { + await this.waitWorkerToBeAvailable(); const task = await this.options.taskBroker.claim(); - await this.runOneTask(task); + this.runningTasks++; + this.runOneTask(task); } })(); } @@ -107,6 +145,8 @@ export class TaskWorker { await task.complete('failed', { error: { name: error.name, message: error.message }, }); + } finally { + this.completeTask(); } } } diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 28dd1ca413..3fbfe24074 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -199,7 +199,7 @@ export async function createRouter( const actionRegistry = new TemplateActionRegistry(); const workers = []; - for (let i = 0; i < (taskWorkers || 3); i++) { + for (let i = 0; i < (taskWorkers || 1); i++) { const worker = await TaskWorker.create({ taskBroker, actionRegistry, From 1b701258705e27824c8f997efb389e420a51e562 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Tue, 4 Oct 2022 00:16:01 -0500 Subject: [PATCH 004/269] fixed linting errors Signed-off-by: Hao Luo --- .../scaffolder/actions/builtin/stress/index.ts | 16 ++++++++++++++++ .../actions/builtin/stress/waitWorkflow.ts | 18 +++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts index d6b15d0f2a..9260f41e2c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/index.ts @@ -1 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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. + */ + export { waitWorkflow } from './waitWorkflow'; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts index 317d4ee4aa..eeb5603e19 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/stress/waitWorkflow.ts @@ -1,4 +1,20 @@ -import { createTemplateAction } from '@backstage/plugin-scaffolder-backend'; +/* + * Copyright 2021 The Backstage Authors + * + * 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. + */ + +import { createTemplateAction } from '../../createTemplateAction'; export function waitWorkflow() { type InputParameters = { From 92cd574898be08cfc717706813f4e1a79b5cb6b3 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Tue, 4 Oct 2022 00:28:56 -0500 Subject: [PATCH 005/269] added api-report.md Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 35e3dab0b5..5b9f65cd41 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -448,6 +448,7 @@ export type CreateWorkerOptions = { workingDirectory: string; logger: Logger; additionalTemplateFilters?: Record; + concurrentTasksLimit?: number; }; // @public From b32005e98aeaf6452526510985b98045e0b6a739 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Tue, 4 Oct 2022 00:39:44 -0500 Subject: [PATCH 006/269] added changeset Signed-off-by: Hao Luo --- .changeset/little-chairs-dance.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .changeset/little-chairs-dance.md diff --git a/.changeset/little-chairs-dance.md b/.changeset/little-chairs-dance.md new file mode 100644 index 0000000000..07cbf52389 --- /dev/null +++ b/.changeset/little-chairs-dance.md @@ -0,0 +1,21 @@ +--- +'@backstage/plugin-scaffolder-backend': minor +--- + +Added optional "concurrentTasksLimit" option to TaskWorker + +TaskWorker can now run multiple (defaults to 10) tasks concurrently. + +To use the option, in `createRouter`: + +```diff +const worker = await TaskWorker.create({ + taskBroker, + actionRegistry, + integrations, + logger, + workingDirectory, + additionalTemplateFilters, ++ concurrentTasksLimit: 10 // (1 to Infinity) +}); +``` From d64bae4974fc4efd07814a5aa442575095af4c37 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 6 Oct 2022 11:28:14 -0700 Subject: [PATCH 007/269] removed multiple TaskWorkers Signed-off-by: Hao Luo --- .../scaffolder-backend/src/service/router.ts | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 9d4aa547f8..6fe914202e 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -201,20 +201,6 @@ export async function createRouter( const actionRegistry = new TemplateActionRegistry(); - const workers = []; - for (let i = 0; i < (taskWorkers || 1); i++) { - const worker = await TaskWorker.create({ - taskBroker, - actionRegistry, - integrations, - logger, - workingDirectory, - additionalTemplateFilters, - additionalTemplateGlobals, - }); - workers.push(worker); - } - const actionsToRegister = Array.isArray(actions) ? actions : createBuiltinActions({ @@ -227,7 +213,17 @@ export async function createRouter( }); actionsToRegister.forEach(action => actionRegistry.register(action)); - workers.forEach(worker => worker.start()); + + const worker = await TaskWorker.create({ + taskBroker, + actionRegistry, + integrations, + logger, + workingDirectory, + additionalTemplateFilters, + additionalTemplateGlobals, + }); + worker.start(); const dryRunner = createDryRunner({ actionRegistry, From 0c55e847a41fdaf84a643b71c929cc54336e9a75 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 6 Oct 2022 12:02:44 -0700 Subject: [PATCH 008/269] removed 'taskWorkers' options Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 3 --- plugins/scaffolder-backend/src/ScaffolderPlugin.ts | 3 --- plugins/scaffolder-backend/src/service/router.ts | 2 -- 3 files changed, 8 deletions(-) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 96a3d33fa7..2ea9884b99 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -562,8 +562,6 @@ export interface RouterOptions { scheduler?: PluginTaskScheduler; // (undocumented) taskBroker?: TaskBroker; - // (undocumented) - taskWorkers?: number; } // @public (undocumented) @@ -599,7 +597,6 @@ export const scaffolderPlugin: ( // @alpha export type ScaffolderPluginOptions = { actions?: TemplateAction[]; - taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index 09d7bdcbb2..84bf355156 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -36,7 +36,6 @@ import { createRouter } from './service/router'; */ export type ScaffolderPluginOptions = { actions?: TemplateAction[]; - taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; @@ -105,7 +104,6 @@ export const scaffolderPlugin = createBackendPlugin({ const { additionalTemplateFilters, taskBroker, - taskWorkers, additionalTemplateGlobals, } = options; const log = loggerToWinstonLogger(logger); @@ -135,7 +133,6 @@ export const scaffolderPlugin = createBackendPlugin({ reader, actions, taskBroker, - taskWorkers, additionalTemplateFilters, additionalTemplateGlobals, }); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 6fe914202e..ddef93e396 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -67,7 +67,6 @@ export interface RouterOptions { scheduler?: PluginTaskScheduler; actions?: TemplateAction[]; - taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; @@ -159,7 +158,6 @@ export async function createRouter( database, catalogClient, actions, - taskWorkers, scheduler, additionalTemplateFilters, additionalTemplateGlobals, From 19ecf558172e96bd63bbba2fab1193c156620ee7 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 6 Oct 2022 12:46:47 -0700 Subject: [PATCH 009/269] implemented p-queue for use as a taskQueue Signed-off-by: Hao Luo --- plugins/scaffolder-backend/package.json | 1 + .../src/scaffolder/tasks/TaskWorker.ts | 41 +++---------------- yarn.lock | 20 ++++++++- 3 files changed, 25 insertions(+), 37 deletions(-) diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 2be7b62f75..c273e509bf 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -72,6 +72,7 @@ "octokit": "^2.0.0", "octokit-plugin-create-pull-request": "^3.10.0", "p-limit": "^3.1.0", + "p-queue": "^7.3.0", "uuid": "^8.2.0", "vm2": "^3.9.11", "winston": "^3.2.1", diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 26a342d754..799510b278 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -15,6 +15,7 @@ */ import { TaskContext, TaskBroker, WorkflowRunner } from './types'; +import PQueue from 'p-queue'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; import { Logger } from 'winston'; import { TemplateActionRegistry } from '../actions'; @@ -54,15 +55,6 @@ export type CreateWorkerOptions = { additionalTemplateGlobals?: Record; }; -// Same implementation as StorageTaskBroker -function makeLock() { - let unlock = () => {}; - const promise = new Promise(_ => { - unlock = _; - }); - return { promise, unlock }; -} - /** * TaskWorker * @@ -71,28 +63,9 @@ function makeLock() { export class TaskWorker { private constructor(private readonly options: TaskWorkerOptions) {} - private runningTasks: number = 0; - - private workerLock = makeLock(); - - private get isWorkerAvailable() { - return this.runningTasks < this.options.concurrentTasksLimit; - } - - private completeTask() { - this.runningTasks--; - if (this.runningTasks === this.options.concurrentTasksLimit - 1) { - this.workerLock.unlock(); - this.workerLock = makeLock(); - } - } - - private async waitWorkerToBeAvailable() { - if (this.isWorkerAvailable) { - return; - } - await this.workerLock.promise; - } + private taskQueue: PQueue = new PQueue({ + concurrency: this.options.concurrentTasksLimit, + }); static async create(options: CreateWorkerOptions): Promise { const { @@ -125,10 +98,8 @@ export class TaskWorker { start() { (async () => { for (;;) { - await this.waitWorkerToBeAvailable(); const task = await this.options.taskBroker.claim(); - this.runningTasks++; - this.runOneTask(task); + this.taskQueue.add(() => this.runOneTask(task)); } })(); } @@ -151,8 +122,6 @@ export class TaskWorker { await task.complete('failed', { error: { name: error.name, message: error.message }, }); - } finally { - this.completeTask(); } } } diff --git a/yarn.lock b/yarn.lock index c2019f86ad..ba20ab94b7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6680,6 +6680,7 @@ __metadata: octokit: ^2.0.0 octokit-plugin-create-pull-request: ^3.10.0 p-limit: ^3.1.0 + p-queue: ^7.3.0 supertest: ^6.1.3 uuid: ^8.2.0 vm2: ^3.9.11 @@ -21960,7 +21961,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4, eventemitter3@npm:^4.0.7": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 @@ -31128,6 +31129,16 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:^7.3.0": + version: 7.3.0 + resolution: "p-queue@npm:7.3.0" + dependencies: + eventemitter3: ^4.0.7 + p-timeout: ^5.0.2 + checksum: eda8b8d4dac9456d1722c8ee0892bbb2e7f7b79d1f90b6cc1bac5fb9dcf3120285f90c28a68dc2f66bc9e46c7d7d42ad206a2c4d83e7aad27a0226ae042081ee + languageName: node + linkType: hard + "p-retry@npm:^4.5.0": version: 4.5.0 resolution: "p-retry@npm:4.5.0" @@ -31147,6 +31158,13 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^5.0.2": + version: 5.1.0 + resolution: "p-timeout@npm:5.1.0" + checksum: f5cd4e17301ff1ff1d8dbf2817df0ad88c6bba99349fc24d8d181827176ad4f8aca649190b8a5b1a428dfd6ddc091af4606835d3e0cb0656e04045da5c9e270c + languageName: node + linkType: hard + "p-transform@npm:^1.3.0": version: 1.3.0 resolution: "p-transform@npm:1.3.0" From 0b4430b0859bbe450e70bf12ebab0ef4e7e2865a Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 6 Oct 2022 13:40:04 -0700 Subject: [PATCH 010/269] reverted p-queue to ^6 for non-esm loading Signed-off-by: Hao Luo --- plugins/scaffolder-backend/package.json | 2 +- yarn.lock | 21 ++------------------- 2 files changed, 3 insertions(+), 20 deletions(-) diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index c273e509bf..0255d4045f 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -72,7 +72,7 @@ "octokit": "^2.0.0", "octokit-plugin-create-pull-request": "^3.10.0", "p-limit": "^3.1.0", - "p-queue": "^7.3.0", + "p-queue": "^6.6.2", "uuid": "^8.2.0", "vm2": "^3.9.11", "winston": "^3.2.1", diff --git a/yarn.lock b/yarn.lock index ba20ab94b7..8b43a7fb95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6680,7 +6680,7 @@ __metadata: octokit: ^2.0.0 octokit-plugin-create-pull-request: ^3.10.0 p-limit: ^3.1.0 - p-queue: ^7.3.0 + p-queue: ^6.6.2 supertest: ^6.1.3 uuid: ^8.2.0 vm2: ^3.9.11 @@ -21961,7 +21961,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4, eventemitter3@npm:^4.0.7": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.1, eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 1875311c42fcfe9c707b2712c32664a245629b42bb0a5a84439762dd0fd637fc54d078155ea83c2af9e0323c9ac13687e03cfba79b03af9f40c89b4960099374 @@ -31129,16 +31129,6 @@ __metadata: languageName: node linkType: hard -"p-queue@npm:^7.3.0": - version: 7.3.0 - resolution: "p-queue@npm:7.3.0" - dependencies: - eventemitter3: ^4.0.7 - p-timeout: ^5.0.2 - checksum: eda8b8d4dac9456d1722c8ee0892bbb2e7f7b79d1f90b6cc1bac5fb9dcf3120285f90c28a68dc2f66bc9e46c7d7d42ad206a2c4d83e7aad27a0226ae042081ee - languageName: node - linkType: hard - "p-retry@npm:^4.5.0": version: 4.5.0 resolution: "p-retry@npm:4.5.0" @@ -31158,13 +31148,6 @@ __metadata: languageName: node linkType: hard -"p-timeout@npm:^5.0.2": - version: 5.1.0 - resolution: "p-timeout@npm:5.1.0" - checksum: f5cd4e17301ff1ff1d8dbf2817df0ad88c6bba99349fc24d8d181827176ad4f8aca649190b8a5b1a428dfd6ddc091af4606835d3e0cb0656e04045da5c9e270c - languageName: node - linkType: hard - "p-transform@npm:^1.3.0": version: 1.3.0 resolution: "p-transform@npm:1.3.0" From cbb618c6694b31ff879cc791028829a1451eb61a Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 13 Oct 2022 16:44:59 -0500 Subject: [PATCH 011/269] added taskWorkers back in Signed-off-by: Hao Luo --- plugins/scaffolder-backend/api-report.md | 3 +++ plugins/scaffolder-backend/src/ScaffolderPlugin.ts | 3 +++ plugins/scaffolder-backend/src/service/router.ts | 2 ++ 3 files changed, 8 insertions(+) diff --git a/plugins/scaffolder-backend/api-report.md b/plugins/scaffolder-backend/api-report.md index 2ea9884b99..96a3d33fa7 100644 --- a/plugins/scaffolder-backend/api-report.md +++ b/plugins/scaffolder-backend/api-report.md @@ -562,6 +562,8 @@ export interface RouterOptions { scheduler?: PluginTaskScheduler; // (undocumented) taskBroker?: TaskBroker; + // (undocumented) + taskWorkers?: number; } // @public (undocumented) @@ -597,6 +599,7 @@ export const scaffolderPlugin: ( // @alpha export type ScaffolderPluginOptions = { actions?: TemplateAction[]; + taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; diff --git a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts index 84bf355156..09d7bdcbb2 100644 --- a/plugins/scaffolder-backend/src/ScaffolderPlugin.ts +++ b/plugins/scaffolder-backend/src/ScaffolderPlugin.ts @@ -36,6 +36,7 @@ import { createRouter } from './service/router'; */ export type ScaffolderPluginOptions = { actions?: TemplateAction[]; + taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; @@ -104,6 +105,7 @@ export const scaffolderPlugin = createBackendPlugin({ const { additionalTemplateFilters, taskBroker, + taskWorkers, additionalTemplateGlobals, } = options; const log = loggerToWinstonLogger(logger); @@ -133,6 +135,7 @@ export const scaffolderPlugin = createBackendPlugin({ reader, actions, taskBroker, + taskWorkers, additionalTemplateFilters, additionalTemplateGlobals, }); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index ddef93e396..6fe914202e 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -67,6 +67,7 @@ export interface RouterOptions { scheduler?: PluginTaskScheduler; actions?: TemplateAction[]; + taskWorkers?: number; taskBroker?: TaskBroker; additionalTemplateFilters?: Record; additionalTemplateGlobals?: Record; @@ -158,6 +159,7 @@ export async function createRouter( database, catalogClient, actions, + taskWorkers, scheduler, additionalTemplateFilters, additionalTemplateGlobals, From 86de58739da823e3827c95a0fff414708cae0644 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 13 Oct 2022 16:50:56 -0500 Subject: [PATCH 012/269] reverted back to multiple TaskWorkers Signed-off-by: Hao Luo --- .../scaffolder-backend/src/service/router.ts | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 6fe914202e..9d4aa547f8 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -201,6 +201,20 @@ export async function createRouter( const actionRegistry = new TemplateActionRegistry(); + const workers = []; + for (let i = 0; i < (taskWorkers || 1); i++) { + const worker = await TaskWorker.create({ + taskBroker, + actionRegistry, + integrations, + logger, + workingDirectory, + additionalTemplateFilters, + additionalTemplateGlobals, + }); + workers.push(worker); + } + const actionsToRegister = Array.isArray(actions) ? actions : createBuiltinActions({ @@ -213,17 +227,7 @@ export async function createRouter( }); actionsToRegister.forEach(action => actionRegistry.register(action)); - - const worker = await TaskWorker.create({ - taskBroker, - actionRegistry, - integrations, - logger, - workingDirectory, - additionalTemplateFilters, - additionalTemplateGlobals, - }); - worker.start(); + workers.forEach(worker => worker.start()); const dryRunner = createDryRunner({ actionRegistry, From d7dad72fdbd414175b5c86ab9ca836923016b846 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 13 Oct 2022 16:55:36 -0500 Subject: [PATCH 013/269] implemented that only claim new tasks if queue is empty Signed-off-by: Hao Luo --- plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts index 799510b278..1dc8d01aad 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/TaskWorker.ts @@ -75,7 +75,7 @@ export class TaskWorker { integrations, workingDirectory, additionalTemplateFilters, - concurrentTasksLimit = 10, // Or Infinity + concurrentTasksLimit = 2, // Or Infinity additionalTemplateGlobals, } = options; @@ -98,6 +98,7 @@ export class TaskWorker { start() { (async () => { for (;;) { + await this.taskQueue.onEmpty(); const task = await this.options.taskBroker.claim(); this.taskQueue.add(() => this.runOneTask(task)); } From 85607e499820149a11e9baf7e5bbbdb3f2ca9e79 Mon Sep 17 00:00:00 2001 From: Hao Luo Date: Thu, 13 Oct 2022 17:16:00 -0500 Subject: [PATCH 014/269] updated diagrams Signed-off-by: Hao Luo --- ...scaffolder-task-broker-blocking.drawio.png | Bin 67549 -> 80393 bytes .../scaffolder-task-broker-events.drawio.png | Bin 64340 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/assets/architecture-overview/scaffolder-task-broker-events.drawio.png diff --git a/docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png b/docs/assets/architecture-overview/scaffolder-task-broker-blocking.drawio.png index 214de226f1e7959e9bb56f91173a6c415f74eb40..4abdbb44e4462e428d8de6284abdfbfeabfd594a 100644 GIT binary patch literal 80393 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 X^hsA_{xp6U0)8|v>Z#?QzaIKOQtggM literal 67549 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