From 53470ada548eea440975a03075f3e1110d390b49 Mon Sep 17 00:00:00 2001 From: Johan Hammar Date: Fri, 1 Oct 2021 17:20:09 +0200 Subject: [PATCH 01/50] Fix handling of search term when performing searches from the sidebar Signed-off-by: Johan Hammar --- .changeset/neat-cooks-sell.md | 5 +++++ packages/core-components/src/layout/Sidebar/Items.tsx | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/neat-cooks-sell.md diff --git a/.changeset/neat-cooks-sell.md b/.changeset/neat-cooks-sell.md new file mode 100644 index 0000000000..11859c3589 --- /dev/null +++ b/.changeset/neat-cooks-sell.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Fix search in Firefox. When the search was performed by pressing enter, the query parameter was first set but then reverted back. diff --git a/packages/core-components/src/layout/Sidebar/Items.tsx b/packages/core-components/src/layout/Sidebar/Items.tsx index fbe1ffbb82..1246fda82e 100644 --- a/packages/core-components/src/layout/Sidebar/Items.tsx +++ b/packages/core-components/src/layout/Sidebar/Items.tsx @@ -311,6 +311,7 @@ export function SidebarSearchField(props: SidebarSearchFieldProps) { const handleEnter: KeyboardEventHandler = ev => { if (ev.key === 'Enter') { search(); + ev.preventDefault(); } }; From ebb2886122f57bfe438bc7b60c1f8691fb3ae6ae Mon Sep 17 00:00:00 2001 From: Johan Hammar Date: Tue, 5 Oct 2021 20:07:03 +0200 Subject: [PATCH 02/50] Call ev.preventDefault() before calling search() Signed-off-by: Johan Hammar --- packages/core-components/src/layout/Sidebar/Items.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core-components/src/layout/Sidebar/Items.tsx b/packages/core-components/src/layout/Sidebar/Items.tsx index 1246fda82e..91af93439c 100644 --- a/packages/core-components/src/layout/Sidebar/Items.tsx +++ b/packages/core-components/src/layout/Sidebar/Items.tsx @@ -310,8 +310,8 @@ export function SidebarSearchField(props: SidebarSearchFieldProps) { const handleEnter: KeyboardEventHandler = ev => { if (ev.key === 'Enter') { - search(); ev.preventDefault(); + search(); } }; From 3539f88c6d731ca2ce4f9584c48b189659e19a7d Mon Sep 17 00:00:00 2001 From: Johan Hammar Date: Wed, 6 Oct 2021 20:14:12 +0200 Subject: [PATCH 03/50] Add test for defaultPrevented Signed-off-by: Johan Hammar --- .../src/layout/Sidebar/Items.test.tsx | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/core-components/src/layout/Sidebar/Items.test.tsx b/packages/core-components/src/layout/Sidebar/Items.test.tsx index 89d2a2c294..a3d3845028 100644 --- a/packages/core-components/src/layout/Sidebar/Items.test.tsx +++ b/packages/core-components/src/layout/Sidebar/Items.test.tsx @@ -16,12 +16,12 @@ import React from 'react'; import { renderInTestApp } from '@backstage/test-utils'; -import { screen } from '@testing-library/react'; +import { createEvent, fireEvent, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import HomeIcon from '@material-ui/icons/Home'; import CreateComponentIcon from '@material-ui/icons/AddCircleOutline'; import { Sidebar } from './Bar'; -import { SidebarItem } from './Items'; +import { SidebarItem, SidebarSearchField } from './Items'; import { renderHook } from '@testing-library/react-hooks'; import { hexToRgb, makeStyles } from '@material-ui/core'; @@ -36,6 +36,7 @@ async function renderSidebar() { await renderInTestApp( + {}} to="/search" /> { ).toHaveStyle(`background-color: ${hexToRgb('2b2a2a')}`); }); }); + describe('SidebarSearchField', () => { + it('should be defaultPrevented when enter is pressed', async () => { + const searchEvent = createEvent.keyDown( + await screen.findByPlaceholderText('Search'), + { key: 'Enter', code: 'Enter', charCode: 13 }, + ); + fireEvent(await screen.findByPlaceholderText('Search'), searchEvent); + expect(searchEvent.defaultPrevented).toBeTruthy(); + }); + }); }); From 86f9a418bfd3e30b59e6a8af228ee864941f7cec Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Wed, 6 Oct 2021 17:33:51 +0200 Subject: [PATCH 04/50] Add GA to plugin marketplace. Signed-off-by: Eric Peterson --- .../plugins/backstage-analytics-module-ga.yaml | 9 +++++++++ microsite/static/img/ga-icon.png | Bin 0 -> 34270 bytes 2 files changed, 9 insertions(+) create mode 100644 microsite/data/plugins/backstage-analytics-module-ga.yaml create mode 100644 microsite/static/img/ga-icon.png diff --git a/microsite/data/plugins/backstage-analytics-module-ga.yaml b/microsite/data/plugins/backstage-analytics-module-ga.yaml new file mode 100644 index 0000000000..362f03bdad --- /dev/null +++ b/microsite/data/plugins/backstage-analytics-module-ga.yaml @@ -0,0 +1,9 @@ +--- +title: "Analytics Module: Google Analytics" +author: Spotify +authorUrl: https://github.com/spotify +category: Analytics +description: Track usage of your Backstage instance using Google Analytics. +documentation: https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga/README.md +iconUrl: img/ga-icon.png +npmPackageName: '@backstage/plugin-analytics-module-ga' diff --git a/microsite/static/img/ga-icon.png b/microsite/static/img/ga-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8eaebd06aa7cdd2625d785c273da8282cb3017a7 GIT binary patch literal 34270 zcmd?Pg;!K<)IL0jfV4BZOSCEXbGRl866&2L1 zb>xerVyZGI@hGzXx%oanLWZg`_HmoWKUcFHa_=l&di?sXjnWY5M~y7b0U_pB^A|;D zEhWoS4*a*fBKW%p2R{T;Pr3D-aiI&5Cn?ZHt`bRux^$Gc3}DOu5B^D&LvH|XezNfD zFJ5|fP*uGemTG8Y^VZwt?K2MxGL8ZYJHzY^Ug(Z;%*vPNV-)1k_hE_;xw^GqmTO#A z5cath!b4s7*8Z+cxYoYIVr^M`T(uLs%`;tD(RAhBCB{$e_`vEybJG_7b4Rfj`QZkv z+Qt0Zj$icx^uJa>y;QQb_J5BQbXtVM3|Q0sQftyaJk7hh4SUew!x{Z7gRjoKGf#3* zrFiM%gX1QS;}=8|s~Y`{xe1aY0s;c=oxaBR(<>Q?)nf2~T|)N;g4LnKCLcYo(z9P*L&rBPKhPZoLfue{RrOZt`v>0XB3 zj=#}9<$)cnie;?X1I2fA<<5@z<^@}HvChmC5oJ>PBt#Fp|Ey3vg%~zBB zmVfG(OB|Jc?p3tPaGp z;=_-PBn^u(mMI!v3_~)?6l0@y_PHN3YbA9^saYNZ)McY4$st?-Mxi z=Ove~V#|NxI`JWM)?3ok08qDG#ioPkMH{2h{%hx%Z@hUrkQk|_u ztQOUah6ZI20k&1#^qdIs*ELECX=70FJM#}wRMd*fW7UjV7t3mjOb?zzc=%7nK8e%p zEzf^f6*VFv!3((QzFs7GiwsYe8d$;F@%(#V&t4Og)B4xheygFVqE?O4z|kJr3D)*O z4Zcpwr8I5M2N)fG`=i|?{dDgLl@=TUHK#3qNjPPbme7xP}nz+O5H4+zPOC(48 z2&I!)07;1L#)F#BQubVT>9$K(Y!3hB1K z%S;5eGLjp@E@`*zzggb=Ay{00EZ-l7i{gWZS7~-SKaGxE$K;*5a+x(%Uh0rCvKFtG z3ZE%!>Eumn5gP_d-mIQ(JnqX0eV&V(^|j~ZTJvz)q5s`nM$HkKn^x-CdQbIXsqFWS zIj!I`4I6Rs&Arq;2@2P-$!j@sy1ShG4i#`X;Wvq~Rd}h}mSho@#jFXN$%(wAqW&n> zzGfIKtu3Vlv<)HNQG9 zsSq=tljeQwHe-KyDU=u3h`YY+)Tla};}9*+8nJyjzbj@aoXRkK4{GF7RHsnRp{}K> zjqtg@Wf0Jod|H@ekMEA)8(m6@(FdQ|`wg|!D*R|k5rGafTU?TN zFQkD9#CkjoH^1f!mrMvl=O~t`!>I11yD7YMI$LDb-F3Bo>e~#hS$)lw(m==#`3_bY zx~Xapf8T@gVQ-qb2eryY3~4sSh(1TfXl=Ik#Y?(H&Bzv>8=x6qwGJfQ7Y@9M{n_l6 zL)@ZD`A*%mboeU^;tG9-H>QlwiZ6p%qo+7+A?-Uh6R*2K9ujXuNEF95GLo%WwviTF zP3Ip3jrW$rCYK)BSx9Q)LL=gE$?u4~wSZA63~mTlD$F+!IqF9H@fixm&s-1 z;-Ybth%8K3Zi9HK7EfJ|Ox$(JHq)4XH@Tjz%KKIok^fm3M(+Etu8@OX^3G@(YrJ_G0aEsQd1raj z42!PX#)Rv{L%*#J(ZEAD90CKICn%$%_9~$xtzWVVeIu9MRur`kBJ}!-n@qPHxG;ME zWWfQ?q{?qkHZBy=tq?B@-UIE;m@Q@*q{dwlm=+Uyl-p zbNDf-E5N!pSUV0} z;tWl18tG;jJkqW#xIJcEc@ptPk_?B&108Ac&hO zEeA^*PgQCE10wuD4j&jAGupDK5!1;gfJiF3K%-RZ^6s_GuO`<>MJ-JY@x#U0V6Hjl zZ$ox~B_=%UQ`Hu}R$IH}*;)c^B<+^r*Gl=>J6K;&>@ex7RTz{`Rvu(f3ew)Xjr8$j=@tpBj34EO~TAY=~A%U4TS< zq|NeF$B3-s0n~o+>IVb`@^6nW;-oXZXYa6wZ$3ItROl zX=_*VdtPi+gqSoLxP{!ybd@j`KGYLT_EiV!jnyMX^^*PBW8_Fkx@z`=+&IH>hvlMRBZ@zq zh&fN|^<3un@>la1j4}TjtSeq#H}v41xoqwQ$6GSrVof*IcQ@9DWM{W={ub);g{~5!T;kk2IQ0{W{rqzzOc8SsYdA3#v z)l_iDRa6*w$O)%q1Iodw`W0`$}{@pLZ^!>SfgHNVq2Y8h=)U?K~rPKTT?$TxqQ)IjV zlnvPxX-}s{;qM#wR@>Lst&MWbDl94w}ttS1`b2ESgVWL$mu68Jm?^c)S7k#^i-V$I( z<;uATjJJ|4z|2G1%k_<#PvX+i={N;^Aind%IuFhsuSZ``&Ft~#P|ueyh3Fx zmQCk6WI%xRL>lTv&Ha9tKgwg4TwMHQaIuIhH~RyXg!`^id_@T8_E)|XueLM}m{65Q zlDDt1ey9cYhZxG(-27q-pL(2nDM=R(ovwy-@hWW7j$Sz2PwHCYm9;25vWW=Iz-o%g zl{NpP{o;mqPQU^CVRhQuN)s0Xa`SYJ*v8h?yEg?%CF;z|e+tLm08SU4@WKq- z;i}PW?mN8kuI?PMNE1a$t*ic>P~DKPzi$JKD9Yn-`#qyj#C*XtdbDP{Ylc6OeRypK z7NGxUi!e_P^P$g@#Q7nRa<_P8jbFc0TARbyl%A@TBVz6omqVmKsU(Qnru$NdTtPvFXN z`h{H+ZT0X1-#O-vXkNYn?YTc{8y7k$J1-klA8~6phswnS4$b`e#f5Qrb3iE$@uJV- z>*&#WiyJ16(;oLN)hC1wRsSF$ZS)33pv@15P?#&YCK^0ij>OS-;0!pkI6UKOXl=M( zYe_8iD9xNa*|+v_q5Zc1kzgH;5Y~?V(rD4g5AKz+U+C$vKPjkxN>8;+89OvvfKv%; z$Cc$NWp!Q!)(a_D;+GCC73VixZN|}23hCPUT6ddQxI+pLX`X*?@h!?(nF2glso0xf z>g#&CIauP?iSR!yT>bDViHu=zz8Q^@#R0;Xqp>_dd6R?phDnoh9vN4@#s=C0=Teg9 zFDAiDqcTCq(Aw8<3R^Q&D9Fr#lrop!g7>;w9=lwUy;NebEiW;57v#N^+uru}$Gt%% z?2o+Og?U4B)hbJcKi>lcn78-tj;{UUWB|lZPpDNRR?*+#Pizg|b=Yn_vbf}ym?-pw zTJN&@3S~G|L>Mlj(F)yfRgw7y>M%{%t4m}t`2t3`dLP6}4qaC5WJyh9Pj5;yhD7L8 z>BZW%{c$VNzK|0d%JcQB!Bxdrb#?Fv62z)`;GU@ZW9i|A2N$EKH7&Hy0uQ(ERF@V8 zecKgQO)1t2wY_LMK!#87A>r`39;vB#yLZX3glJzWwY#?uRYdH8!sDbjq+L& zO(&b-JlmOo^L!?Pv`o^*rGKB_5TH|d34ZRf7d#C%|H3x+^b1%$6qWvG>G+^f@ z)L=(coQDi|eR-OY9((~}VllbwAUEw!46k~i;K}0zRAs%ysAWThGv3BCi0aHyulJF~EwX8|2tY11m>z z)KY*DNF_~o%)i|<1qKJjQn%4qV83h`d@}caUUu4&1{|y$U5&ha2Uz^;U_+uj1n?=y z!~Gp^kQxCb=);H8i_VBj?4Nni7(A>aUpft8AC3vJ6TC*{%IG?oR1O1Qy`=eSHxRG1aG3)>Qa5zWw-;58& ze(+n^xe(Cw5XrN3>D3$9zfFt-Qz6(T63&m}pZ?EeR&Z6J6J&kIO3!3F)}59DBqC+* z785}~TmT1Rb3nb*O7TE@P_PP!%&B&Sof+1Sd5?PZc0nH#_V1PeYJ9B2wCJsKxBuC) z_UAPrGQgdWPCG9>qNuQjnN0cxTK{FSO!K%PXawlDvng_60Cd3QWTGG3Bq&dEQ#2C9 z>omZ3P3!{JiOn1yTx{kf=|%qhxZiyd{Our0YUEmV?5`R2? zaXRp4P(8Tc{2Bws;LlQst_FvoiO4^A`INiUgA_SrU4`SOC$!(<@oK696XU9Q0DW(Y z00C(-cAkWffBIqr1hmBkabWld;F%9#$Z%{@ZE%UAa%KiFz7r{^WVmz*jCLIj$S?@F zeTplB|6g_l{V^V7#SzcTDcoAaRG^0t5IE@nJH3uNl?|l)mf!E&|FN#2cTEfr3=58> zxKQ@>$(Q`c^}eaOmua98I@Lz_SoY&As%H4xzPd1MI{f)*Fye3T=;T(ffJEM^`pZD_ z`ZnvnLI;pg+~GW?yM7Mk``8pe6C1g8W&TApn2ajmUO4&-;3A0gk6fS18{AQ~5*ODU z_P=a{qyJ{=cSpCWzjNy)-+wX3&tkM6n;^7AG|8~?_{qMP8sy(#*Ymm_B z|1lGE(ktWPU-9_M)3p5m^F0;+Us(Nz@vclaufTtl__o zmNr&U?y|!de8w`3qAJ zm;Z(w?Zxr@WqFV$T`%qbg8IL~|A$YwECF#anpJW73v6&GWEZn0Kmfr&<%T|-Spj(q z5V2(g9oFa@4l8Kb7CW0;)zY40en8vujil9RTMV^Socig;-TZML{MJKpXQgz z7e9_uOK+04yBJ9AKE6)VLBLByFa5ryu$`)<8qX~3y8!E*y9dOE>iQcx)z3G4J#;;^ zQ{4^+MmH>~M^uzDSUfy1X_bc?nyXs=!-VMm0Muz+{knW$EH!Fp!iV5L(+LdfU-pdrk;`rPEave~?pn7G*cF|N-(ZSNM+2ZPzU{6dM zr5l6w$=N#9yUqj+BdvMaEEvpI9L7@04F7FFzA1=FyK~IJ-?{YYlR2Lj??;^p-i;ac zoNZ$2qSIt(oml14y%NL2=^=}5I45RHu<@*pbc}?q6haJvJOWhfs1crBk7!q=-`Wup zm8?Jw#q~!9jKG@hE{o|XTF_C&ThMdt%4EyD`qgFZmVU$m-#pWnsE?_6%)-mXp{8Ek zzz#OX|>1S!^$#QYa?#7 z^ek=XKZaZeid~C1jlH+~+R|hA7)I^(=6Ux@s$GC&>QcxeMqRajYjVm7bJvIuSQ zdV&Fr!(BmRJRVxRmhtJMeb{fzh zJS!(I2~xQKhPaWz@Qei3*Y09v4YR;zH(4*DL*!X$4Br>TxO?b56EM{9*U*`d>gm2J zJ`3lJGl!i%;K+;QL)w(6JiMpgrF1nz?@@|wo!IWlm+^xM=IY~e2QEqItjnwcvM&1k z{J=?nuZ{d6`gwI??F!_2J>g`BA@6Vsp4WuANCwu?Pm2>=aALuddXoyPZmXnpbSt54 z#$7t9NLw-HWU{S(l4cdL161}^$&6;VM1#*{Z;i&9HX901{g{^bBpYJ|1k5Zv9Z zc>S|O?=oTVl%phO*thvOM6j;Af*TJaB@Z0@(mI^{+O{3IjNl{t)q>edjq5C(xf-1b z%<;Vy$|HuX!_4UxeM24;JriA`y4J-5VT!)$l%@C72d>AWrU#+pE**WGJ3iiv@cz1U z&!@g~ky{y(beaeFke~=&NRUcx9lf5nDpJKtZ0dCSO}(9u(a~e+&rF6?q&o=O`p1bq zEXh2_Co;80G)P75@fYXC-o+^%l}n5d<7n!zYyO;MW*J4jt=rBxdXR$RpX6yLdf2nI)Z9yt@2* zkNoJJHQ&}o5P06Z@>up!YG@ujPwzC_gDoxK+#|Sz@pySg(Ml*dp?{ ztwBRRERn)1!#%5eI){Zxzps4D~jdO^6nzhZ~?B}Mc7d%e1n-xE#YLJ0=hdapVZJIpj-niL0(E?&d4Ij9jw+Ub{= zQQfqc2g&KYqK9;r5Xc&k4|=AJ8)r|q(C~V>+XR!2j_e0oBI%zEU<`RI!@DxEZrPc4 zIXkPlI2_LdC2h~Ywaw7Y=^Yz+3ex#QAOpY?8t3ntns79xvex@R5*~Z_1-iFZBKouV zswg8KwI!=({B*32!g|e@B%vJUZOMDpS(rqR>XhpRf=Cj-A+rTG|6oy62wHorgJ%c}if;vj#t2h%|Rq=`e)O3J%{0 zGAV1@WRd-${$p@pna<9a%LyG!8o1dLT~aqEu^**ZLI;7k18Tg>KcUs_u<9=|d*-zR z^E*9-4(^&iNwccobzS>Xd;c*DxfKtUFNHh$tZ5~_Y1g$wTDMuH1W?wCK$ry1(8vbWlsyK#m)XPXILxTT9MY_oJ$?v%Asaapd zQ5Y$m2n5u}x}P+T!mCy0r;&nis`_{B|8dsP+fp}qbE!)UTA3f=jE_A=Ge?|tUe5!oKevx z4e|XXO$bI|dS-0yaF(XKehlrWkS8iG5lQRg{=}}(q0E3+o91F@>>kf(tZyv!w5z=4 zVIiB}R;3N600i3U&eXcio;o@XF|uu_X3g_uPfT)UxMtY-1n zWjnU3IctFWz`h0{neK7O)>JQh4Nz7<{~*cDC!Zo!nArdZ!zWOV}693{#zJjam ztyy>D;a;nmwTGIO_~6mR+0(9W+0eKMfXd2W>{A65Wx@`_mz+yq8VXOW)hd}pogC`c zQv;1hJLK^|@_Gr-@Xh?*X;K$0TO{Z2d=DHM%JCnUC0brg_@WHc^$+ME=A7{K6Ho3X z$Oj;|1QO1I;u|`kra)k00#0!*u6EvX^6%=r4D! z#7_2qKyiK?axo&#Y_2Ohj-w3BKfZvg!DHGx$H=7V?0&6?pnbjJeRQ!(kbQF?jYPNG zL`n1N_El{iL$L?_9)62&^|?01P;Sjfr4ho+j<0TVfYN4tI&{iKLO8Y4`JL&iSQ^WX z37N!0{G(U*CWdUzlU#$TecoJMEIa_ll5WpV15 zBt=EWAIq#u1tpWD7BFU&Z7ky1%xA?Ncp6nH%hN!DJ^`r^5nL?V^wmz<&S9h^CVqK4 zR>V9=!O>@Q!hBAbx6_a^TMB0L8aQQEE`P4m+L}JJ^gZ|D*Ce-d^swqujpEtP~gGT`5W;79p z_))=XRdLgX5FOMR{_Wy!SqOlDl>Fj>$B*Kbz=B8uN*@IzwTWw%wobO#M|$t|;~ep1 zVt3^hTH+IR3A?5#PslC^zGgg$p#^cz1wOGvJCqVKP3~ARKHMk|jGdAQA^d{GH~G z!vS+Jy*zW}xSjLg*}ghWhQU|umo8z6A=T|4c=*o591gerb>nU5>Rc&Bkb;D|=6FTo zBqjUU(d9=j@UZ@)Bzr}|YhXgQ%y3Q~BN;3*ZX_DO>}DZ_8icdaN-LA;n0C~#k%qs` z&iC&l7`JH_5;P008AB>+gc9A2LeORVv0yf3CSRwS-O#q+-`$rPk&iI{48` zYV7;k5+4G3anNY*&pUmr<|C%e4qLir-N`@C%c9sJOj&idf5S7;h#2Iw6g+J1R8fVG z;!DE=%`%AK5?(`DsqU5@>PK_kDQs?78HZop4rVPGagB~aiRG>!P*_e>V`;7!vk%kw@rpc21hW%3 znDW@#G5;kPOTIaeW7+kgfzW|W{5XST?fg2(N^DX{ckJG44RkWY?{@ol!1I?UHVnYU zz{R5GbM5hhRhyv!5%b#LxKZlk-$eJm6>aF0a zP$nA%dnFYz9Pn;*@2MUr=P8@W9_@A#SG>23Q7d>SFO-JX82vYKW6a) zs1$nD+g7?+83xjyWLAo=NT_GOy(~0uzpKTYJ+j+vyw4C&CRalD0Ju{?yGAcV=Iu&U z1SJoLPrudN(fpB-qC)Wc%a=*lz^{1@ZRtR-3Ts{%Ib=S|s>-jXxI!@Xu`b|q)Ft*D6_P#lKGqQCvx4N@3|LEoZiI^GWH)}XNwjOd09?*n`d`WChq!In zIn@~s1y>3IZ@KsoL&odTKlIu9R3Z-SAQx2ZHz;osa?O;p*2`RD0Le9e(zfYxo2KEx zE^MikwbsrBAUZUl*zd#shK=FrBTheDt!bl4Z!Qy{k7X%UmY{}N9Bx2Ui#G^sNEEXQ z#Hy;%9NV+jmc?&@%mMCfz!PnPz=JGz;Oz|l7q-AXP=(hxZ);IT8PkFYu&&`G-|-U?6!GPuz2uZszZ*u#$NJwJ%z{ zI@ODGOgXlH#_1b-?Tf$QWxaO;(kl?4_QJ&oEjorNy-5!~so?(VW+w2ygYQbq<|5$> z4H&7X|JaPmH9`=v-O7m*t07NQzr1;;=9ttEj#;yw+25Y@ zdh(gEQ3SG`#8-OiA(k=SH-^c53p_*vO2ATG)wwL|ZJk^_LQ<1;k55?9V)CB}EP4yv zdx77NlKAt4B%NjN-|G?^dIXt=*)$kD($LYP7q9kLsnQuG#nIr_QRmca>A9`jp9(f% z;qeA9G~y13nq*6^^eA`Gf|*gf?Vx*6K_R;huZ8)Ng2EfaWUjGCk23BI@J$x#l=rjy_t+R;CrcnYdExAv6tkIQb)*6_ek{Wy?FEG zsK|Vg(kLnr38tAT4EK|+Bxb={-z>&EOEa_#d z>$GHrz@FwwF9Q#TG?

G(2zw+crFq7EjH&q`=&{oc3hJ#{rViaeHeDZK(}B-~t|U zagTeSSO>!KlD%qmH@NY*f83^96W6~+2Dy_3qzCt;F4gL3))%p0GD_kI8w6z-ce7Wut>AshFlf{o*@m@MN4Y~vI1D7c5AadCf=OhZX3eQ5*x3UIwhFJ z2Te#`AqSUjcg0s^k-g+vYZn3Gt{n>1$~4X009qtKyxZkYIiD!M27# zCa-J)@W6R6U&hYWuhB#;OIIm4LJREI`N51~M?8VdYmjl=rc*)#z0{Z04$Q>gthKv+ zF`lB5mKgz5ddg(@&jY_-rW+KwltOdIq?MFKzzld^9E4m`^$#OzHjXab+&uGttwtcl zjz9m8ozV1`iCWdS*v8|$)*&AOVPel5@SY;jlu7BSW{$=uVDx@j3`ejK0Q~}?NTZ=! zXD`w4;lMG?O<7;dAJ~q>=*4wim7MG1xnGzCQ;T5uE7M1lj;O`|6iTgxxy6IH!G{ zySMOGOFWVS-;2G`o3gM~-d`!*6aoyLzjo^_QFGgKw?8|OAYV&w8Gb$s6)!i%dPZ@= z^@h|gIp=a~q%{q`SSC?Rdg+iCD>VrZG?7#?b90i~&tR%&>ES93aJ_By3~3A#AP~fM z%+l1~5po+oK2DtkAJjJhx(&EIp9A-Uk7B>6VKcNLB7tgt#u^DZa^w#e{&@`x-ut$O zmOMDgKG?uZw|EW?*!{q}Yl!}R8;jMhW~vV{=o#Xm%+xtSL3h&v$^o{5f`QW;up0f) za~mwI&h)-2X3h!JIY#){=2$>NPbd~g)i1!#>h|06~Jj6s3a;(ymb}~%EtCof+S1IZ@+2lNu$JCjcb7KHd6r0 zwLFq;DbO+Fno3;0!-b82*vARqWplTWRKSnB4iP{B1<=LzJf_#a0PYO`wL%R~Cy069 zV%g9wu&sk_4+X)cTiNtgu;~R%1Te`NX}k^G%>V3LQ#o{t)^g~tWw5;y=a;7<90bAE z$?ZmN3ZU05W(kS6u>P9Y{aO5o2p~H48=0i`zuGg{l^ZM%0Zjg0RVb(UuR)Fme@}6= z2T1d;UmzM@NR-)R7gz2qjq4>&LY75Ntmubc^hhgc%w`j6QCOE&lj z3@b)i-fnnu>5O@9IbRD`15>uPgew(Usz94hBp6lB1qp5 zkg>^jBTtp~N^C;3yh%vpn>ijZ5XBeV06qg`7UTP0V-HC~Xjhsd1Xgtw~S^9`z{qRN`=EgG#I}s2P@rp?!jgDD0H@=O%RIjb{ui*}`~4%xhbQ-hC<{{ugmFX!poA&u6RqF6!R z?gWSj(j7GM$Xo>n4)|%leKv7Cta$MR%VFR0^1p}`)YbrIz;war_P>2z=bZLcG1`Je zF@}G$31WlbE~)NG1IN&}^)SbS$*(+FjMJJU3g4%j7MgIv|4|m)YdHy;CE$x64O11M znL&iSI45z5*6fHaeGo5NxAp(R57`aVIg9`ybm^J>FP@NH`ekEx6*jE9K^+4ED_ZSYMOw zM9tPvd;F5owoFaA&jH0Wv%QqDl#P}6lEJ&tTM2)@-T3O1>t57$2?^cAjK}^`)TK6m zw79gid_8iZ^{o+~$nN+v3R(FUO}D2H^d75^T(cMAdB5CM`G~<_`)FeAVB+r^d*LOis>}(_TX`G2V`m?IZRiEo}C0ZA$fhxFcDH zdiQFPFraESaOnprrc*bL)g^&>>`9~QEuDr*_}!aiJMchgi<9OWKhauRe$%`Y!WY z*y|$WJ2R4ZW_(cSw0`^ISd{QdUjJ*V>(^e7?wNl45JX<=zNz?le?utdI%&?x%WV5Q zZvz_(OSi?BceH%s&WAIWsm{ID_X|9C$s_cgoMb}Y_gvW)vejyR&kh>n-Gq$jn)OId z_wa%*me|wIA=@i4M+;e58R;6dpV&yuN*}c>RJ?-QbW#_rqziL&K%hYv8if2m_2J<= zQP*<1!Qv^T>y2E0?=Eio{^}SR-ah(C7`VVO!@-4_4lO7?RYyI=%&J4(u4CQ5LEOd2 zG(AHybJ|DA=IL;<+}c);L7enA?9?%j{WJ{^UHvD4{0PHtfRFic?N$!*q?6qvpB z%4ZW({07g_1R^AdSNhId^&4cleQ>_b*QuE9Ss=2wcaHIVn2kUn@V9JW>F^AS+qNezeK*53;<$HGy0+`<}*rgCR4BbJNu}WHXlFOt%C`jQlKj~@4sp2tf^Zl7?~D|SbgpuhJ9 zIu8H^0*_6`CC;4RegMikT+C2^EU9C*0XRP`&AX0G=4 z%2UU|yC#f`A_vc9Wcb*-AIwK=9d(Ho3pH)EMoJ#1iU!tB3n_ZiGJh9o71HM39g8*J zJw};1w>{4egyPdWe@K}Ze#Y~GN{VS9m%-=wRmWkYAAFH?JK)S|_Gn7i6Z1`SinE%6 zo%-z~nUJ4ES5|JYFqW&C4)@n3nT>dQG6ttMGV=#CQ}^JzoytnXsHNHEH1)-dHx2!GGD_AaJ`@IcbCr)wh{ zD{Org@bg()w_D2_R?s%QhGP$2d>Y|Lq8#r&3q49>STEcW_R~eT95x%G_H<``W|}cS z`lrIH1prNRmEfjjVSKJ0cl?b`^ki93(yHyWcuuHc&yLiC)V{s}z>fWSu({_~bvDz* z55n`xDkLU3DxCxgkz&fcZeImZI-*61_z{)Gu*L0`iSv5ZU&2{u%&C<*elKTq zC5NifCB}RAQT608@3H@MVwR_cj(TTfBO5VOfyUdX8%cd-x62$1K;?0X1Qq%zU7^IGHwsDW|%_waJq6FXb+u%C(3FdRicNP7;GnJuRO-_kKxO{$#@g z#+XAv*!`xSfWd1CpX+2TB>fq3Zme*OE!JF2u=d-jKX^n4UmE%>Eu0=YG@#+>VPrR=6cl?H z6|o9u{}mYl=bYY66-{5eHI25*G7XZ7NV-Ne%}waXSkR+-J9xcttJiBII8toyGv>(0 zlPC-RSk~OV6#xRLV3yS$>1UE$G}HU3jX<7qaZ&j*^KsM4=^=){;mM~~(|*{q=#>n{ z%cG20yhC^J=KC9jME&;DbPPNIHFE`E9&5`RVbGA{%{|g$Z}t6=$f|f6;Q6~CH)Ai~ zjeegM6B3Br)FtTd%BaSzi>~+gn6skw1FdEjcl=wLXQy5bg_dE3002UX-XC)xX$+gHq z_00PX&N1(;)#8xhqE&~D{obA(dn)P06#fZRkOUjXxN;1JL`Kmip=+RNnT?^@7u70i zR87WTAawH)Hh;q2uhCoJwajb{PNkt1id*TNN+{TbWASe#NOREgrwe6TSvn7z3?m@~7Q~%2 zXJMZ1#Nr2&J%lb?)*OR26PcweJ5WZO2e|?fgX4$&lGBIl$xc$KbFbwA_TGCf44m5@ z@WMo)(eDGsnQzBbvUwNHAq8VUie4bi22pAAct!tOeEsPTG;@xt(tSMH$Sx1KL$rh5 z8!JlpNAt$K?}0kL&2$&X1-YMTr}11R_07{Jt}yAz`a7C^J$+ttWsA3>zB6S_M(qzo z>^KSgplGN*^>L8gVBrlX0}9TzdK|JRGw|?rypF0^fG_{yEBP4Ze|Y4!k8(MBR9o&H zbHDJK`!<7Uu79~W)7amz5;rRXXjBB*VCXuLO9$R`D-l>8*Q@vNxoWcgOp$`!vXWl3 zTSn6>tBhtYE%L{HM5@ecAAQ0Vw+2{_vwhD?tE&Y+^<7i_(BsTF`K3^|q*o1_ciD53 zQ%=vfJF1EiKO>`j@L8gNnee%_CzHRAF_nyMo#8r;{f(&p45$RQj-_zaOZvF+&!FcQ zV>7reGR`|phj9$i6GEmTG;?oJtxQ=$PsUIq3?=A+z_b2bYAZ*;V}}bj)id32I$T$a zdY2i@aPm@qYv5OpT~Ma^5Ru>S>e8v^-PzRdZuzC@zsFZf98SOY>VC3}TVTJDc<-(V znAYz4zEipq2ECDucLrJ@)3=z4xRp+cxZ6`jbFQ{>L&-`s^XV*2cBBykv*>!mTxxS5 z51`B!!+_gB9-KFI3^T`dG`jgSyE@kII@4XiQEnSuF`Zwy;AO8i#LzQk=``lC|G-|a+M;$4iqPF~zVjXGrS*3w7qVb02i=9`ks z8`4cGR)TD}%9PWfjTT028^Joo&8SyT@qiSB-o(}pZ1w1;?AY-^W_%6Yf_MFpLVUEJ z-%k2yF?LyI$n?FtGsel`q#zzct5_l)y2f2{+N|O0k6Byn?NV$i^=NGBW=C7Hgyww$;8gZ1v684$ zwVR0-+RzAX=^+Y|dXxuf;yC6sS>hm{Lw&gKwJe}5d+#&d6XM^madRaaZ95_`9mw<2 z%z*bji1~Mm1OHGf_K^}C9SQ7GtLCj)IrqOo)uN1EjM1q3V9)JX#(%IpO?C2e;r+Vv zHp>*UDE8DmMjYAxBr`=gzWsLW0y^IDWWIX#vftG#IK8apT_}?hXGR5Z=mY*|_hUR; z)G<{I=n_{RDd!GnZuw5{ULiM$6IM%PiUuuX+PE9=ZuxA(Wqt=DMnHROL~ZT20oDO` z>1g%2if!@H$ycr#L@zAah3CAxhtKcO5s|re$uhL*2cEf%RD|5511Qcy0o=)myLi<_ zn3uh5fE(_2#t8iR2-rj?ga&QG6;yHSi=9`0LAC!c$^!M_Z(rY&B}(v!C{9Vr z$oR%s_|WQOW<*7AcPKRC1>swoyn`X*!uP8xp+59@L_G>(Ik5CkPMGX|;X)qgk&#d# zMH$QYqQIuWc|(S_?zC6eg3a^H^ky)(&_NAUmux0;+Pt?BCC9v%Qs}ZTi#Y$4ZKtN$ z*LxKZ&Y15w8EBZEIkZ3TjL$#j(Quj%LfmFgY@4>}eE;PKWN&xT_@$?`$~`7IZ1{pQ zSvNT1H<S?%K)}Iw~;GLUt}>|#N7g74Ez?fSXrUBz$R(= zE76zMh&Im{q#5(9REX=4Y0$~5j-3&s<-Eo3?*Wu*Kn);13@kvA5s=P&Y`=TqhRi?A zV{7)b4SpS%vsgQIO-7R&EE#PLmhbDqGmKLGq0`wQ<_R+3!VTx^H#Dv)9xI%n9FBz) zf%N&g89xtlWJ}1^$tjXA>yLiEUqQ3Wz$&M+jY;+qSA_{R!%@O-8u z8nNTIb}-tmPIf!tvy7@s50eego^j+Jbo(8E9Ytn6^y%8`x%l6aazv;#g&mSD# zV3(44o*3Q!Lh;S%+y?4AfSUiF5pYicjK$t-)BDpJR#W>GkkO;x5eYyoUng@?>x|s{ zUe(+DPg2Y$K#_*K%ocLh`N3i{>1=-bW=ARXMNg}gj9daWq~-=TtR1hZ z*rRM-SSqs@u_Nr*fOC6R=gz5`mB?3=g+j4(gA9a-o6xO=4np+d$p&#*0|vHbeAXDI zMy?}6%fib!oq8n;@%eWp`5@^AAG^}9W<9;0rUUKWa$0B%J0W*V3w7sHaRr{9kesw5 z&Y0q0GU2ChM;L9jo|*PN*=E0i{-g>Nxb35J&K=IggLGrje?Z6nb=2n#ZLg@YFTSX-X_(BjpZn6!nP_qfVZGVBU z^!$$RmVxni=^q0H0VpJVQvxOW(G=1^@toAXb3tfcU>~9i^<=vXqx7epY+CnJC;tW9 zT$Iz_XUge<5=%X^mm|=?6jB*?7jgqnu%+)TkBV8AjzQ><)w3}`{Dx(zRLDS@pnw@ zGX6y_?qReQqt()f=er`udoxZhp3>n;*$CjgpdTZPC5Y4XOz1h2ld@^5lzpxI|5wdd zK2-HRUtd0SmvmlQKpJU*%O#|d2I=lDLE_R~my||AkOt}QZjc5AlGDNh#?0UdIX3K( zo}2*xmtT0{qe1^UW1*p-(9=+$(9K}DadicTWVucc)_m3vK;Y-#4gmxlFT?B=fG=P8 zj^e$iLkGA|*ir%sgyjr!I_{sVXNPeoA>MwAM?}`8-0th3dLg={EOP)8Bmd(utKDs2 zM^Ux)`x~7X^We8#PnVyEal!~}wx(Q7;6eEBO|wn^_FZ*ct@D&QOhbbH5vSMOU(;Sm z=-2nbwVTJpwz2`^Z3rNgX)2Hx7b3n*Xb^>9prm?V6uGRIxC?TbgESU0sqvTwUBN%A zT<$mUi8qDroo5~0^ixjSm9MR-T50xuz<=+os4zsQJ~l?1UMQ1>iu#Y&c?wA1 zoe^9NeH#;cgG$Lbf`G;4JTQb1PKSDoURo#LTGkx?iVNgy=WoxF_}&@l#kBDpW&w3* zaIJFN1S)4grp)-4@?pW>^3d{0p_ONwfGFW|QO{S2NCI}*u}V%x(LJuxg^U+EN`OHS5r*~1?Uk?@J|K<8_dDBL0KZ@*jsvmM>DDtMOH>ym~td zZU>Q=^Pt5!BtSoZT@El3&~ubfqiOqTiX$lhRmpL4V2KB@_x&*9{`av@W>`f7iZ~;{ zN|)RPVSu>Q@^P@X$eW6)9dbXDvxZ7FFc!~;R|93L+xP)9Wmf~05@7W5HbZ@KQCn4F zGF&&Vk~PR%>(U?QDaW}@$RI!hsIw?x$i}jIGULzzSqRzLiQOwc@IaG3(Z*P??DNh9 z^1&(r2!Oong!dbd|5f|Mq63V|&?@psMH1Nt&OM##HFUr(e?o!EcC;)7?SGHyV#&yd z7ON4>SI+cE`_>>a(*0Rg9q#^L%y2at6JIVj4DoS$X*|d;{VJsX0JzPSL#)|8_y4&Y zYjjNCsP(N3HI2`uiWdI&E1NGF2vVijAKP4A0vNi1MUQk5Qu3EsVHLGd%bSz$n6m)t zBrJo!iwm=UjxwQJ5(+}ia@je?%3rn+SYJM6prA$S(mSaj#?MfGvOuMm8RYukR&p94 zuK!_qi95&fr=!yvTCLKwDhwT-7LMdjcN`*Br`iEWWnZV z7lPB1j=AB*f)!;$LbG%KvZzJ`aeWy*4z~tQ`~mGJcG^Mr%Zrb zy0{A%8Fp}FWAhhHgyhZlg=7$mh<0=t##tY-kWjfwj-X#F+Uw%*DZ15;TDMff&Q)Wl z|BK-=PlFu>F$Z z!~Uje@l7Z`5HOKEy;Aaed+u{OlnQZD>Ri3)?sUS62_RjfB1xZxA>q~=?;&SJFZl>X zZZGHmdW&p>$kXH}YpZ62VyieqO54 zinIMy5P`Qa7W#EufMcv{yi|{|V4%o%hY?q1^q(z+WK76xEVym$bH2Xp0thAv{NFFD zCqf4cQk?%gez(s@OGoJYyXQ@Qy`OX(dD>KssdoJ2!nvL zkU#qV+xFY+Xpslk(TJZcyj^`(miR}52m*yxK6-frJHK8uM7HvgK%|x|iRe*Cu54;Y zx-sNmeDB^%th|F3rzcP4MF9@?6}2*E3FC1LQoGotr#otQ!7oG%WW-|F`H!E&vOSUA zw<~xHpkZ`$AC_bfJ5|TtcUi*+Oxlcf zQPH8RXs5j@bz!?*}Dr*6>v&hg+qb_b`f|Cd9S7T7G)aGxx*dDkze&+%0v{zZ+BVT96`{ zCV&t1NfVS|rXtRR=hDYcty7#t5K3a9d`OLqNePx>|3X`Sv1cb9st}}R*zQ>fgu%s4 z9|A5qm`xm(iPu`=RgEtkFY{qpWupgIM@7lLzQr`X4~nr_v8v0qZva9 zqwMgiN&Rk2c5CC~Iw_AZamBJd$*N$4Fx#Xsb;Q*xFDHL7Y4aY+2y=GB&r4cxEnsp} zZ+WF?SP{tVM2$GH?pcf*k@qxVN{-c?L$?`+-y~Z>D?ltPh8s|LfX2If`mAsnXO^6; zr*{0Y?Yy`2$6OS$$eMZ=;MWY&ar=5ZNlGkG@0%4zl2zdd03lyKx{bf_P?3Mg29W}{ zA+th6HFWDAXRu4r^*yfm?V?qC$eidtT`hC3@(c<8{i}Q3spink)w$iIKkzfsnzI&R zfRs!Sp)rOIF8+^UD2nEhbECoi-0-1oX#(>6-J|HKt18vT5V0I#eM56jun9;vqHmUfIa=LxTQ?Yyq*^ zYW#l+c!-`r~DLupIgTd`E9o#vo4i|sn{M%4g zdt>_(%}N|V8h3(S!y7lKttrt`884&Cb+rO+oB2zM6=rQEyxKB4+&P)~zFrrh5Pm#x> zk%Djp-^QiYVS}7Mgza@KF0AGj^07?HWFx9jmoa8T0c39XCrsDGrws;`Fv<#E+_7O4}$ z9$Ai`9U@*Okpk3qcyRWeroGo`!gRCul~+cRd#-DHy|p$L*{0Pxp+(6{?U0}O!fFX+ z1$4RHw#wis?A=_`&&-F5tPw;V;YeS&G#|v5MRGD!Tn0!k9^^cUsA|>e_zA}f7A1HYWc2mXZn0Fo!(~?kH}1*yYw4* z?-5@+gd~JlvFf!o`BGK*FWi=3JCnC0D)J=`{9FKkUMeTG{wC!%50RhLYdwF%KL^*T zzR#@c{|Yk`G+y{*R4Wp}xA#oUt{OtX#_6-5twuOw#Qy9lIdDrjjeLS5(e=%*4@>sn zax1;BlG=rI-LbxVqg9~P_@C|-Mfeis%KA?cP&DF0Oq z`E_r8_Nsif}}# z1mQ7lf#$YlGxJh}p=exQbQe_gg1W7`Gsnlbv$r{Y@skGU3!ZYEF(HyIK zI=u+^gWd0}`c&|GT6g0r13#O)V4W?jBhnNdFL==w4ZcTCgP6 zxj7wUyZ1vsrNP?n4OAlxUvXo=JY@LN z`zXQ@-8enC*%L1cqZ?F6n-GpcV&HjKSo-=b`yTtt>In8krdF1;kPJh91l7quHD$-q zzBd_9V&n0d0R#k-g=NXn1}A$_&KvXLeLL}}%(s?}uhvDM$PuyHA6Q1#BI%tPzGf@D zj5xM61Z5I5uDYrus(-G^h;8|5AG3{fT=-oudd%Q>O7y5@%wL5X0=yx5<~SuFi-K8{o%|(r$`pZ*Xr*=ctA5{ zGqACeV^B5hcs{_^Qz0l*Yt-;+>_}>9CVy34aFf*7_|u}=E+=oHh_sfELQ+q7j|*4H&`8H)?h^jiDzdPs|187J1Bgs>)alOr#relJ1vlIo#0!^8 z7TLrr{EZa#btHWm-a63+=Y~PrmfF@)=v$ z`j^*oVZN=4vo`&@yCj1wkOrsWmNch->@%9Qqy2OvQ@V)~7i?)U9ff@y7(^Br#Mor< z%I4-7)9@^@MD0&sk@kjjNr@(i3-z(Sh%)i65B=49)KO0V=QOohQ^|(=D;SSuW}vj5 z5Kds??49ycwQ}%zR-*^mf!VSy8#~xk?>qif6gH{g=J;&oH%0^Yw#^YQKtE4JhH^f1 z)rjh!2KVq}1-2?@rrfb50SGeGeZ(C#JlnWeo$WDfsUS{{yAcVS%$==}o)AV%4>H?^ zzyDRh$wf1h_g$U3z2%fjn&meVUZU16pB&jps`FU`=Pm1g)_%un#z|?(8dRZriZY%X zK1N|FQxE^N+&f|=db3t)!>{4)&raYh(8a~e1s~J(4~rN3p*(Sn_ufWlQY_lZ=N1X@ zw4ZY~dZ8S(`HXOy%$*D6l{L zt5HTiaPo{q7rHFoE~fWqAXGr?2PPo=-hDH4A8$SXia2Pk1oi#T%wn&X+8f?%wgc=wHYdY6x{r5LMISX8DO6^Yn^SnqoQfYUNmTt`VKQu!)BZ8@#R3YQSS>?h-HYj{c% z?79`GSFerC+3$TB`$YfGW$sJ)f5b%--iZCICWx>O;E7c&dLR>jT4`Z(-ZePWH(FgY z(mUI<*~ne(!e(>}-dexM@XXPOh_3XDUh}p?^ia;&l4AGM{MzTIe97Ud%+K-0@s{V` zgDu+IxxY8<3y|l-%vdt2vLq5UhS;J}E4_~<0}wq7|F+#`>K|zJ*UY}vj2vqa8=20p zhRZAyiU1=$k0r(<;+<9>l1a;2sTeQf&6+IcD*oIYruy#xv+dGL?|QbxdtE~x#Fvdf zpEvY;%h&%pT3cskqs#?nHu2iJE2gt3$SMuEM8YCn-1(-Vu{#18f@GcCOc_m^eeAh1 zs2|gs7=*0}>a0~G^M(i{UXhb$I)3_A=H+wj^_{iUJZv+c3y((`60wl@`DFIEZalx?Z^z}BDB$To;(>ce1 zIQI7H{ScN{nqP$OPR*Wd?kDlEl!&o_lbcFb9b}&F7*WRUN|%>_cuX3CGCywq${H{O z3#Rc%4xv%povcHR$(9rr%C|#xfm5_npI0-wsl4;8#(|R6nrPC5@%nJzlHr2q(aGoL z*|O!os>Tv&m99An&BHQiTJzs8Y#itMs|lc+%4InxHMr0r3dpH!2NUfBhPvlG6+$J3 zS88h9!)u-pB#Y*9dkq!+&5TfE7CiiPp}R|H)+Yv@KlI&ym6H)+xxav@_sr|j;2*$6jcyev)s^e@d{Ho z4>~y#N{iT1x{#Xy8L~dBR)sJ160p73yk({0W!#P_fai*0+8DOq<)P$7ZkFP$7M#Uv zXZzmRZu1Fg;%F&l(FjE6r=;9D(;$RoT?%f?it1b(oGDO0V7f-JI6T^YQA#}ElW|1< zkq~UD92*R?n$MC}vo|2SH^TEuOw1p+RJ{N`Mw!?Z#wZS zMfoF9?rt}^%RyX1Qp1)SZDLa{QXy%yU)!^U z__a-}5jv%wquV12$1>}9>d$+}xNXKu?UfjT`8btBF@kqk0^oyW1^>QBex=zC&#M4% zN#sbV{<`yPKk?+qk4y{%ZsJaIEoii1Q332C2P(eP0$@p9#pYc&s#(y!7v(w4DK#y= z1a!y)!o{4+fYPm$%ao?{ZcoE@tkFfaz;YqW&Q$C5$8!@wbjh`xXWGBpHm+cZS^RVB zBdG#2hR?DE$77sjVB$$gpB*d=rhx49w78Gm*)>QHgjhjoWtQg%S)69Nfn~@e<`CqV zoe*K{VL&p}1iIfLa=l992wle~%5AM$i&ku(dkX=vsGFzG+QAdZ2eGgbBY|>$$CaWD~(6HdR4267xT7+>~4KeH18t#?Nk+I%?kxmywX_GW#~SyhZQE`gsc8 zt+KTdbi2M9Vk>a(UN90WyVb?Uyi=50w8KT{)7(iR%Juc4xL1)=C7z8Jx>zv?;?_5y zPuKL!<_uXyXP^Tig~9BI3%!?De*>%_ZJ1n^*0UU@GB{4qWNw*#xMSI92X@mzqeYC< zjOqHRk|W`kDm=snLtEXdGWrW9MI^n0pjny+ZhqJ*t8L_X#>a_E$YXzpMaW1PFCt_@ zTw=+V9OOrj#M>Jj*`$U9pED49Zfg~wKZ!(76Z^q|Pwg9D2$>Qan8(LYPvi|TR`ytl zrwEmJ|Ac*~@A}4ex8m^p`#GW5ZI|j0GlWY~kVT?|+>2GZkR0{jjyy;nZR9vW@$~Xe~DAUl{i`1bFEKr(jYl zAjVU89_UnpU{Va6yTodF!om`o0896;PnQ~HhQGS^_uPJ4qKlqi4Y7;5E47CJBY^GA zRO3B{!f;)93lx~Mo$03Kbi$!XZombUHZ`fB#ORQ}@2+}-(PdLswYdY1I9>jtp^v!I zR3Ar#mi*L;Trh`8O3gFYJ3+XD@=n!0*5V07Z_$YS{y8!rBEt16;=Q)$Q@Hn5$O9$O z7|wt(DA-#-7j2{sLGYtxb0S5W7AFt_Ze%vbGhHkNQ6VkC3__xL|q)@FGpnBFZV<- zECsgD1KHU!JHweU(9ZgT4BEQ3L3p*}qDS2ycEi2Rseg7}V~nqK9<^GtEQbZNWm&rO z>M)BzP%=I#I%|R)tM{krJMSJuxC_v2BbFJj26N!mN#aAJl^?-jc)@yiKz2%Krl`u_ zB$E`(FEgSs$@SrtVNh!}K5(LB?Ff=I{^~sOQIHVQ9UR)E=J~TaDg)mbh5p5QOP zLu8(Y)%~qMNb#xY0^OIuzfLNtuRX4MS!0P}#GXpS26o=c@JS-Ald(Q!^=>ik0-*cl zIH`&c%gE2zB<;tA5_fn}oF~z4GuAwHm+xn8eDYKO=?ELfdF3l%)Xv_rp+51cGXXge z)wOIau;fv0;;Ax2%w;!a(y`A(_VDBN4y;%ppqb5F;Ni1ys)6VDoUhQ21P^P_h82hd z8ILz=i{dFVG8w1bL+p~u_`#&Fsr{Twtu44G#Zt-Bd`X2N%0N=| z@v`TreA%|)F8_~17li$n`3hoNg6e-O73dIRlBOblc8WdxtM_=<_Aqjg>3h=UHy)}@ z4x6{&gQ>1gmEm0j<)!buIGqXXQM(l@MCxYbl-FjZ=(?Q|JlazqHRt9gl9efo6W9S= z;bQdZuXMoCVR@?tH|4pcRK7OiYX|`h9qw0KPG>+GLDBDwanRwt-N5;T6VA_VHvClX zzSLK4YKi`_b}9g}3%26Amtp0PjMIbmYOr)S! zk8=t4dH|F6&aO~tkpjsU+a7}_V3Fb~q+n-YPGsm`5i&PnF-QSpYWhuE(4b@|B%4cv5HiVdV9RHVDsfpCmTX~Z01roWsaJkFqcAid zX?H0^qt=~L{3-hyh8JGY6Bq&7fA$sQ!PgFzL$Y%c+1D?BMzn$8;ZNqcj`v3zUyXb= zxEJqZN7U~_C@-$VQ#+Rw#tKeg^ho;nU#s<_m*vK7i4$QL0SLNR@CH|~>=A_o!I}k& z82kro3=5aZo;A>6L9zUHm0~49B!usRfHJm>zr!l+OU1$Ng9j>>Cyvi7CAd_-i>WUb zQjcmIAo`FxpXNVD$^!OYn(r3S7Ju+>ItZQ#JO)MJ>Z(hE$C1h4_N()1TxZuy0#A2( zbX+qb#(|!1s+t)~y*A9%{tHjSt9N3jQsZIpI{T}u8Edxzam05mU}qtp$0n?@QG7LD z_0y|%3@Qi@*>q$cHtBLJJ1dv-g5hd1XRWDk45~b0$>3lc;d!#QQXe-z+a=DvMe+9JI{+Nx5Ih zPMhuq{dGHWn`OpH1@rUoc*~XI!vEF{Ne_eaxK$zETwA1)egDnhOtkE*^*=3TVbnP8 z70@4z2l&w&3-p?!_EAS9NJp&yVR$euhx|nLXq;3`)h8^(g>VI5i;7-vJhmNBV4$;j z3+h0c?7P&#f(xZ#wRHk*v5&OdP+e82La~e4H0pyC#ZQb&&~PmCg8+cWN`xx$p;p$b z*{Fm`q3M20=K`_IOKxTzbB|thXlG}|+|K(ZrRH*RDTiL`k7p?6LqqNx?>{ zZZ-!c(7IU<`^H=dFZdWRh17`K=xjTlmaB5N3{G;W=Z?M+Qd)ogd}wI|@iy;P12aGx z1jd?tt|}0lFW2>5@6KT-Mmc zdnE}9?h@}W5Z5PAvHJ2iVW(%OCapfiF|V*Ob6Bm9YGqZZJf8QdhExE$LLQH8neDu8 z<<-2xzv-_4q)|SFDf;k#Q21RYHkSMZ^BP5t_tx0o{Sz!;$=nve)IA;kIu(U%_J{kW z!`C-*sFes$^jCMyeYD=@w3ew|mFb_CC8TQch%le;qnm_wUy*bx9`3A9CXD2EN-Kb!{>YL$WtU*IH%;-JQG@F z$$I@l(=GJDIU1L7H_l&pcm<}<%V{DSYxPL-lxc4ggg@R$z%p79-a9JhWCE!xx=%PU)p2A|gz7<;xP&Bq(&X|2;EbS=2cZu=5v zD}5}fP=fFdPVOF=O;6f?@K_5lE*62gzPn`=U1oxwy|w-Mu$sbXxC7?zyWo>!8JGPu z$NgX?=xpJjCQ7^4#_3rOISd86^fL2PTiwac4zVOswG2j)6c2@5ddfy@Tf@S6hN9;hJs#Q#J=q zPOuca zzSFf^kj_>T;*&40hd>Ee$r=+cdFS*98rN=p2yyfj%|IrnRj|8mYrWWXjCs0*BcLzXu9Od`i)97!59AvaT8x= zMNS-Kr;rpT4AZYvP0b}r2z?dj%4O;9_Pw3ob%IUkkT~@%zkhPtyZLTV-bwE2B~_D# zG1|9jIEcQ}lP&R0#{}}i1zZ!t`y~SwmNI+U%=Panp&&mw?Bc@z^&}hrn(g#$#i`4R zBBCef4#C`SabDL%c-`fbP?wwwJ~T!?4bJ&!{7vx=4-@J??fX2PPskIZ|~S@6<5;@PN|PCQI{z~c6WXoeq2Z5{l%XH6{%iN^`g2@DSY?sP&kVtYWq|8$ZWQ!tW4cly*1m-`}o(2;|_dtfWjH zfGj#ti&&mA6Ggt#{73&K4AR2_Wmj!|t>HChlg!z1QZ+;fIrOgIipaa^#$@tJrEso2 zZo|>$L~2fcoc4;3tQDt_K(g!#rg=*g(E8PH`OVWiX<`C+=+EnD%#ycNPrswJOub?! z4-}CtJtdJ;5Ko5V}xQH&Hm8i@FJ&fy~+DE359^o|FqpWpeOM`=ivybXzwb zqQ2d%nt)M)DY@+Mn)FqvC!~+jmo z=yv2FSwi-%3KI!?gt{Ut7)eT!!oM$ufFWwX)7$*lCF<+=6FSW9vHJVtfx4@QDsf8J z%#?4f#?{e?`QJC+>KHsBUzG~Z>@DKl;R!^Ugb#|UbN>devW|6n2%Kl(QKXG?aA==w zSnQ=` zY^3x)z4=(XS;|Gw5f!4we*oJv%D6j~1=_3Ip_lEvqH1zyu^79oeV zj`4^K@vime|9a3LTds-||1++I^%h72XuGA$t|wot4%hClUv!l1^7o35IoZ5vtuIZv z-j)iT{lRbf4SsyUE0U$?LIpa%dZ86s?~h=w7dzTu5v1V=V7r+xns#B%h5BR3UK`B& zw#w~H^Dg8rpBKro<__v&fv-8|y;}Z)mNnODaYj6M+mkQwU3O3BbUYwmnfW}$;5CTl z3BH{T#D)!D;9Zn-tn>8m#pKBlbsXZYO)xt!1sXDTgJ{w z(_&h!C#Oq9d2YBU8|aW;?x+tqJ70FvE+-ni!U#pS7O7~xX(0r>H)8J?9$rp@4M=c2 zvqw0Nv`#b?Wy1wg6w)+DOJOjmH zZ3JfoF>}zdTm5;Pd^;l)-N<}3>HX}4f5JoyPta2c-W!$qc>dp1FYi~Irz8p+j&J6dw-k_p1{48rX5;}8mD4%97sGN@9_nAlpQFE3fL)c^4t-VST644&7 z{DywrCuOT)tuzn85)Uk{P(}87&P(<9W$hQ1r38M<)-hODM8kcS+U+vi#|2dvSS_qj zt)cn8qHyI$Rr{cPJ+;YS4pL!+WGa?xi78#i&ly5lWMg**7YXmXpALEyFpQO-G9x#; z17(>+i2}=E&f_qF|8~qsR2;=zEH(;rLhyiE#nIbq$4a=dqIK3)#1^X&vshWH{c=WM zGSiv&2MHZp``lsp? zh>t}*DZAGz1eF?22DC0>{vpEX~(R7uZfb7O|h{ zvOfB!sd>uIFWEK5qzeuG<47R!ubiKc zsNcMGYExpoeoJb|-Ymrb^L-k`7O!ct)hC2+!Y`mp(r1%dZi$8=gyH!oV{Bj;jERur zgV#$vexP00!UKI_6<_hhNAA7vG)&HNXyDt)=_y|}?a##(Hcu6B>o3MN*gO6C_1K8V z&-*0%bvF{vzqgYsKL#OJ_4zU)nXz3Yr$a83~ho+v7kG6U@4^-Wuu zU!*kEX>$ChvqeyDE_KkRuOC(v1UjEbM6GU$1Fjf7=kGm4*sCx{6eQG?RYb>e&QV=X ze$vx_t|&w^&`6)kFQb9Svj~)F zqRce3oV1Pa$poQQMV0^h;<@j_MowmCdUsQkR>4r5DM;}-Dg8G9?&s=Btoh%Jq^Ytq)!{WlC)r@g$eFaI&7G?K(+T$^95@SorYoFIacWb-rQZA%5Ru1B%@s_2w; zP)ZhPVJi+#;O)4>ysXa^G0E}hOqkSPjL)UYyOKFzUf#&h+T|0s3d}qq|Kw?EiBoLf zk4}#dD?hM}u7n&)m|86ll+%S%u_oa}aD?Ixc`&cnB~R5uGXi6vZ!<46WAw9b(PCyI z1OxayQN2luEJqqzT`}ZTF*Dt$lI}U?gsJib3^NEd1Djv2g*B8jH=O+BnsnIk`8Mg0 zYwSZc>@h4~p^)M0J_bVkigO*u6_oLy);;4UM$hG799|uLK;C)L z)DSuwcHUDvSs2q_4b5TdjPvQMG?HXqWSnudr7|U{cQROh z;ff#w1<&AitwCHpbtZ7yu~H1(fYMkCh0jVkMw0bvV+dBfy;lPqPle`{p4TLCUsY*o z%yp=^6}oJ{0Ru93kc73dNHSSuW3x~C>yc|ej`fBOuc+$zuto=-AY0e<`N8)qmb;`D z74{|OI;PjwOo89$GLaCo{2XA|8zN)7A9xU7DAb;@`J60BaIpVkW+wl8WtEX#sVO$e@m|_3-r#)eI zE^S=4Ij!NhO$i%pzd6aC!I+6Y_pV?>6ohZ;zld?4ua-}%rqL?g@Sn@=kOVR;?;eN> z2M&vc6sWMM{%4uVBdR0Dqc`IX1{Et-KeK(~ZVo4YZ?^DuQ-iP%TNQ?c+g~FK-U+)E zB>SNCfh3Gk-b#UA_n${(#sI8WTHjw+u&|Y)g6;MNGHpH%o<`W!R#>NAeicx`Hiw7#B95G5$ zVa(;H?1R+4Sll(T)#d4iKE9FeNcy3wyR*LLkew~Q^1({hca@D8_)3YF%K4$xdwjWJ z(dmw$n8>S@y|-SG$Q`>s$7E2fw@Tv2LewiX5IYO!anki2c08579ZNj6RBO)8a@U~G$Uz_ypH%GGJ53QHlpO7 zVl&A$wT$f>r@n2|8YqSfg>xwxLC7q7xIVk^j2Tovjt5Cp>)s(&6n9q7Yis;q1JyfJ zeT!Gh?HB^nJ--}vA)o{E|9ZF{O5P5d=o10||NrvWg<#hh+&Tyz0cQJwK<}lMp_LG0 G*#7~FX=la& literal 0 HcmV?d00001 From 79d0c0f4c45a209dcef176efac932e4c93fd7cdd Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Wed, 6 Oct 2021 17:39:42 +0200 Subject: [PATCH 05/50] Remove existing GA 'integration' docs. Signed-off-by: Eric Peterson --- .../google-analytics/installation.md | 23 ------------------- microsite/sidebars.json | 5 ---- mkdocs.yml | 2 -- 3 files changed, 30 deletions(-) delete mode 100644 docs/integrations/google-analytics/installation.md diff --git a/docs/integrations/google-analytics/installation.md b/docs/integrations/google-analytics/installation.md deleted file mode 100644 index d6c23cc4b0..0000000000 --- a/docs/integrations/google-analytics/installation.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -id: installation -title: Google Analytics Installation -sidebar_label: Installation -# prettier-ignore -description: Adding Google Analytics to Your App ---- - -There is a basic -[Google Analytics](https://marketingplatform.google.com/about/analytics/) -integration built into Backstage. You can enable it by adding the following to -your app configuration: - -```yaml -app: - googleAnalyticsTrackingId: UA-000000-0 -``` - -Replace the tracking ID with the one generated for you after signing up for the -Google Analytics service. - -The default behavior is only to send a pageview hit. To record more, review the -[Google Analytics developer documentation](https://developers.google.com/analytics/devguides/collection/gtagjs). diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 9cf3b204c2..1f578e0cbe 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -146,11 +146,6 @@ "label": "GitLab", "ids": ["integrations/gitlab/locations"] }, - { - "type": "subcategory", - "label": "Google Analytics", - "ids": ["integrations/google-analytics/installation"] - }, { "type": "subcategory", "label": "Google GCS", diff --git a/mkdocs.yml b/mkdocs.yml index 366411c7c4..364d44905f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -97,8 +97,6 @@ nav: - Org Data: 'integrations/github/org.md' - GitLab: - Locations: 'integrations/gitlab/locations.md' - - Google Analytics: - - Installation: 'integrations/google-analytics/installation.md' - Google GCS: - Locations: 'integrations/google-cloud-storage/locations.md' - LDAP: From b00e5643854e909dab97c61cc1fca8470b9d9523 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Thu, 7 Oct 2021 09:53:10 +0200 Subject: [PATCH 06/50] Document the Analytics API. Signed-off-by: Eric Peterson --- docs/plugins/analytics.md | 298 ++++++++++++++++++++++++++++++++++ docs/plugins/observability.md | 5 - microsite/sidebars.json | 1 + mkdocs.yml | 1 + 4 files changed, 300 insertions(+), 5 deletions(-) create mode 100644 docs/plugins/analytics.md diff --git a/docs/plugins/analytics.md b/docs/plugins/analytics.md new file mode 100644 index 0000000000..0b3d5dfd9c --- /dev/null +++ b/docs/plugins/analytics.md @@ -0,0 +1,298 @@ +--- +id: analytics +title: Plugin Analytics +description: Measuring usage of your Backstage instance. +--- + +Setting up, maintaining, and iterating on an instance of Backstage can be a +large investment. To help measure return on this investment, Backstage comes +with an event-based Analytics API that grants app integrators the flexibility to +collect and analyze Backstage usage in the analytics tool of their choice, while +providing plugin developers a standard interface for instrumenting key user +interactions. + +## Concepts + +- **Events** consist of, at a minimum, an `action` (like `click`) and a + `subject` (like `thing that was clicked on`). +- **Attributes** represent additional dimensional data (in the form of key/value + pairs) that may be provided on an event-by-event basis. To continue the above + example, the URL a user clicked to might look like `{ "to": "/a/page" }`. +- **Context** represents the broader context in which an event took place. By + default, information like `pluginId`, `extension`, and `routeRef` are + provided. + +This composition of events aims to allow analysis at different levels of detail, +enabling very granular questions (like "what is the most clicked on thing on a +particular route") as well as very high-level questions (like "what is the most +used plugin in my Backstage instance") to be answered. + +## Supported Analytics Tools + +While all that's needed to consume and forward these events to an analytics tool +is a concrete implementation of [AnalyticsApi][analytics-api-type], common +integrations are packaged and provided as plugins. Find your analytics tool of +choice below. + +| Analytics Tool | Support Status | +| ---------------------- | -------------- | +| [Google Analytics][ga] | Yes ✅ | + +To suggest an integration, please [open an issue][add-tool] for the analytics +tool your organization uses. Or jump to [Writing Integrations][int-howto] to +learn how to contribute the integration yourself! + +[ga]: + https://github.com/backstage/backstage/blob/master/plugins/analytics-module-ga/README.md +[add-tool]: + https://github.com/backstage/backstage/issues/new?assignees=&labels=plugin&template=plugin_template.md&title=%5BAnalytics+Module%5D+THE+ANALYTICS+TOOL+TO+INTEGRATE +[int-howto]: #writing-integrations +[analytics-api-type]: + https://backstage.io/docs/reference/core-plugin-api.analyticsapi + +## Key Events + +The following table summarizes events that, depending on the plugins you have +installed, may be captured. + +| Action | Provided By | Subject | +| ---------- | -------------- | ----------------------------------------- | +| `navigate` | Backstage Core | The URL of the page that was navigated to | +| `click` | Backstage Core | The text of the link that was clicked on | + +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 +would help you answer. Or jump to [Capturing Events][event-howto] to learn how +to contribute the instrumentation yourself! + +_OSS plugin maintainers: feel free to document your events in the table above._ + +[add-event]: +https://github.com/backstage/backstage/issues/new?assignees=&labels=enhancement&template=feature_template.md&title=[Analytics%20Event]:%20THE+EVENT+TO+CAPTURE +[event-howto]: #capturing-events + +## Writing Integrations + +Analytics event forwarding is implemented as a Backstage utility API. Just as +you might provide a custom API implementation for errors or SCM Authentication, +you can provide one for analytics. + +The provided API need only provide a single method `captureEvent`, which takes +an `AnalyticsEvent` object. + +```ts +import { + analyticsApiRef, + AnalyticsEvent, + AnyApiFactory, + createApiFactory, +} from '@backstage/core-plugin-api'; + +export const apis: AnyApiFactory[] = [ + createApiFactory(analyticsApiRef, { + captureEvent: (event: AnalyticsEvent) => { + window._AcmeAnalyticsQ.push(event); + }, + }), +]; +``` + +In reality, you would likely want to encapsulate instantiation logic and pull +some details from configuration. A more complete example might look like: + +```ts +import { + AnalyticsApi, + analyticsApiRef, + AnalyticsEvent, + AnyApiFactory, + configApiRef, + createApiFactory, +} from '@backstage/core-plugin-api'; +import { AcmeAnalytics } from 'acme-analytics'; + +class AcmeAnalytics implements AnalyticsApi { + private constructor(accountId: number) { + AcmeAnalytics.init(accountId); + } + + static fromConfig(config) { + const accountId = config.getString('app.analytics.acme.id'); + return new AcmeAnalytics(accountId); + } + + captureEvent(event: AnalyticsEvent) { + const { action, ...rest } = event; + AcmeAnalytics.send(action, rest); + } +} + +export const apis: AnyApiFactory[] = [ + createApiFactory({ + api: analyticsApiRef, + deps: { configApi: configApiRef }, + factory: ({ configApi }) => AcmeAnalytics.fromConfig(configApi), + }), +]; +``` + +If you are integrating with an analytics service (as opposed to an internal +tool), consider contributing your API implementation as a plugin! + +By convention, such packages should be named +`@backstage/analytics-module-[name]`, and any configuration should be keyed +under `app.analytics.[name]`. + +## Capturing Events + +To instrument an event in a component, start by retrieving an analytics tracker +using the `useAnalytics()` hook provided by `@backstage/core-plugin-api`. The +tracker includes a `captureEvent` method which takes an `action` and a `subject` +as arguments. + +```ts +import { useAnalytics } from '@backstage/core-plugin-api'; + +const analytics = useAnalytics(); +analytics.captureEvent('deploy', serviceName); +``` + +### Providing Extra Attributes + +Additional dimensional `attributes` as well as a numeric `value` can be provided +on a third `options` argument if/when relevant for the event: + +```ts +analytics.captureEvent('merge', pullRequestName, { + value: pullRequestAgeInMinutes, + attributes: { + org, + repo, + }, +}); +``` + +In the above example, an event resembling the following object would be +captured: + +```json +{ + "action": "merge", + "subject": "Name of Pull Request", + "value": 60, + "attributes": { + "org": "some-org", + "repo": "some-repo" + } +} +``` + +### Providing Context for Events + +The `attributes` option is good for capturing details available to you within +the component that you're instrumenting. For capturing metadata only available +further up the react tree, or to help app integrators aggregate distinct events +by some common value, use an ``. + +```tsx +import { AnalyticsContext, useAnalytics } from '@backstage/core-plugin-api'; + +const MyComponent = ({ value }) => { + const analytics = useAnalytics(); + const handleClick = () => analytics.captureEvent('check', value); + return ; +}; + +const MyWrapper = () => { + return ( + + + + ); +}; +``` + +In the above example, clicking on `` would result in an analytics +event resembling: + +```json +{ + "action": "check", + "subject": "Some Value", + "context": { + "segment": "xyz" + } +} +``` + +Note that, for brevity in the example above, the context keys provided by +Backstage core (`pluginId`, `extension`, and `routeRef`) have been omitted. In +reality, those details would be included alongside any additional context +provided by you. + +Analytics contexts can be nested; their values are merged down the react tree, +allowing keys to be overwritten. + +### Event Naming Considerations + +An event is split into its constituent parts to enable analysis at various +levels of granularity. In order to maintain this flexibility at analysis-time, +it's important to keep each of these levels of detail disaggregated. + +- Avoid providing an overly specific `action`. For example, instead of + `filterEntityTable`, consider just using `filter` as the action, and allowing + `EntityTable` to be specified as part of the event's `context` (most likely + automatically as part of the `extension` in which the `filter` event was + captured). + +- On the flip side, when adding `attributes` to an event, look at existing + events and see if the data you are capturing matches the intention, type, or + even the content of _their_ `attributes`. For instance, it may be common for + events that involve the Catalog to add details like entity `name`, `kind`, + and/or `namespace` as `attributes`. Using the same keys in your event will + ensure that events instrumented across plugins can easily be aggregated. + +### Unit Testing Event Capture + +The `@backstage/test-utils` package includes a `MockAnalyticsApi` implementation +that you can use in your unit tests to spy on and make assertions about any +analytics events captured. + +Use it like this: + +```tsx +import { ApiProvider, ApiRegistry } from '@backstage/core-app-api'; +import { analyticsApiRef } from '@backstage/core-plugin-api'; +import { MockAnalyticsApi, wrapInTestApp } from '@backstage/test-utils'; +import { render, fireEvent, waitFor } from '@testing-library/react'; + +describe('SomeComponent', () => { + it('should capture event on click', () => { + // Use the Mock Analytics API to spy on event captures. + const apiSpy = new MockAnalyticsApi(); + + // Render the component being tested + const { getByText } = render( + wrapInTestApp( + + + , + ), + ); + + // Fire the event that triggers event capture. + fireEvent.click(getByText('some component text')); + + // Assert that the event was captured with the expected data. + await waitFor(() => { + expect(apiSpy.getEvents()[0]).toMatchObject({ + action: 'expected action', + subject: 'expected subject'', + attributes: { + foo: 'bar', + }, + }); + }); + }); +}); +``` diff --git a/docs/plugins/observability.md b/docs/plugins/observability.md index b5a6a0ba60..d8778f07f8 100644 --- a/docs/plugins/observability.md +++ b/docs/plugins/observability.md @@ -8,11 +8,6 @@ description: Adding Observability to Your Plugin This article briefly describes the observability options that are available to a Backstage integrator. -## Google Analytics - -See how to install Google Analytics in your app -[here](../integrations/google-analytics/installation.md) - ## Datadog RUM Events See how to install Datadog Events in your app diff --git a/microsite/sidebars.json b/microsite/sidebars.json index 1f578e0cbe..c82586e14a 100644 --- a/microsite/sidebars.json +++ b/microsite/sidebars.json @@ -165,6 +165,7 @@ "plugins/structure-of-a-plugin", "plugins/integrating-plugin-into-software-catalog", "plugins/composability", + "plugins/analytics", { "type": "subcategory", "label": "Backends and APIs", diff --git a/mkdocs.yml b/mkdocs.yml index 364d44905f..8747d5ad8b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -110,6 +110,7 @@ nav: - Plugin Development: 'plugins/plugin-development.md' - Integrate into the Software Catalog: 'plugins/integrating-plugin-into-software-catalog.md' - Composability System: 'plugins/composability.md' + - Plugin Analytics: 'plugins/analytics.md' - Backends and APIs: - Proxying: 'plugins/proxying.md' - Backend plugin: 'plugins/backend-plugin.md' From 3cc66fd08721c67ac7f49c7186efc592a6e94656 Mon Sep 17 00:00:00 2001 From: Eric Peterson Date: Thu, 7 Oct 2021 20:47:08 +0200 Subject: [PATCH 07/50] Prettier Signed-off-by: Eric Peterson --- microsite/data/plugins/backstage-analytics-module-ga.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microsite/data/plugins/backstage-analytics-module-ga.yaml b/microsite/data/plugins/backstage-analytics-module-ga.yaml index 362f03bdad..0a03ec20e8 100644 --- a/microsite/data/plugins/backstage-analytics-module-ga.yaml +++ b/microsite/data/plugins/backstage-analytics-module-ga.yaml @@ -1,5 +1,5 @@ --- -title: "Analytics Module: Google Analytics" +title: 'Analytics Module: Google Analytics' author: Spotify authorUrl: https://github.com/spotify category: Analytics From ce7822674788c9700ab34bf0521e6dd5c2ef33ff Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Wed, 6 Oct 2021 14:32:58 -0500 Subject: [PATCH 08/50] Adding Azure DevOps frontend plugin Signed-off-by: Andre Wanlin --- app-config.yaml | 1 + packages/app/package.json | 1 + .../app/src/components/catalog/EntityPage.tsx | 8 ++ plugins/azure-devops/.eslintrc.js | 3 + plugins/azure-devops/README.md | 135 ++++++++++++++++++ plugins/azure-devops/api-report.md | 35 +++++ plugins/azure-devops/config.d.ts | 26 ++++ plugins/azure-devops/dev/index.tsx | 20 +++ .../azure-devops/doc/azure-devops-builds.png | Bin 0 -> 177135 bytes plugins/azure-devops/package.json | 62 ++++++++ .../azure-devops/src/api/AzureDevOpsApi.ts | 32 +++++ .../azure-devops/src/api/AzureDevOpsClient.ts | 56 ++++++++ plugins/azure-devops/src/api/index.ts | 18 +++ plugins/azure-devops/src/api/types.ts | 30 ++++ .../src/components/BuildTable/BuildTable.tsx | 132 +++++++++++++++++ .../src/components/BuildTable/index.ts | 17 +++ .../EntityPageAzureDevOps.tsx | 33 +++++ .../components/EntityPageAzureDevOps/index.ts | 17 +++ .../azure-devops/src/components/Router.tsx | 48 +++++++ plugins/azure-devops/src/constants.ts | 17 +++ .../src/hooks/useProjectRepoFromEntity.ts | 25 ++++ .../azure-devops/src/hooks/useRepoBuilds.ts | 40 ++++++ plugins/azure-devops/src/index.ts | 17 +++ plugins/azure-devops/src/plugin.test.ts | 22 +++ plugins/azure-devops/src/plugin.ts | 54 +++++++ plugins/azure-devops/src/routes.ts | 20 +++ plugins/azure-devops/src/setupTests.ts | 17 +++ 27 files changed, 886 insertions(+) create mode 100644 plugins/azure-devops/.eslintrc.js create mode 100644 plugins/azure-devops/README.md create mode 100644 plugins/azure-devops/api-report.md create mode 100644 plugins/azure-devops/config.d.ts create mode 100644 plugins/azure-devops/dev/index.tsx create mode 100644 plugins/azure-devops/doc/azure-devops-builds.png create mode 100644 plugins/azure-devops/package.json create mode 100644 plugins/azure-devops/src/api/AzureDevOpsApi.ts create mode 100644 plugins/azure-devops/src/api/AzureDevOpsClient.ts create mode 100644 plugins/azure-devops/src/api/index.ts create mode 100644 plugins/azure-devops/src/api/types.ts create mode 100644 plugins/azure-devops/src/components/BuildTable/BuildTable.tsx create mode 100644 plugins/azure-devops/src/components/BuildTable/index.ts create mode 100644 plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx create mode 100644 plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts create mode 100644 plugins/azure-devops/src/components/Router.tsx create mode 100644 plugins/azure-devops/src/constants.ts create mode 100644 plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts create mode 100644 plugins/azure-devops/src/hooks/useRepoBuilds.ts create mode 100644 plugins/azure-devops/src/index.ts create mode 100644 plugins/azure-devops/src/plugin.test.ts create mode 100644 plugins/azure-devops/src/plugin.ts create mode 100644 plugins/azure-devops/src/routes.ts create mode 100644 plugins/azure-devops/src/setupTests.ts diff --git a/app-config.yaml b/app-config.yaml index c24ac1701b..b92595df7b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -436,3 +436,4 @@ azureDevOps: host: dev.azure.com token: my-token organization: my-company + top: 25 diff --git a/packages/app/package.json b/packages/app/package.json index d1892438d8..fe86077273 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,6 +11,7 @@ "@backstage/core-plugin-api": "^0.1.10", "@backstage/integration-react": "^0.1.11", "@backstage/plugin-api-docs": "^0.6.11", + "@backstage/plugin-azure-devops": "^0.1.0", "@backstage/plugin-badges": "^0.2.12", "@backstage/plugin-catalog": "^0.7.0", "@backstage/plugin-catalog-graph": "^0.1.3", diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 62fdcf4d3f..b79bd2c4aa 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -33,6 +33,10 @@ import { EntityProvidedApisCard, EntityProvidingComponentsCard, } from '@backstage/plugin-api-docs'; +import { + EntityAzureDevOpsContent, + isAzureDevOpsAvailable, +} from '@backstage/plugin-azure-devops'; import { EntityBadgesDialog } from '@backstage/plugin-badges'; import { EntityAboutCard, @@ -183,6 +187,10 @@ export const cicdContent = ( + + + + { + return await createRouter({ logger, config }); + } + ``` + +3. Next we wire this into the overall backend router, edit `packages/backend/src/index.ts`: + + ```ts + import azureDevOps from './plugins/azuredevops'; + // ... + async function main() { + // ... + const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); + apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); + ``` + +4. Now run `yarn start-backend` from the repo root +5. Finally open `http://localhost:7000/api/azure-devops/health` in a browser and it should return `{"status":"ok"}` + +### Frontend + +To get the frontend working you'll need to do the following two steps: + +1. First we need to add the @backstage/plugin-azure-devops package to your frontend app: + + ```bash + # From your Backstage root directory + cd packages/app + yarn add @backstage/plugin-azure-devops + ``` + +2. Second we need to add the `EntityAzureDevOpsContent` extension to the entity page in your app: + +```tsx +// In packages/app/src/components/catalog/EntityPage.tsx +import { + EntityAzureDevOpsContent, + isAzureDevOpsAvailable, +} from '@backstage/plugin-azure-devops'; + +// For example in the CI/CD section +const cicdContent = ( + + // ... + + + + // ... + +``` + +### Entity Annotation + +You need to add the following annotation to any entities you want to be able to use the Azure Devops plugin with: + +```yaml +dev.azure.com/project-repo: / +``` + +Let's break this down a little: `` will be the name of your Team Project and `` will be the name of your repository which needs to be part of the Team Project you entered for ``. + +Here's what that will look like in action: + +```yaml +# Example catalog-info.yaml entity definition file +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + # ... + annotations: + dev.azure.com/project-repo: my-project/my-repo +spec: + type: service + # ... +``` + +## Features + +- Lists the top _n_ builds for a given repository where _n_ is the value configured for `top` + +## Limitations + +- Currently multiple organizations is not supported diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md new file mode 100644 index 0000000000..11de164276 --- /dev/null +++ b/plugins/azure-devops/api-report.md @@ -0,0 +1,35 @@ +## API Report File for "@backstage/plugin-azure-devops" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; +import { RouteRef } from '@backstage/core-plugin-api'; + +// Warning: (ae-missing-release-tag) "azureDevOpsPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const azureDevOpsPlugin: BackstagePlugin< + { + entityContent: RouteRef; + }, + {} +>; + +// Warning: (ae-missing-release-tag) "EntityAzureDevOpsContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const EntityAzureDevOpsContent: (_props: { + entity?: Entity | undefined; +}) => JSX.Element; + +// Warning: (ae-missing-release-tag) "isAzureDevOpsAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const isAzureDevOpsAvailable: (entity: Entity) => boolean; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts new file mode 100644 index 0000000000..827e64d5bd --- /dev/null +++ b/plugins/azure-devops/config.d.ts @@ -0,0 +1,26 @@ +/* + * 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. + */ + +export interface Config { + /** Configuration options for the azure-devops-backend plugin */ + azureDevOps: { + /** + * The max number of items to return - applies to builds + * @visibility frontend + */ + top: number; + }; +} diff --git a/plugins/azure-devops/dev/index.tsx b/plugins/azure-devops/dev/index.tsx new file mode 100644 index 0000000000..8d1c3ef6ea --- /dev/null +++ b/plugins/azure-devops/dev/index.tsx @@ -0,0 +1,20 @@ +/* + * 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 { createDevApp } from '@backstage/dev-utils'; +import { azureDevOpsPlugin } from '../src/plugin'; + +createDevApp().registerPlugin(azureDevOpsPlugin).render(); diff --git a/plugins/azure-devops/doc/azure-devops-builds.png b/plugins/azure-devops/doc/azure-devops-builds.png new file mode 100644 index 0000000000000000000000000000000000000000..89a777059f67b448c961bdcd829d38ddd9eea0d5 GIT binary patch literal 177135 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'OLF;}K1r?yk4 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 literal 0 HcmV?d00001 diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json new file mode 100644 index 0000000000..fb59d5eb38 --- /dev/null +++ b/plugins/azure-devops/package.json @@ -0,0 +1,62 @@ +{ + "name": "@backstage/plugin-azure-devops", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/azure-devops" + }, + "scripts": { + "build": "backstage-cli plugin:build", + "start": "backstage-cli plugin:serve", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "diff": "backstage-cli plugin:diff", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/catalog-model": "^0.9.3", + "@backstage/core-components": "^0.6.0", + "@backstage/core-plugin-api": "^0.1.9", + "@backstage/plugin-catalog-react": "^0.5.1", + "@backstage/theme": "^0.2.10", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.57", + "azure-devops-node-api": "^11.0.1", + "moment": "^2.29.1", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-router": "6.0.0-beta.0", + "react-use": "^17.2.4" + }, + "devDependencies": { + "@backstage/cli": "^0.7.13", + "@backstage/core-app-api": "^0.1.14", + "@backstage/dev-utils": "^0.2.10", + "@backstage/test-utils": "^0.1.17", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^11.2.5", + "@testing-library/user-event": "^13.1.8", + "@types/jest": "*", + "@types/node": "*", + "msw": "^0.29.0", + "cross-fetch": "^3.0.6" + }, + "files": [ + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" +} diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts new file mode 100644 index 0000000000..424999441d --- /dev/null +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -0,0 +1,32 @@ +/* + * 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 { RepoBuild } from './types'; +import { createApiRef } from '@backstage/core-plugin-api'; + +export const azureDevOpsApiRef = createApiRef({ + id: 'plugin.azure-devops.service', + description: + 'Used by the Azure DevOps plugin to make requests to accompanying backend', +}); + +export interface AzureDevOpsApi { + getRepoBuilds( + projectName: string, + repoName: string, + top: number, + ): Promise; +} diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts new file mode 100644 index 0000000000..c9e44109aa --- /dev/null +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -0,0 +1,56 @@ +/* + * 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 { AzureDevOpsApi } from './AzureDevOpsApi'; +import { RepoBuild } from './types'; +import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; + +export class AzureDevOpsClient implements AzureDevOpsApi { + private readonly discoveryApi: DiscoveryApi; + private readonly identityApi: IdentityApi; + + constructor(options: { + discoveryApi: DiscoveryApi; + identityApi: IdentityApi; + }) { + this.discoveryApi = options.discoveryApi; + this.identityApi = options.identityApi; + } + + async getRepoBuilds( + projectName: string, + repoName: string, + top: number, + ): Promise { + return await this.get(`/repo-builds/${projectName}/${repoName}?top=${top}`); + } + + private async get(path: string): Promise { + const url = `${await this.discoveryApi.getBaseUrl('azure-devops')}${path}`; + const idToken = await this.identityApi.getIdToken(); + const response = await fetch(url, { + headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, + }); + + if (!response.ok) { + const payload = await response.text(); + const message = `Request failed with ${response.status} ${response.statusText}, ${payload}`; + throw new Error(message); + } + + return await response.json(); + } +} diff --git a/plugins/azure-devops/src/api/index.ts b/plugins/azure-devops/src/api/index.ts new file mode 100644 index 0000000000..c69636222f --- /dev/null +++ b/plugins/azure-devops/src/api/index.ts @@ -0,0 +1,18 @@ +/* + * 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 * from './AzureDevOpsApi'; +export * from './AzureDevOpsClient'; diff --git a/plugins/azure-devops/src/api/types.ts b/plugins/azure-devops/src/api/types.ts new file mode 100644 index 0000000000..35d4e38ae1 --- /dev/null +++ b/plugins/azure-devops/src/api/types.ts @@ -0,0 +1,30 @@ +/* + * 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 { + BuildResult, + BuildStatus, +} from 'azure-devops-node-api/interfaces/BuildInterfaces'; + +export type RepoBuild = { + id?: number; + title: string; + link: string; + status?: BuildStatus; + result?: BuildResult; + queueTime?: Date; + source: string; +}; diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx new file mode 100644 index 0000000000..26f365c5e9 --- /dev/null +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -0,0 +1,132 @@ +/* + * 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 React from 'react'; +import moment from 'moment'; +import { + Table, + TableColumn, + StatusError, + StatusOK, + StatusWarning, + StatusAborted, +} from '@backstage/core-components'; +import { Link, Box, Typography } from '@material-ui/core'; +import Alert from '@material-ui/lab/Alert'; +import { RepoBuild } from '../../api/types'; +import { + BuildResult, + BuildStatus, +} from 'azure-devops-node-api/interfaces/BuildInterfaces'; + +const getBuildResultComponent = (result: number | undefined = 0) => { + switch (result) { + case 0: // None + return ; + case 2: // Succeeded + return ; + case 4: // PartiallySucceeded + return ; + case 8: // Failed + return ; + case 32: // Canceled + return ; + default: + return ; + } +}; + +const columns: TableColumn[] = [ + { + title: 'ID', + field: 'id', + highlight: false, + width: '80px', + }, + { + title: 'Build', + field: 'title', + render: (row: Partial) => ( + + {row.title} + + ), + }, + { + title: 'Source', + field: 'source', + }, + { + title: 'Status', + field: 'status', + render: (row: Partial) => ( + + + {BuildStatus[row.status || 0]} + + ), + }, + { + title: 'Result', + field: 'result', + render: (row: Partial) => ( + + {getBuildResultComponent(row.result)} + + {BuildResult[row.result || 0]} + + ), + }, + { + title: 'Date', + field: 'queueTime', + render: (row: Partial) => moment(row.queueTime).fromNow(), + }, +]; + +type Props = { + items: RepoBuild[]; + loading: boolean; + error?: any; +}; + +export const BuildTable = ({ items, loading, error }: Props) => { + if (error) { + return ( +

+ + Error encountered while fetching Azure DevOps builds.{' '} + {error.toString()} + +
+ ); + } + + return ( + + ); +}; diff --git a/plugins/azure-devops/src/components/BuildTable/index.ts b/plugins/azure-devops/src/components/BuildTable/index.ts new file mode 100644 index 0000000000..acf20eb523 --- /dev/null +++ b/plugins/azure-devops/src/components/BuildTable/index.ts @@ -0,0 +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 { BuildTable } from './BuildTable'; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx new file mode 100644 index 0000000000..fbeac53569 --- /dev/null +++ b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx @@ -0,0 +1,33 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import React from 'react'; +import { useRepoBuilds } from '../../hooks/useRepoBuilds'; +import { BuildTable } from '../BuildTable/BuildTable'; + +type Props = { + /** @deprecated The entity is now grabbed from context instead */ + entity?: Entity; +}; + +export const EntityPageAzureDevOps = (_props: Props) => { + const { entity } = useEntity(); + const { items, loading, error } = useRepoBuilds(entity); + + return ; +}; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts b/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts new file mode 100644 index 0000000000..89ee4f199b --- /dev/null +++ b/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts @@ -0,0 +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 { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; diff --git a/plugins/azure-devops/src/components/Router.tsx b/plugins/azure-devops/src/components/Router.tsx new file mode 100644 index 0000000000..74cf0439f8 --- /dev/null +++ b/plugins/azure-devops/src/components/Router.tsx @@ -0,0 +1,48 @@ +/* + * 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 React from 'react'; +import { Routes, Route } from 'react-router'; +import { azureDevOpsRouteRef } from '../routes'; +import { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; +import { AZURE_DEVOPS_ANNOTATION } from '../constants'; +import { Entity } from '@backstage/catalog-model'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import { MissingAnnotationEmptyState } from '@backstage/core-components'; + +export const isAzureDevOpsAvailable = (entity: Entity) => + Boolean(entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION]); + +type Props = { + /** @deprecated The entity is now grabbed from context instead */ + entity?: Entity; +}; + +export const Router = (_props: Props) => { + const { entity } = useEntity(); + + if (!isAzureDevOpsAvailable(entity)) { + return ; + } + + return ( + + } + /> + + ); +}; diff --git a/plugins/azure-devops/src/constants.ts b/plugins/azure-devops/src/constants.ts new file mode 100644 index 0000000000..6abc6449e9 --- /dev/null +++ b/plugins/azure-devops/src/constants.ts @@ -0,0 +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 const AZURE_DEVOPS_ANNOTATION = 'dev.azure.com/project-repo'; diff --git a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts new file mode 100644 index 0000000000..721fa52781 --- /dev/null +++ b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts @@ -0,0 +1,25 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { AZURE_DEVOPS_ANNOTATION } from '../constants'; + +export function useProjectRepoFromEntity(entity: Entity) { + const [project, repo] = ( + entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION] ?? '' + ).split('/'); + return { project, repo }; +} diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts new file mode 100644 index 0000000000..e6d2964770 --- /dev/null +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -0,0 +1,40 @@ +/* + * 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 { useAsync } from 'react-use'; +import { Entity } from '@backstage/catalog-model'; +import { useApi, configApiRef } from '@backstage/core-plugin-api'; +import { azureDevOpsApiRef } from '../api'; +import { RepoBuild } from '../api/types'; +import { useProjectRepoFromEntity } from './useProjectRepoFromEntity'; + +const DEFAULT_TOP: number = 10; + +export function useRepoBuilds(entity: Entity) { + const config = useApi(configApiRef); + const top = config.getOptionalNumber('azureDevOps.top') ?? DEFAULT_TOP; + const api = useApi(azureDevOpsApiRef); + const { project, repo } = useProjectRepoFromEntity(entity); + const { value, loading, error } = useAsync(() => { + return api.getRepoBuilds(project, repo, top); + }, [api, project, repo, entity]); + + return { + items: value as RepoBuild[], + loading, + error, + }; +} diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts new file mode 100644 index 0000000000..b654aebab7 --- /dev/null +++ b/plugins/azure-devops/src/index.ts @@ -0,0 +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 { azureDevOpsPlugin, EntityAzureDevOpsContent } from './plugin'; +export { isAzureDevOpsAvailable } from './components/Router'; diff --git a/plugins/azure-devops/src/plugin.test.ts b/plugins/azure-devops/src/plugin.test.ts new file mode 100644 index 0000000000..f23639798f --- /dev/null +++ b/plugins/azure-devops/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * 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 { azureDevOpsPlugin } from './plugin'; + +describe('azure-devops', () => { + it('should export plugin', () => { + expect(azureDevOpsPlugin).toBeDefined(); + }); +}); diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts new file mode 100644 index 0000000000..f37fab6d62 --- /dev/null +++ b/plugins/azure-devops/src/plugin.ts @@ -0,0 +1,54 @@ +/* + * 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 { azureDevOpsApiRef } from './api/AzureDevOpsApi'; +import { AzureDevOpsClient } from './api/AzureDevOpsClient'; +import { + createApiFactory, + createPlugin, + createRoutableExtension, + createRouteRef, + discoveryApiRef, + identityApiRef, +} from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + path: '', + title: 'AzureDevOps', +}); + +export const azureDevOpsPlugin = createPlugin({ + id: 'azureDevOps', + apis: [ + createApiFactory({ + api: azureDevOpsApiRef, + deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, + factory: ({ discoveryApi, identityApi }) => + new AzureDevOpsClient({ discoveryApi, identityApi }), + }), + ], + routes: { + entityContent: rootRouteRef, + }, +}); + +export const EntityAzureDevOpsContent = azureDevOpsPlugin.provide( + createRoutableExtension({ + name: 'EntityAzureDevOpsContent', + component: () => import('./components/Router').then(m => m.Router), + mountPoint: rootRouteRef, + }), +); diff --git a/plugins/azure-devops/src/routes.ts b/plugins/azure-devops/src/routes.ts new file mode 100644 index 0000000000..81f4b48fda --- /dev/null +++ b/plugins/azure-devops/src/routes.ts @@ -0,0 +1,20 @@ +/* + * 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 { createRouteRef } from '@backstage/core-plugin-api'; + +export const azureDevOpsRouteRef = createRouteRef({ + title: 'azure-devops', +}); diff --git a/plugins/azure-devops/src/setupTests.ts b/plugins/azure-devops/src/setupTests.ts new file mode 100644 index 0000000000..fc6dbd98f8 --- /dev/null +++ b/plugins/azure-devops/src/setupTests.ts @@ -0,0 +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. + */ +import '@testing-library/jest-dom'; +import 'cross-fetch/polyfill'; From 02ef33e4e89ed02e5e0e00dfc52c5407ed3790b1 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 06:59:24 -0500 Subject: [PATCH 09/50] Updated devDependencies causing CI to fail Signed-off-by: Andre Wanlin --- plugins/azure-devops/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index fb59d5eb38..c823924c9d 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -42,15 +42,15 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.7.13", - "@backstage/core-app-api": "^0.1.14", - "@backstage/dev-utils": "^0.2.10", + "@backstage/cli": "^0.7.14", + "@backstage/core-app-api": "^0.1.15", + "@backstage/dev-utils": "^0.2.11", "@backstage/test-utils": "^0.1.17", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", - "@types/jest": "*", - "@types/node": "*", + "@types/jest": "^26.0.7", + "@types/node": "^14.14.32", "msw": "^0.29.0", "cross-fetch": "^3.0.6" }, From cba0352000e541473675bca099678795b076f5ab Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 08:57:16 -0500 Subject: [PATCH 10/50] Fixed formatting of README Signed-off-by: Andre Wanlin --- plugins/azure-devops/README.md | 60 +++++++++++++++++----------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index a596863bad..376a630873 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -31,43 +31,43 @@ Configuration Details: Here's how to get the backend up and running: -1. First we need to add the @backstage/plugin-azure-devops-backend package to your backend: +1. First we need to add the @backstage/plugin-azure-devops-backend package to your backend: - ```sh - # From the Backstage root directory - cd packages/backend - yarn add @backstage/plugin-azure-devops-backend - ``` + ```sh + # From the Backstage root directory + cd packages/backend + yarn add @backstage/plugin-azure-devops-backend + ``` -2. Then we will create a new file named `packages/backend/src/plugins/azuredevops.ts`, and add the - following to it: +2. Then we will create a new file named `packages/backend/src/plugins/azuredevops.ts`, and add the + following to it: - ```ts - import { createRouter } from '@backstage/plugin-azure-devops-backend'; - import { Router } from 'express'; - import type { PluginEnvironment } from '../types'; + ```ts + import { createRouter } from '@backstage/plugin-azure-devops-backend'; + import { Router } from 'express'; + import type { PluginEnvironment } from '../types'; - export default async function createPlugin({ - logger, - config, - }: PluginEnvironment): Promise { - return await createRouter({ logger, config }); - } - ``` + export default async function createPlugin({ + logger, + config, + }: PluginEnvironment): Promise { + return await createRouter({ logger, config }); + } + ``` -3. Next we wire this into the overall backend router, edit `packages/backend/src/index.ts`: +3. Next we wire this into the overall backend router, edit `packages/backend/src/index.ts`: - ```ts - import azureDevOps from './plugins/azuredevops'; - // ... - async function main() { - // ... - const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); - apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); - ``` + ```ts + import azureDevOps from './plugins/azuredevops'; + // ... + async function main() { + // ... + const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); + apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); + ``` -4. Now run `yarn start-backend` from the repo root -5. Finally open `http://localhost:7000/api/azure-devops/health` in a browser and it should return `{"status":"ok"}` +4. Now run `yarn start-backend` from the repo root +5. Finally open `http://localhost:7000/api/azure-devops/health` in a browser and it should return `{"status":"ok"}` ### Frontend From 48232f8507d07d3d6944f00cb47b3229527c514f Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 19:55:26 -0500 Subject: [PATCH 11/50] Start of refactoring based on feedback Signed-off-by: Andre Wanlin --- .../app/src/components/catalog/EntityPage.tsx | 4 +-- plugins/azure-devops/README.md | 2 +- plugins/azure-devops/config.d.ts | 2 +- .../{doc => docs}/azure-devops-builds.png | Bin plugins/azure-devops/package.json | 10 +++---- .../azure-devops/src/api/AzureDevOpsClient.ts | 8 +++-- .../src/api/AzureDevOpsClientError.ts | 21 +++++++++++++ plugins/azure-devops/src/api/types.ts | 2 +- .../src/components/BuildTable/BuildTable.tsx | 28 +++++++++++------- .../EntityPageAzureDevOps.tsx | 2 +- plugins/azure-devops/src/constants.ts | 1 + .../src/hooks/useProjectRepoFromEntity.ts | 5 +++- .../azure-devops/src/hooks/useRepoBuilds.ts | 12 +++++--- plugins/azure-devops/src/index.ts | 2 +- plugins/azure-devops/src/plugin.ts | 13 +++----- 15 files changed, 72 insertions(+), 40 deletions(-) rename plugins/azure-devops/{doc => docs}/azure-devops-builds.png (100%) create mode 100644 plugins/azure-devops/src/api/AzureDevOpsClientError.ts diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index b79bd2c4aa..4147874e65 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -34,7 +34,7 @@ import { EntityProvidingComponentsCard, } from '@backstage/plugin-api-docs'; import { - EntityAzureDevOpsContent, + EntityAzurePipelinesContent, isAzureDevOpsAvailable, } from '@backstage/plugin-azure-devops'; import { EntityBadgesDialog } from '@backstage/plugin-badges'; @@ -188,7 +188,7 @@ export const cicdContent = ( - + diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 376a630873..97a415d8d0 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -2,7 +2,7 @@ Website: [https://dev.azure.com/](https://dev.azure.com/) -![Azure DevOps Builds Example](./doc/azure-devops-builds.png) +![Azure DevOps Builds Example](./docs/azure-devops-builds.png) ## Setup diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts index 827e64d5bd..62b1488e49 100644 --- a/plugins/azure-devops/config.d.ts +++ b/plugins/azure-devops/config.d.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * 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. diff --git a/plugins/azure-devops/doc/azure-devops-builds.png b/plugins/azure-devops/docs/azure-devops-builds.png similarity index 100% rename from plugins/azure-devops/doc/azure-devops-builds.png rename to plugins/azure-devops/docs/azure-devops-builds.png diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index c823924c9d..16e8f35991 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -27,8 +27,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.3", - "@backstage/core-components": "^0.6.0", - "@backstage/core-plugin-api": "^0.1.9", + "@backstage/core-components": "^0.6.1", + "@backstage/core-plugin-api": "^0.1.10", "@backstage/plugin-catalog-react": "^0.5.1", "@backstage/theme": "^0.2.10", "@material-ui/core": "^4.12.2", @@ -42,10 +42,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.7.14", - "@backstage/core-app-api": "^0.1.15", + "@backstage/cli": "^0.7.15", + "@backstage/core-app-api": "^0.1.16", "@backstage/dev-utils": "^0.2.11", - "@backstage/test-utils": "^0.1.17", + "@backstage/test-utils": "^0.1.18", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index c9e44109aa..32a563f429 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -17,6 +17,7 @@ import { AzureDevOpsApi } from './AzureDevOpsApi'; import { RepoBuild } from './types'; import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { AzureDevOpsClientError } from './AzureDevOpsClientError'; export class AzureDevOpsClient implements AzureDevOpsApi { private readonly discoveryApi: DiscoveryApi; @@ -39,7 +40,9 @@ export class AzureDevOpsClient implements AzureDevOpsApi { } private async get(path: string): Promise { - const url = `${await this.discoveryApi.getBaseUrl('azure-devops')}${path}`; + const baseUrl = await this.discoveryApi.getBaseUrl('azure-devops'); + const url = `${baseUrl}/${path}`; + const idToken = await this.identityApi.getIdToken(); const response = await fetch(url, { headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, @@ -47,8 +50,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { if (!response.ok) { const payload = await response.text(); - const message = `Request failed with ${response.status} ${response.statusText}, ${payload}`; - throw new Error(message); + throw new AzureDevOpsClientError(response, payload); } return await response.json(); diff --git a/plugins/azure-devops/src/api/AzureDevOpsClientError.ts b/plugins/azure-devops/src/api/AzureDevOpsClientError.ts new file mode 100644 index 0000000000..f9a2f37b41 --- /dev/null +++ b/plugins/azure-devops/src/api/AzureDevOpsClientError.ts @@ -0,0 +1,21 @@ +/* + * 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 class AzureDevOpsClientError extends Error { + public constructor({ status, statusText }: Response, payload: string) { + super(`Request failed with ${status} ${statusText}, ${payload}`); + } +} diff --git a/plugins/azure-devops/src/api/types.ts b/plugins/azure-devops/src/api/types.ts index 35d4e38ae1..b3562f76c6 100644 --- a/plugins/azure-devops/src/api/types.ts +++ b/plugins/azure-devops/src/api/types.ts @@ -22,7 +22,7 @@ import { export type RepoBuild = { id?: number; title: string; - link: string; + link?: string; status?: BuildStatus; result?: BuildResult; queueTime?: Date; diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index 26f365c5e9..e853662fbf 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -32,17 +32,19 @@ import { BuildStatus, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -const getBuildResultComponent = (result: number | undefined = 0) => { +const getBuildResultComponent = ( + result: number | undefined = BuildResult.None, +) => { switch (result) { - case 0: // None + case BuildResult.None: return ; - case 2: // Succeeded + case BuildResult.Succeeded: return ; - case 4: // PartiallySucceeded + case BuildResult.PartiallySucceeded: return ; - case 8: // Failed + case BuildResult.Failed: return ; - case 32: // Canceled + case BuildResult.Canceled: return ; default: return ; @@ -75,7 +77,9 @@ const columns: TableColumn[] = [ render: (row: Partial) => ( - {BuildStatus[row.status || 0]} + + {BuildStatus[row.status || BuildStatus.None]} + ), }, @@ -86,7 +90,9 @@ const columns: TableColumn[] = [ {getBuildResultComponent(row.result)} - {BuildResult[row.result || 0]} + + {BuildResult[row.result || BuildResult.None]} + ), }, @@ -98,7 +104,7 @@ const columns: TableColumn[] = [ ]; type Props = { - items: RepoBuild[]; + items?: RepoBuild[]; loading: boolean; error?: any; }; @@ -125,8 +131,8 @@ export const BuildTable = ({ items, loading, error }: Props) => { pageSize: 5, showEmptyDataSourceMessage: !loading, }} - title={`Builds (${(items && items.length) || 0})`} - data={items} + title={`Builds (${items ? items.length : 0})`} + data={items || []} /> ); }; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx index fbeac53569..8e102e647d 100644 --- a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx +++ b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx @@ -29,5 +29,5 @@ export const EntityPageAzureDevOps = (_props: Props) => { const { entity } = useEntity(); const { items, loading, error } = useRepoBuilds(entity); - return ; + return ; }; diff --git a/plugins/azure-devops/src/constants.ts b/plugins/azure-devops/src/constants.ts index 6abc6449e9..d6e67ff7ed 100644 --- a/plugins/azure-devops/src/constants.ts +++ b/plugins/azure-devops/src/constants.ts @@ -15,3 +15,4 @@ */ export const AZURE_DEVOPS_ANNOTATION = 'dev.azure.com/project-repo'; +export const AZURE_DEVOPS_DEFAULT_TOP: number = 10; diff --git a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts index 721fa52781..dfbee81d62 100644 --- a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts +++ b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts @@ -17,7 +17,10 @@ import { Entity } from '@backstage/catalog-model'; import { AZURE_DEVOPS_ANNOTATION } from '../constants'; -export function useProjectRepoFromEntity(entity: Entity) { +export function useProjectRepoFromEntity(entity: Entity): { + project: string; + repo: string; +} { const [project, repo] = ( entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION] ?? '' ).split('/'); diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index e6d2964770..1e68490ea6 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -20,12 +20,16 @@ import { useApi, configApiRef } from '@backstage/core-plugin-api'; import { azureDevOpsApiRef } from '../api'; import { RepoBuild } from '../api/types'; import { useProjectRepoFromEntity } from './useProjectRepoFromEntity'; +import { AZURE_DEVOPS_DEFAULT_TOP } from '../constants'; -const DEFAULT_TOP: number = 10; - -export function useRepoBuilds(entity: Entity) { +export function useRepoBuilds(entity: Entity): { + items: RepoBuild[]; + loading: boolean; + error: any; +} { const config = useApi(configApiRef); - const top = config.getOptionalNumber('azureDevOps.top') ?? DEFAULT_TOP; + const top = + config.getOptionalNumber('azureDevOps.top') ?? AZURE_DEVOPS_DEFAULT_TOP; const api = useApi(azureDevOpsApiRef); const { project, repo } = useProjectRepoFromEntity(entity); const { value, loading, error } = useAsync(() => { diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts index b654aebab7..9a90d6ed6a 100644 --- a/plugins/azure-devops/src/index.ts +++ b/plugins/azure-devops/src/index.ts @@ -13,5 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { azureDevOpsPlugin, EntityAzureDevOpsContent } from './plugin'; +export { azureDevOpsPlugin, EntityAzurePipelinesContent } from './plugin'; export { isAzureDevOpsAvailable } from './components/Router'; diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts index f37fab6d62..9ec5ebbb09 100644 --- a/plugins/azure-devops/src/plugin.ts +++ b/plugins/azure-devops/src/plugin.ts @@ -20,15 +20,10 @@ import { createApiFactory, createPlugin, createRoutableExtension, - createRouteRef, discoveryApiRef, identityApiRef, } from '@backstage/core-plugin-api'; - -export const rootRouteRef = createRouteRef({ - path: '', - title: 'AzureDevOps', -}); +import { azureDevOpsRouteRef } from './routes'; export const azureDevOpsPlugin = createPlugin({ id: 'azureDevOps', @@ -41,14 +36,14 @@ export const azureDevOpsPlugin = createPlugin({ }), ], routes: { - entityContent: rootRouteRef, + entityContent: azureDevOpsRouteRef, }, }); -export const EntityAzureDevOpsContent = azureDevOpsPlugin.provide( +export const EntityAzurePipelinesContent = azureDevOpsPlugin.provide( createRoutableExtension({ name: 'EntityAzureDevOpsContent', component: () => import('./components/Router').then(m => m.Router), - mountPoint: rootRouteRef, + mountPoint: azureDevOpsRouteRef, }), ); From e5070b3f2ba649e536c73bd2cc3cf445dbad8946 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 20:31:31 -0500 Subject: [PATCH 12/50] Regenerated API Report Signed-off-by: Andre Wanlin --- plugins/azure-devops/api-report.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 11de164276..bc39fd0ce4 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -19,10 +19,10 @@ export const azureDevOpsPlugin: BackstagePlugin< {} >; -// Warning: (ae-missing-release-tag) "EntityAzureDevOpsContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "EntityAzurePipelinesContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const EntityAzureDevOpsContent: (_props: { +export const EntityAzurePipelinesContent: (_props: { entity?: Entity | undefined; }) => JSX.Element; From e67321d20d4eb0b04c6ee602a070da671bb43c7c Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 08:20:49 -0500 Subject: [PATCH 13/50] Further refactoring based on feedback Signed-off-by: Andre Wanlin --- plugins/azure-devops/README.md | 6 +++--- plugins/azure-devops/package.json | 2 +- plugins/azure-devops/src/api/AzureDevOpsClient.ts | 8 ++++---- .../src/components/BuildTable/BuildTable.tsx | 9 ++++++--- .../EntityPageAzurePipelines.tsx} | 2 +- .../index.ts | 2 +- plugins/azure-devops/src/components/Router.tsx | 4 ++-- plugins/azure-devops/src/plugin.ts | 2 +- 8 files changed, 19 insertions(+), 16 deletions(-) rename plugins/azure-devops/src/components/{EntityPageAzureDevOps/EntityPageAzureDevOps.tsx => EntityPageAzurePipelines/EntityPageAzurePipelines.tsx} (94%) rename plugins/azure-devops/src/components/{EntityPageAzureDevOps => EntityPageAzurePipelines}/index.ts (89%) diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 97a415d8d0..55d5ea5f91 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -81,12 +81,12 @@ To get the frontend working you'll need to do the following two steps: yarn add @backstage/plugin-azure-devops ``` -2. Second we need to add the `EntityAzureDevOpsContent` extension to the entity page in your app: +2. Second we need to add the `EntityAzurePipelinesContent` extension to the entity page in your app: ```tsx // In packages/app/src/components/catalog/EntityPage.tsx import { - EntityAzureDevOpsContent, + EntityAzurePipelinesContent, isAzureDevOpsAvailable, } from '@backstage/plugin-azure-devops'; @@ -95,7 +95,7 @@ const cicdContent = ( // ... - + // ... diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 16e8f35991..16008090b7 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -35,7 +35,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "azure-devops-node-api": "^11.0.1", - "moment": "^2.29.1", + "luxon": "^2.0.2", "react": "^16.13.1", "react-dom": "^16.13.1", "react-router": "6.0.0-beta.0", diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index 32a563f429..d82dfbe09e 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -36,15 +36,15 @@ export class AzureDevOpsClient implements AzureDevOpsApi { repoName: string, top: number, ): Promise { - return await this.get(`/repo-builds/${projectName}/${repoName}?top=${top}`); + return await this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); } private async get(path: string): Promise { - const baseUrl = await this.discoveryApi.getBaseUrl('azure-devops'); - const url = `${baseUrl}/${path}`; + const baseUrl = `${await this.discoveryApi.getBaseUrl('azure-devops')}/`; + const url = new URL(path, baseUrl); const idToken = await this.identityApi.getIdToken(); - const response = await fetch(url, { + const response = await fetch(url.toString(), { headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, }); diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index e853662fbf..7c3e09c66c 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import moment from 'moment'; +import { DateTime } from 'luxon'; import { Table, TableColumn, @@ -56,7 +56,7 @@ const columns: TableColumn[] = [ title: 'ID', field: 'id', highlight: false, - width: '80px', + width: '100px', }, { title: 'Build', @@ -99,7 +99,10 @@ const columns: TableColumn[] = [ { title: 'Date', field: 'queueTime', - render: (row: Partial) => moment(row.queueTime).fromNow(), + render: (row: Partial) => + DateTime.fromISO( + row.queueTime ? row.queueTime.toString() : new Date().toString(), + ).toRelative(), }, ]; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx similarity index 94% rename from plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx rename to plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx index 8e102e647d..5d53df928c 100644 --- a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx +++ b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx @@ -25,7 +25,7 @@ type Props = { entity?: Entity; }; -export const EntityPageAzureDevOps = (_props: Props) => { +export const EntityPageAzurePipelines = (_props: Props) => { const { entity } = useEntity(); const { items, loading, error } = useRepoBuilds(entity); diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts b/plugins/azure-devops/src/components/EntityPageAzurePipelines/index.ts similarity index 89% rename from plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts rename to plugins/azure-devops/src/components/EntityPageAzurePipelines/index.ts index 89ee4f199b..c907c61b2c 100644 --- a/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts +++ b/plugins/azure-devops/src/components/EntityPageAzurePipelines/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; +export { EntityPageAzurePipelines } from './EntityPageAzurePipelines'; diff --git a/plugins/azure-devops/src/components/Router.tsx b/plugins/azure-devops/src/components/Router.tsx index 74cf0439f8..81b6d89a25 100644 --- a/plugins/azure-devops/src/components/Router.tsx +++ b/plugins/azure-devops/src/components/Router.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { Routes, Route } from 'react-router'; import { azureDevOpsRouteRef } from '../routes'; -import { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; +import { EntityPageAzurePipelines } from './EntityPageAzurePipelines'; import { AZURE_DEVOPS_ANNOTATION } from '../constants'; import { Entity } from '@backstage/catalog-model'; import { useEntity } from '@backstage/plugin-catalog-react'; @@ -41,7 +41,7 @@ export const Router = (_props: Props) => { } + element={} /> ); diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts index 9ec5ebbb09..1cf6e680d0 100644 --- a/plugins/azure-devops/src/plugin.ts +++ b/plugins/azure-devops/src/plugin.ts @@ -42,7 +42,7 @@ export const azureDevOpsPlugin = createPlugin({ export const EntityAzurePipelinesContent = azureDevOpsPlugin.provide( createRoutableExtension({ - name: 'EntityAzureDevOpsContent', + name: 'EntityAzurePipelinesContent', component: () => import('./components/Router').then(m => m.Router), mountPoint: azureDevOpsRouteRef, }), From 353c0b7aae57f740d7f2566174ac5bdad039b066 Mon Sep 17 00:00:00 2001 From: Fanny Gaudin Date: Fri, 8 Oct 2021 15:41:58 +0200 Subject: [PATCH 14/50] Add actions props to the ApiExplorerPage Signed-off-by: Fanny Gaudin --- .changeset/new-steaks-taste.md | 5 + .../ApiExplorerPage/ApiExplorerPage.test.tsx | 92 ++++++++++++++++++- .../ApiExplorerPage/ApiExplorerPage.tsx | 8 +- 3 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 .changeset/new-steaks-taste.md diff --git a/.changeset/new-steaks-taste.md b/.changeset/new-steaks-taste.md new file mode 100644 index 0000000000..fc719cc19d --- /dev/null +++ b/.changeset/new-steaks-taste.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': minor +--- + +add actions prop to the ApiExplorerPage diff --git a/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx b/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx index 518c3c7001..ac1c3d5361 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx @@ -15,7 +15,11 @@ */ import { Entity, RELATION_MEMBER_OF } from '@backstage/catalog-model'; -import { CatalogApi, catalogApiRef } from '@backstage/plugin-catalog-react'; +import { + CatalogApi, + catalogApiRef, + entityRouteRef, +} from '@backstage/plugin-catalog-react'; import { MockStorageApi, wrapInTestApp } from '@backstage/test-utils'; import { render } from '@testing-library/react'; import React from 'react'; @@ -32,6 +36,9 @@ import { ConfigApi, configApiRef, } from '@backstage/core-plugin-api'; +import { TableColumn, TableProps } from '@backstage/core-components'; +import DashboardIcon from '@material-ui/icons/Dashboard'; +import { CatalogTableRow } from '@backstage/plugin-catalog'; describe('ApiCatalogPage', () => { const catalogApi: Partial = { @@ -96,6 +103,11 @@ describe('ApiCatalogPage', () => { > {children} , + { + mountedRoutes: { + '/catalog/:namespace/:kind/:name': entityRouteRef, + }, + }, ), ); @@ -106,4 +118,82 @@ describe('ApiCatalogPage', () => { const { findByText } = renderWrapped(); expect(await findByText(/My Company API Explorer/)).toBeInTheDocument(); }); + + it('should render the default column of the grid', async () => { + const { getAllByRole } = await renderWrapped(); + + const columnHeader = getAllByRole('button').filter( + c => c.tagName === 'SPAN', + ); + const columnHeaderLabels = columnHeader.map(c => c.textContent); + + expect(columnHeaderLabels).toEqual([ + 'Name', + 'System', + 'Owner', + 'Type', + 'Lifecycle', + 'Description', + 'Tags', + 'Actions', + ]); + }); + + it('should render the custom column passed as prop', async () => { + const columns: TableColumn[] = [ + { title: 'Foo', field: 'entity.foo' }, + { title: 'Bar', field: 'entity.bar' }, + { title: 'Baz', field: 'entity.spec.lifecycle' }, + ]; + const { getAllByRole } = await renderWrapped( + , + ); + + const columnHeader = getAllByRole('button').filter( + c => c.tagName === 'SPAN', + ); + const columnHeaderLabels = columnHeader.map(c => c.textContent); + + expect(columnHeaderLabels).toEqual(['Foo', 'Bar', 'Baz', 'Actions']); + }); + + it('should render the default actions of an item in the grid', async () => { + const { findByTitle, findByText } = await renderWrapped( + , + ); + expect(await findByText(/Owned \(1\)/)).toBeInTheDocument(); + expect(await findByTitle(/View/)).toBeInTheDocument(); + expect(await findByTitle(/View/)).toBeInTheDocument(); + expect(await findByTitle(/Edit/)).toBeInTheDocument(); + expect(await findByTitle(/Add to favorites/)).toBeInTheDocument(); + }); + + it('should render the custom actions of an item passed as prop', async () => { + const actions: TableProps['actions'] = [ + () => { + return { + icon: () => , + tooltip: 'Foo Action', + disabled: false, + onClick: () => jest.fn(), + }; + }, + () => { + return { + icon: () => , + tooltip: 'Bar Action', + disabled: true, + onClick: () => jest.fn(), + }; + }, + ]; + + const { findByTitle, findByText } = await renderWrapped( + , + ); + expect(await findByText(/Owned \(1\)/)).toBeInTheDocument(); + expect(await findByTitle(/Foo Action/)).toBeInTheDocument(); + expect(await findByTitle(/Bar Action/)).toBeInTheDocument(); + expect((await findByTitle(/Bar Action/)).firstChild).toBeDisabled(); + }); }); diff --git a/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.tsx b/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.tsx index 2f74aaa166..f28574145e 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.tsx @@ -21,6 +21,7 @@ import { PageWithHeader, SupportButton, TableColumn, + TableProps, } from '@backstage/core-components'; import { configApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api'; import { @@ -56,11 +57,13 @@ const defaultColumns: TableColumn[] = [ type ApiExplorerPageProps = { initiallySelectedFilter?: UserListFilterKind; columns?: TableColumn[]; + actions?: TableProps['actions']; }; export const ApiExplorerPage = ({ initiallySelectedFilter = 'all', columns, + actions, }: ApiExplorerPageProps) => { const configApi = useApi(configApiRef); const generatedSubtitle = `${ @@ -94,7 +97,10 @@ export const ApiExplorerPage = ({ - + From 94acc6211641f92da6963d89dbfd1fac71973083 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 10:06:05 -0500 Subject: [PATCH 15/50] Another set of feedback improvements Signed-off-by: Andre Wanlin --- app-config.yaml | 3 +- packages/backend/src/index.ts | 2 +- .../{azuredevops.ts => azure-devops.ts} | 0 plugins/azure-devops/README.md | 39 ++++++++++--------- plugins/azure-devops/config.d.ts | 12 +++--- .../src/components/BuildTable/BuildTable.tsx | 9 ++++- .../src/hooks/useProjectRepoFromEntity.ts | 19 +++++++++ .../azure-devops/src/hooks/useRepoBuilds.ts | 3 +- 8 files changed, 58 insertions(+), 29 deletions(-) rename packages/backend/src/plugins/{azuredevops.ts => azure-devops.ts} (100%) diff --git a/app-config.yaml b/app-config.yaml index b92595df7b..645221538b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -436,4 +436,5 @@ azureDevOps: host: dev.azure.com token: my-token organization: my-company - top: 25 + azurePipelines: + top: 25 diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index f25ec5a14e..b6c148dfba 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -38,7 +38,7 @@ import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; import { metricsInit, metricsHandler } from './metrics'; import auth from './plugins/auth'; -import azureDevOps from './plugins/azuredevops'; +import azureDevOps from './plugins/azure-devops'; import catalog from './plugins/catalog'; import codeCoverage from './plugins/codecoverage'; import kubernetes from './plugins/kubernetes'; diff --git a/packages/backend/src/plugins/azuredevops.ts b/packages/backend/src/plugins/azure-devops.ts similarity index 100% rename from packages/backend/src/plugins/azuredevops.ts rename to packages/backend/src/plugins/azure-devops.ts diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 55d5ea5f91..d2ab1b6c6f 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -17,7 +17,8 @@ azureDevOps: host: dev.azure.com token: ${AZURE_TOKEN} organization: my-company - top: 50 + azurePipelines: + top: 50 ``` Configuration Details: @@ -25,7 +26,7 @@ Configuration Details: - `host` and `token` can be the same as the ones used for the `integration` section - `AZURE_TOKEN` environment variable must be set to a [Personal Access Token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page) with read access to both Code and Build - `organization` is your Azure DevOps Organization name or for Azure DevOps Server (on-premise) this will be your Collection name -- `top` is strictly used by the frontend to limit the number of items returned, currently only used for Builds +- `top` is strictly used by the frontend to limit the number of items returned, if not provided it defaults to 10. Currently only used for Builds ### Backend @@ -39,7 +40,7 @@ Here's how to get the backend up and running: yarn add @backstage/plugin-azure-devops-backend ``` -2. Then we will create a new file named `packages/backend/src/plugins/azuredevops.ts`, and add the +2. Then we will create a new file named `packages/backend/src/plugins/azure-devops.ts`, and add the following to it: ```ts @@ -83,23 +84,23 @@ To get the frontend working you'll need to do the following two steps: 2. Second we need to add the `EntityAzurePipelinesContent` extension to the entity page in your app: -```tsx -// In packages/app/src/components/catalog/EntityPage.tsx -import { - EntityAzurePipelinesContent, - isAzureDevOpsAvailable, -} from '@backstage/plugin-azure-devops'; + ```tsx + // In packages/app/src/components/catalog/EntityPage.tsx + import { + EntityAzurePipelinesContent, + isAzureDevOpsAvailable, + } from '@backstage/plugin-azure-devops'; -// For example in the CI/CD section -const cicdContent = ( - - // ... - - - - // ... - -``` + // For example in the CI/CD section + const cicdContent = ( + + // ... + + + + // ... + + ``` ### Entity Annotation diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts index 62b1488e49..bbd42c55a1 100644 --- a/plugins/azure-devops/config.d.ts +++ b/plugins/azure-devops/config.d.ts @@ -17,10 +17,12 @@ export interface Config { /** Configuration options for the azure-devops-backend plugin */ azureDevOps: { - /** - * The max number of items to return - applies to builds - * @visibility frontend - */ - top: number; + azurePipelines: { + /** + * The max number of items to return - applies to builds + * @visibility frontend + */ + top: number; + }; }; } diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index 7c3e09c66c..b3d239d914 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -56,11 +56,12 @@ const columns: TableColumn[] = [ title: 'ID', field: 'id', highlight: false, - width: '100px', + width: 'auto', }, { title: 'Build', field: 'title', + width: 'auto', render: (row: Partial) => ( {row.title} @@ -70,10 +71,12 @@ const columns: TableColumn[] = [ { title: 'Source', field: 'source', + width: 'auto', }, { title: 'Status', field: 'status', + width: 'auto', render: (row: Partial) => ( @@ -86,6 +89,7 @@ const columns: TableColumn[] = [ { title: 'Result', field: 'result', + width: 'auto', render: (row: Partial) => ( {getBuildResultComponent(row.result)} @@ -97,8 +101,9 @@ const columns: TableColumn[] = [ ), }, { - title: 'Date', + title: 'Age', field: 'queueTime', + width: 'auto', render: (row: Partial) => DateTime.fromISO( row.queueTime ? row.queueTime.toString() : new Date().toString(), diff --git a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts index dfbee81d62..418badc630 100644 --- a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts +++ b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts @@ -24,5 +24,24 @@ export function useProjectRepoFromEntity(entity: Entity): { const [project, repo] = ( entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION] ?? '' ).split('/'); + + if (!project && !repo) { + throw new Error( + 'Value for annotation dev.azure.com/project-repo was not in the correct format: /', + ); + } + + if (!project) { + throw new Error( + 'Project Name for annotation dev.azure.com/project-repo was not found; expected format is: /', + ); + } + + if (!repo) { + throw new Error( + 'Repo Name for annotation dev.azure.com/project-repo was not found; expected format is: /', + ); + } + return { project, repo }; } diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index 1e68490ea6..0bae4b334b 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -29,7 +29,8 @@ export function useRepoBuilds(entity: Entity): { } { const config = useApi(configApiRef); const top = - config.getOptionalNumber('azureDevOps.top') ?? AZURE_DEVOPS_DEFAULT_TOP; + config.getOptionalNumber('azureDevOps.azurePipelines.top') ?? + AZURE_DEVOPS_DEFAULT_TOP; const api = useApi(azureDevOpsApiRef); const { project, repo } = useProjectRepoFromEntity(entity); const { value, loading, error } = useAsync(() => { From 619257ff83f33ec6caf7ce71e44cfd0a3ca65790 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 11:11:10 -0500 Subject: [PATCH 16/50] Applied suggested async and await changes Signed-off-by: Andre Wanlin --- packages/backend/src/plugins/azure-devops.ts | 4 ++-- plugins/azure-devops/README.md | 4 ++-- plugins/azure-devops/src/api/AzureDevOpsClient.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/plugins/azure-devops.ts b/packages/backend/src/plugins/azure-devops.ts index e11a21ba2e..4120e655ed 100644 --- a/packages/backend/src/plugins/azure-devops.ts +++ b/packages/backend/src/plugins/azure-devops.ts @@ -18,9 +18,9 @@ import { createRouter } from '@backstage/plugin-azure-devops-backend'; import { Router } from 'express'; import type { PluginEnvironment } from '../types'; -export default async function createPlugin({ +export default function createPlugin({ logger, config, }: PluginEnvironment): Promise { - return await createRouter({ logger, config }); + return createRouter({ logger, config }); } diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index d2ab1b6c6f..8b25800bb7 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -48,11 +48,11 @@ Here's how to get the backend up and running: import { Router } from 'express'; import type { PluginEnvironment } from '../types'; - export default async function createPlugin({ + export default function createPlugin({ logger, config, }: PluginEnvironment): Promise { - return await createRouter({ logger, config }); + return createRouter({ logger, config }); } ``` diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index d82dfbe09e..02cac3b9de 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -31,12 +31,12 @@ export class AzureDevOpsClient implements AzureDevOpsApi { this.identityApi = options.identityApi; } - async getRepoBuilds( + getRepoBuilds( projectName: string, repoName: string, top: number, ): Promise { - return await this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); + return this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); } private async get(path: string): Promise { @@ -53,6 +53,6 @@ export class AzureDevOpsClient implements AzureDevOpsApi { throw new AzureDevOpsClientError(response, payload); } - return await response.json(); + return response.json() as Promise; } } From ff09af35cea4593c8d361ea2d53f36d9f4aed22e Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 14:03:16 -0500 Subject: [PATCH 17/50] Combined the Status and Result columns into a single State Signed-off-by: Andre Wanlin --- .../src/components/BuildTable/BuildTable.tsx | 100 +++++++++++++----- 1 file changed, 72 insertions(+), 28 deletions(-) diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index b3d239d914..a6cfb9bf81 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -23,6 +23,8 @@ import { StatusOK, StatusWarning, StatusAborted, + StatusRunning, + StatusPending, } from '@backstage/core-components'; import { Link, Box, Typography } from '@material-ui/core'; import Alert from '@material-ui/lab/Alert'; @@ -32,22 +34,80 @@ import { BuildStatus, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -const getBuildResultComponent = ( - result: number | undefined = BuildResult.None, -) => { +const getBuildResultComponent = (result: number | undefined) => { switch (result) { - case BuildResult.None: - return ; case BuildResult.Succeeded: - return ; + return ( + + Succeeded{' '} + + ); case BuildResult.PartiallySucceeded: - return ; + return ( + + Partially Succeeded{' '} + + ); case BuildResult.Failed: - return ; + return ( + + Failed{' '} + + ); case BuildResult.Canceled: - return ; + return ( + + Canceled{' '} + + ); + case BuildResult.None: default: - return ; + return ( + + Unknown + + ); + } +}; + +const getBuildStateComponent = ( + status: number | undefined, + result: number | undefined, +) => { + switch (status) { + case BuildStatus.InProgress: + return ( + + In Progress + + ); + case BuildStatus.Completed: + return getBuildResultComponent(result); + case BuildStatus.Cancelling: + return ( + + Cancelling + + ); + case BuildStatus.Postponed: + return ( + + Postponed + + ); + case BuildStatus.NotStarted: + return ( + + Not Started + + ); + case BuildStatus.None: + default: + return ( + + Unknown + + ); } }; @@ -74,28 +134,12 @@ const columns: TableColumn[] = [ width: 'auto', }, { - title: 'Status', - field: 'status', + title: 'State', width: 'auto', render: (row: Partial) => ( - - {BuildStatus[row.status || BuildStatus.None]} - - - ), - }, - { - title: 'Result', - field: 'result', - width: 'auto', - render: (row: Partial) => ( - - {getBuildResultComponent(row.result)} - - - {BuildResult[row.result || BuildResult.None]} + {getBuildStateComponent(row.status, row.result)} ), From b7c05854715be73891bd7156f27ea0be5321741f Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Sat, 9 Oct 2021 13:14:26 -0500 Subject: [PATCH 18/50] Added pull requests to backend Signed-off-by: Andre Wanlin --- .changeset/stale-seahorses-sell.md | 5 ++ plugins/azure-devops-backend/api-report.md | 24 ++++++ .../src/api/AzureDevOpsApi.test.ts | 74 ++++++++++++++++--- .../src/api/AzureDevOpsApi.ts | 62 +++++++++++++++- plugins/azure-devops-backend/src/api/index.ts | 2 +- plugins/azure-devops-backend/src/api/types.ts | 14 ++++ plugins/azure-devops-backend/src/index.ts | 2 +- .../src/service/router.test.ts | 72 +++++++++++++++++- .../src/service/router.ts | 16 ++++ 9 files changed, 252 insertions(+), 19 deletions(-) create mode 100644 .changeset/stale-seahorses-sell.md diff --git a/.changeset/stale-seahorses-sell.md b/.changeset/stale-seahorses-sell.md new file mode 100644 index 0000000000..2fa52b109f --- /dev/null +++ b/.changeset/stale-seahorses-sell.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-azure-devops-backend': patch +--- + +Expands the Azure DevOps backend plugin to provide pull request data to be used by the front end plugin diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index 4ad2f833d7..511127f1e8 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -10,6 +10,7 @@ import { Config } from '@backstage/config'; import express from 'express'; import { GitRepository } from 'azure-devops-node-api/interfaces/GitInterfaces'; import { Logger as Logger_2 } from 'winston'; +import { PullRequestStatus } from 'azure-devops-node-api/interfaces/GitInterfaces'; import { WebApi } from 'azure-devops-node-api'; // Warning: (ae-missing-release-tag) "AzureDevOpsApi" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -29,6 +30,13 @@ export class AzureDevOpsApi { repoName: string, ): Promise; // (undocumented) + getPullRequests( + projectName: string, + repoName: string, + top: number, + status: PullRequestStatus, + ): Promise; + // (undocumented) getRepoBuilds( projectName: string, repoName: string, @@ -41,6 +49,22 @@ export class AzureDevOpsApi { // @public (undocumented) export function createRouter(options: RouterOptions): Promise; +// Warning: (ae-missing-release-tag) "PullRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type PullRequest = { + pullRequestId?: number; + repoName?: string; + title?: string; + createdBy?: string; + creationDate?: Date; + sourceRefName?: string; + targetRefName?: string; + status?: PullRequestStatus; + isDraft?: boolean; + link: string; +}; + // Warning: (ae-missing-release-tag) "RepoBuild" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts index 25022b4c02..3a3662ec56 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts @@ -13,17 +13,23 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { repoBuildFromBuild } from './AzureDevOpsApi'; -import { RepoBuild } from './types'; +import { mappedPullRequest, mappedRepoBuild } from './AzureDevOpsApi'; +import { PullRequest, RepoBuild } from './types'; import { Build, BuildResult, BuildStatus, DefinitionReference, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; +import { + GitPullRequest, + PullRequestStatus, +} from 'azure-devops-node-api/interfaces/GitInterfaces'; +import { GitRepository } from 'azure-devops-node-api/interfaces/TfvcInterfaces'; +import { IdentityRef } from 'azure-devops-node-api/interfaces/common/VSSInterfaces'; describe('AzureDevOpsApi', () => { - describe('repoBuildFromBuild', () => { + describe('mappedRepoBuild', () => { it('should return RepoBuild from Build', () => { const inputBuildDefinition: DefinitionReference = { name: 'My Build Definition', @@ -57,11 +63,11 @@ describe('AzureDevOpsApi', () => { source: 'refs/heads/develop (f4f78b31)', }; - expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); }); }); - describe('repoBuildFromBuild with no Build definition name', () => { + describe('mappedRepoBuild with no Build definition name', () => { it('should return RepoBuild with only Build Number for title', () => { const inputLinks: any = { web: { @@ -91,11 +97,11 @@ describe('AzureDevOpsApi', () => { source: 'refs/heads/develop (f4f78b31)', }; - expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); }); }); - describe('repoBuildFromBuild with undefined status', () => { + describe('mappedRepoBuild with undefined status', () => { it('should return BuildStatus of None for status', () => { const inputLinks: any = { web: { @@ -125,11 +131,11 @@ describe('AzureDevOpsApi', () => { source: 'refs/heads/develop (f4f78b31)', }; - expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); }); }); - describe('repoBuildFromBuild with undefined result', () => { + describe('mappedRepoBuild with undefined result', () => { it('should return BuildResult of None for result', () => { const inputLinks: any = { web: { @@ -159,11 +165,11 @@ describe('AzureDevOpsApi', () => { source: 'refs/heads/develop (f4f78b31)', }; - expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); }); }); - describe('repoBuildFromBuild with undefined link', () => { + describe('mappedRepoBuild with undefined link', () => { it('should return empty string for link', () => { const inputBuild: Build = { id: 1, @@ -187,7 +193,51 @@ describe('AzureDevOpsApi', () => { source: 'refs/heads/develop (f4f78b31)', }; - expect(repoBuildFromBuild(inputBuild)).toEqual(outputRepoBuild); + expect(mappedRepoBuild(inputBuild)).toEqual(outputRepoBuild); + }); + }); + + describe('mappedPullRequest', () => { + it('should return PullRequest from GitPullRequest', () => { + const inputGitRepository: GitRepository = { + name: 'super-feature-repo', + }; + + const inputIdentityRef: IdentityRef = { + displayName: 'Jane Doe', + }; + + const inputPullRequest: GitPullRequest = { + pullRequestId: 7181, + repository: inputGitRepository, + title: 'My Awesome New Feature', + createdBy: inputIdentityRef, + creationDate: new Date('2020-09-12T06:10:23.9325232Z'), + sourceRefName: 'refs/heads/topic/super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + }; + + const inputBaseUrl = + 'https://host.com/myOrg/_git/super-feature-repo/pullrequest'; + + const outputPullRequest: PullRequest = { + pullRequestId: 7181, + repoName: 'super-feature-repo', + title: 'My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: new Date('2020-09-12T06:10:23.9325232Z'), + sourceRefName: 'refs/heads/topic/super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7181', + }; + + expect(mappedPullRequest(inputPullRequest, inputBaseUrl)).toEqual( + outputPullRequest, + ); }); }); }); diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 3da4dff11d..3d4320da6a 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -16,12 +16,17 @@ import { Logger } from 'winston'; import { WebApi } from 'azure-devops-node-api'; -import { RepoBuild } from './types'; import { Build, BuildResult, BuildStatus, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; +import { + GitPullRequest, + GitPullRequestSearchCriteria, + PullRequestStatus, +} from 'azure-devops-node-api/interfaces/GitInterfaces'; +import { PullRequest, RepoBuild } from './types'; export class AzureDevOpsApi { constructor( @@ -88,14 +93,47 @@ export class AzureDevOpsApi { ); const repoBuilds: RepoBuild[] = buildList.map(build => { - return repoBuildFromBuild(build); + return mappedRepoBuild(build); }); return repoBuilds; } + + async getPullRequests( + projectName: string, + repoName: string, + top: number, + status: PullRequestStatus, + ) { + if (this.logger) { + this.logger.debug( + `Calling Azure DevOps REST API, getting up to ${top} Pull Requests for Repository ${repoName} for Project ${projectName}`, + ); + } + + const gitRepository = await this.getGitRepository(projectName, repoName); + const client = await this.webApi.getGitApi(); + const searchCriteria: GitPullRequestSearchCriteria = { + status: status, + }; + const gitPullRequests = await client.getPullRequests( + gitRepository.id as string, + searchCriteria, + projectName, + undefined, + undefined, + top, + ); + const linkBaseUrl = `${this.webApi.serverUrl}/${projectName}/_git/${repoName}/pullrequest`; + const pullRequests: PullRequest[] = gitPullRequests.map(gitPullRequest => { + return mappedPullRequest(gitPullRequest, linkBaseUrl); + }); + + return pullRequests; + } } -export function repoBuildFromBuild(build: Build) { +export function mappedRepoBuild(build: Build) { return { id: build.id, title: [build.definition?.name, build.buildNumber] @@ -108,3 +146,21 @@ export function repoBuildFromBuild(build: Build) { source: `${build.sourceBranch} (${build.sourceVersion?.substr(0, 8)})`, }; } + +export function mappedPullRequest( + pullRequest: GitPullRequest, + linkBaseUrl: string, +) { + return { + pullRequestId: pullRequest.pullRequestId, + repoName: pullRequest.repository?.name, + title: pullRequest.title, + createdBy: pullRequest.createdBy?.displayName, + creationDate: pullRequest.creationDate, + sourceRefName: pullRequest.sourceRefName, + targetRefName: pullRequest.targetRefName, + status: pullRequest.status, + isDraft: pullRequest.isDraft, + link: `${linkBaseUrl}/${pullRequest.pullRequestId}`, + }; +} diff --git a/plugins/azure-devops-backend/src/api/index.ts b/plugins/azure-devops-backend/src/api/index.ts index 8faf37fe4e..893f0f4f2c 100644 --- a/plugins/azure-devops-backend/src/api/index.ts +++ b/plugins/azure-devops-backend/src/api/index.ts @@ -15,4 +15,4 @@ */ export { AzureDevOpsApi } from './AzureDevOpsApi'; -export type { RepoBuild } from './types'; +export type { RepoBuild, PullRequest } from './types'; diff --git a/plugins/azure-devops-backend/src/api/types.ts b/plugins/azure-devops-backend/src/api/types.ts index b3562f76c6..aaa9d8dcbd 100644 --- a/plugins/azure-devops-backend/src/api/types.ts +++ b/plugins/azure-devops-backend/src/api/types.ts @@ -18,6 +18,7 @@ import { BuildResult, BuildStatus, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; +import { PullRequestStatus } from 'azure-devops-node-api/interfaces/GitInterfaces'; export type RepoBuild = { id?: number; @@ -28,3 +29,16 @@ export type RepoBuild = { queueTime?: Date; source: string; }; + +export type PullRequest = { + pullRequestId?: number; + repoName?: string; + title?: string; + createdBy?: string; + creationDate?: Date; + sourceRefName?: string; + targetRefName?: string; + status?: PullRequestStatus; + isDraft?: boolean; + link: string; +}; diff --git a/plugins/azure-devops-backend/src/index.ts b/plugins/azure-devops-backend/src/index.ts index a7004ec73e..ff4d3973bf 100644 --- a/plugins/azure-devops-backend/src/index.ts +++ b/plugins/azure-devops-backend/src/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ export { AzureDevOpsApi } from './api'; -export type { RepoBuild } from './api'; +export type { RepoBuild, PullRequest } from './api'; export * from './service/router'; diff --git a/plugins/azure-devops-backend/src/service/router.test.ts b/plugins/azure-devops-backend/src/service/router.test.ts index a66b86f418..e6444bb9d3 100644 --- a/plugins/azure-devops-backend/src/service/router.test.ts +++ b/plugins/azure-devops-backend/src/service/router.test.ts @@ -20,8 +20,11 @@ import express from 'express'; import request from 'supertest'; import { AzureDevOpsApi } from '../api'; import { createRouter } from './router'; -import { RepoBuild } from '../api/types'; -import { GitRepository } from 'azure-devops-node-api/interfaces/GitInterfaces'; +import { PullRequest, RepoBuild } from '../api/types'; +import { + GitRepository, + PullRequestStatus, +} from 'azure-devops-node-api/interfaces/GitInterfaces'; import { Build, BuildResult, @@ -37,6 +40,7 @@ describe('createRouter', () => { getGitRepository: jest.fn(), getBuildList: jest.fn(), getRepoBuilds: jest.fn(), + getPullRequests: jest.fn(), } as any; const router = await createRouter({ azureDevOpsApi, @@ -193,4 +197,68 @@ describe('createRouter', () => { expect(response.body).toEqual(repoBuilds); }); }); + + describe('GET /pull-requests/:projectName/:repoName', () => { + it('fetches a list of pull requests', async () => { + const firstPullRequest: PullRequest = { + pullRequestId: 7181, + repoName: 'super-feature-repo', + title: 'My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: undefined, + sourceRefName: 'refs/heads/topic/super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7181', + }; + + const secondPullRequest: PullRequest = { + pullRequestId: 7182, + repoName: 'super-feature-repo', + title: 'Refactoring My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: undefined, + sourceRefName: 'refs/heads/topic/refactor-super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7182', + }; + + const thirdPullRequest: PullRequest = { + pullRequestId: 7183, + repoName: 'super-feature-repo', + title: 'Bug Fix for My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: undefined, + sourceRefName: 'refs/heads/topic/fix-super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7183', + }; + + const pullRequests: PullRequest[] = [ + firstPullRequest, + secondPullRequest, + thirdPullRequest, + ]; + + azureDevOpsApi.getPullRequests.mockResolvedValueOnce(pullRequests); + + const response = await request(app) + .get('/pull-requests/myProject/myRepo') + .query({ top: '50', status: 1 }); + + expect(azureDevOpsApi.getPullRequests).toHaveBeenCalledWith( + 'myProject', + 'myRepo', + 50, + 1, + ); + expect(response.status).toEqual(200); + expect(response.body).toEqual(pullRequests); + }); + }); }); diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index 1fc86128e6..62ac06afe4 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -21,6 +21,7 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; import { getPersonalAccessTokenHandler, WebApi } from 'azure-devops-node-api'; import { AzureDevOpsApi } from '../api'; +import { PullRequestStatus } from 'azure-devops-node-api/interfaces/GitInterfaces'; const DEFAULT_TOP: number = 10; @@ -84,6 +85,21 @@ export async function createRouter( res.status(200).json(gitRepository); }); + router.get('/pull-requests/:projectName/:repoName', async (req, res) => { + const { projectName, repoName } = req.params; + const top = req.query.top ? Number(req.query.top) : DEFAULT_TOP; + const status = req.query.status + ? Number(req.query.status) + : PullRequestStatus.Active; + const gitPullRequest = await azureDevOpsApi.getPullRequests( + projectName, + repoName, + top, + status, + ); + res.status(200).json(gitPullRequest); + }); + router.use(errorHandler()); return router; } From c1acc473573a4459ccafb283415753bb17009ecc Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Sat, 9 Oct 2021 15:36:51 -0500 Subject: [PATCH 19/50] Added Unique Name Signed-off-by: Andre Wanlin --- plugins/azure-devops-backend/api-report.md | 1 + plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts | 2 ++ plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts | 1 + plugins/azure-devops-backend/src/api/types.ts | 1 + 4 files changed, 5 insertions(+) diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index 511127f1e8..34477a71ca 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -56,6 +56,7 @@ export type PullRequest = { pullRequestId?: number; repoName?: string; title?: string; + uniqueName?: string; createdBy?: string; creationDate?: Date; sourceRefName?: string; diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts index 3a3662ec56..fd9aa169d5 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.test.ts @@ -205,6 +205,7 @@ describe('AzureDevOpsApi', () => { const inputIdentityRef: IdentityRef = { displayName: 'Jane Doe', + uniqueName: 'DOMAINjdoe', }; const inputPullRequest: GitPullRequest = { @@ -226,6 +227,7 @@ describe('AzureDevOpsApi', () => { pullRequestId: 7181, repoName: 'super-feature-repo', title: 'My Awesome New Feature', + uniqueName: 'DOMAINjdoe', createdBy: 'Jane Doe', creationDate: new Date('2020-09-12T06:10:23.9325232Z'), sourceRefName: 'refs/heads/topic/super-awesome-feature', diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 3d4320da6a..991a68fcee 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -155,6 +155,7 @@ export function mappedPullRequest( pullRequestId: pullRequest.pullRequestId, repoName: pullRequest.repository?.name, title: pullRequest.title, + uniqueName: pullRequest.createdBy?.uniqueName, createdBy: pullRequest.createdBy?.displayName, creationDate: pullRequest.creationDate, sourceRefName: pullRequest.sourceRefName, diff --git a/plugins/azure-devops-backend/src/api/types.ts b/plugins/azure-devops-backend/src/api/types.ts index aaa9d8dcbd..4b2a0f7988 100644 --- a/plugins/azure-devops-backend/src/api/types.ts +++ b/plugins/azure-devops-backend/src/api/types.ts @@ -34,6 +34,7 @@ export type PullRequest = { pullRequestId?: number; repoName?: string; title?: string; + uniqueName?: string; createdBy?: string; creationDate?: Date; sourceRefName?: string; From 87b2d5ad88d1a16a8044b7e2ddb0c95a294e4ca1 Mon Sep 17 00:00:00 2001 From: Oliver Sand Date: Mon, 11 Oct 2021 11:19:34 +0200 Subject: [PATCH 20/50] Fix `` to display only the selected tab, not the other way around Signed-off-by: Oliver Sand --- .changeset/two-foxes-marry.md | 5 ++ .../ComponentTabs/ComponentTabs.test.tsx | 76 +++++++++++++++++++ .../ComponentTabs/ComponentTabs.tsx | 5 +- 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 .changeset/two-foxes-marry.md create mode 100644 plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.test.tsx diff --git a/.changeset/two-foxes-marry.md b/.changeset/two-foxes-marry.md new file mode 100644 index 0000000000..a6ac7df666 --- /dev/null +++ b/.changeset/two-foxes-marry.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-home': patch +--- + +Fix `` to display only the selected tab, not the other way around. diff --git a/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.test.tsx b/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.test.tsx new file mode 100644 index 0000000000..96ab37a8aa --- /dev/null +++ b/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.test.tsx @@ -0,0 +1,76 @@ +/* + * 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 { render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; +import { ComponentTabs } from './ComponentTabs'; + +describe('', () => { + test('should render tabs without exploding', () => { + const { getByText } = render( + <>ContentA, + }, + { + label: 'TabB', + Component: () => <>ContentB, + }, + ]} + />, + ); + + expect(getByText('TabA')).toBeInTheDocument(); + expect(getByText('TabB')).toBeInTheDocument(); + + expect(getByText('ContentA')).toBeInTheDocument(); + expect(getByText('ContentB')).toHaveStyle({ + display: 'none', + }); + }); + + test('should switch tab on click', () => { + const { getByText } = render( + <>ContentA, + }, + { + label: 'TabB', + Component: () => <>ContentB, + }, + ]} + />, + ); + + expect(getByText('ContentB')).toHaveStyle({ + display: 'none', + }); + + userEvent.click(getByText('TabB')); + + expect(getByText('ContentA')).toHaveStyle({ + display: 'none', + }); + }); +}); diff --git a/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx b/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx index f404a80980..d6d3561fe1 100644 --- a/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx +++ b/plugins/home/src/componentRenderers/ComponentTabs/ComponentTabs.tsx @@ -44,7 +44,10 @@ export const ComponentTabs = ({ ))} {tabs.map(({ Component }, idx) => ( -
+
))} From c6f927d819bb5576f5d1b25ba6e94ef25a7f04e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Oct 2021 04:11:02 +0000 Subject: [PATCH 21/50] build(deps): bump mini-css-extract-plugin from 1.4.1 to 2.4.2 Bumps [mini-css-extract-plugin](https://github.com/webpack-contrib/mini-css-extract-plugin) from 1.4.1 to 2.4.2. - [Release notes](https://github.com/webpack-contrib/mini-css-extract-plugin/releases) - [Changelog](https://github.com/webpack-contrib/mini-css-extract-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/mini-css-extract-plugin/compare/v1.4.1...v2.4.2) --- updated-dependencies: - dependency-name: mini-css-extract-plugin dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .changeset/slow-frogs-deliver.md | 5 +++++ packages/cli/package.json | 2 +- yarn.lock | 25 +++++++------------------ 3 files changed, 13 insertions(+), 19 deletions(-) create mode 100644 .changeset/slow-frogs-deliver.md diff --git a/.changeset/slow-frogs-deliver.md b/.changeset/slow-frogs-deliver.md new file mode 100644 index 0000000000..adb0831311 --- /dev/null +++ b/.changeset/slow-frogs-deliver.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +Bump mini-css-extract-plugin to v2 diff --git a/packages/cli/package.json b/packages/cli/package.json index 53c1b06e76..606525cbb6 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -85,7 +85,7 @@ "json-schema": "^0.3.0", "jest-transform-yaml": "^0.1.1", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^1.4.1", + "mini-css-extract-plugin": "^2.4.2", "node-libs-browser": "^2.2.1", "ora": "^5.3.0", "postcss": "^8.1.0", diff --git a/yarn.lock b/yarn.lock index e6babc2742..0dbd5fb92a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -19626,14 +19626,12 @@ min-indent@^1.0.0: resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= -mini-css-extract-plugin@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.4.1.tgz#975e27c1d0bd8e052972415f47c79cea5ed37548" - integrity sha512-COAGbpAsU0ioFzj+/RRfO5Qv177L1Z/XAx2EmCF33b8GDDqKygMffBTws2lit8iaPdrbKEY5P+zsseBUCREZWQ== +mini-css-extract-plugin@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.2.tgz#b3508191ea479388a4715018c99dd3e6dd40d2d2" + integrity sha512-ZmqShkn79D36uerdED+9qdo1ZYG8C1YsWvXu0UMJxurZnSdgz7gQKO2EGv8T55MhDqG3DYmGtizZNpM/UbTlcA== dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - webpack-sources "^1.1.0" + schema-utils "^3.1.0" minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" @@ -24449,16 +24447,7 @@ schema-utils@^2.6.5, schema-utils@^2.6.6, schema-utils@^2.7.0: ajv "^6.12.4" ajv-keywords "^3.5.2" -schema-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== - dependencies: - "@types/json-schema" "^7.0.6" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^3.1.0, schema-utils@^3.1.1: +schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== @@ -27772,7 +27761,7 @@ webpack-node-externals@^3.0.0: resolved "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: +webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== From d9f3cbe0340b5abbab7d7cb3657ba94087fe50cc Mon Sep 17 00:00:00 2001 From: Fanny Gaudin Date: Mon, 11 Oct 2021 17:04:32 +0200 Subject: [PATCH 22/50] update api-report Signed-off-by: Fanny Gaudin --- plugins/api-docs/api-report.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugins/api-docs/api-report.md b/plugins/api-docs/api-report.md index 74a0dc07dd..de36857945 100644 --- a/plugins/api-docs/api-report.md +++ b/plugins/api-docs/api-report.md @@ -5,6 +5,7 @@ ```ts /// +import { Action } from '@material-table/core'; import { ApiEntity } from '@backstage/catalog-model'; import { ApiRef } from '@backstage/core-plugin-api'; import { BackstagePlugin } from '@backstage/core-plugin-api'; @@ -58,9 +59,20 @@ export { apiDocsPlugin as plugin }; export const ApiExplorerPage: ({ initiallySelectedFilter, columns, + actions, }: { initiallySelectedFilter?: UserListFilterKind | undefined; columns?: TableColumn[] | undefined; + actions?: + | ( + | Action + | { + action: (rowData: CatalogTableRow) => Action; + position: string; + } + | ((rowData: CatalogTableRow) => Action) + )[] + | undefined; }) => JSX.Element; // Warning: (ae-missing-release-tag) "ApiTypeTitle" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) From ac7edbb437ad3af875a843a15360b4a6cadea54f Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Mon, 11 Oct 2021 15:08:53 -0500 Subject: [PATCH 23/50] Refactoring based on feedback Signed-off-by: Andre Wanlin --- plugins/azure-devops-backend/api-report.md | 5 +++-- .../azure-devops-backend/src/api/AzureDevOpsApi.ts | 14 +++++++------- plugins/azure-devops-backend/src/api/types.ts | 5 +++++ .../src/service/router.test.ts | 3 +-- plugins/azure-devops-backend/src/service/router.ts | 8 ++++++-- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index 34477a71ca..74b4ac5b23 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -29,12 +29,13 @@ export class AzureDevOpsApi { projectName: string, repoName: string, ): Promise; + // Warning: (ae-forgotten-export) The symbol "PullRequestOptions" needs to be exported by the entry point index.d.ts + // // (undocumented) getPullRequests( projectName: string, repoName: string, - top: number, - status: PullRequestStatus, + options: PullRequestOptions, ): Promise; // (undocumented) getRepoBuilds( diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 991a68fcee..89e32aa2f3 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -24,9 +24,8 @@ import { import { GitPullRequest, GitPullRequestSearchCriteria, - PullRequestStatus, } from 'azure-devops-node-api/interfaces/GitInterfaces'; -import { PullRequest, RepoBuild } from './types'; +import { PullRequest, PullRequestOptions, RepoBuild } from './types'; export class AzureDevOpsApi { constructor( @@ -102,8 +101,7 @@ export class AzureDevOpsApi { async getPullRequests( projectName: string, repoName: string, - top: number, - status: PullRequestStatus, + options: PullRequestOptions, ) { if (this.logger) { this.logger.debug( @@ -114,7 +112,7 @@ export class AzureDevOpsApi { const gitRepository = await this.getGitRepository(projectName, repoName); const client = await this.webApi.getGitApi(); const searchCriteria: GitPullRequestSearchCriteria = { - status: status, + status: options.status, }; const gitPullRequests = await client.getPullRequests( gitRepository.id as string, @@ -122,9 +120,11 @@ export class AzureDevOpsApi { projectName, undefined, undefined, - top, + options.top, ); - const linkBaseUrl = `${this.webApi.serverUrl}/${projectName}/_git/${repoName}/pullrequest`; + const linkBaseUrl = `${this.webApi.serverUrl}/${encodeURIComponent( + projectName, + )}/_git/${encodeURIComponent(repoName)}/pullrequest`; const pullRequests: PullRequest[] = gitPullRequests.map(gitPullRequest => { return mappedPullRequest(gitPullRequest, linkBaseUrl); }); diff --git a/plugins/azure-devops-backend/src/api/types.ts b/plugins/azure-devops-backend/src/api/types.ts index 4b2a0f7988..a53f501f26 100644 --- a/plugins/azure-devops-backend/src/api/types.ts +++ b/plugins/azure-devops-backend/src/api/types.ts @@ -43,3 +43,8 @@ export type PullRequest = { isDraft?: boolean; link: string; }; + +export type PullRequestOptions = { + top: number; + status: PullRequestStatus; +}; diff --git a/plugins/azure-devops-backend/src/service/router.test.ts b/plugins/azure-devops-backend/src/service/router.test.ts index e6444bb9d3..4143291409 100644 --- a/plugins/azure-devops-backend/src/service/router.test.ts +++ b/plugins/azure-devops-backend/src/service/router.test.ts @@ -254,8 +254,7 @@ describe('createRouter', () => { expect(azureDevOpsApi.getPullRequests).toHaveBeenCalledWith( 'myProject', 'myRepo', - 50, - 1, + { status: 1, top: 50 }, ); expect(response.status).toEqual(200); expect(response.body).toEqual(pullRequests); diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index 62ac06afe4..0929d5cde9 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -22,6 +22,7 @@ import { Config } from '@backstage/config'; import { getPersonalAccessTokenHandler, WebApi } from 'azure-devops-node-api'; import { AzureDevOpsApi } from '../api'; import { PullRequestStatus } from 'azure-devops-node-api/interfaces/GitInterfaces'; +import { PullRequestOptions } from '../api/types'; const DEFAULT_TOP: number = 10; @@ -91,11 +92,14 @@ export async function createRouter( const status = req.query.status ? Number(req.query.status) : PullRequestStatus.Active; + const pullRequestOptions: PullRequestOptions = { + top: top, + status: status, + }; const gitPullRequest = await azureDevOpsApi.getPullRequests( projectName, repoName, - top, - status, + pullRequestOptions, ); res.status(200).json(gitPullRequest); }); From 38b014a5f5700bcb54908fce1291b0cf249273af Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Wed, 6 Oct 2021 14:32:58 -0500 Subject: [PATCH 24/50] Adding Azure DevOps frontend plugin Signed-off-by: Andre Wanlin --- app-config.yaml | 1 + packages/app/package.json | 1 + .../app/src/components/catalog/EntityPage.tsx | 8 ++ plugins/azure-devops/.eslintrc.js | 3 + plugins/azure-devops/README.md | 135 ++++++++++++++++++ plugins/azure-devops/api-report.md | 35 +++++ plugins/azure-devops/config.d.ts | 26 ++++ plugins/azure-devops/dev/index.tsx | 20 +++ .../azure-devops/doc/azure-devops-builds.png | Bin 0 -> 177135 bytes plugins/azure-devops/package.json | 62 ++++++++ .../azure-devops/src/api/AzureDevOpsApi.ts | 32 +++++ .../azure-devops/src/api/AzureDevOpsClient.ts | 56 ++++++++ plugins/azure-devops/src/api/index.ts | 18 +++ plugins/azure-devops/src/api/types.ts | 30 ++++ .../src/components/BuildTable/BuildTable.tsx | 132 +++++++++++++++++ .../src/components/BuildTable/index.ts | 17 +++ .../EntityPageAzureDevOps.tsx | 33 +++++ .../components/EntityPageAzureDevOps/index.ts | 17 +++ .../azure-devops/src/components/Router.tsx | 48 +++++++ plugins/azure-devops/src/constants.ts | 17 +++ .../src/hooks/useProjectRepoFromEntity.ts | 25 ++++ .../azure-devops/src/hooks/useRepoBuilds.ts | 40 ++++++ plugins/azure-devops/src/index.ts | 17 +++ plugins/azure-devops/src/plugin.test.ts | 22 +++ plugins/azure-devops/src/plugin.ts | 54 +++++++ plugins/azure-devops/src/routes.ts | 20 +++ plugins/azure-devops/src/setupTests.ts | 17 +++ 27 files changed, 886 insertions(+) create mode 100644 plugins/azure-devops/.eslintrc.js create mode 100644 plugins/azure-devops/README.md create mode 100644 plugins/azure-devops/api-report.md create mode 100644 plugins/azure-devops/config.d.ts create mode 100644 plugins/azure-devops/dev/index.tsx create mode 100644 plugins/azure-devops/doc/azure-devops-builds.png create mode 100644 plugins/azure-devops/package.json create mode 100644 plugins/azure-devops/src/api/AzureDevOpsApi.ts create mode 100644 plugins/azure-devops/src/api/AzureDevOpsClient.ts create mode 100644 plugins/azure-devops/src/api/index.ts create mode 100644 plugins/azure-devops/src/api/types.ts create mode 100644 plugins/azure-devops/src/components/BuildTable/BuildTable.tsx create mode 100644 plugins/azure-devops/src/components/BuildTable/index.ts create mode 100644 plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx create mode 100644 plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts create mode 100644 plugins/azure-devops/src/components/Router.tsx create mode 100644 plugins/azure-devops/src/constants.ts create mode 100644 plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts create mode 100644 plugins/azure-devops/src/hooks/useRepoBuilds.ts create mode 100644 plugins/azure-devops/src/index.ts create mode 100644 plugins/azure-devops/src/plugin.test.ts create mode 100644 plugins/azure-devops/src/plugin.ts create mode 100644 plugins/azure-devops/src/routes.ts create mode 100644 plugins/azure-devops/src/setupTests.ts diff --git a/app-config.yaml b/app-config.yaml index c24ac1701b..b92595df7b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -436,3 +436,4 @@ azureDevOps: host: dev.azure.com token: my-token organization: my-company + top: 25 diff --git a/packages/app/package.json b/packages/app/package.json index d1892438d8..fe86077273 100644 --- a/packages/app/package.json +++ b/packages/app/package.json @@ -11,6 +11,7 @@ "@backstage/core-plugin-api": "^0.1.10", "@backstage/integration-react": "^0.1.11", "@backstage/plugin-api-docs": "^0.6.11", + "@backstage/plugin-azure-devops": "^0.1.0", "@backstage/plugin-badges": "^0.2.12", "@backstage/plugin-catalog": "^0.7.0", "@backstage/plugin-catalog-graph": "^0.1.3", diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 62fdcf4d3f..b79bd2c4aa 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -33,6 +33,10 @@ import { EntityProvidedApisCard, EntityProvidingComponentsCard, } from '@backstage/plugin-api-docs'; +import { + EntityAzureDevOpsContent, + isAzureDevOpsAvailable, +} from '@backstage/plugin-azure-devops'; import { EntityBadgesDialog } from '@backstage/plugin-badges'; import { EntityAboutCard, @@ -183,6 +187,10 @@ export const cicdContent = ( + + + + { + return await createRouter({ logger, config }); + } + ``` + +3. Next we wire this into the overall backend router, edit `packages/backend/src/index.ts`: + + ```ts + import azureDevOps from './plugins/azuredevops'; + // ... + async function main() { + // ... + const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); + apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); + ``` + +4. Now run `yarn start-backend` from the repo root +5. Finally open `http://localhost:7000/api/azure-devops/health` in a browser and it should return `{"status":"ok"}` + +### Frontend + +To get the frontend working you'll need to do the following two steps: + +1. First we need to add the @backstage/plugin-azure-devops package to your frontend app: + + ```bash + # From your Backstage root directory + cd packages/app + yarn add @backstage/plugin-azure-devops + ``` + +2. Second we need to add the `EntityAzureDevOpsContent` extension to the entity page in your app: + +```tsx +// In packages/app/src/components/catalog/EntityPage.tsx +import { + EntityAzureDevOpsContent, + isAzureDevOpsAvailable, +} from '@backstage/plugin-azure-devops'; + +// For example in the CI/CD section +const cicdContent = ( + + // ... + + + + // ... + +``` + +### Entity Annotation + +You need to add the following annotation to any entities you want to be able to use the Azure Devops plugin with: + +```yaml +dev.azure.com/project-repo: / +``` + +Let's break this down a little: `` will be the name of your Team Project and `` will be the name of your repository which needs to be part of the Team Project you entered for ``. + +Here's what that will look like in action: + +```yaml +# Example catalog-info.yaml entity definition file +apiVersion: backstage.io/v1alpha1 +kind: Component +metadata: + # ... + annotations: + dev.azure.com/project-repo: my-project/my-repo +spec: + type: service + # ... +``` + +## Features + +- Lists the top _n_ builds for a given repository where _n_ is the value configured for `top` + +## Limitations + +- Currently multiple organizations is not supported diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md new file mode 100644 index 0000000000..11de164276 --- /dev/null +++ b/plugins/azure-devops/api-report.md @@ -0,0 +1,35 @@ +## API Report File for "@backstage/plugin-azure-devops" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +/// + +import { BackstagePlugin } from '@backstage/core-plugin-api'; +import { Entity } from '@backstage/catalog-model'; +import { RouteRef } from '@backstage/core-plugin-api'; + +// Warning: (ae-missing-release-tag) "azureDevOpsPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const azureDevOpsPlugin: BackstagePlugin< + { + entityContent: RouteRef; + }, + {} +>; + +// Warning: (ae-missing-release-tag) "EntityAzureDevOpsContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const EntityAzureDevOpsContent: (_props: { + entity?: Entity | undefined; +}) => JSX.Element; + +// Warning: (ae-missing-release-tag) "isAzureDevOpsAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const isAzureDevOpsAvailable: (entity: Entity) => boolean; + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts new file mode 100644 index 0000000000..827e64d5bd --- /dev/null +++ b/plugins/azure-devops/config.d.ts @@ -0,0 +1,26 @@ +/* + * 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. + */ + +export interface Config { + /** Configuration options for the azure-devops-backend plugin */ + azureDevOps: { + /** + * The max number of items to return - applies to builds + * @visibility frontend + */ + top: number; + }; +} diff --git a/plugins/azure-devops/dev/index.tsx b/plugins/azure-devops/dev/index.tsx new file mode 100644 index 0000000000..8d1c3ef6ea --- /dev/null +++ b/plugins/azure-devops/dev/index.tsx @@ -0,0 +1,20 @@ +/* + * 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 { createDevApp } from '@backstage/dev-utils'; +import { azureDevOpsPlugin } from '../src/plugin'; + +createDevApp().registerPlugin(azureDevOpsPlugin).render(); diff --git a/plugins/azure-devops/doc/azure-devops-builds.png b/plugins/azure-devops/doc/azure-devops-builds.png new file mode 100644 index 0000000000000000000000000000000000000000..89a777059f67b448c961bdcd829d38ddd9eea0d5 GIT binary patch literal 177135 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'OLF;}K1r?yk4 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 literal 0 HcmV?d00001 diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json new file mode 100644 index 0000000000..fb59d5eb38 --- /dev/null +++ b/plugins/azure-devops/package.json @@ -0,0 +1,62 @@ +{ + "name": "@backstage/plugin-azure-devops", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.esm.js", + "types": "dist/index.d.ts" + }, + "homepage": "https://backstage.io", + "repository": { + "type": "git", + "url": "https://github.com/backstage/backstage", + "directory": "plugins/azure-devops" + }, + "scripts": { + "build": "backstage-cli plugin:build", + "start": "backstage-cli plugin:serve", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "diff": "backstage-cli plugin:diff", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/catalog-model": "^0.9.3", + "@backstage/core-components": "^0.6.0", + "@backstage/core-plugin-api": "^0.1.9", + "@backstage/plugin-catalog-react": "^0.5.1", + "@backstage/theme": "^0.2.10", + "@material-ui/core": "^4.12.2", + "@material-ui/icons": "^4.9.1", + "@material-ui/lab": "4.0.0-alpha.57", + "azure-devops-node-api": "^11.0.1", + "moment": "^2.29.1", + "react": "^16.13.1", + "react-dom": "^16.13.1", + "react-router": "6.0.0-beta.0", + "react-use": "^17.2.4" + }, + "devDependencies": { + "@backstage/cli": "^0.7.13", + "@backstage/core-app-api": "^0.1.14", + "@backstage/dev-utils": "^0.2.10", + "@backstage/test-utils": "^0.1.17", + "@testing-library/jest-dom": "^5.10.1", + "@testing-library/react": "^11.2.5", + "@testing-library/user-event": "^13.1.8", + "@types/jest": "*", + "@types/node": "*", + "msw": "^0.29.0", + "cross-fetch": "^3.0.6" + }, + "files": [ + "dist", + "config.d.ts" + ], + "configSchema": "config.d.ts" +} diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts new file mode 100644 index 0000000000..424999441d --- /dev/null +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -0,0 +1,32 @@ +/* + * 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 { RepoBuild } from './types'; +import { createApiRef } from '@backstage/core-plugin-api'; + +export const azureDevOpsApiRef = createApiRef({ + id: 'plugin.azure-devops.service', + description: + 'Used by the Azure DevOps plugin to make requests to accompanying backend', +}); + +export interface AzureDevOpsApi { + getRepoBuilds( + projectName: string, + repoName: string, + top: number, + ): Promise; +} diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts new file mode 100644 index 0000000000..c9e44109aa --- /dev/null +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -0,0 +1,56 @@ +/* + * 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 { AzureDevOpsApi } from './AzureDevOpsApi'; +import { RepoBuild } from './types'; +import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; + +export class AzureDevOpsClient implements AzureDevOpsApi { + private readonly discoveryApi: DiscoveryApi; + private readonly identityApi: IdentityApi; + + constructor(options: { + discoveryApi: DiscoveryApi; + identityApi: IdentityApi; + }) { + this.discoveryApi = options.discoveryApi; + this.identityApi = options.identityApi; + } + + async getRepoBuilds( + projectName: string, + repoName: string, + top: number, + ): Promise { + return await this.get(`/repo-builds/${projectName}/${repoName}?top=${top}`); + } + + private async get(path: string): Promise { + const url = `${await this.discoveryApi.getBaseUrl('azure-devops')}${path}`; + const idToken = await this.identityApi.getIdToken(); + const response = await fetch(url, { + headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, + }); + + if (!response.ok) { + const payload = await response.text(); + const message = `Request failed with ${response.status} ${response.statusText}, ${payload}`; + throw new Error(message); + } + + return await response.json(); + } +} diff --git a/plugins/azure-devops/src/api/index.ts b/plugins/azure-devops/src/api/index.ts new file mode 100644 index 0000000000..c69636222f --- /dev/null +++ b/plugins/azure-devops/src/api/index.ts @@ -0,0 +1,18 @@ +/* + * 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 * from './AzureDevOpsApi'; +export * from './AzureDevOpsClient'; diff --git a/plugins/azure-devops/src/api/types.ts b/plugins/azure-devops/src/api/types.ts new file mode 100644 index 0000000000..35d4e38ae1 --- /dev/null +++ b/plugins/azure-devops/src/api/types.ts @@ -0,0 +1,30 @@ +/* + * 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 { + BuildResult, + BuildStatus, +} from 'azure-devops-node-api/interfaces/BuildInterfaces'; + +export type RepoBuild = { + id?: number; + title: string; + link: string; + status?: BuildStatus; + result?: BuildResult; + queueTime?: Date; + source: string; +}; diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx new file mode 100644 index 0000000000..26f365c5e9 --- /dev/null +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -0,0 +1,132 @@ +/* + * 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 React from 'react'; +import moment from 'moment'; +import { + Table, + TableColumn, + StatusError, + StatusOK, + StatusWarning, + StatusAborted, +} from '@backstage/core-components'; +import { Link, Box, Typography } from '@material-ui/core'; +import Alert from '@material-ui/lab/Alert'; +import { RepoBuild } from '../../api/types'; +import { + BuildResult, + BuildStatus, +} from 'azure-devops-node-api/interfaces/BuildInterfaces'; + +const getBuildResultComponent = (result: number | undefined = 0) => { + switch (result) { + case 0: // None + return ; + case 2: // Succeeded + return ; + case 4: // PartiallySucceeded + return ; + case 8: // Failed + return ; + case 32: // Canceled + return ; + default: + return ; + } +}; + +const columns: TableColumn[] = [ + { + title: 'ID', + field: 'id', + highlight: false, + width: '80px', + }, + { + title: 'Build', + field: 'title', + render: (row: Partial) => ( + + {row.title} + + ), + }, + { + title: 'Source', + field: 'source', + }, + { + title: 'Status', + field: 'status', + render: (row: Partial) => ( + + + {BuildStatus[row.status || 0]} + + ), + }, + { + title: 'Result', + field: 'result', + render: (row: Partial) => ( + + {getBuildResultComponent(row.result)} + + {BuildResult[row.result || 0]} + + ), + }, + { + title: 'Date', + field: 'queueTime', + render: (row: Partial) => moment(row.queueTime).fromNow(), + }, +]; + +type Props = { + items: RepoBuild[]; + loading: boolean; + error?: any; +}; + +export const BuildTable = ({ items, loading, error }: Props) => { + if (error) { + return ( +
+ + Error encountered while fetching Azure DevOps builds.{' '} + {error.toString()} + +
+ ); + } + + return ( +
+ ); +}; diff --git a/plugins/azure-devops/src/components/BuildTable/index.ts b/plugins/azure-devops/src/components/BuildTable/index.ts new file mode 100644 index 0000000000..acf20eb523 --- /dev/null +++ b/plugins/azure-devops/src/components/BuildTable/index.ts @@ -0,0 +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 { BuildTable } from './BuildTable'; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx new file mode 100644 index 0000000000..fbeac53569 --- /dev/null +++ b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx @@ -0,0 +1,33 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import React from 'react'; +import { useRepoBuilds } from '../../hooks/useRepoBuilds'; +import { BuildTable } from '../BuildTable/BuildTable'; + +type Props = { + /** @deprecated The entity is now grabbed from context instead */ + entity?: Entity; +}; + +export const EntityPageAzureDevOps = (_props: Props) => { + const { entity } = useEntity(); + const { items, loading, error } = useRepoBuilds(entity); + + return ; +}; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts b/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts new file mode 100644 index 0000000000..89ee4f199b --- /dev/null +++ b/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts @@ -0,0 +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 { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; diff --git a/plugins/azure-devops/src/components/Router.tsx b/plugins/azure-devops/src/components/Router.tsx new file mode 100644 index 0000000000..74cf0439f8 --- /dev/null +++ b/plugins/azure-devops/src/components/Router.tsx @@ -0,0 +1,48 @@ +/* + * 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 React from 'react'; +import { Routes, Route } from 'react-router'; +import { azureDevOpsRouteRef } from '../routes'; +import { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; +import { AZURE_DEVOPS_ANNOTATION } from '../constants'; +import { Entity } from '@backstage/catalog-model'; +import { useEntity } from '@backstage/plugin-catalog-react'; +import { MissingAnnotationEmptyState } from '@backstage/core-components'; + +export const isAzureDevOpsAvailable = (entity: Entity) => + Boolean(entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION]); + +type Props = { + /** @deprecated The entity is now grabbed from context instead */ + entity?: Entity; +}; + +export const Router = (_props: Props) => { + const { entity } = useEntity(); + + if (!isAzureDevOpsAvailable(entity)) { + return ; + } + + return ( + + } + /> + + ); +}; diff --git a/plugins/azure-devops/src/constants.ts b/plugins/azure-devops/src/constants.ts new file mode 100644 index 0000000000..6abc6449e9 --- /dev/null +++ b/plugins/azure-devops/src/constants.ts @@ -0,0 +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 const AZURE_DEVOPS_ANNOTATION = 'dev.azure.com/project-repo'; diff --git a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts new file mode 100644 index 0000000000..721fa52781 --- /dev/null +++ b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts @@ -0,0 +1,25 @@ +/* + * 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 { Entity } from '@backstage/catalog-model'; +import { AZURE_DEVOPS_ANNOTATION } from '../constants'; + +export function useProjectRepoFromEntity(entity: Entity) { + const [project, repo] = ( + entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION] ?? '' + ).split('/'); + return { project, repo }; +} diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts new file mode 100644 index 0000000000..e6d2964770 --- /dev/null +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -0,0 +1,40 @@ +/* + * 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 { useAsync } from 'react-use'; +import { Entity } from '@backstage/catalog-model'; +import { useApi, configApiRef } from '@backstage/core-plugin-api'; +import { azureDevOpsApiRef } from '../api'; +import { RepoBuild } from '../api/types'; +import { useProjectRepoFromEntity } from './useProjectRepoFromEntity'; + +const DEFAULT_TOP: number = 10; + +export function useRepoBuilds(entity: Entity) { + const config = useApi(configApiRef); + const top = config.getOptionalNumber('azureDevOps.top') ?? DEFAULT_TOP; + const api = useApi(azureDevOpsApiRef); + const { project, repo } = useProjectRepoFromEntity(entity); + const { value, loading, error } = useAsync(() => { + return api.getRepoBuilds(project, repo, top); + }, [api, project, repo, entity]); + + return { + items: value as RepoBuild[], + loading, + error, + }; +} diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts new file mode 100644 index 0000000000..b654aebab7 --- /dev/null +++ b/plugins/azure-devops/src/index.ts @@ -0,0 +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 { azureDevOpsPlugin, EntityAzureDevOpsContent } from './plugin'; +export { isAzureDevOpsAvailable } from './components/Router'; diff --git a/plugins/azure-devops/src/plugin.test.ts b/plugins/azure-devops/src/plugin.test.ts new file mode 100644 index 0000000000..f23639798f --- /dev/null +++ b/plugins/azure-devops/src/plugin.test.ts @@ -0,0 +1,22 @@ +/* + * 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 { azureDevOpsPlugin } from './plugin'; + +describe('azure-devops', () => { + it('should export plugin', () => { + expect(azureDevOpsPlugin).toBeDefined(); + }); +}); diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts new file mode 100644 index 0000000000..f37fab6d62 --- /dev/null +++ b/plugins/azure-devops/src/plugin.ts @@ -0,0 +1,54 @@ +/* + * 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 { azureDevOpsApiRef } from './api/AzureDevOpsApi'; +import { AzureDevOpsClient } from './api/AzureDevOpsClient'; +import { + createApiFactory, + createPlugin, + createRoutableExtension, + createRouteRef, + discoveryApiRef, + identityApiRef, +} from '@backstage/core-plugin-api'; + +export const rootRouteRef = createRouteRef({ + path: '', + title: 'AzureDevOps', +}); + +export const azureDevOpsPlugin = createPlugin({ + id: 'azureDevOps', + apis: [ + createApiFactory({ + api: azureDevOpsApiRef, + deps: { discoveryApi: discoveryApiRef, identityApi: identityApiRef }, + factory: ({ discoveryApi, identityApi }) => + new AzureDevOpsClient({ discoveryApi, identityApi }), + }), + ], + routes: { + entityContent: rootRouteRef, + }, +}); + +export const EntityAzureDevOpsContent = azureDevOpsPlugin.provide( + createRoutableExtension({ + name: 'EntityAzureDevOpsContent', + component: () => import('./components/Router').then(m => m.Router), + mountPoint: rootRouteRef, + }), +); diff --git a/plugins/azure-devops/src/routes.ts b/plugins/azure-devops/src/routes.ts new file mode 100644 index 0000000000..81f4b48fda --- /dev/null +++ b/plugins/azure-devops/src/routes.ts @@ -0,0 +1,20 @@ +/* + * 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 { createRouteRef } from '@backstage/core-plugin-api'; + +export const azureDevOpsRouteRef = createRouteRef({ + title: 'azure-devops', +}); diff --git a/plugins/azure-devops/src/setupTests.ts b/plugins/azure-devops/src/setupTests.ts new file mode 100644 index 0000000000..fc6dbd98f8 --- /dev/null +++ b/plugins/azure-devops/src/setupTests.ts @@ -0,0 +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. + */ +import '@testing-library/jest-dom'; +import 'cross-fetch/polyfill'; From d1b0a7345383c638d495add074bb135971e6b93b Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 06:59:24 -0500 Subject: [PATCH 25/50] Updated devDependencies causing CI to fail Signed-off-by: Andre Wanlin --- plugins/azure-devops/package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index fb59d5eb38..c823924c9d 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -42,15 +42,15 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.7.13", - "@backstage/core-app-api": "^0.1.14", - "@backstage/dev-utils": "^0.2.10", + "@backstage/cli": "^0.7.14", + "@backstage/core-app-api": "^0.1.15", + "@backstage/dev-utils": "^0.2.11", "@backstage/test-utils": "^0.1.17", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", - "@types/jest": "*", - "@types/node": "*", + "@types/jest": "^26.0.7", + "@types/node": "^14.14.32", "msw": "^0.29.0", "cross-fetch": "^3.0.6" }, From a44d32d46c3da76aacbbb265e7202c1865686f10 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 08:57:16 -0500 Subject: [PATCH 26/50] Fixed formatting of README Signed-off-by: Andre Wanlin --- plugins/azure-devops/README.md | 60 +++++++++++++++++----------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index a596863bad..376a630873 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -31,43 +31,43 @@ Configuration Details: Here's how to get the backend up and running: -1. First we need to add the @backstage/plugin-azure-devops-backend package to your backend: +1. First we need to add the @backstage/plugin-azure-devops-backend package to your backend: - ```sh - # From the Backstage root directory - cd packages/backend - yarn add @backstage/plugin-azure-devops-backend - ``` + ```sh + # From the Backstage root directory + cd packages/backend + yarn add @backstage/plugin-azure-devops-backend + ``` -2. Then we will create a new file named `packages/backend/src/plugins/azuredevops.ts`, and add the - following to it: +2. Then we will create a new file named `packages/backend/src/plugins/azuredevops.ts`, and add the + following to it: - ```ts - import { createRouter } from '@backstage/plugin-azure-devops-backend'; - import { Router } from 'express'; - import type { PluginEnvironment } from '../types'; + ```ts + import { createRouter } from '@backstage/plugin-azure-devops-backend'; + import { Router } from 'express'; + import type { PluginEnvironment } from '../types'; - export default async function createPlugin({ - logger, - config, - }: PluginEnvironment): Promise { - return await createRouter({ logger, config }); - } - ``` + export default async function createPlugin({ + logger, + config, + }: PluginEnvironment): Promise { + return await createRouter({ logger, config }); + } + ``` -3. Next we wire this into the overall backend router, edit `packages/backend/src/index.ts`: +3. Next we wire this into the overall backend router, edit `packages/backend/src/index.ts`: - ```ts - import azureDevOps from './plugins/azuredevops'; - // ... - async function main() { - // ... - const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); - apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); - ``` + ```ts + import azureDevOps from './plugins/azuredevops'; + // ... + async function main() { + // ... + const azureDevOpsEnv = useHotMemoize(module, () => createEnv('azure-devops')); + apiRouter.use('/azure-devops', await azureDevOps(azureDevOpsEnv)); + ``` -4. Now run `yarn start-backend` from the repo root -5. Finally open `http://localhost:7000/api/azure-devops/health` in a browser and it should return `{"status":"ok"}` +4. Now run `yarn start-backend` from the repo root +5. Finally open `http://localhost:7000/api/azure-devops/health` in a browser and it should return `{"status":"ok"}` ### Frontend From 9953dc1b44f01a66a372a896bf6ff43fd7d2ea7b Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 19:55:26 -0500 Subject: [PATCH 27/50] Start of refactoring based on feedback Signed-off-by: Andre Wanlin --- .../app/src/components/catalog/EntityPage.tsx | 4 +-- plugins/azure-devops/README.md | 2 +- plugins/azure-devops/config.d.ts | 2 +- .../{doc => docs}/azure-devops-builds.png | Bin plugins/azure-devops/package.json | 10 +++---- .../azure-devops/src/api/AzureDevOpsClient.ts | 8 +++-- .../src/api/AzureDevOpsClientError.ts | 21 +++++++++++++ plugins/azure-devops/src/api/types.ts | 2 +- .../src/components/BuildTable/BuildTable.tsx | 28 +++++++++++------- .../EntityPageAzureDevOps.tsx | 2 +- plugins/azure-devops/src/constants.ts | 1 + .../src/hooks/useProjectRepoFromEntity.ts | 5 +++- .../azure-devops/src/hooks/useRepoBuilds.ts | 12 +++++--- plugins/azure-devops/src/index.ts | 2 +- plugins/azure-devops/src/plugin.ts | 13 +++----- 15 files changed, 72 insertions(+), 40 deletions(-) rename plugins/azure-devops/{doc => docs}/azure-devops-builds.png (100%) create mode 100644 plugins/azure-devops/src/api/AzureDevOpsClientError.ts diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index b79bd2c4aa..4147874e65 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -34,7 +34,7 @@ import { EntityProvidingComponentsCard, } from '@backstage/plugin-api-docs'; import { - EntityAzureDevOpsContent, + EntityAzurePipelinesContent, isAzureDevOpsAvailable, } from '@backstage/plugin-azure-devops'; import { EntityBadgesDialog } from '@backstage/plugin-badges'; @@ -188,7 +188,7 @@ export const cicdContent = ( - + diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 376a630873..97a415d8d0 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -2,7 +2,7 @@ Website: [https://dev.azure.com/](https://dev.azure.com/) -![Azure DevOps Builds Example](./doc/azure-devops-builds.png) +![Azure DevOps Builds Example](./docs/azure-devops-builds.png) ## Setup diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts index 827e64d5bd..62b1488e49 100644 --- a/plugins/azure-devops/config.d.ts +++ b/plugins/azure-devops/config.d.ts @@ -1,5 +1,5 @@ /* - * Copyright 2020 The Backstage Authors + * 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. diff --git a/plugins/azure-devops/doc/azure-devops-builds.png b/plugins/azure-devops/docs/azure-devops-builds.png similarity index 100% rename from plugins/azure-devops/doc/azure-devops-builds.png rename to plugins/azure-devops/docs/azure-devops-builds.png diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index c823924c9d..16e8f35991 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -27,8 +27,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.3", - "@backstage/core-components": "^0.6.0", - "@backstage/core-plugin-api": "^0.1.9", + "@backstage/core-components": "^0.6.1", + "@backstage/core-plugin-api": "^0.1.10", "@backstage/plugin-catalog-react": "^0.5.1", "@backstage/theme": "^0.2.10", "@material-ui/core": "^4.12.2", @@ -42,10 +42,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.7.14", - "@backstage/core-app-api": "^0.1.15", + "@backstage/cli": "^0.7.15", + "@backstage/core-app-api": "^0.1.16", "@backstage/dev-utils": "^0.2.11", - "@backstage/test-utils": "^0.1.17", + "@backstage/test-utils": "^0.1.18", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index c9e44109aa..32a563f429 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -17,6 +17,7 @@ import { AzureDevOpsApi } from './AzureDevOpsApi'; import { RepoBuild } from './types'; import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; +import { AzureDevOpsClientError } from './AzureDevOpsClientError'; export class AzureDevOpsClient implements AzureDevOpsApi { private readonly discoveryApi: DiscoveryApi; @@ -39,7 +40,9 @@ export class AzureDevOpsClient implements AzureDevOpsApi { } private async get(path: string): Promise { - const url = `${await this.discoveryApi.getBaseUrl('azure-devops')}${path}`; + const baseUrl = await this.discoveryApi.getBaseUrl('azure-devops'); + const url = `${baseUrl}/${path}`; + const idToken = await this.identityApi.getIdToken(); const response = await fetch(url, { headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, @@ -47,8 +50,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { if (!response.ok) { const payload = await response.text(); - const message = `Request failed with ${response.status} ${response.statusText}, ${payload}`; - throw new Error(message); + throw new AzureDevOpsClientError(response, payload); } return await response.json(); diff --git a/plugins/azure-devops/src/api/AzureDevOpsClientError.ts b/plugins/azure-devops/src/api/AzureDevOpsClientError.ts new file mode 100644 index 0000000000..f9a2f37b41 --- /dev/null +++ b/plugins/azure-devops/src/api/AzureDevOpsClientError.ts @@ -0,0 +1,21 @@ +/* + * 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 class AzureDevOpsClientError extends Error { + public constructor({ status, statusText }: Response, payload: string) { + super(`Request failed with ${status} ${statusText}, ${payload}`); + } +} diff --git a/plugins/azure-devops/src/api/types.ts b/plugins/azure-devops/src/api/types.ts index 35d4e38ae1..b3562f76c6 100644 --- a/plugins/azure-devops/src/api/types.ts +++ b/plugins/azure-devops/src/api/types.ts @@ -22,7 +22,7 @@ import { export type RepoBuild = { id?: number; title: string; - link: string; + link?: string; status?: BuildStatus; result?: BuildResult; queueTime?: Date; diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index 26f365c5e9..e853662fbf 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -32,17 +32,19 @@ import { BuildStatus, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -const getBuildResultComponent = (result: number | undefined = 0) => { +const getBuildResultComponent = ( + result: number | undefined = BuildResult.None, +) => { switch (result) { - case 0: // None + case BuildResult.None: return ; - case 2: // Succeeded + case BuildResult.Succeeded: return ; - case 4: // PartiallySucceeded + case BuildResult.PartiallySucceeded: return ; - case 8: // Failed + case BuildResult.Failed: return ; - case 32: // Canceled + case BuildResult.Canceled: return ; default: return ; @@ -75,7 +77,9 @@ const columns: TableColumn[] = [ render: (row: Partial) => ( - {BuildStatus[row.status || 0]} + + {BuildStatus[row.status || BuildStatus.None]} + ), }, @@ -86,7 +90,9 @@ const columns: TableColumn[] = [ {getBuildResultComponent(row.result)} - {BuildResult[row.result || 0]} + + {BuildResult[row.result || BuildResult.None]} + ), }, @@ -98,7 +104,7 @@ const columns: TableColumn[] = [ ]; type Props = { - items: RepoBuild[]; + items?: RepoBuild[]; loading: boolean; error?: any; }; @@ -125,8 +131,8 @@ export const BuildTable = ({ items, loading, error }: Props) => { pageSize: 5, showEmptyDataSourceMessage: !loading, }} - title={`Builds (${(items && items.length) || 0})`} - data={items} + title={`Builds (${items ? items.length : 0})`} + data={items || []} /> ); }; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx index fbeac53569..8e102e647d 100644 --- a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx +++ b/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx @@ -29,5 +29,5 @@ export const EntityPageAzureDevOps = (_props: Props) => { const { entity } = useEntity(); const { items, loading, error } = useRepoBuilds(entity); - return ; + return ; }; diff --git a/plugins/azure-devops/src/constants.ts b/plugins/azure-devops/src/constants.ts index 6abc6449e9..d6e67ff7ed 100644 --- a/plugins/azure-devops/src/constants.ts +++ b/plugins/azure-devops/src/constants.ts @@ -15,3 +15,4 @@ */ export const AZURE_DEVOPS_ANNOTATION = 'dev.azure.com/project-repo'; +export const AZURE_DEVOPS_DEFAULT_TOP: number = 10; diff --git a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts index 721fa52781..dfbee81d62 100644 --- a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts +++ b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts @@ -17,7 +17,10 @@ import { Entity } from '@backstage/catalog-model'; import { AZURE_DEVOPS_ANNOTATION } from '../constants'; -export function useProjectRepoFromEntity(entity: Entity) { +export function useProjectRepoFromEntity(entity: Entity): { + project: string; + repo: string; +} { const [project, repo] = ( entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION] ?? '' ).split('/'); diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index e6d2964770..1e68490ea6 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -20,12 +20,16 @@ import { useApi, configApiRef } from '@backstage/core-plugin-api'; import { azureDevOpsApiRef } from '../api'; import { RepoBuild } from '../api/types'; import { useProjectRepoFromEntity } from './useProjectRepoFromEntity'; +import { AZURE_DEVOPS_DEFAULT_TOP } from '../constants'; -const DEFAULT_TOP: number = 10; - -export function useRepoBuilds(entity: Entity) { +export function useRepoBuilds(entity: Entity): { + items: RepoBuild[]; + loading: boolean; + error: any; +} { const config = useApi(configApiRef); - const top = config.getOptionalNumber('azureDevOps.top') ?? DEFAULT_TOP; + const top = + config.getOptionalNumber('azureDevOps.top') ?? AZURE_DEVOPS_DEFAULT_TOP; const api = useApi(azureDevOpsApiRef); const { project, repo } = useProjectRepoFromEntity(entity); const { value, loading, error } = useAsync(() => { diff --git a/plugins/azure-devops/src/index.ts b/plugins/azure-devops/src/index.ts index b654aebab7..9a90d6ed6a 100644 --- a/plugins/azure-devops/src/index.ts +++ b/plugins/azure-devops/src/index.ts @@ -13,5 +13,5 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { azureDevOpsPlugin, EntityAzureDevOpsContent } from './plugin'; +export { azureDevOpsPlugin, EntityAzurePipelinesContent } from './plugin'; export { isAzureDevOpsAvailable } from './components/Router'; diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts index f37fab6d62..9ec5ebbb09 100644 --- a/plugins/azure-devops/src/plugin.ts +++ b/plugins/azure-devops/src/plugin.ts @@ -20,15 +20,10 @@ import { createApiFactory, createPlugin, createRoutableExtension, - createRouteRef, discoveryApiRef, identityApiRef, } from '@backstage/core-plugin-api'; - -export const rootRouteRef = createRouteRef({ - path: '', - title: 'AzureDevOps', -}); +import { azureDevOpsRouteRef } from './routes'; export const azureDevOpsPlugin = createPlugin({ id: 'azureDevOps', @@ -41,14 +36,14 @@ export const azureDevOpsPlugin = createPlugin({ }), ], routes: { - entityContent: rootRouteRef, + entityContent: azureDevOpsRouteRef, }, }); -export const EntityAzureDevOpsContent = azureDevOpsPlugin.provide( +export const EntityAzurePipelinesContent = azureDevOpsPlugin.provide( createRoutableExtension({ name: 'EntityAzureDevOpsContent', component: () => import('./components/Router').then(m => m.Router), - mountPoint: rootRouteRef, + mountPoint: azureDevOpsRouteRef, }), ); From 9cc89f753042c6ad47b7dba165fe8d450d90fcf7 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Thu, 7 Oct 2021 20:31:31 -0500 Subject: [PATCH 28/50] Regenerated API Report Signed-off-by: Andre Wanlin --- plugins/azure-devops/api-report.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 11de164276..bc39fd0ce4 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -19,10 +19,10 @@ export const azureDevOpsPlugin: BackstagePlugin< {} >; -// Warning: (ae-missing-release-tag) "EntityAzureDevOpsContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// Warning: (ae-missing-release-tag) "EntityAzurePipelinesContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const EntityAzureDevOpsContent: (_props: { +export const EntityAzurePipelinesContent: (_props: { entity?: Entity | undefined; }) => JSX.Element; From a9d460dd1cd3e1006dc4b9e06e3016e61b5774bf Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 08:20:49 -0500 Subject: [PATCH 29/50] Further refactoring based on feedback Signed-off-by: Andre Wanlin --- plugins/azure-devops/README.md | 6 +++--- plugins/azure-devops/package.json | 2 +- plugins/azure-devops/src/api/AzureDevOpsClient.ts | 8 ++++---- .../src/components/BuildTable/BuildTable.tsx | 9 ++++++--- .../EntityPageAzurePipelines.tsx} | 2 +- .../index.ts | 2 +- plugins/azure-devops/src/components/Router.tsx | 4 ++-- plugins/azure-devops/src/plugin.ts | 2 +- 8 files changed, 19 insertions(+), 16 deletions(-) rename plugins/azure-devops/src/components/{EntityPageAzureDevOps/EntityPageAzureDevOps.tsx => EntityPageAzurePipelines/EntityPageAzurePipelines.tsx} (94%) rename plugins/azure-devops/src/components/{EntityPageAzureDevOps => EntityPageAzurePipelines}/index.ts (89%) diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 97a415d8d0..55d5ea5f91 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -81,12 +81,12 @@ To get the frontend working you'll need to do the following two steps: yarn add @backstage/plugin-azure-devops ``` -2. Second we need to add the `EntityAzureDevOpsContent` extension to the entity page in your app: +2. Second we need to add the `EntityAzurePipelinesContent` extension to the entity page in your app: ```tsx // In packages/app/src/components/catalog/EntityPage.tsx import { - EntityAzureDevOpsContent, + EntityAzurePipelinesContent, isAzureDevOpsAvailable, } from '@backstage/plugin-azure-devops'; @@ -95,7 +95,7 @@ const cicdContent = ( // ... - + // ... diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 16e8f35991..16008090b7 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -35,7 +35,7 @@ "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "azure-devops-node-api": "^11.0.1", - "moment": "^2.29.1", + "luxon": "^2.0.2", "react": "^16.13.1", "react-dom": "^16.13.1", "react-router": "6.0.0-beta.0", diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index 32a563f429..d82dfbe09e 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -36,15 +36,15 @@ export class AzureDevOpsClient implements AzureDevOpsApi { repoName: string, top: number, ): Promise { - return await this.get(`/repo-builds/${projectName}/${repoName}?top=${top}`); + return await this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); } private async get(path: string): Promise { - const baseUrl = await this.discoveryApi.getBaseUrl('azure-devops'); - const url = `${baseUrl}/${path}`; + const baseUrl = `${await this.discoveryApi.getBaseUrl('azure-devops')}/`; + const url = new URL(path, baseUrl); const idToken = await this.identityApi.getIdToken(); - const response = await fetch(url, { + const response = await fetch(url.toString(), { headers: idToken ? { Authorization: `Bearer ${idToken}` } : {}, }); diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index e853662fbf..7c3e09c66c 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -15,7 +15,7 @@ */ import React from 'react'; -import moment from 'moment'; +import { DateTime } from 'luxon'; import { Table, TableColumn, @@ -56,7 +56,7 @@ const columns: TableColumn[] = [ title: 'ID', field: 'id', highlight: false, - width: '80px', + width: '100px', }, { title: 'Build', @@ -99,7 +99,10 @@ const columns: TableColumn[] = [ { title: 'Date', field: 'queueTime', - render: (row: Partial) => moment(row.queueTime).fromNow(), + render: (row: Partial) => + DateTime.fromISO( + row.queueTime ? row.queueTime.toString() : new Date().toString(), + ).toRelative(), }, ]; diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx similarity index 94% rename from plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx rename to plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx index 8e102e647d..5d53df928c 100644 --- a/plugins/azure-devops/src/components/EntityPageAzureDevOps/EntityPageAzureDevOps.tsx +++ b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx @@ -25,7 +25,7 @@ type Props = { entity?: Entity; }; -export const EntityPageAzureDevOps = (_props: Props) => { +export const EntityPageAzurePipelines = (_props: Props) => { const { entity } = useEntity(); const { items, loading, error } = useRepoBuilds(entity); diff --git a/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts b/plugins/azure-devops/src/components/EntityPageAzurePipelines/index.ts similarity index 89% rename from plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts rename to plugins/azure-devops/src/components/EntityPageAzurePipelines/index.ts index 89ee4f199b..c907c61b2c 100644 --- a/plugins/azure-devops/src/components/EntityPageAzureDevOps/index.ts +++ b/plugins/azure-devops/src/components/EntityPageAzurePipelines/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ -export { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; +export { EntityPageAzurePipelines } from './EntityPageAzurePipelines'; diff --git a/plugins/azure-devops/src/components/Router.tsx b/plugins/azure-devops/src/components/Router.tsx index 74cf0439f8..81b6d89a25 100644 --- a/plugins/azure-devops/src/components/Router.tsx +++ b/plugins/azure-devops/src/components/Router.tsx @@ -16,7 +16,7 @@ import React from 'react'; import { Routes, Route } from 'react-router'; import { azureDevOpsRouteRef } from '../routes'; -import { EntityPageAzureDevOps } from './EntityPageAzureDevOps'; +import { EntityPageAzurePipelines } from './EntityPageAzurePipelines'; import { AZURE_DEVOPS_ANNOTATION } from '../constants'; import { Entity } from '@backstage/catalog-model'; import { useEntity } from '@backstage/plugin-catalog-react'; @@ -41,7 +41,7 @@ export const Router = (_props: Props) => { } + element={} /> ); diff --git a/plugins/azure-devops/src/plugin.ts b/plugins/azure-devops/src/plugin.ts index 9ec5ebbb09..1cf6e680d0 100644 --- a/plugins/azure-devops/src/plugin.ts +++ b/plugins/azure-devops/src/plugin.ts @@ -42,7 +42,7 @@ export const azureDevOpsPlugin = createPlugin({ export const EntityAzurePipelinesContent = azureDevOpsPlugin.provide( createRoutableExtension({ - name: 'EntityAzureDevOpsContent', + name: 'EntityAzurePipelinesContent', component: () => import('./components/Router').then(m => m.Router), mountPoint: azureDevOpsRouteRef, }), From 0b0876b0da3e5a97e9d9ca6e2e17d0f815251e39 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 10:06:05 -0500 Subject: [PATCH 30/50] Another set of feedback improvements Signed-off-by: Andre Wanlin --- app-config.yaml | 3 +- packages/backend/src/index.ts | 2 +- .../{azuredevops.ts => azure-devops.ts} | 0 plugins/azure-devops/README.md | 39 ++++++++++--------- plugins/azure-devops/config.d.ts | 12 +++--- .../src/components/BuildTable/BuildTable.tsx | 9 ++++- .../src/hooks/useProjectRepoFromEntity.ts | 19 +++++++++ .../azure-devops/src/hooks/useRepoBuilds.ts | 3 +- 8 files changed, 58 insertions(+), 29 deletions(-) rename packages/backend/src/plugins/{azuredevops.ts => azure-devops.ts} (100%) diff --git a/app-config.yaml b/app-config.yaml index b92595df7b..645221538b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -436,4 +436,5 @@ azureDevOps: host: dev.azure.com token: my-token organization: my-company - top: 25 + azurePipelines: + top: 25 diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index f25ec5a14e..b6c148dfba 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -38,7 +38,7 @@ import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; import { metricsInit, metricsHandler } from './metrics'; import auth from './plugins/auth'; -import azureDevOps from './plugins/azuredevops'; +import azureDevOps from './plugins/azure-devops'; import catalog from './plugins/catalog'; import codeCoverage from './plugins/codecoverage'; import kubernetes from './plugins/kubernetes'; diff --git a/packages/backend/src/plugins/azuredevops.ts b/packages/backend/src/plugins/azure-devops.ts similarity index 100% rename from packages/backend/src/plugins/azuredevops.ts rename to packages/backend/src/plugins/azure-devops.ts diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 55d5ea5f91..d2ab1b6c6f 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -17,7 +17,8 @@ azureDevOps: host: dev.azure.com token: ${AZURE_TOKEN} organization: my-company - top: 50 + azurePipelines: + top: 50 ``` Configuration Details: @@ -25,7 +26,7 @@ Configuration Details: - `host` and `token` can be the same as the ones used for the `integration` section - `AZURE_TOKEN` environment variable must be set to a [Personal Access Token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page) with read access to both Code and Build - `organization` is your Azure DevOps Organization name or for Azure DevOps Server (on-premise) this will be your Collection name -- `top` is strictly used by the frontend to limit the number of items returned, currently only used for Builds +- `top` is strictly used by the frontend to limit the number of items returned, if not provided it defaults to 10. Currently only used for Builds ### Backend @@ -39,7 +40,7 @@ Here's how to get the backend up and running: yarn add @backstage/plugin-azure-devops-backend ``` -2. Then we will create a new file named `packages/backend/src/plugins/azuredevops.ts`, and add the +2. Then we will create a new file named `packages/backend/src/plugins/azure-devops.ts`, and add the following to it: ```ts @@ -83,23 +84,23 @@ To get the frontend working you'll need to do the following two steps: 2. Second we need to add the `EntityAzurePipelinesContent` extension to the entity page in your app: -```tsx -// In packages/app/src/components/catalog/EntityPage.tsx -import { - EntityAzurePipelinesContent, - isAzureDevOpsAvailable, -} from '@backstage/plugin-azure-devops'; + ```tsx + // In packages/app/src/components/catalog/EntityPage.tsx + import { + EntityAzurePipelinesContent, + isAzureDevOpsAvailable, + } from '@backstage/plugin-azure-devops'; -// For example in the CI/CD section -const cicdContent = ( - - // ... - - - - // ... - -``` + // For example in the CI/CD section + const cicdContent = ( + + // ... + + + + // ... + + ``` ### Entity Annotation diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts index 62b1488e49..bbd42c55a1 100644 --- a/plugins/azure-devops/config.d.ts +++ b/plugins/azure-devops/config.d.ts @@ -17,10 +17,12 @@ export interface Config { /** Configuration options for the azure-devops-backend plugin */ azureDevOps: { - /** - * The max number of items to return - applies to builds - * @visibility frontend - */ - top: number; + azurePipelines: { + /** + * The max number of items to return - applies to builds + * @visibility frontend + */ + top: number; + }; }; } diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index 7c3e09c66c..b3d239d914 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -56,11 +56,12 @@ const columns: TableColumn[] = [ title: 'ID', field: 'id', highlight: false, - width: '100px', + width: 'auto', }, { title: 'Build', field: 'title', + width: 'auto', render: (row: Partial) => ( {row.title} @@ -70,10 +71,12 @@ const columns: TableColumn[] = [ { title: 'Source', field: 'source', + width: 'auto', }, { title: 'Status', field: 'status', + width: 'auto', render: (row: Partial) => ( @@ -86,6 +89,7 @@ const columns: TableColumn[] = [ { title: 'Result', field: 'result', + width: 'auto', render: (row: Partial) => ( {getBuildResultComponent(row.result)} @@ -97,8 +101,9 @@ const columns: TableColumn[] = [ ), }, { - title: 'Date', + title: 'Age', field: 'queueTime', + width: 'auto', render: (row: Partial) => DateTime.fromISO( row.queueTime ? row.queueTime.toString() : new Date().toString(), diff --git a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts index dfbee81d62..418badc630 100644 --- a/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts +++ b/plugins/azure-devops/src/hooks/useProjectRepoFromEntity.ts @@ -24,5 +24,24 @@ export function useProjectRepoFromEntity(entity: Entity): { const [project, repo] = ( entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION] ?? '' ).split('/'); + + if (!project && !repo) { + throw new Error( + 'Value for annotation dev.azure.com/project-repo was not in the correct format: /', + ); + } + + if (!project) { + throw new Error( + 'Project Name for annotation dev.azure.com/project-repo was not found; expected format is: /', + ); + } + + if (!repo) { + throw new Error( + 'Repo Name for annotation dev.azure.com/project-repo was not found; expected format is: /', + ); + } + return { project, repo }; } diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index 1e68490ea6..0bae4b334b 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -29,7 +29,8 @@ export function useRepoBuilds(entity: Entity): { } { const config = useApi(configApiRef); const top = - config.getOptionalNumber('azureDevOps.top') ?? AZURE_DEVOPS_DEFAULT_TOP; + config.getOptionalNumber('azureDevOps.azurePipelines.top') ?? + AZURE_DEVOPS_DEFAULT_TOP; const api = useApi(azureDevOpsApiRef); const { project, repo } = useProjectRepoFromEntity(entity); const { value, loading, error } = useAsync(() => { From e290590517a7141102b4e7a4f325ceb7d871ef59 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 11:11:10 -0500 Subject: [PATCH 31/50] Applied suggested async and await changes Signed-off-by: Andre Wanlin --- packages/backend/src/plugins/azure-devops.ts | 4 ++-- plugins/azure-devops/README.md | 4 ++-- plugins/azure-devops/src/api/AzureDevOpsClient.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/backend/src/plugins/azure-devops.ts b/packages/backend/src/plugins/azure-devops.ts index e11a21ba2e..4120e655ed 100644 --- a/packages/backend/src/plugins/azure-devops.ts +++ b/packages/backend/src/plugins/azure-devops.ts @@ -18,9 +18,9 @@ import { createRouter } from '@backstage/plugin-azure-devops-backend'; import { Router } from 'express'; import type { PluginEnvironment } from '../types'; -export default async function createPlugin({ +export default function createPlugin({ logger, config, }: PluginEnvironment): Promise { - return await createRouter({ logger, config }); + return createRouter({ logger, config }); } diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index d2ab1b6c6f..8b25800bb7 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -48,11 +48,11 @@ Here's how to get the backend up and running: import { Router } from 'express'; import type { PluginEnvironment } from '../types'; - export default async function createPlugin({ + export default function createPlugin({ logger, config, }: PluginEnvironment): Promise { - return await createRouter({ logger, config }); + return createRouter({ logger, config }); } ``` diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index d82dfbe09e..02cac3b9de 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -31,12 +31,12 @@ export class AzureDevOpsClient implements AzureDevOpsApi { this.identityApi = options.identityApi; } - async getRepoBuilds( + getRepoBuilds( projectName: string, repoName: string, top: number, ): Promise { - return await this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); + return this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); } private async get(path: string): Promise { @@ -53,6 +53,6 @@ export class AzureDevOpsClient implements AzureDevOpsApi { throw new AzureDevOpsClientError(response, payload); } - return await response.json(); + return response.json() as Promise; } } From 652d1ad5108dea61fe59a6acac69f8b606e30c4a Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Fri, 8 Oct 2021 14:03:16 -0500 Subject: [PATCH 32/50] Combined the Status and Result columns into a single State Signed-off-by: Andre Wanlin --- .../src/components/BuildTable/BuildTable.tsx | 100 +++++++++++++----- 1 file changed, 72 insertions(+), 28 deletions(-) diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index b3d239d914..a6cfb9bf81 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -23,6 +23,8 @@ import { StatusOK, StatusWarning, StatusAborted, + StatusRunning, + StatusPending, } from '@backstage/core-components'; import { Link, Box, Typography } from '@material-ui/core'; import Alert from '@material-ui/lab/Alert'; @@ -32,22 +34,80 @@ import { BuildStatus, } from 'azure-devops-node-api/interfaces/BuildInterfaces'; -const getBuildResultComponent = ( - result: number | undefined = BuildResult.None, -) => { +const getBuildResultComponent = (result: number | undefined) => { switch (result) { - case BuildResult.None: - return ; case BuildResult.Succeeded: - return ; + return ( + + Succeeded{' '} + + ); case BuildResult.PartiallySucceeded: - return ; + return ( + + Partially Succeeded{' '} + + ); case BuildResult.Failed: - return ; + return ( + + Failed{' '} + + ); case BuildResult.Canceled: - return ; + return ( + + Canceled{' '} + + ); + case BuildResult.None: default: - return ; + return ( + + Unknown + + ); + } +}; + +const getBuildStateComponent = ( + status: number | undefined, + result: number | undefined, +) => { + switch (status) { + case BuildStatus.InProgress: + return ( + + In Progress + + ); + case BuildStatus.Completed: + return getBuildResultComponent(result); + case BuildStatus.Cancelling: + return ( + + Cancelling + + ); + case BuildStatus.Postponed: + return ( + + Postponed + + ); + case BuildStatus.NotStarted: + return ( + + Not Started + + ); + case BuildStatus.None: + default: + return ( + + Unknown + + ); } }; @@ -74,28 +134,12 @@ const columns: TableColumn[] = [ width: 'auto', }, { - title: 'Status', - field: 'status', + title: 'State', width: 'auto', render: (row: Partial) => ( - - {BuildStatus[row.status || BuildStatus.None]} - - - ), - }, - { - title: 'Result', - field: 'result', - width: 'auto', - render: (row: Partial) => ( - - {getBuildResultComponent(row.result)} - - - {BuildResult[row.result || BuildResult.None]} + {getBuildStateComponent(row.status, row.result)} ), From 148d9d22c825ea8f841cfee9013f2969d75bdf7f Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Mon, 11 Oct 2021 16:48:10 -0500 Subject: [PATCH 33/50] More improvements Signed-off-by: Andre Wanlin --- plugins/azure-devops/README.md | 2 +- plugins/azure-devops/api-report.md | 4 +--- plugins/azure-devops/package.json | 6 +++-- .../azure-devops/src/api/AzureDevOpsApi.ts | 6 ++--- .../azure-devops/src/api/AzureDevOpsClient.ts | 19 ++++++++-------- .../src/api/AzureDevOpsClientError.ts | 21 ------------------ plugins/azure-devops/src/api/types.ts | 4 ++++ .../src/components/BuildTable/BuildTable.tsx | 22 ++++++++----------- .../EntityPageAzurePipelines.tsx | 8 +------ .../azure-devops/src/components/Router.tsx | 7 +----- .../azure-devops/src/hooks/useRepoBuilds.ts | 9 +++++--- 11 files changed, 40 insertions(+), 68 deletions(-) delete mode 100644 plugins/azure-devops/src/api/AzureDevOpsClientError.ts diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 8b25800bb7..03be6dfba2 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -32,7 +32,7 @@ Configuration Details: Here's how to get the backend up and running: -1. First we need to add the @backstage/plugin-azure-devops-backend package to your backend: +1. First we need to add the `@backstage/plugin-azure-devops-backend` package to your backend: ```sh # From the Backstage root directory diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index bc39fd0ce4..000702268e 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -22,9 +22,7 @@ export const azureDevOpsPlugin: BackstagePlugin< // Warning: (ae-missing-release-tag) "EntityAzurePipelinesContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const EntityAzurePipelinesContent: (_props: { - entity?: Entity | undefined; -}) => JSX.Element; +export const EntityAzurePipelinesContent: () => JSX.Element; // Warning: (ae-missing-release-tag) "isAzureDevOpsAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 16008090b7..b6f7801766 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -4,6 +4,7 @@ "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", + "private": false, "publishConfig": { "access": "public", "main": "dist/index.esm.js", @@ -29,6 +30,7 @@ "@backstage/catalog-model": "^0.9.3", "@backstage/core-components": "^0.6.1", "@backstage/core-plugin-api": "^0.1.10", + "@backstage/errors": "^0.1.2", "@backstage/plugin-catalog-react": "^0.5.1", "@backstage/theme": "^0.2.10", "@material-ui/core": "^4.12.2", @@ -51,8 +53,8 @@ "@testing-library/user-event": "^13.1.8", "@types/jest": "^26.0.7", "@types/node": "^14.14.32", - "msw": "^0.29.0", - "cross-fetch": "^3.0.6" + "cross-fetch": "^3.0.6", + "msw": "^0.29.0" }, "files": [ "dist", diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts index 424999441d..f0bad53b43 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RepoBuild } from './types'; +import { RepoBuild, RepoBuildOptions } from './types'; import { createApiRef } from '@backstage/core-plugin-api'; export const azureDevOpsApiRef = createApiRef({ @@ -27,6 +27,6 @@ export interface AzureDevOpsApi { getRepoBuilds( projectName: string, repoName: string, - top: number, - ): Promise; + options?: RepoBuildOptions, + ): Promise<{ items: RepoBuild[] }>; } diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index 02cac3b9de..f0ed2d9951 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -15,9 +15,9 @@ */ import { AzureDevOpsApi } from './AzureDevOpsApi'; -import { RepoBuild } from './types'; +import { RepoBuild, RepoBuildOptions } from './types'; import { DiscoveryApi, IdentityApi } from '@backstage/core-plugin-api'; -import { AzureDevOpsClientError } from './AzureDevOpsClientError'; +import { ResponseError } from '@backstage/errors'; export class AzureDevOpsClient implements AzureDevOpsApi { private readonly discoveryApi: DiscoveryApi; @@ -34,12 +34,14 @@ export class AzureDevOpsClient implements AzureDevOpsApi { getRepoBuilds( projectName: string, repoName: string, - top: number, - ): Promise { - return this.get(`repo-builds/${projectName}/${repoName}?top=${top}`); + options?: RepoBuildOptions, + ): Promise<{ items: RepoBuild[] }> { + return this.get( + `repo-builds/${projectName}/${repoName}?top=${options?.top}`, + ); } - private async get(path: string): Promise { + private async get(path: string): Promise<{ items: any }> { const baseUrl = `${await this.discoveryApi.getBaseUrl('azure-devops')}/`; const url = new URL(path, baseUrl); @@ -49,10 +51,9 @@ export class AzureDevOpsClient implements AzureDevOpsApi { }); if (!response.ok) { - const payload = await response.text(); - throw new AzureDevOpsClientError(response, payload); + throw await ResponseError.fromResponse(response); } - return response.json() as Promise; + return response.json() as Promise<{ items: any }>; } } diff --git a/plugins/azure-devops/src/api/AzureDevOpsClientError.ts b/plugins/azure-devops/src/api/AzureDevOpsClientError.ts deleted file mode 100644 index f9a2f37b41..0000000000 --- a/plugins/azure-devops/src/api/AzureDevOpsClientError.ts +++ /dev/null @@ -1,21 +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 class AzureDevOpsClientError extends Error { - public constructor({ status, statusText }: Response, payload: string) { - super(`Request failed with ${status} ${statusText}, ${payload}`); - } -} diff --git a/plugins/azure-devops/src/api/types.ts b/plugins/azure-devops/src/api/types.ts index b3562f76c6..1fbc34231e 100644 --- a/plugins/azure-devops/src/api/types.ts +++ b/plugins/azure-devops/src/api/types.ts @@ -28,3 +28,7 @@ export type RepoBuild = { queueTime?: Date; source: string; }; + +export type RepoBuildOptions = { + top?: number; +}; diff --git a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx index a6cfb9bf81..bead424ffb 100644 --- a/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx +++ b/plugins/azure-devops/src/components/BuildTable/BuildTable.tsx @@ -17,6 +17,7 @@ import React from 'react'; import { DateTime } from 'luxon'; import { + Link, Table, TableColumn, StatusError, @@ -25,9 +26,9 @@ import { StatusAborted, StatusRunning, StatusPending, + ResponseErrorPanel, } from '@backstage/core-components'; -import { Link, Box, Typography } from '@material-ui/core'; -import Alert from '@material-ui/lab/Alert'; +import { Box, Typography } from '@material-ui/core'; import { RepoBuild } from '../../api/types'; import { BuildResult, @@ -39,25 +40,25 @@ const getBuildResultComponent = (result: number | undefined) => { case BuildResult.Succeeded: return ( - Succeeded{' '} + Succeeded ); case BuildResult.PartiallySucceeded: return ( - Partially Succeeded{' '} + Partially Succeeded ); case BuildResult.Failed: return ( - Failed{' '} + Failed ); case BuildResult.Canceled: return ( - Canceled{' '} + Canceled ); case BuildResult.None: @@ -123,9 +124,7 @@ const columns: TableColumn[] = [ field: 'title', width: 'auto', render: (row: Partial) => ( - - {row.title} - + {row.title} ), }, { @@ -165,10 +164,7 @@ export const BuildTable = ({ items, loading, error }: Props) => { if (error) { return (
- - Error encountered while fetching Azure DevOps builds.{' '} - {error.toString()} - +
); } diff --git a/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx index 5d53df928c..34c8bc4fd1 100644 --- a/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx +++ b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx @@ -14,18 +14,12 @@ * limitations under the License. */ -import { Entity } from '@backstage/catalog-model'; import { useEntity } from '@backstage/plugin-catalog-react'; import React from 'react'; import { useRepoBuilds } from '../../hooks/useRepoBuilds'; import { BuildTable } from '../BuildTable/BuildTable'; -type Props = { - /** @deprecated The entity is now grabbed from context instead */ - entity?: Entity; -}; - -export const EntityPageAzurePipelines = (_props: Props) => { +export const EntityPageAzurePipelines = () => { const { entity } = useEntity(); const { items, loading, error } = useRepoBuilds(entity); diff --git a/plugins/azure-devops/src/components/Router.tsx b/plugins/azure-devops/src/components/Router.tsx index 81b6d89a25..ce8dd3b51d 100644 --- a/plugins/azure-devops/src/components/Router.tsx +++ b/plugins/azure-devops/src/components/Router.tsx @@ -25,12 +25,7 @@ import { MissingAnnotationEmptyState } from '@backstage/core-components'; export const isAzureDevOpsAvailable = (entity: Entity) => Boolean(entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION]); -type Props = { - /** @deprecated The entity is now grabbed from context instead */ - entity?: Entity; -}; - -export const Router = (_props: Props) => { +export const Router = () => { const { entity } = useEntity(); if (!isAzureDevOpsAvailable(entity)) { diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index 0bae4b334b..8dafccb4a2 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -18,7 +18,7 @@ import { useAsync } from 'react-use'; import { Entity } from '@backstage/catalog-model'; import { useApi, configApiRef } from '@backstage/core-plugin-api'; import { azureDevOpsApiRef } from '../api'; -import { RepoBuild } from '../api/types'; +import { RepoBuild, RepoBuildOptions } from '../api/types'; import { useProjectRepoFromEntity } from './useProjectRepoFromEntity'; import { AZURE_DEVOPS_DEFAULT_TOP } from '../constants'; @@ -31,14 +31,17 @@ export function useRepoBuilds(entity: Entity): { const top = config.getOptionalNumber('azureDevOps.azurePipelines.top') ?? AZURE_DEVOPS_DEFAULT_TOP; + const options: RepoBuildOptions = { + top: top, + }; const api = useApi(azureDevOpsApiRef); const { project, repo } = useProjectRepoFromEntity(entity); const { value, loading, error } = useAsync(() => { - return api.getRepoBuilds(project, repo, top); + return api.getRepoBuilds(project, repo, options); }, [api, project, repo, entity]); return { - items: value as RepoBuild[], + items: value?.items as RepoBuild[], loading, error, }; From a982e166c581c8b9038748bb96d28d22ae2b099a Mon Sep 17 00:00:00 2001 From: Morgan Martinet Date: Fri, 1 Oct 2021 00:37:18 -0400 Subject: [PATCH 34/50] Enable customization of services used by the kubernetes backend plugin Signed-off-by: Morgan Martinet --- .changeset/young-peas-unite.md | 25 ++ docs/features/kubernetes/installation.md | 8 +- packages/backend/src/plugins/kubernetes.ts | 8 +- plugins/kubernetes-backend/api-report.md | 149 +++++++++- plugins/kubernetes-backend/src/index.ts | 1 + ...uter.test.ts => KubernetesBuilder.test.ts} | 122 ++++++++- .../src/service/KubernetesBuilder.ts | 254 ++++++++++++++++++ .../src/service/KubernetesFanOutHandler.ts | 25 +- .../kubernetes-backend/src/service/router.ts | 153 ++--------- plugins/kubernetes-backend/src/types/types.ts | 43 +++ 10 files changed, 618 insertions(+), 170 deletions(-) create mode 100644 .changeset/young-peas-unite.md rename plugins/kubernetes-backend/src/service/{router.test.ts => KubernetesBuilder.test.ts} (54%) create mode 100644 plugins/kubernetes-backend/src/service/KubernetesBuilder.ts diff --git a/.changeset/young-peas-unite.md b/.changeset/young-peas-unite.md new file mode 100644 index 0000000000..4f22742b24 --- /dev/null +++ b/.changeset/young-peas-unite.md @@ -0,0 +1,25 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +--- + +Enable customization of services used by the kubernetes backend plugin + +The createRouter function has been deprecated in favor of a KubernetesBuilder object. +Here's how you should upgrade your projects when configuring the Kubernetes backend plugin. +in your `packages/backend/src/plugins/kubernetes.ts` file for instance: + +```typescript +import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend'; +import { PluginEnvironment } from '../types'; + +export default async function createPlugin({ + logger, + config, +}: PluginEnvironment) { + const { router } = await KubernetesBuilder.createBuilder({ + logger, + config, + }).build(); + return router; +} +``` diff --git a/docs/features/kubernetes/installation.md b/docs/features/kubernetes/installation.md index 36bb724be6..2e0d9dccb9 100644 --- a/docs/features/kubernetes/installation.md +++ b/docs/features/kubernetes/installation.md @@ -59,14 +59,18 @@ add the following: ```typescript // In packages/backend/src/plugins/kubernetes.ts -import { createRouter } from '@backstage/plugin-kubernetes-backend'; +import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend'; import { PluginEnvironment } from '../types'; export default async function createPlugin({ logger, config, }: PluginEnvironment) { - return await createRouter({ logger, config }); + const { router } = await KubernetesBuilder.createBuilder({ + logger, + config, + }).build(); + return router; } ``` diff --git a/packages/backend/src/plugins/kubernetes.ts b/packages/backend/src/plugins/kubernetes.ts index a19520312f..6d40d89b66 100644 --- a/packages/backend/src/plugins/kubernetes.ts +++ b/packages/backend/src/plugins/kubernetes.ts @@ -14,12 +14,16 @@ * limitations under the License. */ -import { createRouter } from '@backstage/plugin-kubernetes-backend'; +import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend'; import { PluginEnvironment } from '../types'; export default async function createPlugin({ logger, config, }: PluginEnvironment) { - return await createRouter({ logger, config }); + const { router } = await KubernetesBuilder.createBuilder({ + logger, + config, + }).build(); + return router; } diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index 3d52c4ff43..e6fb2d5cce 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -3,13 +3,13 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { ClusterObjects } from '@backstage/plugin-kubernetes-common'; import { Config } from '@backstage/config'; import express from 'express'; import type { FetchResponse } from '@backstage/plugin-kubernetes-common'; import type { KubernetesFetchError } from '@backstage/plugin-kubernetes-common'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; +import type { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; import { Logger as Logger_2 } from 'winston'; +import type { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; // Warning: (ae-missing-release-tag) "AWSClusterDetails" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -40,7 +40,7 @@ export interface ClusterDetails { // 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) +// @public @deprecated export function createRouter(options: RouterOptions): Promise; // Warning: (ae-missing-release-tag) "CustomResource" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -71,6 +71,71 @@ export interface FetchResponseWrapper { // @public (undocumented) export interface GKEClusterDetails extends ClusterDetails {} +// Warning: (ae-missing-release-tag) "KubernetesBuilder" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class KubernetesBuilder { + constructor(env: KubernetesEnvironment); + // (undocumented) + build(): Promise<{ + clusterDetails: ClusterDetails[]; + clusterSupplier: KubernetesClustersSupplier; + customResources: CustomResource[]; + fetcher: KubernetesFetcher; + objectsProvider: KubernetesObjectsProvider; + router: express.Router; + serviceLocator: KubernetesServiceLocator; + }>; + // (undocumented) + protected buildClusterSupplier(): KubernetesClustersSupplier; + // (undocumented) + protected buildCustomResources(): CustomResource[]; + // (undocumented) + protected buildFetcher(): KubernetesFetcher; + // (undocumented) + protected buildHttpServiceLocator( + _clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + // (undocumented) + protected buildMultiTenantServiceLocator( + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + // (undocumented) + protected buildObjectsProvider( + options: KubernetesObjectsProviderOptions, + ): KubernetesObjectsProvider; + // (undocumented) + protected buildRouter( + objectsProvider: KubernetesObjectsProvider, + clusterDetails: ClusterDetails[], + ): express.Router; + // (undocumented) + protected buildServiceLocator( + method: ServiceLocatorMethod, + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + // (undocumented) + static createBuilder(env: KubernetesEnvironment): KubernetesBuilder; + // (undocumented) + protected readonly env: KubernetesEnvironment; + // (undocumented) + protected fetchClusterDetails( + clusterSupplier: KubernetesClustersSupplier, + ): Promise; + // (undocumented) + protected getObjectTypesToFetch(): ObjectToFetch[] | undefined; + // (undocumented) + protected getServiceLocatorMethod(): ServiceLocatorMethod; + // (undocumented) + setClusterSupplier(clusterSupplier?: KubernetesClustersSupplier): this; + // (undocumented) + setFetcher(fetcher?: KubernetesFetcher): this; + // (undocumented) + setObjectsProvider(objectsProvider?: KubernetesObjectsProvider): this; + // (undocumented) + setServiceLocator(serviceLocator?: KubernetesServiceLocator): this; +} + // Warning: (ae-missing-release-tag) "KubernetesClustersSupplier" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -79,6 +144,43 @@ export interface KubernetesClustersSupplier { getClusters(): Promise; } +// Warning: (ae-missing-release-tag) "KubernetesEnvironment" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface KubernetesEnvironment { + // (undocumented) + config: Config; + // (undocumented) + logger: Logger_2; +} + +// Warning: (ae-missing-release-tag) "KubernetesFactory" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface KubernetesFactory { + // (undocumented) + createHttpServiceLocator( + _clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + // (undocumented) + createKubernetesClustersSupplier(config: Config): KubernetesClustersSupplier; + // (undocumented) + createKubernetesFetcher(logger: Logger_2): KubernetesFetcher; + // (undocumented) + createKubernetesObjectsProvider( + options: KubernetesObjectsProviderOptions, + ): KubernetesObjectsProvider; + // (undocumented) + createMultiTenantServiceLocator( + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + // (undocumented) + createServiceLocator( + method: ServiceLocatorMethod, + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; +} + // Warning: (ae-missing-release-tag) "KubernetesFetcher" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -89,6 +191,32 @@ export interface KubernetesFetcher { ): Promise; } +// Warning: (ae-missing-release-tag) "KubernetesObjectsProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface KubernetesObjectsProvider { + // (undocumented) + getKubernetesObjectsByEntity( + request: ObjectsByEntityRequest, + ): Promise; +} + +// Warning: (ae-missing-release-tag) "KubernetesObjectsProviderOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface KubernetesObjectsProviderOptions { + // (undocumented) + customResources: CustomResource[]; + // (undocumented) + fetcher: KubernetesFetcher; + // (undocumented) + logger: Logger_2; + // (undocumented) + objectTypesToFetch?: ObjectToFetch[]; + // (undocumented) + serviceLocator: KubernetesServiceLocator; +} + // Warning: (ae-missing-release-tag) "KubernetesObjectTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -110,16 +238,6 @@ export interface KubernetesServiceLocator { getClustersByServiceId(serviceId: string): Promise; } -// Warning: (ae-forgotten-export) The symbol "KubernetesFanOutHandler" needs to be exported by the entry point index.d.ts -// Warning: (ae-missing-release-tag) "makeRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export const makeRouter: ( - logger: Logger_2, - kubernetesFanOutHandler: KubernetesFanOutHandler, - clusterDetails: ClusterDetails[], -) => express.Router; - // Warning: (ae-missing-release-tag) "ObjectFetchParams" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -140,6 +258,11 @@ export interface ObjectFetchParams { serviceId: string; } +// Warning: (ae-missing-release-tag) "ObjectsByEntityRequest" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ObjectsByEntityRequest = KubernetesRequestBody; + // Warning: (ae-missing-release-tag) "ObjectToFetch" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/plugins/kubernetes-backend/src/index.ts b/plugins/kubernetes-backend/src/index.ts index 29818f805c..ac514db104 100644 --- a/plugins/kubernetes-backend/src/index.ts +++ b/plugins/kubernetes-backend/src/index.ts @@ -21,6 +21,7 @@ */ export * from './service/router'; +export * from './service/KubernetesBuilder'; export * from './types/types'; export { DEFAULT_OBJECTS } from './service/KubernetesFanOutHandler'; diff --git a/plugins/kubernetes-backend/src/service/router.test.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts similarity index 54% rename from plugins/kubernetes-backend/src/service/router.test.ts rename to plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts index c70ae44406..1b90e65fd7 100644 --- a/plugins/kubernetes-backend/src/service/router.test.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.test.ts @@ -14,22 +14,32 @@ * limitations under the License. */ -import { getVoidLogger } from '@backstage/backend-common'; +import { Config } from '@backstage/config'; +import { getVoidLogger, loadBackendConfig } from '@backstage/backend-common'; import express from 'express'; import request from 'supertest'; -import { makeRouter } from './router'; import { KubernetesFanOutHandler } from './KubernetesFanOutHandler'; +import { + ClusterDetails, + FetchResponseWrapper, + KubernetesClustersSupplier, + KubernetesFetcher, + KubernetesServiceLocator, + ObjectFetchParams, +} from '../types/types'; +import { ObjectsByEntityResponse } from '@backstage/plugin-kubernetes-common'; +import { KubernetesBuilder } from './KubernetesBuilder'; -describe('router', () => { +describe('KubernetesBuilder', () => { let app: express.Express; let kubernetesFanOutHandler: jest.Mocked; + let config: Config; beforeAll(async () => { - kubernetesFanOutHandler = { - getKubernetesObjectsByEntity: jest.fn(), - } as any; + const logger = getVoidLogger(); + config = await loadBackendConfig({ logger, argv: [] }); - const router = makeRouter(getVoidLogger(), kubernetesFanOutHandler, [ + const clusters: ClusterDetails[] = [ { name: 'some-cluster', authProvider: 'serviceAccount', @@ -41,7 +51,22 @@ describe('router', () => { url: 'https://localhost:1235', authProvider: 'google', }, - ]); + ]; + const clusterSupplier: KubernetesClustersSupplier = { + async getClusters() { + return clusters; + }, + }; + + kubernetesFanOutHandler = { + getKubernetesObjectsByEntity: jest.fn(), + } as any; + + const { router } = await KubernetesBuilder.createBuilder({ config, logger }) + .setObjectsProvider(kubernetesFanOutHandler) + .setClusterSupplier(clusterSupplier) + .build(); + app = express().use(router); }); @@ -130,5 +155,86 @@ describe('router', () => { expect(response.status).toEqual(500); expect(response.body).toEqual({ error: 'some internal error' }); }); + + it('custom service locator', async () => { + const logger = getVoidLogger(); + const someCluster: ClusterDetails = { + name: 'some-cluster', + authProvider: 'serviceAccount', + url: 'https://localhost:1234', + serviceAccountToken: 'someToken', + }; + const clusters: ClusterDetails[] = [ + someCluster, + { + name: 'some-other-cluster', + url: 'https://localhost:1235', + authProvider: 'google', + }, + ]; + const clusterSupplier: KubernetesClustersSupplier = { + async getClusters() { + return clusters; + }, + }; + const pod = { + metadata: { + name: 'pod1', + }, + }; + const result: ObjectsByEntityResponse = { + items: [ + { + cluster: { + name: someCluster.name, + }, + errors: [], + resources: [ + { + type: 'pods', + resources: [pod], + }, + ], + }, + ], + }; + + const serviceLocator: KubernetesServiceLocator = { + getClustersByServiceId(_serviceId: string): Promise { + return Promise.resolve([someCluster]); + }, + }; + + const fetcher: KubernetesFetcher = { + fetchObjectsForService( + _params: ObjectFetchParams, + ): Promise { + return Promise.resolve({ + errors: [], + responses: [ + { + type: 'pods', + resources: [pod], + }, + ], + }); + }, + }; + + const { router } = await KubernetesBuilder.createBuilder({ + logger, + config, + }) + .setClusterSupplier(clusterSupplier) + .setServiceLocator(serviceLocator) + .setFetcher(fetcher) + .build(); + app = express().use(router); + + const response = await request(app).post('/services/test-service'); + + expect(response.body).toEqual(result); + expect(response.status).toEqual(200); + }); }); }); diff --git a/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts new file mode 100644 index 0000000000..bde538bf55 --- /dev/null +++ b/plugins/kubernetes-backend/src/service/KubernetesBuilder.ts @@ -0,0 +1,254 @@ +/* + * 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 { Config } from '@backstage/config'; +import express from 'express'; +import Router from 'express-promise-router'; +import { Logger } from 'winston'; +import { getCombinedClusterDetails } from '../cluster-locator'; +import { MultiTenantServiceLocator } from '../service-locator/MultiTenantServiceLocator'; +import { + ClusterDetails, + KubernetesObjectTypes, + ServiceLocatorMethod, + CustomResource, + KubernetesObjectsProvider, + ObjectsByEntityRequest, + KubernetesClustersSupplier, + KubernetesFetcher, + KubernetesServiceLocator, + KubernetesObjectsProviderOptions, +} from '../types/types'; +import { KubernetesClientProvider } from './KubernetesClientProvider'; +import { + DEFAULT_OBJECTS, + KubernetesFanOutHandler, +} from './KubernetesFanOutHandler'; +import { KubernetesClientBasedFetcher } from './KubernetesFetcher'; + +export interface KubernetesEnvironment { + logger: Logger; + config: Config; +} + +export class KubernetesBuilder { + private clusterSupplier?: KubernetesClustersSupplier; + private objectsProvider?: KubernetesObjectsProvider; + private fetcher?: KubernetesFetcher; + private serviceLocator?: KubernetesServiceLocator; + + static createBuilder(env: KubernetesEnvironment) { + return new KubernetesBuilder(env); + } + + constructor(protected readonly env: KubernetesEnvironment) {} + + public async build() { + const logger = this.env.logger; + + logger.info('Initializing Kubernetes backend'); + + const customResources = this.buildCustomResources(); + + const fetcher = this.fetcher ?? this.buildFetcher(); + + const clusterSupplier = this.clusterSupplier ?? this.buildClusterSupplier(); + + const clusterDetails = await this.fetchClusterDetails(clusterSupplier); + + const serviceLocator = + this.serviceLocator ?? + this.buildServiceLocator(this.getServiceLocatorMethod(), clusterDetails); + + const objectsProvider = + this.objectsProvider ?? + this.buildObjectsProvider({ + logger, + fetcher, + serviceLocator, + customResources, + objectTypesToFetch: this.getObjectTypesToFetch(), + }); + + const router = this.buildRouter(objectsProvider, clusterDetails); + + return { + clusterDetails, + clusterSupplier, + customResources, + fetcher, + objectsProvider, + router, + serviceLocator, + }; + } + + public setClusterSupplier(clusterSupplier?: KubernetesClustersSupplier) { + this.clusterSupplier = clusterSupplier; + return this; + } + + public setObjectsProvider(objectsProvider?: KubernetesObjectsProvider) { + this.objectsProvider = objectsProvider; + return this; + } + + public setFetcher(fetcher?: KubernetesFetcher) { + this.fetcher = fetcher; + return this; + } + + public setServiceLocator(serviceLocator?: KubernetesServiceLocator) { + this.serviceLocator = serviceLocator; + return this; + } + + protected buildCustomResources() { + const customResources: CustomResource[] = ( + this.env.config.getOptionalConfigArray('kubernetes.customResources') ?? [] + ).map( + c => + ({ + group: c.getString('group'), + apiVersion: c.getString('apiVersion'), + plural: c.getString('plural'), + } as CustomResource), + ); + + this.env.logger.info( + `action=LoadingCustomResources numOfCustomResources=${customResources.length}`, + ); + return customResources; + } + + protected buildClusterSupplier(): KubernetesClustersSupplier { + const config = this.env.config; + return { + getClusters() { + return getCombinedClusterDetails(config); + }, + }; + } + + protected buildObjectsProvider( + options: KubernetesObjectsProviderOptions, + ): KubernetesObjectsProvider { + return new KubernetesFanOutHandler(options); + } + + protected buildFetcher(): KubernetesFetcher { + return new KubernetesClientBasedFetcher({ + kubernetesClientProvider: new KubernetesClientProvider(), + logger: this.env.logger, + }); + } + + protected buildServiceLocator( + method: ServiceLocatorMethod, + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator { + switch (method) { + case 'multiTenant': + return this.buildMultiTenantServiceLocator(clusterDetails); + case 'http': + return this.buildHttpServiceLocator(clusterDetails); + default: + throw new Error( + `Unsupported kubernetes.clusterLocatorMethod "${method}"`, + ); + } + } + + protected buildMultiTenantServiceLocator( + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator { + return new MultiTenantServiceLocator(clusterDetails); + } + + protected buildHttpServiceLocator( + _clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator { + throw new Error('not implemented'); + } + + protected buildRouter( + objectsProvider: KubernetesObjectsProvider, + clusterDetails: ClusterDetails[], + ): express.Router { + const logger = this.env.logger; + const router = Router(); + router.use(express.json()); + + router.post('/services/:serviceId', async (req, res) => { + const serviceId = req.params.serviceId; + const requestBody: ObjectsByEntityRequest = req.body; + try { + const response = await objectsProvider.getKubernetesObjectsByEntity( + requestBody, + ); + res.json(response); + } catch (e) { + logger.error( + `action=retrieveObjectsByServiceId service=${serviceId}, error=${e}`, + ); + res.status(500).json({ error: e.message }); + } + }); + + router.get('/clusters', async (_, res) => { + res.json({ + items: clusterDetails.map(cd => ({ + name: cd.name, + dashboardUrl: cd.dashboardUrl, + authProvider: cd.authProvider, + })), + }); + }); + return router; + } + + protected async fetchClusterDetails( + clusterSupplier: KubernetesClustersSupplier, + ) { + const clusterDetails = await clusterSupplier.getClusters(); + + this.env.logger.info( + `action=loadClusterDetails numOfClustersLoaded=${clusterDetails.length}`, + ); + + return clusterDetails; + } + + protected getServiceLocatorMethod() { + return this.env.config.getString( + 'kubernetes.serviceLocatorMethod.type', + ) as ServiceLocatorMethod; + } + + protected getObjectTypesToFetch() { + const objectTypesToFetchStrings = this.env.config.getOptionalStringArray( + 'kubernetes.objectTypes', + ) as KubernetesObjectTypes[]; + + let objectTypesToFetch; + + if (objectTypesToFetchStrings) { + objectTypesToFetch = DEFAULT_OBJECTS.filter(obj => + objectTypesToFetchStrings.includes(obj.objectType), + ); + } + return objectTypesToFetch; + } +} diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index d520c66d7a..1f856e90a9 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -19,15 +19,17 @@ import { ClusterDetails, CustomResource, KubernetesFetcher, + KubernetesObjectsProviderOptions, KubernetesServiceLocator, + ObjectsByEntityRequest, ObjectToFetch, } from '../types/types'; -import { - ClusterObjects, - KubernetesRequestBody, -} from '@backstage/plugin-kubernetes-common'; import { KubernetesAuthTranslator } from '../kubernetes-auth-translator/types'; import { KubernetesAuthTranslatorGenerator } from '../kubernetes-auth-translator/KubernetesAuthTranslatorGenerator'; +import { + ClusterObjects, + ObjectsByEntityResponse, +} from '@backstage/plugin-kubernetes-common'; export const DEFAULT_OBJECTS: ObjectToFetch[] = [ { @@ -74,13 +76,10 @@ export const DEFAULT_OBJECTS: ObjectToFetch[] = [ }, ]; -export interface KubernetesFanOutHandlerOptions { - logger: Logger; - fetcher: KubernetesFetcher; - serviceLocator: KubernetesServiceLocator; - customResources: CustomResource[]; - objectTypesToFetch?: ObjectToFetch[]; -} +export interface KubernetesFanOutHandlerOptions + extends KubernetesObjectsProviderOptions {} + +export interface KubernetesRequestBody extends ObjectsByEntityRequest {} export class KubernetesFanOutHandler { private readonly logger: Logger; @@ -103,7 +102,9 @@ export class KubernetesFanOutHandler { this.objectTypesToFetch = new Set(objectTypesToFetch); } - async getKubernetesObjectsByEntity(requestBody: KubernetesRequestBody) { + async getKubernetesObjectsByEntity( + requestBody: KubernetesRequestBody, + ): Promise { const entityName = requestBody.entity?.metadata?.annotations?.[ 'backstage.io/kubernetes-id' diff --git a/plugins/kubernetes-backend/src/service/router.ts b/plugins/kubernetes-backend/src/service/router.ts index 3fc32dac8b..61082267be 100644 --- a/plugins/kubernetes-backend/src/service/router.ts +++ b/plugins/kubernetes-backend/src/service/router.ts @@ -15,26 +15,10 @@ */ import { Config } from '@backstage/config'; -import express from 'express'; -import Router from 'express-promise-router'; import { Logger } from 'winston'; -import { getCombinedClusterDetails } from '../cluster-locator'; -import { MultiTenantServiceLocator } from '../service-locator/MultiTenantServiceLocator'; -import { - ClusterDetails, - KubernetesClustersSupplier, - KubernetesObjectTypes, - KubernetesServiceLocator, - ServiceLocatorMethod, - CustomResource, -} from '../types/types'; -import { KubernetesRequestBody } from '@backstage/plugin-kubernetes-common'; -import { KubernetesClientProvider } from './KubernetesClientProvider'; -import { - KubernetesFanOutHandler, - DEFAULT_OBJECTS, -} from './KubernetesFanOutHandler'; -import { KubernetesClientBasedFetcher } from './KubernetesFetcher'; +import { KubernetesClustersSupplier } from '../types/types'; +import express from 'express'; +import { KubernetesBuilder } from './KubernetesBuilder'; export interface RouterOptions { logger: Logger; @@ -42,121 +26,24 @@ export interface RouterOptions { clusterSupplier?: KubernetesClustersSupplier; } -const getServiceLocator = ( - config: Config, - clusterDetails: ClusterDetails[], -): KubernetesServiceLocator => { - const serviceLocatorMethod = config.getString( - 'kubernetes.serviceLocatorMethod.type', - ) as ServiceLocatorMethod; - - switch (serviceLocatorMethod) { - case 'multiTenant': - return new MultiTenantServiceLocator(clusterDetails); - case 'http': - throw new Error('not implemented'); - default: - throw new Error( - `Unsupported kubernetes.clusterLocatorMethod "${serviceLocatorMethod}"`, - ); - } -}; - -export const makeRouter = ( - logger: Logger, - kubernetesFanOutHandler: KubernetesFanOutHandler, - clusterDetails: ClusterDetails[], -): express.Router => { - const router = Router(); - router.use(express.json()); - - router.post('/services/:serviceId', async (req, res) => { - const serviceId = req.params.serviceId; - const requestBody: KubernetesRequestBody = req.body; - try { - const response = - await kubernetesFanOutHandler.getKubernetesObjectsByEntity(requestBody); - res.json(response); - } catch (e) { - logger.error( - `action=retrieveObjectsByServiceId service=${serviceId}, error=${e}`, - ); - res.status(500).json({ error: e.message }); - } - }); - - router.get('/clusters', async (_, res) => { - res.json({ - items: clusterDetails.map(cd => ({ - name: cd.name, - dashboardUrl: cd.dashboardUrl, - authProvider: cd.authProvider, - })), - }); - }); - return router; -}; - +/** + * creates and configure a new router for handling the kubernetes backend APIs + * @param options - specifies the options required by this plugin + * @returns a new router + * @deprecated Please use the new KubernetesBuilder instead like this + * ``` + * import { KubernetesBuilder } from '@backstage/plugin-kubernetes-backend'; + * const { router } = await KubernetesBuilder.createBuilder({ + * logger, + * config, + * }).build(); + * ``` + */ export async function createRouter( options: RouterOptions, ): Promise { - const logger = options.logger; - - logger.info('Initializing Kubernetes backend'); - - const customResources: CustomResource[] = ( - options.config.getOptionalConfigArray('kubernetes.customResources') ?? [] - ).map( - c => - ({ - group: c.getString('group'), - apiVersion: c.getString('apiVersion'), - plural: c.getString('plural'), - objectType: 'customresources', - } as CustomResource), - ); - - logger.info( - `action=LoadingCustomResources numOfCustomResources=${customResources.length}`, - ); - - const fetcher = new KubernetesClientBasedFetcher({ - kubernetesClientProvider: new KubernetesClientProvider(), - logger, - }); - - let clusterDetails: ClusterDetails[]; - - if (options.clusterSupplier) { - clusterDetails = await options.clusterSupplier.getClusters(); - } else { - clusterDetails = await getCombinedClusterDetails(options.config); - } - - logger.info( - `action=loadClusterDetails numOfClustersLoaded=${clusterDetails.length}`, - ); - - const serviceLocator = getServiceLocator(options.config, clusterDetails); - const objectTypesToFetchStrings = options.config.getOptionalStringArray( - 'kubernetes.objectTypes', - ) as KubernetesObjectTypes[]; - - let objectTypesToFetch; - - if (objectTypesToFetchStrings) { - objectTypesToFetch = DEFAULT_OBJECTS.filter(obj => - objectTypesToFetchStrings.includes(obj.objectType), - ); - } - - const kubernetesFanOutHandler = new KubernetesFanOutHandler({ - logger, - fetcher, - serviceLocator, - customResources, - objectTypesToFetch, - }); - - return makeRouter(logger, kubernetesFanOutHandler, clusterDetails); + const { router } = await KubernetesBuilder.createBuilder(options) + .setClusterSupplier(options.clusterSupplier) + .build(); + return router; } diff --git a/plugins/kubernetes-backend/src/types/types.ts b/plugins/kubernetes-backend/src/types/types.ts index cff87f265a..832a6a5bd5 100644 --- a/plugins/kubernetes-backend/src/types/types.ts +++ b/plugins/kubernetes-backend/src/types/types.ts @@ -14,9 +14,13 @@ * limitations under the License. */ +import { Logger } from 'winston'; +import { Config } from '@backstage/config'; import type { FetchResponse, KubernetesFetchError, + KubernetesRequestBody, + ObjectsByEntityResponse, } from '@backstage/plugin-kubernetes-common'; export interface ObjectFetchParams { @@ -121,3 +125,42 @@ export interface AWSClusterDetails extends ClusterDetails { assumeRole?: string; externalId?: string; } + +export interface KubernetesObjectsProviderOptions { + logger: Logger; + fetcher: KubernetesFetcher; + serviceLocator: KubernetesServiceLocator; + customResources: CustomResource[]; + objectTypesToFetch?: ObjectToFetch[]; +} + +export type ObjectsByEntityRequest = KubernetesRequestBody; + +export interface KubernetesObjectsProvider { + getKubernetesObjectsByEntity( + request: ObjectsByEntityRequest, + ): Promise; +} + +export interface KubernetesFactory { + createKubernetesClustersSupplier(config: Config): KubernetesClustersSupplier; + + createKubernetesObjectsProvider( + options: KubernetesObjectsProviderOptions, + ): KubernetesObjectsProvider; + + createKubernetesFetcher(logger: Logger): KubernetesFetcher; + + createServiceLocator( + method: ServiceLocatorMethod, + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + + createMultiTenantServiceLocator( + clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; + + createHttpServiceLocator( + _clusterDetails: ClusterDetails[], + ): KubernetesServiceLocator; +} From b6ab93c4214100a29232af53f73aa8c83d3fa7ce Mon Sep 17 00:00:00 2001 From: Fanny Gaudin Date: Tue, 12 Oct 2021 09:28:13 +0200 Subject: [PATCH 35/50] change version from minor to patch Signed-off-by: Fanny Gaudin --- .changeset/new-steaks-taste.md | 5 ----- .changeset/old-fishes-drum.md | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) delete mode 100644 .changeset/new-steaks-taste.md create mode 100644 .changeset/old-fishes-drum.md diff --git a/.changeset/new-steaks-taste.md b/.changeset/new-steaks-taste.md deleted file mode 100644 index fc719cc19d..0000000000 --- a/.changeset/new-steaks-taste.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': minor ---- - -add actions prop to the ApiExplorerPage diff --git a/.changeset/old-fishes-drum.md b/.changeset/old-fishes-drum.md new file mode 100644 index 0000000000..cb6bf6c05e --- /dev/null +++ b/.changeset/old-fishes-drum.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-api-docs': patch +--- + +Add actions props to the ApiExplorerPage From 9e5005a4cf3d44ae55acf5813a91bd0b2dc8cc36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Tue, 12 Oct 2021 12:19:51 +0200 Subject: [PATCH 36/50] fix build error MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- packages/cli/src/lib/bundler/optimization.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/bundler/optimization.ts b/packages/cli/src/lib/bundler/optimization.ts index b8164d263d..254799f78c 100644 --- a/packages/cli/src/lib/bundler/optimization.ts +++ b/packages/cli/src/lib/bundler/optimization.ts @@ -26,7 +26,7 @@ export const optimization = ( return { minimize: !isDev, - // Only configure when parallel is explicitly overriden from the default + // Only configure when parallel is explicitly overridden from the default ...(!isParallelDefault(options.parallel) ? { minimizer: [ @@ -45,11 +45,15 @@ export const optimization = ( // enough, if they're smaller they end up in the main packages: { chunks: 'initial', - test: /[\\/]node_modules[\\/]/, + test(module: any) { + return Boolean( + module?.resource?.match(/[\\/]node_modules[\\/](.*?)([\\/]|$)/), + ); + }, name(module: any) { // get the name. E.g. node_modules/packageName/not/this/part.js // or node_modules/packageName - const packageName = module.context.match( + const packageName = module.resource.match( /[\\/]node_modules[\\/](.*?)([\\/]|$)/, )[1]; From 5ac5afe7cc68c0780e37ed02e867e1e689b272aa Mon Sep 17 00:00:00 2001 From: Morgan Martinet Date: Tue, 12 Oct 2021 10:11:07 -0400 Subject: [PATCH 37/50] remove unused type KubernetesFactory Signed-off-by: Morgan Martinet --- plugins/kubernetes-backend/src/types/types.ts | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/plugins/kubernetes-backend/src/types/types.ts b/plugins/kubernetes-backend/src/types/types.ts index 832a6a5bd5..30a8d2756c 100644 --- a/plugins/kubernetes-backend/src/types/types.ts +++ b/plugins/kubernetes-backend/src/types/types.ts @@ -15,7 +15,6 @@ */ import { Logger } from 'winston'; -import { Config } from '@backstage/config'; import type { FetchResponse, KubernetesFetchError, @@ -141,26 +140,3 @@ export interface KubernetesObjectsProvider { request: ObjectsByEntityRequest, ): Promise; } - -export interface KubernetesFactory { - createKubernetesClustersSupplier(config: Config): KubernetesClustersSupplier; - - createKubernetesObjectsProvider( - options: KubernetesObjectsProviderOptions, - ): KubernetesObjectsProvider; - - createKubernetesFetcher(logger: Logger): KubernetesFetcher; - - createServiceLocator( - method: ServiceLocatorMethod, - clusterDetails: ClusterDetails[], - ): KubernetesServiceLocator; - - createMultiTenantServiceLocator( - clusterDetails: ClusterDetails[], - ): KubernetesServiceLocator; - - createHttpServiceLocator( - _clusterDetails: ClusterDetails[], - ): KubernetesServiceLocator; -} From 7e4e97c23bd0aa71f663a4bc5b081cc894af572a Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Tue, 12 Oct 2021 10:47:46 -0600 Subject: [PATCH 38/50] Fix tests Signed-off-by: Tim Hansen --- .../ApiExplorerPage/ApiExplorerPage.test.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx b/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx index ac1c3d5361..d0b7523ead 100644 --- a/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx +++ b/plugins/api-docs/src/components/ApiExplorerPage/ApiExplorerPage.test.tsx @@ -53,14 +53,6 @@ describe('ApiCatalogPage', () => { }, spec: { type: 'openapi' }, }, - { - apiVersion: 'backstage.io/v1alpha1', - kind: 'API', - metadata: { - name: 'Entity2', - }, - spec: { type: 'openapi' }, - }, ] as Entity[], }), getLocationByEntity: () => @@ -120,7 +112,7 @@ describe('ApiCatalogPage', () => { }); it('should render the default column of the grid', async () => { - const { getAllByRole } = await renderWrapped(); + const { getAllByRole } = renderWrapped(); const columnHeader = getAllByRole('button').filter( c => c.tagName === 'SPAN', @@ -145,7 +137,7 @@ describe('ApiCatalogPage', () => { { title: 'Bar', field: 'entity.bar' }, { title: 'Baz', field: 'entity.spec.lifecycle' }, ]; - const { getAllByRole } = await renderWrapped( + const { getAllByRole } = renderWrapped( , ); @@ -161,7 +153,7 @@ describe('ApiCatalogPage', () => { const { findByTitle, findByText } = await renderWrapped( , ); - expect(await findByText(/Owned \(1\)/)).toBeInTheDocument(); + expect(await findByText(/All \(1\)/)).toBeInTheDocument(); expect(await findByTitle(/View/)).toBeInTheDocument(); expect(await findByTitle(/View/)).toBeInTheDocument(); expect(await findByTitle(/Edit/)).toBeInTheDocument(); @@ -191,7 +183,7 @@ describe('ApiCatalogPage', () => { const { findByTitle, findByText } = await renderWrapped( , ); - expect(await findByText(/Owned \(1\)/)).toBeInTheDocument(); + expect(await findByText(/All \(1\)/)).toBeInTheDocument(); expect(await findByTitle(/Foo Action/)).toBeInTheDocument(); expect(await findByTitle(/Bar Action/)).toBeInTheDocument(); expect((await findByTitle(/Bar Action/)).firstChild).toBeDisabled(); From 2435d7a49bdba351355e6a8e3b0d39a9088d71ed Mon Sep 17 00:00:00 2001 From: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Date: Tue, 12 Oct 2021 12:54:44 -0500 Subject: [PATCH 39/50] Move HomepageTimer and use props over config (#7533) --- .changeset/wicked-clocks-kneel.md | 37 ++++++ .changeset/witty-dolls-walk.md | 5 + packages/app/src/components/home/HomePage.tsx | 36 ++++-- packages/core-components/api-report.md | 2 +- .../layout/HomepageTimer/HomepageTimer.tsx | 4 + plugins/home/api-report.md | 17 +++ .../HeaderWorldClock.test.tsx | 88 +++++++++++++++ .../HeaderWorldClock/HeaderWorldClock.tsx | 105 ++++++++++++++++++ .../src/components/HeaderWorldClock/index.ts | 17 +++ plugins/home/src/components/index.ts | 2 + plugins/home/src/index.ts | 3 +- 11 files changed, 304 insertions(+), 12 deletions(-) create mode 100644 .changeset/wicked-clocks-kneel.md create mode 100644 .changeset/witty-dolls-walk.md create mode 100644 plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.test.tsx create mode 100644 plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.tsx create mode 100644 plugins/home/src/components/HeaderWorldClock/index.ts diff --git a/.changeset/wicked-clocks-kneel.md b/.changeset/wicked-clocks-kneel.md new file mode 100644 index 0000000000..fc2ee54440 --- /dev/null +++ b/.changeset/wicked-clocks-kneel.md @@ -0,0 +1,37 @@ +--- +'@backstage/plugin-home': patch +--- + +Added HeaderWorldClock to the Home plugin which is a copy of the HomepageTimer from core-components that has been updated to use props over static config from app-config.yaml. To use HeaderWorldClock you'll need to create an array of ClockConfig like this: + +```ts +const clockConfigs: ClockConfig[] = [ + { + label: 'NYC', + timeZone: 'America/New_York', + }, + { + label: 'UTC', + timeZone: 'UTC', + }, + { + label: 'STO', + timeZone: 'Europe/Stockholm', + }, + { + label: 'TYO', + timeZone: 'Asia/Tokyo', + }, +]; +``` + +Then you can pass `clockConfigs` into the HeaderWorldClock like this: + +```ts + +
+ +
+ ... +
+``` diff --git a/.changeset/witty-dolls-walk.md b/.changeset/witty-dolls-walk.md new file mode 100644 index 0000000000..0c6532e725 --- /dev/null +++ b/.changeset/witty-dolls-walk.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-components': patch +--- + +Deprecated HomepageTimer in favor of HeaderWorldClock which is found in the [home plugin](https://github.com/backstage/backstage/tree/master/plugins/home) diff --git a/packages/app/src/components/home/HomePage.tsx b/packages/app/src/components/home/HomePage.tsx index 33ac1a7e8c..5a19cef6f6 100644 --- a/packages/app/src/components/home/HomePage.tsx +++ b/packages/app/src/components/home/HomePage.tsx @@ -15,26 +15,42 @@ */ import { - Content, - Header, - HomepageTimer, - Page, -} from '@backstage/core-components'; -import { - ComponentAccordion, - ComponentTab, - ComponentTabs, HomePageRandomJoke, + ComponentAccordion, + ComponentTabs, + ComponentTab, WelcomeTitle, + HeaderWorldClock, + ClockConfig, } from '@backstage/plugin-home'; +import { Content, Header, Page } from '@backstage/core-components'; import { HomePageSearchBar } from '@backstage/plugin-search'; import Grid from '@material-ui/core/Grid'; import React from 'react'; +const clockConfigs: ClockConfig[] = [ + { + label: 'NYC', + timeZone: 'America/New_York', + }, + { + label: 'UTC', + timeZone: 'UTC', + }, + { + label: 'STO', + timeZone: 'Europe/Stockholm', + }, + { + label: 'TYO', + timeZone: 'Asia/Tokyo', + }, +]; + export const HomePage = () => (
} pageTitleOverride="Home"> - +
diff --git a/packages/core-components/api-report.md b/packages/core-components/api-report.md index 38fe19fc8b..dc8115287a 100644 --- a/packages/core-components/api-report.md +++ b/packages/core-components/api-report.md @@ -569,7 +569,7 @@ export function HelpIcon(props: IconComponentProps): JSX.Element; // Warning: (ae-missing-release-tag) "HomepageTimer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // -// @public (undocumented) +// @public @deprecated export function HomepageTimer(_props: {}): JSX.Element | null; // Warning: (ae-forgotten-export) The symbol "Props" needs to be exported by the entry point index.d.ts diff --git a/packages/core-components/src/layout/HomepageTimer/HomepageTimer.tsx b/packages/core-components/src/layout/HomepageTimer/HomepageTimer.tsx index a78f4af8ca..a825d52c94 100644 --- a/packages/core-components/src/layout/HomepageTimer/HomepageTimer.tsx +++ b/packages/core-components/src/layout/HomepageTimer/HomepageTimer.tsx @@ -67,6 +67,10 @@ function getTimes(configApi: ConfigApi) { return clocks; } +/** + * Please use the HeaderWorldClock in the home plugin + * @deprecated in favor of the HeaderWorldClock which is found in the to home plugin + */ export function HomepageTimer(_props: {}) { const configApi = useApi(configApiRef); diff --git a/plugins/home/api-report.md b/plugins/home/api-report.md index a1cd98124a..57b0b899e2 100644 --- a/plugins/home/api-report.md +++ b/plugins/home/api-report.md @@ -10,6 +10,14 @@ import { Extension } from '@backstage/core-plugin-api'; import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; +// Warning: (ae-missing-release-tag) "ClockConfig" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export type ClockConfig = { + label: string; + timeZone: string; +}; + // Warning: (ae-missing-release-tag) "ComponentAccordion" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -76,6 +84,15 @@ export function createCardExtension({ } & T) => JSX.Element >; +// Warning: (ae-missing-release-tag) "HeaderWorldClock" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export const HeaderWorldClock: ({ + clockConfigs, +}: { + clockConfigs: ClockConfig[]; +}) => JSX.Element | null; + // Warning: (ae-missing-release-tag) "HomepageCompositionRoot" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) diff --git a/plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.test.tsx b/plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.test.tsx new file mode 100644 index 0000000000..9dbfceac81 --- /dev/null +++ b/plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.test.tsx @@ -0,0 +1,88 @@ +/* + * 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 { renderInTestApp } from '@backstage/test-utils'; +import { HeaderWorldClock, ClockConfig } from './HeaderWorldClock'; +import React from 'react'; +import { lightTheme } from '@backstage/theme'; +import { ThemeProvider } from '@material-ui/core'; + +describe('HeaderWorldClock with valid Time Zones', () => { + it('displays Time Zones as expected', async () => { + const clockConfigs: ClockConfig[] = [ + { + label: 'NYC', + timeZone: 'America/New_York', + }, + { + label: 'UTC', + timeZone: 'UTC', + }, + { + label: 'STO', + timeZone: 'Europe/Stockholm', + }, + { + label: 'TYO', + timeZone: 'Asia/Tokyo', + }, + ]; + + const rendered = await renderInTestApp( + + + , + ); + + expect(rendered.getByText('NYC')).toBeInTheDocument(); + expect(rendered.getByText('UTC')).toBeInTheDocument(); + expect(rendered.getByText('STO')).toBeInTheDocument(); + expect(rendered.getByText('TYO')).toBeInTheDocument(); + }); +}); + +describe('HeaderWorldClock with no Time Zones provided', () => { + it('should not appear in output', async () => { + const clockConfigs: ClockConfig[] = []; + + const rendered = await renderInTestApp( + + + , + ); + + expect(rendered.container).toBeEmptyDOMElement(); + }); +}); + +describe('HeaderWorldClock with invalid Time Zone', () => { + it('uses GMT as fallback Time Zone', async () => { + const clockConfigs: ClockConfig[] = [ + { + label: 'New York', + timeZone: 'America/New_Pork', + }, + ]; + + const rendered = await renderInTestApp( + + + , + ); + + expect(rendered.getByText('GMT')).toBeInTheDocument(); + }); +}); diff --git a/plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.tsx b/plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.tsx new file mode 100644 index 0000000000..32bf305020 --- /dev/null +++ b/plugins/home/src/components/HeaderWorldClock/HeaderWorldClock.tsx @@ -0,0 +1,105 @@ +/* + * 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 React from 'react'; +import { HeaderLabel } from '@backstage/core-components'; + +const timeFormat: Intl.DateTimeFormatOptions = { + hour: '2-digit', + minute: '2-digit', +}; + +type TimeObj = { + time: string; + label: string; +}; + +export type ClockConfig = { + label: string; + timeZone: string; +}; + +function getTimes(clockConfigs: ClockConfig[]) { + const d = new Date(); + const lang = window.navigator.language; + + const clocks: TimeObj[] = []; + + if (!clockConfigs) { + return clocks; + } + + for (const clockConfig of clockConfigs) { + let label = clockConfig.label; + + const options: Intl.DateTimeFormatOptions = { + timeZone: clockConfig.timeZone, + ...timeFormat, + }; + + try { + new Date().toLocaleString(lang, options); + } catch (e) { + // eslint-disable-next-line no-console + console.warn( + `The timezone ${options.timeZone} is invalid. Defaulting to GMT`, + ); + options.timeZone = 'GMT'; + label = 'GMT'; + } + + const time = d.toLocaleTimeString(lang, options); + clocks.push({ time, label }); + } + + return clocks; +} + +export const HeaderWorldClock = ({ + clockConfigs, +}: { + clockConfigs: ClockConfig[]; +}) => { + const defaultTimes: TimeObj[] = []; + const [clocks, setTimes] = React.useState(defaultTimes); + + React.useEffect(() => { + setTimes(getTimes(clockConfigs)); + + const intervalId = setInterval(() => { + setTimes(getTimes(clockConfigs)); + }, 1000); + + return () => { + clearInterval(intervalId); + }; + }, [clockConfigs]); + + if (clocks.length !== 0) { + return ( + <> + {clocks.map(clock => ( + + ))} + + ); + } + return null; +}; diff --git a/plugins/home/src/components/HeaderWorldClock/index.ts b/plugins/home/src/components/HeaderWorldClock/index.ts new file mode 100644 index 0000000000..0893c0586c --- /dev/null +++ b/plugins/home/src/components/HeaderWorldClock/index.ts @@ -0,0 +1,17 @@ +/* + * 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. + */ +export { HeaderWorldClock } from './HeaderWorldClock'; +export type { ClockConfig } from './HeaderWorldClock'; diff --git a/plugins/home/src/components/index.ts b/plugins/home/src/components/index.ts index aae0cbe26d..1408853f5f 100644 --- a/plugins/home/src/components/index.ts +++ b/plugins/home/src/components/index.ts @@ -16,3 +16,5 @@ export { HomepageCompositionRoot } from './HomepageCompositionRoot'; export { SettingsModal } from './SettingsModal'; +export { HeaderWorldClock } from './HeaderWorldClock'; +export type { ClockConfig } from './HeaderWorldClock'; diff --git a/plugins/home/src/index.ts b/plugins/home/src/index.ts index 0004cf5a23..a8b8e7ab14 100644 --- a/plugins/home/src/index.ts +++ b/plugins/home/src/index.ts @@ -29,5 +29,6 @@ export { ComponentTab, WelcomeTitle, } from './plugin'; -export { SettingsModal } from './components'; +export { SettingsModal, HeaderWorldClock } from './components'; +export type { ClockConfig } from './components'; export { createCardExtension } from './extensions'; From 0a47212b423eae9830ecb77970c8d88d24b2c5c9 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Tue, 12 Oct 2021 14:06:04 -0500 Subject: [PATCH 40/50] Another round of improvements Signed-off-by: Andre Wanlin --- app-config.yaml | 2 -- .../app/src/components/catalog/EntityPage.tsx | 2 +- plugins/azure-devops/README.md | 7 ++--- plugins/azure-devops/config.d.ts | 28 ------------------- plugins/azure-devops/package.json | 6 ++-- .../azure-devops/src/api/AzureDevOpsClient.ts | 9 +++--- .../EntityPageAzurePipelines.tsx | 8 ++++-- .../azure-devops/src/components/Router.tsx | 4 +-- .../azure-devops/src/hooks/useRepoBuilds.ts | 12 ++++---- 9 files changed, 25 insertions(+), 53 deletions(-) delete mode 100644 plugins/azure-devops/config.d.ts diff --git a/app-config.yaml b/app-config.yaml index 645221538b..c24ac1701b 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -436,5 +436,3 @@ azureDevOps: host: dev.azure.com token: my-token organization: my-company - azurePipelines: - top: 25 diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 4147874e65..3fe027ddad 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -188,7 +188,7 @@ export const cicdContent = (
- + diff --git a/plugins/azure-devops/README.md b/plugins/azure-devops/README.md index 03be6dfba2..edf26ecfb3 100644 --- a/plugins/azure-devops/README.md +++ b/plugins/azure-devops/README.md @@ -17,8 +17,6 @@ azureDevOps: host: dev.azure.com token: ${AZURE_TOKEN} organization: my-company - azurePipelines: - top: 50 ``` Configuration Details: @@ -26,7 +24,6 @@ Configuration Details: - `host` and `token` can be the same as the ones used for the `integration` section - `AZURE_TOKEN` environment variable must be set to a [Personal Access Token](https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops&tabs=preview-page) with read access to both Code and Build - `organization` is your Azure DevOps Organization name or for Azure DevOps Server (on-premise) this will be your Collection name -- `top` is strictly used by the frontend to limit the number of items returned, if not provided it defaults to 10. Currently only used for Builds ### Backend @@ -96,7 +93,9 @@ To get the frontend working you'll need to do the following two steps: // ... - + // Set defaultLimit to the max number of builds you would like to be able to see + // the default if not set is 10 + // ... diff --git a/plugins/azure-devops/config.d.ts b/plugins/azure-devops/config.d.ts deleted file mode 100644 index bbd42c55a1..0000000000 --- a/plugins/azure-devops/config.d.ts +++ /dev/null @@ -1,28 +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 interface Config { - /** Configuration options for the azure-devops-backend plugin */ - azureDevOps: { - azurePipelines: { - /** - * The max number of items to return - applies to builds - * @visibility frontend - */ - top: number; - }; - }; -} diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index b6f7801766..3aa545cc27 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -57,8 +57,6 @@ "msw": "^0.29.0" }, "files": [ - "dist", - "config.d.ts" - ], - "configSchema": "config.d.ts" + "dist" + ] } diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index f0ed2d9951..e03428e511 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -31,17 +31,18 @@ export class AzureDevOpsClient implements AzureDevOpsApi { this.identityApi = options.identityApi; } - getRepoBuilds( + async getRepoBuilds( projectName: string, repoName: string, options?: RepoBuildOptions, ): Promise<{ items: RepoBuild[] }> { - return this.get( + const items = await this.get( `repo-builds/${projectName}/${repoName}?top=${options?.top}`, ); + return { items }; } - private async get(path: string): Promise<{ items: any }> { + private async get(path: string): Promise { const baseUrl = `${await this.discoveryApi.getBaseUrl('azure-devops')}/`; const url = new URL(path, baseUrl); @@ -54,6 +55,6 @@ export class AzureDevOpsClient implements AzureDevOpsApi { throw await ResponseError.fromResponse(response); } - return response.json() as Promise<{ items: any }>; + return response.json() as Promise; } } diff --git a/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx index 34c8bc4fd1..c993922105 100644 --- a/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx +++ b/plugins/azure-devops/src/components/EntityPageAzurePipelines/EntityPageAzurePipelines.tsx @@ -19,9 +19,13 @@ import React from 'react'; import { useRepoBuilds } from '../../hooks/useRepoBuilds'; import { BuildTable } from '../BuildTable/BuildTable'; -export const EntityPageAzurePipelines = () => { +export const EntityPageAzurePipelines = ({ + defaultLimit, +}: { + defaultLimit?: number; +}) => { const { entity } = useEntity(); - const { items, loading, error } = useRepoBuilds(entity); + const { items, loading, error } = useRepoBuilds(entity, defaultLimit); return ; }; diff --git a/plugins/azure-devops/src/components/Router.tsx b/plugins/azure-devops/src/components/Router.tsx index ce8dd3b51d..3000deb5cc 100644 --- a/plugins/azure-devops/src/components/Router.tsx +++ b/plugins/azure-devops/src/components/Router.tsx @@ -25,7 +25,7 @@ import { MissingAnnotationEmptyState } from '@backstage/core-components'; export const isAzureDevOpsAvailable = (entity: Entity) => Boolean(entity.metadata.annotations?.[AZURE_DEVOPS_ANNOTATION]); -export const Router = () => { +export const Router = ({ defaultLimit }: { defaultLimit?: number }) => { const { entity } = useEntity(); if (!isAzureDevOpsAvailable(entity)) { @@ -36,7 +36,7 @@ export const Router = () => { } + element={} /> ); diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index 8dafccb4a2..5207838f04 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -16,21 +16,21 @@ import { useAsync } from 'react-use'; import { Entity } from '@backstage/catalog-model'; -import { useApi, configApiRef } from '@backstage/core-plugin-api'; +import { useApi } from '@backstage/core-plugin-api'; import { azureDevOpsApiRef } from '../api'; import { RepoBuild, RepoBuildOptions } from '../api/types'; import { useProjectRepoFromEntity } from './useProjectRepoFromEntity'; import { AZURE_DEVOPS_DEFAULT_TOP } from '../constants'; -export function useRepoBuilds(entity: Entity): { +export function useRepoBuilds( + entity: Entity, + defaultLimit?: number, +): { items: RepoBuild[]; loading: boolean; error: any; } { - const config = useApi(configApiRef); - const top = - config.getOptionalNumber('azureDevOps.azurePipelines.top') ?? - AZURE_DEVOPS_DEFAULT_TOP; + const top = defaultLimit ?? AZURE_DEVOPS_DEFAULT_TOP; const options: RepoBuildOptions = { top: top, }; From 9e86cce0851393c8be8a62b8ad5cfe918e27ed28 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Tue, 12 Oct 2021 14:09:31 -0500 Subject: [PATCH 41/50] Updated API Report Signed-off-by: Andre Wanlin --- plugins/azure-devops/api-report.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index 000702268e..fbe28c179c 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -22,7 +22,11 @@ export const azureDevOpsPlugin: BackstagePlugin< // Warning: (ae-missing-release-tag) "EntityAzurePipelinesContent" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) -export const EntityAzurePipelinesContent: () => JSX.Element; +export const EntityAzurePipelinesContent: ({ + defaultLimit, +}: { + defaultLimit?: number | undefined; +}) => JSX.Element; // Warning: (ae-missing-release-tag) "isAzureDevOpsAvailable" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // From 9cfbf27f6d074dcdaf7824e35a1ae54bd374032c Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Tue, 12 Oct 2021 14:17:07 -0500 Subject: [PATCH 42/50] Updated screenshot Signed-off-by: Andre Wanlin --- .../azure-devops/docs/azure-devops-builds.png | Bin 177135 -> 177135 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/plugins/azure-devops/docs/azure-devops-builds.png b/plugins/azure-devops/docs/azure-devops-builds.png index 89a777059f67b448c961bdcd829d38ddd9eea0d5..4788a185ed7d664b179ba6fbd1aaa8453f44a793 100644 GIT binary patch delta 145883 zcma&NXH-+`+wQ9(B1%zNNGB>wP*4E_QbH0H1sfm>q<5rukRCDx1w@gk6sd`df=cLJ zniL5o5D-b|Ekb}0AcO=$J;C*V-*@kQ_Bi8wVn8P2d7jLf-1l|=u4{>MWQlU*bliP? zUH&8DNA~U8$AA0Qjeqv-<96G(@4&+0L!7_7R#Vk{eHsSvmU*?CkMruxWaLVIy7%et zs|VUsT3q9gACBkAv2Z$ea^RAQ#6eN*YOn7(Lsts=Qwy4GtOq>Gy^Mo`BVXLUnw%%j zC+eOohPS(V-P`%;L07w1JxRCHzTgpz&V}9Oh+;=vLPSjXQuz6MI|K*?)F4`~7_<-( zQ?rDmj0Np(18Z<|H1RqC*kN?G6Lx)~?o{(v%K6>ZLr5$dEaEFi4*@If{*W!+^=BIK zvcwQ@k$YnmiLU!Slkiebsc<*|S@{HGc6r0Erp-W$eQ@d^SypE|k$c-B1tM@{=#{kw zj)YkD3`QzlzN9`geUYZ&u{M3XUD-PS1ra=NnUe|t7E7suJPGO>USx3}A#%(Snl8=u z7g)chVQ{QlFord^K9EISmCr4UsQPr0`eQ3Sw!b?UW4lrYuv|7|-WDX`3ax@`DjYjQ zDk|BDeXJRA=}dM$H@Skb@f4Jl7CZ#E8>zTlo8TkbI``hjO`s7?iqbyX+O-X}Yh6A+ z1{@E#=iBJD^8;}i@7&GI8i37=z==_Qd32?B(?52elD6w)ahnBAdf#+I8mdkKAT-;OkSD6j-m`CYw9vJ0`F~3EwnpMx6mCmvNkr-R@QIJ zAfpQJuD|;cx>N!yhe!0(&%)OcG`!tRU%YrXz0s(iFN2QL3WML)V*}XZiW@G7)ePm4 zVeoW7;cXe|E+0_69~Y93X(m#R+fX|0+qlC%3g2zn(1Y*(4cYkx@^c{%N;7n?(G&gh z*qpbiE&;Vj0qb;!ydY;gb^}B-JzOATMx@_*^8;L+lC>$L+JzJM>%ysf64qzcFc^kb zukSqgl26rXH10}Zzm*#;|=q($L4rLH%>s$ZnA))CGrd)^W zh$?14Kwje$dm?2>9X{h?2~iD%^Un&%r#?w zrQyZz@LXMJd%d#n_Qg=Kh@6F2;{3CzeHs?3yh*@!&3BOQ=Yt!*o1qUawN8(eK>SCH zfV|8`@6tHhM-@8NzeW;SPPXC^Q3G>3}H8gtEw&%YvElggs{dUsF z^;c~~yJguGt!5*rnuP>foUW74?aJd#&i=*If=GYd0k?zpYIYw{e*OW=rjR zkf79_-mPaO%aD1dU@eK4!e>HF8V8fZxs7){4VzA1K_`DXLhev z%XX^`scy#w+SsF*lN4&oChM$$xW1oP$SMtx9@=4`(&}q6?=y^c1`pzCzcZMFiiD4o z7V*DT9*o&uIGoRq=wTc7NxJNh5Jv)SMu0Aa1fgEY2rr@P$e)p~>+;9#)ti#f}`pXZ$ z(EU~RUf?vSgzJ^6`Uw8{#J!%ao|?qXPEzmuN1wy*w$222ND6o6cTV(2^vo z&JsLiD_#f_yq#|@dp4>mNeOG4=$dt&s0?o3>RM|F!IONdnoON*k3%rTfR=PyoTPz( zi*T0dUl>RrP^-mgN?WOQu{uYn+eB1T@n8I>29zJ!iE@8GrztJv+y2O#@J!0J`vj%* zrCZ~&hD$oy&lD$Ya{7YC@2yL0zwdWk)N~JA=1NdM!B5h~6YT_&4q+26_C-w|HCg+e zer1K$CjYem2=x{z*TwiAKDBY)tV0sG_$a55*#7Zffk!}VHBuQKr%{g7zEEYtYnBx=(x zaGC_BWY_xtk_R0vhGBz)TR_T-4{uRN!Tm}$Sr2j)3J0XL6yI*m(wuKoPgAInA!V#I z=rg8xCAHf60%Y7uhPA^>X|RjhkZbOT6JHdprh}~euI>-!mn@y?6NAs^vam(97^^o7 z2Jgx*=EPOigOF>hE{L$5+9oy_xeB=KbR=n1VhXl%)xAN`hM~Y)DeB1S^ z#$@|m(Bfq85H`E@psuJ}3l24Eaw!v9K!D1jHYp#B8(?D%mwJEjXrO-qlGOKCeSgIh z6m+ zeVnI)c}EX#AMRn9PDI_3SX;WpxYckw-R3IF1{sN&qDbJbbddn8`M!Lf^C8>sR|Ph6ye zLAnM^Ez;@}TEg|l$@k08z{riU=7qif|PZ^=ZC%b_!|mESd#d~Hrsd4Ko%QMGX0+t@?F*{br#slH z_#*#qIZ@$_mp6*2;jLMV_AA^tXxjN?)@_@~HqG$P=i^}KS%o|8V>aA;80GM2MYHr$ z7T2yatj@k%rXh@{^kwspYYKeBK`!>U5EDxjr@2M4ghm z4XU?m^+02SfLXYr74m zqljCfArTN}7;gG_6jgBVch#xI!*h!BfnDQA`k(nrE$D z;8!0x!g^|!3ifO~BEk>Vb`WlIk1n5B5Iv!gMRmcdJTf^5Mz0LJ#0vy&hR>{v89l7w zPRUpLb9G)kBx~mBU4e_KQW~&B@uXb)1XJXuPU}8O#`?k+q3Pd#DPMA|fq7!KOU!FE z>|}3IM^&HOq>xK=xn0ojbLO~R_!ao3+~9iM>>CaPZNG#Lk&6X@}Q#cqEF$*-NsF6gLJ_xVM&jiB>iZm zE}T=KV0TSLL$7N@ndF?OQB9qIfv(N{BG_z?jm8hyV8X|DJbpfm}p5;N_a25oc-7L(bCZyYqQZQdabTBip3h)5uxi z0fq5P4Dm|zP*$KFIfpAm&!c(nix=Wn7kVG3o1fWNm?`Y=*C(uj7x|(?NFCW6ai)J1 zXfM0iR|0hEY3hahC|`vf3;)aKL=stzRyMhza>0PsS)68pJg?^V&0&1n+5UeAf^NUyQ&3`xI zs=7a!qk@W>)0w?H-o)I+wd^-Q-@QB1pf9g@nEV6Y<;q#JSza<-*^a(oVw7m2!eh%t}wewHYdh5=l0>2pp^ zj4VnE=wF@<8Enxiwl;XIJ+#mp#ut(fs`8errCb5RWp&dl6$c&i%ksnh`Fb|gYW1|1 zT9)#rlgmR5dxJD0iLbPEsO2TFPO>Ao6uyRvp?z>(SAjQvTE)$SCnOaY zwAQx{U>3tbh3%q>tsw$W+m2L52HLGj`Uiupv9!v>Vdnc4$jx$_!{=f=EG~l4!2IAb zdN$1GmvgI3E45V}%Bb;D7F@I>;1~}H+}Q@5;@zQ*aymCQmVK$}d2@lx#Hd%;)8RcbYK#SIN(&>Kd~rPOlx-o~PL`ebZ)Ksx=2;4* zJxk^h_LTx$r;;0fJ-X@JEUB#n=eVEdu5UZ&IHdv1`SDsoH>(jwrH_I;y(m-xyFzn(1TTY9ZJZJXy zw8v@XTBlohb&0|5uN7k#B$XB)k>6z0RAk#vn{tluSBr0nkO8&1VPq%%s7pue@{!>h z!dr*|rpMNwbgnG?T?HN+S(I|td9bz2ZaovMN2tmpAK5#BKa%s#*?lU_klCNMUsp0N zhAQLip~Q2C%LJF=1~e{n=Y{+0Nw9++?iIJdkDMWtysYy*#-I^ygpVa`Se&Juqem^W z%UZfSBW%Xny2*@xe_C4zd~Dz(Uz_|R?0P$A43oz>bo*j7}(Kr^B(|8CJBy$^iD1lB4evybG| zcv`BV@lm-){k?^qOw*DIII*+SK^kO`$(fL`PiI!YQN4d1n3=08u>B>Mea!7m))i8o zHJsA9^QXGYU|#rp?~2tnEWdsHC_nZgfSDoT!3lz}Uo@B9lr&vNqz6){CY#GRWgxE$ z>{8hm)vw>Te`)7)8|n2- z2kC{XkjGQAZNq8$qDy3dv6I$356d@!-+8b(8{YTZw<ie`QF(VjeciQA z1!hGRk^3u$EV}vPW(DQo?|^Qm1s0B+VubXIb>K)33K^N40)>Y>;#O&5B; zYk=c7n$4YB`Ox)mf-czH4)<(ME~`1m($029Ne-ZH9j0)JPG3vkcq*Hxc|`4QM_xUAYGz#~cMR{p&UBZ?srK*U!{^^hUtivjqsFC*B4(_}Z&6l^y-Zq(U)!D6T# zOogUw&J*vgT~%t;22J|VkHFs|{2ZJW5h4V83&Rc{&%ZD)K$h`x)2 z2G{#FeL?RA-1l}dtGra(#G-eaPLo!{-fUZP3db#`n?=KaBnm*zU6c7)FgIJdCq%ND zgGDx5+>NWaCNs=@s6khsC(H8mwD$FUZ9<4 z(75d_QR)XkNXU}t@!O~XJFfRaH8WO9^96FifM>98%=Q*G(C%humYNWg_kElkQ!DP` zX2<3W?ve2EYlF~a#CB`qx34Ltqzdsu`^5YEzju9GmMcL!B<%cwUMcUrlx4liNIU7edWd(Akz~{Vlnqu!T2YQjoPo&!{@?IMyHM zeBm5pC}+>)D%`r}clJEWrK^F>e*xzp{?GJ%z#)0KIa9-~^&Tkz7WtPczkiB_zV1@T zFHZAMrO!yMLbpSFE7r!I)n4(mHbEQq>Umvlgu)vAHN{$c0afK zdv(WuJHGcC_J&Zvu2PgV#949W{MP;Er7utbSb0h=&Z5t?r&6K}C$~7?Bf*IV3pB!J z6!Tk;^3;ql5genKN>3VxIUbw{dsivfG4!yEkalMHqE4|T6wy@|Ps-#tYULRdfc7C&=M(se8D>^KvAKRT-Ri{Nx z08c+zf|{Zu)~fv}X^TgOgEoWBF`DBE_D4;sTxZ2jn!x-=g*Wr5ndu^kY zSVpncE}<3Djn&fn9tF6>10{`Q9jXyr(C%^SqST9RH&T^d_s#9L`9j`m>zTk0D(Rci zkGJ`s?au1$pwc{lsS$K0Tx6}#AQbV#F6f!cg?m=0+yx!d)e7CyzuDCna9QZU zc`2voR%>z>(p1wivfmGF#`oqG=xUz%=mHr%6A*&s0ZW4 zFuGalibN|%5-Xi`f#`8za|=IOA20k^w_UiE^)5m!)xWQRM#XU4l)L<^$tvfiW1)5p9W^-{uL>RGK+9zu1>A>0%)5fbin#1axT%L zH_uazhC^NuWBy+>Lm6H%&t>7-w?on$k^CPyqJ~A)H?ukd*O@a%hK*Twng5C(G|KAF zl0+F5E5-7w=9r;Y4#3Go4*{*QCY)38;F)dnoVo^FV}g#7p~>6-Kz(|LmS1y($)1|2 zO?LwU5#`2#(*g#^LX&@nhUs4D1i^gV)<#4_EPVFJo z+%MmDW5UamOFWR}e>hvP_1})noJWC*E#6@(TiHb50qL}=pqk&XVpRfdSk1MPt+$`S z2;8>1*~x74R-lrtID5svV9u6bMzE^k(EfnzUV6!Pi2H#f!FHaa2D4v3*cQqn39!hr zv9Y@~++7Q2^P>x;-c5|cAcTHYRTz!e+B}>Y7VhMg_$r21fb)P>+DB-4Pt`~C+SXoE z0Gi7e&R6*GCJqJj2E))p-y0d^c0J|qH{H5B$!;$k*3TgFADe`Xm%nSp*(E-{Vg`EI zIseVZu-HCAU}Y=)%Mw~^S@R0j^cOlS)PhS-v5j@wBa-H9aFHT z?w^{aQIX53`_+mzN~MJ_2E1&UZzIMH#+v?gkC*@_DAeJtbit^*Ilc7rtgvYxV4|&~ ziHVZbb{^lGs!8=5c5k~FIEQy?!1;faX@M%`0^&7)?r8@9&o{eYWClQAf*jC(i;py# zcQ4HfEE0aNJgc-Dky+kh#BGa7#b6OZ;5AdF0|IFY!F&bgyD7o(&*Q|vW>Sz8f7pK!jMPKQP54w| z(FKIVqGIRh8=Av|fiCak0f=TLaT(Ln&kMa#YA|4=OA1-eOFhfV)S zb4An*h~p!FKIU|@7D|Z5d9+oZPQ8?QbdiO<)ZE5u{PTx9(_ZLzbx>sUV(9V_EZa|I zL%=YB5PCskO~)H7I7lW_>o~Cq+kN1q>Y={joZ*plq}tI34!MA36}ZwEuUAT94x*54W9_ zhC);|G!@nA0hC6`peiuij!pB5vfOHFsB{$vN@<=oqZp!B(&uioian&Ooclm1?txu7 zS+CTwKIe&aeVw30yBvAjiLpC z0qWI1-=iPU=*<<|sNA!a3<)VXw36zw)={cWE35??#oOlHwo~s)lCf=Y#{{qk^0^R= zk17BrZhf%5?31*y*GQ;XvFGrao`dWcXvi{qIsu&9!F!=%Ly)MwZJ*7dA`|JDEE$gQ znYxgIC-+#kFdYNS0uWUP9n}f3mrC;-vxu1wt_CK=QlJ?|GTqzRwDzn1t(Gfg(vpA^ zD`i4?Qz%j66-o=K;@wBTaWp1R)hyxpLxH?W)t*f1r^QC)rtQ6%?E(Rj38Gvn<{8$d zlG!a`e=8IZ_rKFBmUgfxm9FLXc=s3EB_0=sNEKEbX-;$$ua@qjCmr|D&rV!A52v$!aX<v{$UWdD<43GuoUo>=DBFgC?r{;GyF_1bB2cn_syi?{|Bwdu-F>u#|E&qV}&kb$3} zr6(X2J|b?ZTVU#l3jGY{@;Y;yr=!0suh-zoCf&KDJxu?!LvW0~4zvrR6Q_v~;m37%TMOM!E(lpOf$QB^E${6e( z?*B9`xZ#HkXjf6s%^1=kT%~Tlh?6m-gq~@S(|E0FkS17?aHltR^mo~EL^)$CNszZ( zTB+Vzkk~F1Nsx8L5R|Ev9#=f|tTnTIr^J>;u|f|sZCzikK|zgq?us_m$1%442kf`M zeas$T4gI`kOd#rMpiMsdg#+%4t-a$W1P*SqRoT~ObopcRb6;PbvrrKqzr$U17Z;Yn^GUHlH~f5pUsOk`z@ty|Ko`Mg^Aa51{Q;)LmfS4?h=z< z6_{O?|7FWnsbpLUM-)r*2aGDI7gRk}yH}iGUuqqyWP-OW8q$f+sH!%!G$&gdu#Xrn zx+p=#x|wJjv-N?J;kn^7ab>UWzO4&Bl{HS`PR7qv=g&r?3 z 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 z%0A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 z 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 UQ3)~G7x~Y0ykOx^vD7^N8<;gmssI20 delta 145779 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

  • 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 From 3135d711d899f986fbe4b0ddb167a84df1ade761 Mon Sep 17 00:00:00 2001 From: Andre Wanlin Date: Tue, 12 Oct 2021 14:23:36 -0500 Subject: [PATCH 43/50] Fixed this missed item Signed-off-by: Andre Wanlin --- plugins/azure-devops/src/hooks/useRepoBuilds.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/azure-devops/src/hooks/useRepoBuilds.ts b/plugins/azure-devops/src/hooks/useRepoBuilds.ts index 5207838f04..14a8a79428 100644 --- a/plugins/azure-devops/src/hooks/useRepoBuilds.ts +++ b/plugins/azure-devops/src/hooks/useRepoBuilds.ts @@ -26,7 +26,7 @@ export function useRepoBuilds( entity: Entity, defaultLimit?: number, ): { - items: RepoBuild[]; + items: RepoBuild[] | undefined; loading: boolean; error: any; } { @@ -41,7 +41,7 @@ export function useRepoBuilds( }, [api, project, repo, entity]); return { - items: value?.items as RepoBuild[], + items: value?.items, loading, error, }; From f969089a184e1771dd18d9d8c255fc520cd4016b Mon Sep 17 00:00:00 2001 From: Morgan Martinet Date: Tue, 12 Oct 2021 15:35:32 -0400 Subject: [PATCH 44/50] regen API docs Signed-off-by: Morgan Martinet --- plugins/kubernetes-backend/api-report.md | 27 ------------------------ 1 file changed, 27 deletions(-) diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index e6fb2d5cce..c8211a5323 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -154,33 +154,6 @@ export interface KubernetesEnvironment { logger: Logger_2; } -// Warning: (ae-missing-release-tag) "KubernetesFactory" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) -export interface KubernetesFactory { - // (undocumented) - createHttpServiceLocator( - _clusterDetails: ClusterDetails[], - ): KubernetesServiceLocator; - // (undocumented) - createKubernetesClustersSupplier(config: Config): KubernetesClustersSupplier; - // (undocumented) - createKubernetesFetcher(logger: Logger_2): KubernetesFetcher; - // (undocumented) - createKubernetesObjectsProvider( - options: KubernetesObjectsProviderOptions, - ): KubernetesObjectsProvider; - // (undocumented) - createMultiTenantServiceLocator( - clusterDetails: ClusterDetails[], - ): KubernetesServiceLocator; - // (undocumented) - createServiceLocator( - method: ServiceLocatorMethod, - clusterDetails: ClusterDetails[], - ): KubernetesServiceLocator; -} - // Warning: (ae-missing-release-tag) "KubernetesFetcher" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) From 9ee25fedf65f4c42d3b0b8f957c7e5aae8b0a831 Mon Sep 17 00:00:00 2001 From: Michal Partyka Date: Wed, 13 Oct 2021 09:49:27 +0200 Subject: [PATCH 45/50] Add Box as an adopter Signed-off-by: Michal Partyka --- ADOPTERS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ADOPTERS.md b/ADOPTERS.md index 21d1419a45..e74bdacbfd 100644 --- a/ADOPTERS.md +++ b/ADOPTERS.md @@ -55,4 +55,5 @@ | [Santagostino](https://santagostino.it) | [@santagostino](https://github.com/santagostino) | Developer portal, gateway to our infrastructure, documentation, service catalog and internal tooling. | | [Peak](https://peak.ai) | [Luke Beamish](https://github.com/lukebeamish-peak) | Developer portal for all internal engineers to access documentation and tooling. | | [Gelato](https://gelato.com/) | [Dmitry Makarenko](https://github.com/dmitry-makarenko-gelato) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal and third-party systems🚀. | -| [GoCardless](https://gocardless.com/) | [James Turley](https://github.com/tragiclifestories) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal systems. | \ No newline at end of file +| [GoCardless](https://gocardless.com/) | [James Turley](https://github.com/tragiclifestories) | Developer portal: documentation, service templates, org structure, service catalog, plugins for integration with internal systems. | +| [Box](https://www.box.com) | [@kielosz](https://github.com/kielosz), [@jluk-box](https://github.com/jluk-box), [@ptychu](https://github.com/ptychu), [@alexrybch](https://github.com/alexrybch), [@szubster](https://github.com/szubster) | Developer portal for service catalog, integration with internal systems, new service onboarding. | From 3b59bb915e9e7363ecbda3439c4e2e591ed0b850 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Wed, 13 Oct 2021 11:30:56 +0200 Subject: [PATCH 46/50] Catalog: Fix entity orphaning Co-authored-by: Patrik Oldsberg Signed-off-by: Johan Haals --- .changeset/moody-shrimps-whisper.md | 5 + .../DefaultProcessingDatabase.test.ts | 130 ++++++++++++++++++ .../src/database/DefaultProcessingDatabase.ts | 19 +++ plugins/catalog-backend/src/database/types.ts | 13 ++ .../DefaultCatalogProcessingEngine.test.ts | 5 +- .../DefaultCatalogProcessingEngine.ts | 10 +- 6 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 .changeset/moody-shrimps-whisper.md diff --git a/.changeset/moody-shrimps-whisper.md b/.changeset/moody-shrimps-whisper.md new file mode 100644 index 0000000000..ea37ed5ef3 --- /dev/null +++ b/.changeset/moody-shrimps-whisper.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-catalog-backend': patch +--- + +Fixes a bug in the catalog where entities were not being marked as orphaned. diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 00b3de2fc7..1364e17f37 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -1182,4 +1182,134 @@ describe('Default Processing Database', () => { 60_000, ); }); + + describe('listAncestors', () => { + let nextId = 1; + function makeEntity(ref: string) { + return { + entity_id: String(nextId++), + entity_ref: ref, + unprocessed_entity: JSON.stringify({ + kind: 'Location', + apiVersion: '1.0.0', + metadata: { + name: 'xyz', + }, + }), + errors: '[]', + next_update_at: '2019-01-01 23:00:00', + last_discovery_at: '2021-04-01 13:37:00', + }; + } + + it.each(databases.eachSupportedId())( + 'should return entities to process, %p', + async databaseId => { + const { knex, db } = await createDatabase(databaseId); + + await knex('refresh_state').insert( + makeEntity('location:default/root-1'), + ); + await knex('refresh_state').insert( + makeEntity('location:default/root-2'), + ); + await knex('refresh_state').insert( + makeEntity('component:default/foobar'), + ); + + await insertRefRow(knex, { + source_key: 'source', + target_entity_ref: 'location:default/root-2', + }); + await insertRefRow(knex, { + source_entity_ref: 'location:default/root-2', + target_entity_ref: 'location:default/root-1', + }); + await insertRefRow(knex, { + source_entity_ref: 'location:default/root-1', + target_entity_ref: 'component:default/foobar', + }); + + const result = await db.transaction(async tx => + db.listAncestors(tx, { entityRef: 'component:default/foobar' }), + ); + expect(result.entityRefs).toEqual([ + 'location:default/root-1', + 'location:default/root-2', + ]); + }, + ); + }); + + describe('listParents', () => { + let nextId = 1; + function makeEntity(ref: string) { + return { + entity_id: String(nextId++), + entity_ref: ref, + unprocessed_entity: JSON.stringify({ + kind: 'Location', + apiVersion: '1.0.0', + metadata: { + name: 'xyz', + }, + }), + errors: '[]', + next_update_at: '2019-01-01 23:00:00', + last_discovery_at: '2021-04-01 13:37:00', + }; + } + + it.each(databases.eachSupportedId())( + 'should return entities to process, %p', + async databaseId => { + const { knex, db } = await createDatabase(databaseId); + + await knex('refresh_state').insert( + makeEntity('location:default/root-1'), + ); + await knex('refresh_state').insert( + makeEntity('location:default/root-2'), + ); + await knex('refresh_state').insert( + makeEntity('component:default/foobar'), + ); + + await insertRefRow(knex, { + source_key: 'source', + target_entity_ref: 'location:default/root-2', + }); + await insertRefRow(knex, { + source_entity_ref: 'location:default/root-2', + target_entity_ref: 'location:default/root-1', + }); + await insertRefRow(knex, { + source_entity_ref: 'location:default/root-1', + target_entity_ref: 'component:default/foobar', + }); + await insertRefRow(knex, { + source_entity_ref: 'location:default/root-2', + target_entity_ref: 'component:default/foobar', + }); + + 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', + ]); + + const result2 = await db.transaction(async tx => + db.listParents(tx, { entityRef: 'location:default/root-1' }), + ); + expect(result2.entityRefs).toEqual(['location:default/root-2']); + + const result3 = await db.transaction(async tx => + db.listParents(tx, { entityRef: 'location:default/root-2' }), + ); + expect(result3.entityRefs).toEqual([]); + }, + ); + }); }); diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts index 9785ac3935..0b9d3653a0 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.ts @@ -31,6 +31,8 @@ import { ListAncestorsOptions, ListAncestorsResult, UpdateEntityCacheOptions, + ListParentsOptions, + ListParentsResult, } from './types'; import { DeferredEntity } from '../processing/types'; import { RefreshIntervalFunction } from '../processing/refresh'; @@ -419,6 +421,23 @@ export class DefaultProcessingDatabase implements ProcessingDatabase { ); } + async listParents( + txOpaque: Transaction, + options: ListParentsOptions, + ): Promise { + const tx = txOpaque as Knex.Transaction; + + const rows = await tx( + 'refresh_state_references', + ) + .where({ target_entity_ref: options.entityRef }) + .select(); + + const entityRefs = rows.map(r => r.source_entity_ref!).filter(Boolean); + + return { entityRefs }; + } + async refresh(txOpaque: Transaction, options: RefreshOptions): Promise { const tx = txOpaque as Knex.Transaction; const { entityRef } = options; diff --git a/plugins/catalog-backend/src/database/types.ts b/plugins/catalog-backend/src/database/types.ts index 041a3fdc5b..9d28387e2c 100644 --- a/plugins/catalog-backend/src/database/types.ts +++ b/plugins/catalog-backend/src/database/types.ts @@ -91,6 +91,14 @@ export type ListAncestorsResult = { entityRefs: string[]; }; +export type ListParentsOptions = { + entityRef: string; +}; + +export type ListParentsResult = { + entityRefs: string[]; +}; + export interface ProcessingDatabase { transaction(fn: (tx: Transaction) => Promise): Promise; @@ -148,4 +156,9 @@ export interface ProcessingDatabase { txOpaque: Transaction, options: ListAncestorsOptions, ): Promise; + + listParents( + txOpaque: Transaction, + options: ListParentsOptions, + ): Promise; } diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts index 044c3e7c4b..6b55b8b9eb 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.test.ts @@ -29,6 +29,7 @@ describe('DefaultCatalogProcessingEngine', () => { getProcessableEntities: jest.fn(), updateProcessedEntity: jest.fn(), updateEntityCache: jest.fn(), + listParents: jest.fn(), } as unknown as jest.Mocked; const orchestrator: jest.Mocked = { process: jest.fn(), @@ -209,18 +210,19 @@ describe('DefaultCatalogProcessingEngine', () => { db.transaction.mockImplementation(cb => cb((() => {}) as any)); + db.listParents.mockResolvedValue({ entityRefs: [] }); db.getProcessableEntities .mockResolvedValueOnce({ items: [{ ...refreshState, resultHash: 'NOT RIGHT' }], }) .mockResolvedValue({ items: [] }); - await engine.start(); await waitForExpect(() => { expect(orchestrator.process).toBeCalledTimes(1); expect(hash.digest).toBeCalledTimes(1); expect(db.updateProcessedEntity).toBeCalledTimes(1); + expect(db.listParents).toBeCalledTimes(1); }); expect(db.updateEntityCache).not.toHaveBeenCalled(); @@ -236,6 +238,7 @@ describe('DefaultCatalogProcessingEngine', () => { expect(hash.digest).toBeCalledTimes(2); expect(db.updateProcessedEntity).toBeCalledTimes(1); expect(db.updateEntityCache).toBeCalledTimes(1); + expect(db.listParents).toBeCalledTimes(2); }); expect(db.updateEntityCache).toHaveBeenCalledWith(expect.anything(), { id: '', diff --git a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts index d0faff25d5..59cd4d94ae 100644 --- a/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts +++ b/plugins/catalog-backend/src/processing/DefaultCatalogProcessingEngine.ts @@ -189,10 +189,18 @@ export class DefaultCatalogProcessingEngine implements CatalogProcessingEngine { let hashBuilder = this.createHash().update(errorsString); if (result.ok) { + const { entityRefs: parents } = + await this.processingDatabase.transaction(tx => + this.processingDatabase.listParents(tx, { + entityRef, + }), + ); + hashBuilder = hashBuilder .update(stableStringify({ ...result.completedEntity })) .update(stableStringify([...result.deferredEntities])) - .update(stableStringify([...result.relations])); + .update(stableStringify([...result.relations])) + .update(stableStringify([...parents])); } const resultHash = hashBuilder.digest('hex'); From 80ab0ccaa83f77ff760877cfcfb56d0f7b296dd0 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Wed, 13 Oct 2021 11:34:58 +0200 Subject: [PATCH 47/50] fix test names Signed-off-by: Johan Haals --- .../src/database/DefaultProcessingDatabase.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts index 1364e17f37..905339af17 100644 --- a/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts +++ b/plugins/catalog-backend/src/database/DefaultProcessingDatabase.test.ts @@ -1203,7 +1203,7 @@ describe('Default Processing Database', () => { } it.each(databases.eachSupportedId())( - 'should return entities to process, %p', + 'should return ancestors, %p', async databaseId => { const { knex, db } = await createDatabase(databaseId); @@ -1261,7 +1261,7 @@ describe('Default Processing Database', () => { } it.each(databases.eachSupportedId())( - 'should return entities to process, %p', + 'should return parents, %p', async databaseId => { const { knex, db } = await createDatabase(databaseId); From efb0c6bf15dc707cda4924d8aa2c4e5be6f9aca4 Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Tue, 12 Oct 2021 13:56:31 +0100 Subject: [PATCH 48/50] Set catalog table search field placeholder to "Filter" Full reasoning is in the changeset but in short this is to avoid confusion with the search plugin. Signed-off-by: Iain Billett --- .changeset/healthy-poets-tap.md | 9 +++++++++ .../catalog/src/components/CatalogTable/CatalogTable.tsx | 1 + 2 files changed, 10 insertions(+) create mode 100644 .changeset/healthy-poets-tap.md diff --git a/.changeset/healthy-poets-tap.md b/.changeset/healthy-poets-tap.md new file mode 100644 index 0000000000..31e03e7e09 --- /dev/null +++ b/.changeset/healthy-poets-tap.md @@ -0,0 +1,9 @@ +--- +'@backstage/plugin-catalog': patch +--- + +Set the search field placeholder on the catalog table to "Filter" to differentiate it from the search feature + +We had feedback that users expected the catalog table search field to have more sophisticated behaviour +than simple filtering. This change better sets expectations by setting the placeholder to "Filter" to +differentiate it from components which are part of the search plugin. diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index f293710847..197937d6f7 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -163,6 +163,7 @@ export const CatalogTable = ({ columns, actions }: CatalogTableProps) => { title={`${titlePreamble} (${entities.length})`} data={rows} actions={actions || defaultActions} + localization={{ toolbar: { searchPlaceholder: 'Filter' } }} /> ); }; From 28afbcd45ac9bf1dd281869da9adcdc25d1a9350 Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Wed, 13 Oct 2021 10:48:59 +0100 Subject: [PATCH 49/50] Revert "Set catalog table search field placeholder to "Filter"" This reverts commit c9940ec5c5d515888c7f5cd2ee14a3672f9f02ac. Signed-off-by: Iain Billett --- .changeset/healthy-poets-tap.md | 9 --------- .../catalog/src/components/CatalogTable/CatalogTable.tsx | 1 - 2 files changed, 10 deletions(-) delete mode 100644 .changeset/healthy-poets-tap.md diff --git a/.changeset/healthy-poets-tap.md b/.changeset/healthy-poets-tap.md deleted file mode 100644 index 31e03e7e09..0000000000 --- a/.changeset/healthy-poets-tap.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@backstage/plugin-catalog': patch ---- - -Set the search field placeholder on the catalog table to "Filter" to differentiate it from the search feature - -We had feedback that users expected the catalog table search field to have more sophisticated behaviour -than simple filtering. This change better sets expectations by setting the placeholder to "Filter" to -differentiate it from components which are part of the search plugin. diff --git a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx index 197937d6f7..f293710847 100644 --- a/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx +++ b/plugins/catalog/src/components/CatalogTable/CatalogTable.tsx @@ -163,7 +163,6 @@ export const CatalogTable = ({ columns, actions }: CatalogTableProps) => { title={`${titlePreamble} (${entities.length})`} data={rows} actions={actions || defaultActions} - localization={{ toolbar: { searchPlaceholder: 'Filter' } }} /> ); }; From b488d8b69fa70e6081effa214e4e1f771f1dfaa9 Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Wed, 13 Oct 2021 11:03:01 +0100 Subject: [PATCH 50/50] Set catalog table search field placeholder to "Filter" Full reasoning is in the changeset but in short this is to avoid confusion with the search plugin. The icon is also updated. Signed-off-by: Iain Billett --- .changeset/nine-laws-run.md | 11 +++++++++++ .../core-components/src/components/Table/Table.tsx | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 .changeset/nine-laws-run.md diff --git a/.changeset/nine-laws-run.md b/.changeset/nine-laws-run.md new file mode 100644 index 0000000000..742ec4d8b6 --- /dev/null +++ b/.changeset/nine-laws-run.md @@ -0,0 +1,11 @@ +--- +'@backstage/core-components': patch +--- + +Change the Table search field placeholder to "Filter" and change icon accordingly + +We had feedback that users expected the catalog table search field to have more sophisticated behaviour +than simple filtering. This change sets the search field placeholder to read "Filter" +to avoid confusion with the search feature. The icon is updated to match. This change is applied +generally in core-components so this change is made consistently across the app given the search +field is present on all pages via the sidebar. diff --git a/packages/core-components/src/components/Table/Table.tsx b/packages/core-components/src/components/Table/Table.tsx index f61811938e..234b64ec54 100644 --- a/packages/core-components/src/components/Table/Table.tsx +++ b/packages/core-components/src/components/Table/Table.tsx @@ -32,7 +32,6 @@ import FirstPage from '@material-ui/icons/FirstPage'; import LastPage from '@material-ui/icons/LastPage'; import Remove from '@material-ui/icons/Remove'; import SaveAlt from '@material-ui/icons/SaveAlt'; -import Search from '@material-ui/icons/Search'; import ViewColumn from '@material-ui/icons/ViewColumn'; import { isEqual, transform } from 'lodash'; import MTable, { @@ -73,7 +72,7 @@ const tableIcons: Icons = { )), ResetSearch: forwardRef((props, ref) => ), - Search: forwardRef((props, ref) => ), + Search: forwardRef((props, ref) => ), SortArrow: forwardRef((props, ref) => ), ThirdStateCheck: forwardRef((props, ref) => ), ViewColumn: forwardRef((props, ref) => ), @@ -497,6 +496,7 @@ export function Table(props: TableProps) { } data={typeof data === 'function' ? data : tableData} style={{ width: '100%' }} + localization={{ toolbar: { searchPlaceholder: 'Filter' } }} {...restProps} />