From b7f2a010c85e57b49495ca91a1c39c9f035425e5 Mon Sep 17 00:00:00 2001 From: Devon Thomson Date: Tue, 21 Apr 2020 11:26:53 -0400 Subject: [PATCH 01/34] [DOCS] Add documentation for clone feature (#64019) * Added documentation for the clone feature Co-authored-by: Kaarina Tungseth --- docs/images/clone_panel.gif | Bin 0 -> 817490 bytes docs/user/dashboard.asciidoc | 18 ++++++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 docs/images/clone_panel.gif diff --git a/docs/images/clone_panel.gif b/docs/images/clone_panel.gif new file mode 100644 index 0000000000000000000000000000000000000000..e521e438d051a986820977b75c75606199972ba4 GIT binary patch literal 817490 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

T0P$RjSBFhCSMN2yp4WCX}ow6QigWYlP9e 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:G15=@s5Dv*SXqCs4yAc=EBCd!| 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

5SovVt#Qh=SLu+a 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

oBfY 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 J^IMmP{|OzDFkJuu literal 579529 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ℑ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

-H5+u}=6*8(Wro@Jb& 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"I=ldwnBe=577vEX4LF_Xw*mg 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%0D~gNyX^a~94{ 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

(CYt}FIpy!~_`iBxXgUBe<^noc8L02Q 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�+d=Vdo$(?b$}Z!gA5sKcn$6P@e|=c*y`^&CWT$A?bj~yww8@5 zzsR=8%QOvs(R}Y0M_sbuU?L-wCvb8VR@cqaNni&Hm@AVG^%^sDVM5q=C zVJY(4R ziPpeffaEpxWtpd}pnLR`u`M1A6HWvUTyR`E%evLitmRDIaavdDXTMYlp^j*ay`|3N z3lQ-p+2Nr~1rRV12`64=zcO3{(VI8=A(zTdc_Mel^jL9B?ke!jpo@a8V9ndZnpwSO z#0zYjs}GPT@0|2>8K#Loy+_pmrQVGLx4{cG5gO(Txc!xauwP`m;F+oGRt6zclGG^t zqM$x3y33E=l$nK2(ihlSO=H!1d05@v^U>yNyTh}Cuk@-N2(+|g{Iq;Svt$zKe_Y3iXVC3$RAo}sv0jQXsf34CH$ozU%~J$GcN)}t4AHAU zh_NfiC6h0Pt7$l%v&>Gpw+CAw&&KXF5if-5EexFmEFkqiE99?6RCsgqgCrcIu2QlG zG|`yFiY432V}%5r;7OU2;K$5v!>ClW7psctHMr^Ab}#$wEqY2(L%;>`!vktoEL|&{ z(huTml8ID^=0NS23fdCbXUirc0ZAF*Uq(KTglk_HQ#N>m2m%e6YPfGo`aC>szaMFc|wn!7YOx9n0;;7|IqAR7dwL)y^KXiMhK3zqE?@pWW42+ebi;jD!E zc=8>MTEo_rNGhyR&sUwsFDK>UUqF%s!bn-vLD(^sz0D-iypzwF*aSg#D|%1QbS9%4W2E)WBzdH=V~hCfffB#VuMB4)n&d$WFzJj6iL?lx`MqUd zFOi1k+-nww-rjI*tJ`Dol%kWraG(BCL3Gvdugu1*~hA9?qtPwGZA6K!=| z_u|2FeLlQ;j2o;CfD>9>;QvW%}lBPBWcDQ~hA@$$#dtqI5 zxm3OK!R>R2r!TuGk-H!h$$hwjhcgVME~l8vfGjD_LFlS0Gl>;}&NBmMR-~4N)0MFm z1!H=-;3+(8XJ|YiO*EV!46n{S-BA|*tN>&CDoX7f_1PISrRZD#z=x>ZmW3d7f~o8D z<>A~!!!=c$p4_*CV;p^`{ALVQog`|~W6*t}wiua}e~b4-?%M8QQ@fv)8VO5YbQ68l zuuWfuN+>(f-5rW(x6fdN`glIu5)1E|5E}2(slc^9P6eNzMn^ z)*1C*PZP_}J`XpA4^W^FAU!94AtP5JqXOzu*><)(mw{I$(VO&| zV-)MWWG5ltF+=mJz75YhjruN3qftX%$dv1g_QI|i)S}k~*!cP3=#p106WRkkKi5n#@Id+C`u{{TrZxEfOP} zN=9l@BkM_CJiOXWa8yHNc}gLvdO)Rf#?0s#NZ#08l`13LQQ_tG3Q!4-ua*&;fFbX@&S4erH!l3_JSiu zX0LOMkwJlst~$fl3sm+2>f_D9{?bU1b7w_imdm23?C%9*E4R#*CttAgfBvGY%))Z2 zDnB? zo*>OaVp0Wpmw~rb1GIMt8 zw#?bw)cU#h`#Pl`QB8kIY|^A_?5hY)j77 zLx>}|g|e-zY%d5`N7ZrlhiRhnyHI-bfeDdedbrS(sES0r%EYdM)n=2drj~y>cG~HQ zm)Ef8*Pd`wZ}Y9sw`E#ueZS1Yi>gxjP%JKl^&!~YeNjm!ZXnl^o&{1Ye)gvFgJ$!H^t)*VFEG*i% zpyoM4kDiLzv;QgLyEnDsWX@i(g-TwVM_K$MS`Jf5A*tn6vrAO5k26vXHO88 zSNf4&<8}sh8Oe8VkCocV!7?L$zZ36_rC(nxrPY+ zr0cT6hA9-{*(MmS@hu-efxK|ZM&&0j~lm3^f1?KiJ$(P*gyrSmpf39@OZ zbv_17C9FqcVLP6u{|!r56lif(6JyD!2NPz3A=gGjlOAB#*FO5}MP(=3SfFO)(BseU zdDt29b;e25HEB6y?Oc0&Xq^%)$4eN9*bh2~OO;UPb2O>-nvVi}w)BvR72|vcC0jdQ zgjb!gO^vInfTVb6^cuz^P*kxLVYx6XyJg#=S^Imx62n(PGtCKtp0%4csvPGt`N`A4 zM9EPoA`PpAjMihf${$-yPwb8^%psE1q3VgF0GP{sFuRIKuP=|O{ z?^VT*kAMC=XYtHY^S#Q4lk>ibXT=-aDczja@_Pb=AhL_-RiJ@mSVd@E^YegB?2ImE zwPLYDhYWpr;-bRj7rM@q3D&a|)9B@d0JA$m8r}!ZlrU2bd2CTL(!hq38z*BoRC>V$3d28n7QLwrEkc4DvoH5ch#1#q>j;HU=CHNt~UMs_zR zQ8dWQ+GQpcvJ*(G5T)BZlEmDIInE8rK8!d%=940hK7$n%f}w5Va;sA&eT>EBR)j(P zvcPYxC7d@(@4C4cxT^y=JE6DLqpyM;_ajCki?l1hD^-rhV}eVN{AqrYZC{GT&+O+< z;Sf5M^}XSjmT+iJdg^J-b0#;I*GafMc8gknIBQ#HlAF?Nc{YxyN~h6RvQ0;7xCyp~ z*B_IeAlEcZ)JQgexy-o>Llm~Djrl0|O{XrEIw5@{EoRzBULbx#0~coYRm%yJ?(jt4 zZZoFA{I8@LyG`!baQnaf3*zyAMeNo84l| zXBZvl`zn|@UdNnYir2D^{L1w^u;b>r(c{O@be{R}EG@&S{N&(JZKS!E&r$i<&MNV$ zoVz_!!|&|Kve{>S-e0&38<_@ILP44a(2d-sly=Ty269WVSBmpd^wD+A6#5mfi17-O zgu`8Ix3h4KLce<5%+!(CM=?RYIK zut|=273A6o4BqA)UuCvfy+BYy9AI1hX6dcpMA`DJha3ua=Grwm73RU|6o0LhoP3n0 z+kGeK&{C?}SkpLsJo0rFi{YJ{^MQD;YBF>4m7$@*sIaclsH^z~Xaj29Ub4TyqQ6kF z)CKMw6pY4OSW(}H3a1(^;uR~~{d<_Frl$-}fpXfWfvVX*PBE%ZLo)+2J>&Y)%*7!O zx>lY#%X(TxI{i4q`*~4$EWqZ@;neM!dird@c4eXl6^FJ81ZnD~a+p|jS z7rmmqtGMsfz}MG4rg-DwKH?}z_8N{-EWIw>Pd+6FWXZ_GbTS%FnC#MSw&*uGjQBp` zlP}BfD~u3sGj1`nZJz9C7m>M>NsZUzln6*xrqm>?PB+8Fxgjf;R_<6tx@@nHFDPC4 z+3ujZvAnf^>J!_@vhg!>*Nnc^p(^h?z=B@R0+7f zm`w6%L8_RY-<|w&AiHS%(3v}*bjnXjJ3~FZ`VYLBt(|fAZfuKMfA?cH-^C!e zB&udGm@T$&1P{fXY>&K#wH5kbXGQt>pW{SrC<>pu5@Q@b!bMzWaA+j-Rqvcd9shcu zJa)t^;zU)~2hwuM9ARn|64YsCwEvqJpZV%RMD zE6pe8!cOb1&-{C1gWqL1)l=W`z<*umhzlIVp%k4|Msq#CUnHQW;Lh>;cL*bB3Inn| zyN_c;%5;=J#2N?U7lvPdAiIpvppu3vj%E#{nRb1|?9d=@)1v^2S)UMmlPYmmyUHpo zEm(oYW(VTz>hBjCyFWg8``8iHdp=8QhQ6By-L8xruD^Wcvh$Fu_g8U^v%{wnX_{0B zw$*)ykBhVsPhApLD1Tvj_Dyz;pl;x`z{ikk*7u}!QBp1ULo`k?1gci>xySkZU3 zbOOD)Y=#==`62RWk7J%~^1GqLC0R4;!iqwp^lhfz94qd-RVN)XdmKIWt@ zKF;bfsyf>nYLooj0n~kM0~chw{E7y@L=sbFS1mn#Si+L`VLBJwwuGx4GuQFk*yK9E zJjQWc?0vxId1%D2v}htYtaE)e&D-efmnl=X5B(5HMKURWgbPFuSTxYp zxaVEt@Qd|FhWaMOQWHft#{{9n2~CEeso_{4+bw_e84mx{d?O6M5OKBd^>By3A=HM; zAHG}$fZj2FS~_8{kMGUN7Dq;!hum4Kvgys4H{qMUHEyWTCtT^xnz&BE6qo@HuHXdytQ{+R3d<7~E!D}s3 z?N2EBd%Vw8!~SW^=p&!s7-;W@5@OBtk7td;OnqsK!S*KM`Q)QF2ak_-cyGS=`3^m# zV^~~kx!I+xj8pdIcBP_PVMF`e97_%1uA=nmWy&-vnyRl9K0-nyfF`wrDQTvPsEq56OVf+v)Chvl3)>p{hE0K@@CH^FrX&<1*#`r+5Ig5>iO`Pp<~)#A zAEL9;%A$0RU|NQ0RtJgI$306*0w>O`x_{qrcsjkZ`pS{s4(~wfx9Ve3JH?V5_`o+5 zvH|xBMC))@u}=t5>Q0ZyJCN%llrE`)XPc2PbY0;cn5zp@(}=_=qLtbK;l%OouV!I6 zmd%T^gr}FeLxWBGHk4@e#eUR_H)ixPHP-)6^vhjkgs^X&k`C zG4o;pN5QfY8ticfbOb1tvV&a6F&+zQ zNU&zUl170*CyHi!IeUiyr$f5(9!VGal$_0*Ff{3o&s^s28C}*?alH7%&9h>^oo^n6 zV2XD(ZF*5?!YK>$aQ0{oOL#l<<9J|TZTal;F_wF+MqhS!FxdYNrR`Eot+OvJ#~O@P zpQJyFXrRwW1{<;{4~yRo6efkEwJ7gg;VS7~nEF0zyx~Z;WA91iyc5GT`@J74+3Q8Y z-8Wj9PM)+{Dq)jJK`-5`cd#rN8NcITGBp9AlyQ1Br3=}=|$wbJ4o!ZXyWKpx*>&+NTXi83N4c7V1q&fHt3NsBeY}7*Fgm@ zpHTh3%moeloFOHB)r&Gc(DlC4^Id2!W6b^?#h*vM9~L~gT*RDb?zSu|n-^$GZs{n9g(RsaBT0aLMh+!)GQB%z6`g;9M# z-i%y&C_CF7MoXEqnvJuxP#wa9x4@~Cm;E%nxVz$~&hQi`OS^ueZl@&aXk5X=UAwx9 z^+Kx;nY}qvk{OZb>JeR@SMn*y)wyItIkV?9-pwDe`i`MW{K1OX7KGEGm?~PU{coO= z-}VA!U$`(FDs14-m+8qLweg4pgpstua>V~MOlSSxiX^u<*rJoY>Z-Hp z3AtN(!pgKy>J?^h8FSnEWLq|k@wuSFWTWSOCgY`XYqZUomSL}rgTsgN2L?L(O|EW` z%Gv2x2c3KZK}tc*q@{ zO4noKM$oA~>hcT)7HMu!%!9PAh0_dMgu$jKD{41zFC{g&_87zWdk4IGY5w^oX?J&FFzY^e9~^pV98xn;n(dBXD*d{;^H6aAH!*Pd zZ;p;6{P=+;E5P3IAdCq;K-dR!n4%PJzef{CyVDrzRxCxBQX}$(7eH(a)`EsJ&uU-x z$~IL5VAphoRp@~>K1Vfcpwq5RJa|w{cJMFp9DeUPmhQR{;R+KR)QAnwCnBwwGw~IE zrHK6=pt=w1wpwyQY4>ZKKU!z65cfX8jowtnSJvWKy^M8QOSu%lun&R}Q)w+JmL zwH^B9)RZql+Um!xV&cWl(`SiW^3Bb^#`h`xsPB>(A{C{99Cbul#pxK)wZ z^z{QNMJnDE=R)P)-UXObo)Yb#G zYGw2~22x^@Vkw?W7znqkNW?B=Lao0-U!?1AVYEE&Y6_jh;MfImHM_fnnjWk2qi7xCK@&;&TDo(Lpc9^Oe=(DYZ(T18B)@DM( z_XJamJwFVRYQ%hX^HQ0sFdUArcoaChb>OuAz0WKq`FbFm!y3z9QZ!^f$TO(k8!gC4 zhi03rPj$#n7a|P;6<#WKP-@czkI$V^Cq;QeQ;Cl|W{TOnMHUOkt6C%SLRhRWrgQL# z<5g_V^DH~l8%jT(_epF(&0qzkVo~-)skO`t2^0pSo3{;<^^qqWlk8XM1sGQ$aW%r_ zQFK5oBjGZ5J(P{Gb^=*lK-cs__O%@7Rf)F{(i*C?6$afHoMfksKndYxT5{~zU<4|KIkKd1ZxO*HO_Bo>zX+WP`2>K71&8|17t7Iy0y70aa8UmQ# zT;>eZ5-=_z{oMy#ym(vMP-dm+2!NUa&S%R6P_i*&Vqo_>DCRBMO6uJ zltvX66rk{44HOov<4Do4q5K}(4MdL8Cx^kTnjDG0ncnz~K1#Su|Dy=2#Ax9rv4 zv|O1dG5%ve9F>m|py-y0{;0hNG96&bbNZ6(1JG3RB$+619k4r6#cro;1$%DUdhmwO zjlEn|yhDejmz^5b%M~@qC+~9cJ>6%{FmM&jh=+PB{jo0|)n8OQ#RVyupmWc}D+f^Z z)*(Bf(K^uLSpxgNx=qTKoCW!Y+G&){p0X35dWd))q!$2{XFihIv;#9_uE?WDW>pwu zxP#S=ISHTH8%p#ISunD!8*F(zY}KAEYC#A>H5PA3LpWcytO_c;hP4@IMNrV(4vJ=Z zx;+1EMNsZih?_8jUqH%w$9HxCS*mI5W&T{qq0;zuS9!=W@&nX4`8^P;O;6%ia&8G* z9UH39OBwu?d6g%Lo@j2`3Pk=$Shr~3#_e^%`h$V$hvwaqZlSc{7&i4&i5jE{(Rn(wqj}f{K9W=HDYHjD1&ZiN zphzw*b~I|E7LX$9Jx!9xYL7`?b%yhq-IV496g8+vaW~)dv}a?)de5p7-4}P1r;h^> zI^ZzBa7{v$I`q zyjRVVJNZ4&TTsi!Pbz=c2P9KEEWDv`t^kF!v9+!({1aA7QE3oz4h43VqFNHTE| zu-!%i{Ey}tu0Se;DSqvi6D~XULnV8%@Uh|xV5SwiB96@9Q$e3MY4shsh$>_|O1BXt z{Acm^q?^e*VZ$7O^d(ta07$D1u-m7meC2Vyg=a~Yk7=6%L#;{50-&t!`bWhqXk+9xwAB&ojAa<_GD6sz*EJK(+sDLvWK zJX6s2+&m2=(W)fO&{n;Fk7PDRXj6>fhSS!xB2t`9;I|<4y5gY4uh1T{B@jK4yaZ}! zpe%>cu^esEB2mMwGl7v2Hxz0gf@ZPvI>Qc{uUE9BI7f%>g@zxP8?&&K$Ir(C^b}r6 z*p4fmRt?u8XOxVV6)W9cze2~?^j5dOkx|ia&7c7YHyo5F;{s?aDD8b54E$WSqBGo8 z?F;J)3vC#tw)`V0K~$DeHo{HuQLh9hA9Q?1WpH)C*Fvw zLu|usMr7RExjhREbpconLq40L56i9N)ngywL`;pKGh!&8ruDu;hb$Z#&w2Ze^%4kt6=@&)Y*3UM( zEA$Wxs&L3l#EQpmCMAq$C(ArwR1;r?eOh3#h-}@*L4)0q3@rdhEjIFksmU_$!XTe@ z-JG>vNFI-()nl0`JJ4$z(4IywIPLvv-gH7e{u-A-ucO8q8bc-xwO%8c@!@>kah#!y z5LnSJzV_^-_KU5seYqml^id<^cv4VY4D@E8tneEuOYGrfPTtT0ha_r?RX7tlt6 zyxBiFY`{^*@%TEumfdmOWJ^1-p7WP; z{;7T$Z+)U4?Y!6Vb3px$qI2EzzN@^VUgsN>ayBEOLb`Zfv21%V5Y)ZuK{Q7QsQ3tq zQMVa;Pjwpe0Rg=CRG|v2bt?}W8&yuNHx{()wyF0d^#(J3?K*io`0{jX;8W$VLH}UB zz+OUTrPg2YhD5e%IiEBk^tjG;fLdj4Q6pkUP(UY6TJDc^gMAXoxF~ATU{K_8Zg6P$ zqPxb!bl+%Aw#{60Zb?aVplvkA?I%<=An7&bMc8Ga8;Y8&8v*{wW8)NkL^<>#UEfMd zn9?{!A_%`;7rHKS5KJu`%gBs8kP{dIwVdiuNt~W}p6-&}=xLr3Vvd=qCaAnn`o!KP zT{uC(!ZaRgwagQ%ji{rNnfN%vwNH^K=|)oWx8{8>;i>vskH*N4=v8drA|(CQoKJcM zslvU7>=Xn8&u6_BwiT6NXDQvYipZOgsS>hgra&_jpwf!@W2Vsa@Ag0|QW#*k7H(^3wQ2Iir))V7H7B&i zg#*Ebt2fFo$X2GQQKSxGhhv)j`7MN6N|e^LY- zs!B>bm6j{5p7-j(!Uw1~+yQ6FI>1p7gv6$ti2YrZ#iUFZMD&ySA29k~Bq8iD^}+ zBqbsrGnGns5JHTZS*5~EhGi5-_IuoQOBlE8E$JR< zi^OS!4YvnO$L&RW0`d~@uGiX!Tw{S09>u?iKyh0evFjxUObg>8JZ1+24R2D9g59H9 zSQTP1K&Gb#{<%sL9lCtvDKoooQQt-m5eOGJ%-qdbduGzR5nf@?a)e;d3B2cdm?~g! zLlC=PLLLHC6H>ii7th$R-?;PUODj&GidR+U^J7#i4&OnslA;t5dp7nsbEcB&bJS*( z>Ho%@q9$uXY8nT|hckXk&JifJ)Nc?5UYD(f4tYUBAZ&->Ji}YdluR1YszrI7&{sVLhQp~2H_Mp-H}!qsGY5{z&>o;I`D z15=+`R6f_yIQR>+WEqlmI)AI;pKBq9p=wCtK(98yK5 z_3lXo%JsESCnr3AvM(cd}ReOv#1x6Z(00p(@n!pUUN@9oAoD2&yYnLUK;Ht@q7RQa)D!x&N^YX2V zeMQIddQh{ZX9Z7dyYwE?uN`%QIop;6gl-8T@H=2J`z8L;XEHT*#5gzoMlFm-)*>A3 zG1^UlbDT;d>>8@m6KbsmgKseEUB58PDlI)`@s1ie8Cq8N-13&*^H&OeYK)(1Be{;- zWNpJcgmw9iu(c7$5s*0s6?TF_44+v;t+$^-IRz6{h;INI$p1M@$$exYw-1LVA$pcfhw2LVj1`ragh8MNUs#fSRpeWB%FY(IF9Nj z38=3J)+OQm#&I6ex*Q( zuo4*xM=3WzGXg~gk6H0jAj%PYO#M+;Y9Y%B1ObeacO@)ex5Y{p=4H56W}x)xrkipx$AlGs9GgQe$O`hE${0JF7nP8Su!LYI z{CR5%M!%&nhaAUVU#l)shJUM~A3U5VeaaOpQR!uVc#%22LUi9WZqHFf>=PKp!b3nt zgG=X!jm2*D57pO!!w4pjzcA%(RDJ5ze#)Q;E56C!nnN8+3C-UZR(>wie6vKop!8Wl z0Dl}7dP(G)?{egh{3Ahn1A806QfR_=7Zy8Fjtd=|unAGOu1U@Bym<50(lfS_m$DQC)^gVMzovR?QGq9LHu2-tjL2WcZ=CnpK^=1_zxhn#E?F7!SnfZrsL z@+QupBiJo|BYgOqsQUXn{mV1W!D#rZDWYMfbFE-F*86$P%{GVL{JK|XIKyO;)n#J0hQtH>%v7CX##N?SHewrwNvH)=yi_};C^ zH5yG;Tm}BYNS;y*qEDH`m3ThCk=u&vOFtYO(RhZ=0NScRU12R?rI~YjdMiU8%g-JE zQ*X80lm8|i!yo?(JBA?zV5)M@B9!NttOlnkd}|Y*z)>n-t*>iW`U#3#7jqfwX5onx z<@)^u%Wh+|m6xFY5pO2mbBxMqNpHd^_R?Z5kXA>uoe=7zl=!7Zbrk1flwE9V?CfHm zy6*mdHoh|6#L%n5Ffj_@p*LWZ+M6Yz1*L07rc}_f)2n~T7%t;%HPYMN(?D&I&1E)G zD#0M1AhE+Fwvqu933yAA=sNTWkaAjvg77=U-4av5Sk6e9BJflYMVZAt8u2$D5yg(Q zyUkdCv{;!tSw;6muTm?dOv1wPw9T`)Y{|ok$$X$w{887 z46&XOe-NrGheY86sH0!H#4Ngc2vtxsF(1b4w0cdEDe{HnMuaJpdR~AOeF7adpw2eX z$}?!0>Ljz*BQ`{!IGu3@h+q7OhC-7&Mj+iK*mof|5kg+~>CXkm6W2mdxk~0qE=^m# zBdnS{vr}{`xJo2t9P8rNro=!5OW!*Cp^vHceVca!#hw;j6=OjtTuse@f}VS2NoF0j zEW@$l2R3L7S?MTIiRCJ^T$Yv+R7U~_?OKouAVzi$nm55fF_Hdu5P3^WNtimvXjYUQ z;y5Z#R=392@4#hrJSv^YRuY~OIL6ILP$Pfc$F1(cbWC?T2;EXH6=Qe4y08;|dB}KA zx7W+`L+;5{)x8*#d35EE7mp1-yr%4{M)`~~Byj!Y86H`p!nTJRi)0^VyQ`pf-FS(M zFp*dGjV`u|IP!-WMj=U}J%ZgvY{RarG>9M8Vp^a^+M~T>?;$D&zOgyiu?W9)|FdC@ zXpPLauoui@-U? zBQ`NZhls6Wl@3Rh0ruNxQ{g7*4}eb-b239zu=p+MqS=Jm{sT77!G1@MT)Sp87loh* zG)uN+*q9J6ruEU%9Xr@#A;ZSf>j<-{;XP0&$Z9Aw^6gn9tN0Xj7_<+gq4ZMOhisTI zz7d|Jwfcn+Q^;kno>V8T3WaTDmEDkdk7U`M>&fk+vDZa#?NF6HG?X&RrmlNNpTBRV zr`pw!!Tk2lP5iA7(IwL9BD;`&`>nn4dPBAyeE}@XKzix`m5YUR*-ZuC7?%SzB}P(e ztviR!N*4uzMkd%wN8xxYe658hFJ>oC;ihaKdt$MlEYTHea8BKh1iX|LT0^Fysd2Qg zc73)+UuATsLi>{mf$?-XHQcz1&t2##)Kz>%+obc_D=a8wEW9Gztzs%>o3+M3p{MQQ z06u2AQi9a<;3Hp}d`l>n{mxQo)o@fH_z7XHWHm_?1d4JLmU^?yL}+ju@ZLE2W)Kf3 zHzbxN6IcDBl!rP}weAOokBDkMj#S3AXzn~+S1ySWhl`8Lmz`m1mL&PENfXTYcfSqb5#P)Vj3&I4Xf!f}r7O(fn?m0&7O22Y1ULiSE5 zM_4wZ`NwBphsPL#m-tRp((^K5Vgq(4U>wnUmcqH5ky$)Fqmul|K3g zW)mSLswo@>e+7_lzhi5S3o+D@8sxw;J3Gs0PJLn?$_onQS>Gn?EcLB7gRD6Q>Yc{3 ztJ-WK7ol|{3(V45sb*IG868vO7~%gwShnM@?hk))R%0NF+$&;n-FS&pSX3FMQHK|~ z2OE&arenx$GmM%h!Ua%Yi+5e*4`P?`9!tS5-rc|g|vG9q}K=MY;gStT%Ni7v1> z&ta@R2kn3*kQC+smYQUpWv{dFCyns+PInt?_gt~K#K}yuwqZ(6RsZbySRIZJqH3Kx z6|x}BTJX$FPGYCo1e6gwzds1-Wx3TahE8YK)k|GV2WDFvkOQ78T`*2PovTLY zww2vM{sf{A`=*QE*6I8CRt2b5!B*^@2i81gI}B5sM(YhFZ!sZ{X1Z2X3Z@gz=MVX{ z>u1;~3+Uw?u1B8bywCCL@U*m?rs#Rji{IP1iF50xrkK&9iH{)5y;Amxi2~DxJV0u5 zR-n+V4C911mkl&FX_@xc!U`ca=Tw4_!I^$~NeFLDtKTBDtgjLL@anfPj7L?`Uc9Ig zFz(LQksNv@mO+}c8)BZfx!2t&N_Dk&Fid>7SNlWGew%1IEzc)!xQMlI&N+!s&6rMM zFMciS7S@ajk+Dd@U+^<=CL|@}vW>E?jQOUSO_0232yDJTeptIlwk?9x=&p5Gh-{|Z zs^0;fFOE2Df9Pl*(^@c`n%BnNL#x{_wkh}hwW6XzFzab_pal%kba#BTdv~F8lHN6w zOI!9}U3G>N0>{H^os+0kR!SlyRlw{0Hbbe*9k$5$A%lrM;3dWs! z=z9L<7!khHfh`cHZvNhE9a1Ty%WAF=ws0trc6c*iXHbL!J@&9cax-SPG;2u?9JVB+ zGGZ@CB;BtGd>X1SJ2Ou}t}(&&YXv6FjtOq{y5hiOf5{$BbfJYV2kqksLd(RymP2wJ&5cTYVnn2NHGx-u#hVLS2<`ft za`srE-s@3&zm=w@AG%uCe`qv7G#4HgQ#LhPmorQ_4z3wdf=L9Wo0*NW5AZ7MMC7H; z6+~uwwq{?w2?Pf?T8Uu5L*qJ|7j`5&r4qWM>y}*hPGG=C3lbYhYe>Fq@aQ+tfwgLu1gJ&=+~^&km~i1wlgPX7tf#{9 zZ$|`HBE1KPI2!m(-QR!?jl|Wt4Qo1mcWNGqs}Zh|9F2ZtabWmleOgEX$Nn;eu}Bl{ z{oFTC8vRx@BWXuqC^0geY|4o?H?*5iORZU$$KD>ro&q}`2Dt$b%@_Hx1Zy5ZdJtZ8 zKuW2N79((;=+4{Rmt-D1p157I7Nn3v-e-EUm5Ck}+t>r18(A-3l*fd($DEuM#;m5> z4PfcvB|TRr+a2bit(n=G*k}ysJSDKoSyzBKn$YDO<;DE{4x9W4Y`l#V*jO~majz7_# zj}q5ZyGvBl?Ylvli!l%`x&&97Q{}mvJ zU;o4@A4svz1Y@B(JiU)hqFtF zbm&sCEZOXB$v zqzvbwsV9(pL$*#PhyAup8Tc9o`8|;wNpEsD(;pGQPSrw0?&5f|#YwKd z_1V`i$o5_Per3+q9X3UuEy~~Aa4_he20kMoxL^GFCDT5Ql6Zgf06j*$D=ob$t*&=I zaI{CNRAT%0eGvcZ4D?^<*Y>|y(LZHb^q<>R{Xd(x{|_$xze%p&^$+Fx%0a0+`z2x$ z@_h!IiLIHD)C)}Et8KP<&Xf0{8-@OhvW5d z$Bi;Y!K;MEOth*4b9y5@L!;e{Wv(|Esa|9k82aW*V_?i%+8usV_8;<}4CU&#Rz~ok0 zex%=l@oD=&Bg3cT!LPPoCkE8wrD9Kv(bwai{JkOP6?LEW+D=(BFJ3w}oPqb*n}nEj z-Ni&nz zFDPlJ9Wx%d)tAeqXRVp#()xlMd+s@R;dP&R)=Z3fV^8aL8}G4M*xi#D*mm;uSGl+q z4{xsid42F|i<_%|-=2I-;YWK=rqaJ9lmFR``!hj(bxBS|JIO+oyBhr_P4@dl+Wjwq zuj+a<_4W0+m~y*)-34d8s!U9V-1K^H+H?I7zol2EOl&@O&DMU_Mt_i8m=umXG^71K zJ<{$(+G3SBM&yIOT=VO(&d&}xnhHH&URSt!o!O`by=OKZ*BFn(!9UN)m-L{9M+jg=# z01$1gm%9IT zEY3@hJO#D|J;;S~F(~mIQV@C+{0b)^L;J|#vL$Z!Eg7aMW-d-mINZWee!xy5r6!BTkzcv8QbtC;Ou2ZmQwA4T z)z;}XBDTB`wBH;!*Ge;~EI+87o8h-^LMQE1Tid>S;WoQ&{XRaUHswVtcBp*)e0rE% zZsW15$|l4qY?A8j>yl*bn_G_-*A0p5u%AO{3ErCWh0cbncm9wtIxTn`nRL?B^bEVr z?#7qJ)&?=EMw}@%aq6w~3*7aiG%lr(J<;{qHsX-IW@^)hcYEY6TicJz2br#_`Q={W z<`&q4pu4!eR8!YcPv6J9Bih7-y!z4)4QF=@`n~#LPTyjyT%S~6`dmsJy{0SMQT!)ha#4yE_X7BWmD!ZNCEfrCC&y_??rCE)19HY=C0W+}jEQ!bL7 zW*PJ?gVAO1zMSkVCt=G;>;FYbK56FcAH@gw7v6%jkH9=Bcxe09*pk#_mQ}d3y@Jti zjIZ%{Gnsm2^VgRZaSbdz-}SrBJZri8M6T$`$}E#rG z$nQB5d5PjFe{puWJZTU8^5?Hzk25D1@@x)^YElB`S>wpwobuqisNFq< zn*#crZ3yY@=-}r64FvkvtyCWyU69UuAQaYlHy*`EmgZ$aGtjXP1m701V79G zqUucgyQ$HzsG@?CYs_FjW@IsD?yBK3M%h%CM)Kdyb6OKcmc-65raH!#@Q1l-Fi_oEu>li8OmtL*)Peq$c8-No5cbAUCt8oA7ttN zQ<>vG6QKXk{vnqh(ieCP_yFO^MIGA$LJ-iXk`7u@ax6OEV88E<2$a2v@{!#~^%D>. -You need the following permissions to use the Data Visualizer with file upload: +You need the following permissions to use the {data-viz} with file upload: * cluster privileges: `monitor`, `manage_ingest_pipelines` * index privileges: `read`, `manage`, `index` For more information, see {ref}/security-privileges.html[Security privileges] -and {ref}/built-in-roles.html[Built-in roles]. +and {ml-docs}/setup.html[Set up {ml-features}]. -- From 840808c9422c31b1a36ca001804f02da6fa87799 Mon Sep 17 00:00:00 2001 From: Jen Huang Date: Tue, 21 Apr 2020 09:43:17 -0700 Subject: [PATCH 03/34] Include datasource UUID in agent config yaml, adjust overflow height of yaml view (#64027) --- .../datasource_to_agent_datasource.test.ts | 36 +++++++++++++++---- .../datasource_to_agent_datasource.ts | 3 +- .../common/types/models/agent_config.ts | 6 ++-- .../details_page/components/yaml/index.tsx | 4 ++- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts index 3496ea782ee997..17509571f19853 100644 --- a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts +++ b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.test.ts @@ -3,11 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { NewDatasource, DatasourceInput } from '../types'; +import { Datasource, NewDatasource, DatasourceInput } from '../types'; import { storedDatasourceToAgentDatasource } from './datasource_to_agent_datasource'; describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { - const mockDatasource: NewDatasource = { + const mockNewDatasource: NewDatasource = { name: 'mock-datasource', description: '', config_id: '', @@ -17,6 +17,12 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { inputs: [], }; + const mockDatasource: Datasource = { + ...mockNewDatasource, + id: 'some-uuid', + revision: 1, + }; + const mockInput: DatasourceInput = { type: 'test-logs', enabled: true, @@ -70,7 +76,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { it('returns agent datasource config for datasource with no inputs', () => { expect(storedDatasourceToAgentDatasource(mockDatasource)).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -87,7 +94,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { }, }) ).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -99,9 +107,21 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { }); }); + it('uses name for id when id is not provided in case of new datasource', () => { + expect(storedDatasourceToAgentDatasource(mockNewDatasource)).toEqual({ + id: 'mock-datasource', + name: 'mock-datasource', + namespace: 'default', + enabled: true, + use_output: 'default', + inputs: [], + }); + }); + it('returns agent datasource config with flattened input and package stream', () => { expect(storedDatasourceToAgentDatasource({ ...mockDatasource, inputs: [mockInput] })).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -140,7 +160,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { ], }) ).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', @@ -169,7 +190,8 @@ describe('Ingest Manager - storedDatasourceToAgentDatasource', () => { inputs: [{ ...mockInput, enabled: false }], }) ).toEqual({ - id: 'mock-datasource', + id: 'some-uuid', + name: 'mock-datasource', namespace: 'default', enabled: true, use_output: 'default', diff --git a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts index b509878b7f9452..9e09d3fa3153a0 100644 --- a/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts +++ b/x-pack/plugins/ingest_manager/common/services/datasource_to_agent_datasource.ts @@ -12,7 +12,8 @@ export const storedDatasourceToAgentDatasource = ( const { name, namespace, enabled, package: pkg, inputs } = datasource; const fullDatasource: FullAgentConfigDatasource = { - id: name, + id: 'id' in datasource ? datasource.id : name, + name, namespace, enabled, use_output: DEFAULT_OUTPUT.name, // TODO: hardcoded to default output for now diff --git a/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts b/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts index 002c3784446a8e..2372caee512af6 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/agent_config.ts @@ -34,8 +34,10 @@ export interface AgentConfig extends NewAgentConfig, SavedObjectAttributes { revision: number; } -export type FullAgentConfigDatasource = Pick & { - id: string; +export type FullAgentConfigDatasource = Pick< + Datasource, + 'id' | 'name' | 'namespace' | 'enabled' +> & { package?: Pick; use_output: string; inputs: Array< diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx index 56b109a9bc062f..ad27c590d5eaae 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/agent_config/details_page/components/yaml/index.tsx @@ -27,7 +27,9 @@ import { Loading } from '../../../../../components'; const CONFIG_KEYS_ORDER = [ 'id', + 'name', 'revision', + 'type', 'outputs', 'datasources', 'enabled', @@ -52,7 +54,7 @@ export const ConfigYamlView = memo<{ config: AgentConfig }>(({ config }) => { return ( - + {dump(fullConfigRequest.data.item, { sortKeys: (keyA: string, keyB: string) => { const indexA = CONFIG_KEYS_ORDER.indexOf(keyA); From 0c14424321256103abd267975a2ba13b9f727d26 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Tue, 21 Apr 2020 10:55:42 -0600 Subject: [PATCH 04/34] [SIEM] [Cases] Tags suggestions (#63878) --- .../pages/case/components/__mock__/form.ts | 6 +++ .../case/components/create/index.test.tsx | 45 ++++++++++++++++- .../pages/case/components/create/index.tsx | 49 ++++++++++++++++++- .../case/components/tag_list/index.test.tsx | 44 ++++++++++++++++- .../pages/case/components/tag_list/index.tsx | 45 +++++++++++++++-- .../user_action_tree/index.test.tsx | 6 +-- .../plugins/siem/public/shared_imports.ts | 2 + 7 files changed, 184 insertions(+), 13 deletions(-) diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts b/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts index 9d2ac29bc47d7d..cc01edcfaab112 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/__mock__/form.ts @@ -3,6 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { useForm } from '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; +jest.mock( + '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' +); export const mockFormHook = { isSubmitted: false, isSubmitting: false, @@ -35,3 +39,5 @@ export const getFormMock = (sampleData: any) => ({ }), getFormData: () => sampleData, }); + +export const useFormMock = useForm as jest.Mock; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx index d480744fc932a7..0897be6310fa2e 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.test.tsx @@ -14,6 +14,8 @@ import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; import { usePostCase } from '../../../../containers/case/use_post_case'; +import { useGetTags } from '../../../../containers/case/use_get_tags'; + jest.mock('../../../../components/timeline/insert_timeline_popover/use_insert_timeline'); jest.mock('../../../../containers/case/use_post_case'); import { useForm } from '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; @@ -22,6 +24,14 @@ import { SiemPageName } from '../../../home/types'; jest.mock( '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); +jest.mock('../../../../containers/case/use_get_tags'); +jest.mock( + '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', + () => ({ + FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => + children({ tags: ['rad', 'dude'] }), + }) +); export const useFormMock = useForm as jest.Mock; @@ -40,9 +50,11 @@ const defaultInsertTimeline = { handleCursorChange, handleOnTimelineChange, }; + +const sampleTags = ['coke', 'pepsi']; const sampleData = { description: 'what a great description', - tags: ['coke', 'pepsi'], + tags: sampleTags, title: 'what a cool title', }; const defaultPostCase = { @@ -52,14 +64,28 @@ const defaultPostCase = { postCase, }; describe('Create case', () => { + // Suppress warnings about "noSuggestions" prop + /* eslint-disable no-console */ + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ + const fetchTags = jest.fn(); const formHookMock = getFormMock(sampleData); - beforeEach(() => { jest.resetAllMocks(); useInsertTimelineMock.mockImplementation(() => defaultInsertTimeline); usePostCaseMock.mockImplementation(() => defaultPostCase); useFormMock.mockImplementation(() => ({ form: formHookMock })); jest.spyOn(routeData, 'useLocation').mockReturnValue(mockLocation); + (useGetTags as jest.Mock).mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); }); it('should post case on submit click', async () => { @@ -118,4 +144,19 @@ describe('Create case', () => { ); expect(wrapper.find(`[data-test-subj="create-case-loading-spinner"]`).exists()).toBeTruthy(); }); + it('Tag options render with new tags added', () => { + const wrapper = mount( + + + + + + ); + expect( + wrapper + .find(`[data-test-subj="caseTags"] [data-test-subj="input"]`) + .first() + .prop('options') + ).toEqual([{ label: 'coke' }, { label: 'pepsi' }, { label: 'rad' }, { label: 'dude' }]); + }); }); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx index 53b792bb9b5ebb..0f819f961b3963 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/create/index.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { EuiButton, EuiButtonEmpty, @@ -15,8 +15,16 @@ import { import styled, { css } from 'styled-components'; import { Redirect } from 'react-router-dom'; +import { isEqual } from 'lodash/fp'; import { CasePostRequest } from '../../../../../../../../plugins/case/common/api'; -import { Field, Form, getUseField, useForm, UseField } from '../../../../shared_imports'; +import { + Field, + Form, + getUseField, + useForm, + UseField, + FormDataProvider, +} from '../../../../shared_imports'; import { usePostCase } from '../../../../containers/case/use_post_case'; import { schema } from './schema'; import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; @@ -24,6 +32,7 @@ import { useInsertTimeline } from '../../../../components/timeline/insert_timeli import * as i18n from '../../translations'; import { SiemPageName } from '../../../home/types'; import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; +import { useGetTags } from '../../../../containers/case/use_get_tags'; export const CommonUseField = getUseField({ component: Field }); @@ -59,6 +68,21 @@ export const Create = React.memo(() => { options: { stripEmptyFields: false }, schema, }); + const { tags: tagOptions } = useGetTags(); + const [options, setOptions] = useState( + tagOptions.map(label => ({ + label, + })) + ); + useEffect( + () => + setOptions( + tagOptions.map(label => ({ + label, + })) + ), + [tagOptions] + ); const { handleCursorChange, handleOnTimelineChange } = useInsertTimeline( form, 'description' @@ -108,6 +132,8 @@ export const Create = React.memo(() => { fullWidth: true, placeholder: '', disabled: isLoading, + options, + noSuggestions: false, }, }} /> @@ -131,6 +157,25 @@ export const Create = React.memo(() => { }} /> + + {({ tags: anotherTags }) => { + const current: string[] = options.map(opt => opt.label); + const newOptions = anotherTags.reduce((acc: string[], item: string) => { + if (!acc.includes(item)) { + return [...acc, item]; + } + return acc; + }, current); + if (!isEqual(current, newOptions)) { + setOptions( + newOptions.map((label: string) => ({ + label, + })) + ); + } + return null; + }} + ({ + FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => + children({ tags: ['rad', 'dude'] }), + }) +); const onSubmit = jest.fn(); const defaultProps = { disabled: false, @@ -26,11 +35,27 @@ const defaultProps = { }; describe('TagList ', () => { + // Suppress warnings about "noSuggestions" prop + /* eslint-disable no-console */ + const originalError = console.error; + beforeAll(() => { + console.error = jest.fn(); + }); + afterAll(() => { + console.error = originalError; + }); + /* eslint-enable no-console */ const sampleTags = ['coke', 'pepsi']; + const fetchTags = jest.fn(); const formHookMock = getFormMock({ tags: sampleTags }); beforeEach(() => { jest.resetAllMocks(); (useForm as jest.Mock).mockImplementation(() => ({ form: formHookMock })); + + (useGetTags as jest.Mock).mockImplementation(() => ({ + tags: sampleTags, + fetchTags, + })); }); it('Renders no tags, and then edit', () => { const wrapper = mount( @@ -80,6 +105,23 @@ describe('TagList ', () => { expect(onSubmit).toBeCalledWith(sampleTags); }); }); + it('Tag options render with new tags added', () => { + const wrapper = mount( + + + + ); + wrapper + .find(`[data-test-subj="tag-list-edit-button"]`) + .last() + .simulate('click'); + expect( + wrapper + .find(`[data-test-subj="caseTags"] [data-test-subj="input"]`) + .first() + .prop('options') + ).toEqual([{ label: 'coke' }, { label: 'pepsi' }, { label: 'rad' }, { label: 'dude' }]); + }); it('Cancels on cancel', async () => { const props = { ...defaultProps, diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx index 9bac000b93235d..c96ae09706426c 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useCallback, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { EuiText, EuiHorizontalRule, @@ -17,10 +17,12 @@ import { EuiLoadingSpinner, } from '@elastic/eui'; import styled, { css } from 'styled-components'; +import { isEqual } from 'lodash/fp'; import * as i18n from './translations'; -import { Form, useForm } from '../../../../shared_imports'; +import { Form, FormDataProvider, useForm } from '../../../../shared_imports'; import { schema } from './schema'; import { CommonUseField } from '../create'; +import { useGetTags } from '../../../../containers/case/use_get_tags'; interface TagListProps { disabled?: boolean; @@ -54,6 +56,22 @@ export const TagList = React.memo( setIsEditTags(false); } }, [form, onSubmit]); + const { tags: tagOptions } = useGetTags(); + const [options, setOptions] = useState( + tagOptions.map(label => ({ + label, + })) + ); + + useEffect( + () => + setOptions( + tagOptions.map(label => ({ + label, + })) + ), + [tagOptions] + ); return ( @@ -75,7 +93,7 @@ export const TagList = React.memo( )} - + {tags.length === 0 && !isEditTags &&

{i18n.NO_TAGS}

} {tags.length > 0 && !isEditTags && @@ -98,9 +116,30 @@ export const TagList = React.memo( euiFieldProps: { fullWidth: true, placeholder: '', + options, + noSuggestions: false, }, }} /> + + {({ tags: anotherTags }) => { + const current: string[] = options.map(opt => opt.label); + const newOptions = anotherTags.reduce((acc: string[], item: string) => { + if (!acc.includes(item)) { + return [...acc, item]; + } + return acc; + }, current); + if (!isEqual(current, newOptions)) { + setOptions( + newOptions.map((label: string) => ({ + label, + })) + ); + } + return null; + }} + diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx index 1c71260422d4b1..ff402e8ea1c8b4 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx @@ -8,17 +8,13 @@ import React from 'react'; import { mount } from 'enzyme'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { getFormMock } from '../__mock__/form'; +import { getFormMock, useFormMock } from '../__mock__/form'; import { useUpdateComment } from '../../../../containers/case/use_update_comment'; import { basicCase, getUserAction } from '../../../../containers/case/mock'; import { UserActionTree } from './'; import { TestProviders } from '../../../../mock'; -import { useFormMock } from '../create/index.test'; import { wait } from '../../../../lib/helpers'; import { act } from 'react-dom/test-utils'; -jest.mock( - '../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' -); const fetchUserActions = jest.fn(); const onUpdateField = jest.fn(); diff --git a/x-pack/legacy/plugins/siem/public/shared_imports.ts b/x-pack/legacy/plugins/siem/public/shared_imports.ts index c83433ef129c97..0c0ac637a42293 100644 --- a/x-pack/legacy/plugins/siem/public/shared_imports.ts +++ b/x-pack/legacy/plugins/siem/public/shared_imports.ts @@ -8,6 +8,7 @@ export { getUseField, getFieldValidityAndErrorMessage, FieldHook, + FieldValidateResponse, FIELD_TYPES, Form, FormData, @@ -17,6 +18,7 @@ export { UseField, useForm, ValidationFunc, + VALIDATION_TYPES, } from '../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib'; export { Field, From b7aab690f4007fa66e120a2d2dde3f6215c21a17 Mon Sep 17 00:00:00 2001 From: Ben Skelker <54019610+benskelker@users.noreply.github.com> Date: Tue, 21 Apr 2020 20:14:25 +0300 Subject: [PATCH 05/34] [Docs]7.7 SIEM doc updates (#63951) * SIEM section doc updates * corrections * more corrections --- docs/management/advanced-options.asciidoc | 2 ++ docs/siem/images/cases-ui.png | Bin 0 -> 312096 bytes docs/siem/siem-ui.asciidoc | 18 +++++++++++++++++- 3 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 docs/siem/images/cases-ui.png diff --git a/docs/management/advanced-options.asciidoc b/docs/management/advanced-options.asciidoc index f62a4d28dfc0df..7081590931a992 100644 --- a/docs/management/advanced-options.asciidoc +++ b/docs/management/advanced-options.asciidoc @@ -217,6 +217,8 @@ might increase the search time. This setting is off by default. Users must opt-i [horizontal] `siem:defaultAnomalyScore`:: The threshold above which Machine Learning job anomalies are displayed in the SIEM app. `siem:defaultIndex`:: A comma-delimited list of Elasticsearch indices from which the SIEM app collects events. +`siem:ipReputationLinks`:: A JSON array containing links for verifying the reputation of an IP address. The links are displayed on +{siem-guide}/siem-ui-overview.html#network-ui[IP detail] pages. `siem:enableNewsFeed`:: Enables the security news feed on the SIEM *Overview* page. `siem:newsFeedUrl`:: The URL from which the security news feed content is diff --git a/docs/siem/images/cases-ui.png b/docs/siem/images/cases-ui.png new file mode 100644 index 0000000000000000000000000000000000000000..b513efb6647407801733be975c6c1c8d0fc2a420 GIT binary patch literal 312096 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%0ATctif&rE_w5iAW-AteqWx_9mA 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

u<^4h}^zlq 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

Default refresh interval for the SIEM time filter, in milliseconds.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [DEFAULT_SIEM_TIME_RANGE]: { - type: 'json', - name: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeLabel', { - defaultMessage: 'Time filter period', - }), - value: `{ - "from": "${DEFAULT_FROM}", - "to": "${DEFAULT_TO}" -}`, - description: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeDescription', { - defaultMessage: '

Default period of time in the SIEM time filter.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [DEFAULT_INDEX_KEY]: { - name: i18n.translate('xpack.siem.uiSettings.defaultIndexLabel', { - defaultMessage: 'Elasticsearch indices', - }), - value: DEFAULT_INDEX_PATTERN, - description: i18n.translate('xpack.siem.uiSettings.defaultIndexDescription', { - defaultMessage: - '

Comma-delimited list of Elasticsearch indices from which the SIEM app collects events.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [DEFAULT_ANOMALY_SCORE]: { - name: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreLabel', { - defaultMessage: 'Anomaly threshold', - }), - value: 50, - type: 'number', - description: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreDescription', { - defaultMessage: - '

Value above which Machine Learning job anomalies are displayed in the SIEM app.

Valid values: 0 to 100.

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [ENABLE_NEWS_FEED_SETTING]: { - name: i18n.translate('xpack.siem.uiSettings.enableNewsFeedLabel', { - defaultMessage: 'News feed', - }), - value: true, - description: i18n.translate('xpack.siem.uiSettings.enableNewsFeedDescription', { - defaultMessage: '

Enables the News feed

', - }), - type: 'boolean', - category: ['siem'], - requiresPageReload: true, - }, - [NEWS_FEED_URL_SETTING]: { - name: i18n.translate('xpack.siem.uiSettings.newsFeedUrl', { - defaultMessage: 'News feed URL', - }), - value: NEWS_FEED_URL_SETTING_DEFAULT, - description: i18n.translate('xpack.siem.uiSettings.newsFeedUrlDescription', { - defaultMessage: '

News feed content will be retrieved from this URL

', - }), - category: ['siem'], - requiresPageReload: true, - }, - [IP_REPUTATION_LINKS_SETTING]: { - name: i18n.translate('xpack.siem.uiSettings.ipReputationLinks', { - defaultMessage: 'IP Reputation Links', - }), - value: IP_REPUTATION_LINKS_SETTING_DEFAULT, - type: 'json', - description: i18n.translate('xpack.siem.uiSettings.ipReputationLinksDescription', { - defaultMessage: - 'Array of URL templates to build the list of reputation URLs to be displayed on the IP Details page.', - }), - category: ['siem'], - requiresPageReload: true, - }, - }, mappings: savedObjectMappings, }, config(Joi: Root) { diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index b9ec1c2e92438b..29a6999025e1fc 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -42,6 +42,7 @@ import { } from './saved_objects'; import { SiemClientFactory } from './client'; import { createConfig$, ConfigType } from './config'; +import { initUiSettings } from './ui_settings'; export { CoreSetup, CoreStart }; @@ -86,6 +87,8 @@ export class Plugin { ); } + initUiSettings(core.uiSettings); + const router = core.http.createRouter(); core.http.registerRouteHandlerContext(this.name, (context, request, response) => ({ getSiemClient: () => this.siemClientFactory.create(request), diff --git a/x-pack/plugins/siem/server/ui_settings.ts b/x-pack/plugins/siem/server/ui_settings.ts new file mode 100644 index 00000000000000..26b7fd72571afe --- /dev/null +++ b/x-pack/plugins/siem/server/ui_settings.ts @@ -0,0 +1,141 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { schema } from '@kbn/config-schema'; + +import { CoreSetup } from '../../../../src/core/server'; +import { + DEFAULT_INDEX_KEY, + DEFAULT_INDEX_PATTERN, + DEFAULT_ANOMALY_SCORE, + DEFAULT_SIEM_TIME_RANGE, + DEFAULT_SIEM_REFRESH_INTERVAL, + DEFAULT_INTERVAL_PAUSE, + DEFAULT_INTERVAL_VALUE, + DEFAULT_FROM, + DEFAULT_TO, + ENABLE_NEWS_FEED_SETTING, + NEWS_FEED_URL_SETTING, + NEWS_FEED_URL_SETTING_DEFAULT, + IP_REPUTATION_LINKS_SETTING, + IP_REPUTATION_LINKS_SETTING_DEFAULT, +} from '../common/constants'; + +export const initUiSettings = (uiSettings: CoreSetup['uiSettings']) => { + uiSettings.register({ + [DEFAULT_SIEM_REFRESH_INTERVAL]: { + type: 'json', + name: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalLabel', { + defaultMessage: 'Time filter refresh interval', + }), + value: `{ + "pause": ${DEFAULT_INTERVAL_PAUSE}, + "value": ${DEFAULT_INTERVAL_VALUE} +}`, + description: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalDescription', { + defaultMessage: + '

Default refresh interval for the SIEM time filter, in milliseconds.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.object({ + value: schema.number(), + pause: schema.boolean(), + }), + }, + [DEFAULT_SIEM_TIME_RANGE]: { + type: 'json', + name: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeLabel', { + defaultMessage: 'Time filter period', + }), + value: `{ + "from": "${DEFAULT_FROM}", + "to": "${DEFAULT_TO}" +}`, + description: i18n.translate('xpack.siem.uiSettings.defaultTimeRangeDescription', { + defaultMessage: '

Default period of time in the SIEM time filter.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.object({ + from: schema.string(), + to: schema.string(), + }), + }, + [DEFAULT_INDEX_KEY]: { + name: i18n.translate('xpack.siem.uiSettings.defaultIndexLabel', { + defaultMessage: 'Elasticsearch indices', + }), + value: DEFAULT_INDEX_PATTERN, + description: i18n.translate('xpack.siem.uiSettings.defaultIndexDescription', { + defaultMessage: + '

Comma-delimited list of Elasticsearch indices from which the SIEM app collects events.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.arrayOf(schema.string()), + }, + [DEFAULT_ANOMALY_SCORE]: { + name: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreLabel', { + defaultMessage: 'Anomaly threshold', + }), + value: 50, + type: 'number', + description: i18n.translate('xpack.siem.uiSettings.defaultAnomalyScoreDescription', { + defaultMessage: + '

Value above which Machine Learning job anomalies are displayed in the SIEM app.

Valid values: 0 to 100.

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.number(), + }, + [ENABLE_NEWS_FEED_SETTING]: { + name: i18n.translate('xpack.siem.uiSettings.enableNewsFeedLabel', { + defaultMessage: 'News feed', + }), + value: true, + description: i18n.translate('xpack.siem.uiSettings.enableNewsFeedDescription', { + defaultMessage: '

Enables the News feed

', + }), + type: 'boolean', + category: ['siem'], + requiresPageReload: true, + schema: schema.boolean(), + }, + [NEWS_FEED_URL_SETTING]: { + name: i18n.translate('xpack.siem.uiSettings.newsFeedUrl', { + defaultMessage: 'News feed URL', + }), + value: NEWS_FEED_URL_SETTING_DEFAULT, + description: i18n.translate('xpack.siem.uiSettings.newsFeedUrlDescription', { + defaultMessage: '

News feed content will be retrieved from this URL

', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.string(), + }, + [IP_REPUTATION_LINKS_SETTING]: { + name: i18n.translate('xpack.siem.uiSettings.ipReputationLinks', { + defaultMessage: 'IP Reputation Links', + }), + value: IP_REPUTATION_LINKS_SETTING_DEFAULT, + type: 'json', + description: i18n.translate('xpack.siem.uiSettings.ipReputationLinksDescription', { + defaultMessage: + 'Array of URL templates to build the list of reputation URLs to be displayed on the IP Details page.', + }), + category: ['siem'], + requiresPageReload: true, + schema: schema.arrayOf( + schema.object({ + name: schema.string(), + url_template: schema.string(), + }) + ), + }, + }); +}; From ff5971ac170ce557fb6b1563af4e2ee442216791 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 21 Apr 2020 14:27:10 -0500 Subject: [PATCH 08/34] [SIEM] Server NP Followup (#64010) * Remove unused file This was moved to a constant in common/constants. * Remove unused types Omit is now part of Typescript, and Pick3 is unused. * Define and export SIEM's plugin contracts They're empty for now. * Import config type from config file Instead of our plugin index, which could only cause circular dependencies. * SiemClient API uses getter function instead of direct property access * Add public mock for SiemClient * Fix typo in extract-mitre-attacks script We were backgrounding the process (&) instead of ANDing it with the linting. Whoops! * Remove missed instance of old siemClient API I missed this one when grepping, but typescript and CI saved me. * Use our client mock in our test suite This was causing some test failures as I forgot to update the client mock * Update script following updates to the output's usage This was changed in https://github.com/elastic/kibana/pull/55883 but the script was not updated accordingly. --- .../siem/common/default_index_pattern.ts | 15 --------------- x-pack/plugins/siem/common/utility_types.ts | 6 ------ x-pack/plugins/siem/package.json | 2 +- .../scripts/extract_tactics_techniques_mitre.js | 2 +- .../plugins/siem/server/client/client.test.ts | 4 ++-- x-pack/plugins/siem/server/client/client.ts | 6 ++++-- x-pack/plugins/siem/server/client/factory.ts | 2 +- x-pack/plugins/siem/server/index.ts | 4 ++-- .../routes/__mocks__/request_context.ts | 3 ++- .../routes/index/create_index_route.ts | 2 +- .../routes/index/delete_index_route.ts | 2 +- .../routes/index/read_index_route.ts | 2 +- .../routes/privileges/read_privileges_route.ts | 2 +- .../routes/rules/add_prepackaged_rules_route.ts | 2 +- .../routes/rules/create_rules_bulk_route.ts | 2 +- .../routes/rules/create_rules_route.ts | 2 +- .../routes/rules/export_rules_route.ts | 2 +- .../routes/rules/import_rules_route.test.ts | 1 + .../routes/rules/import_rules_route.ts | 4 ++-- .../routes/rules/update_rules_bulk_route.ts | 2 +- .../routes/rules/update_rules_route.ts | 2 +- .../routes/signals/open_close_signals_route.ts | 2 +- .../routes/signals/query_signals_route.ts | 2 +- .../timeline/routes/export_timelines_route.ts | 2 +- .../timeline/routes/import_timelines_route.ts | 2 +- x-pack/plugins/siem/server/lib/types.ts | 2 +- x-pack/plugins/siem/server/mocks.ts | 17 +++++++++++++++++ x-pack/plugins/siem/server/plugin.ts | 14 ++++++++++++-- x-pack/plugins/siem/server/routes/index.ts | 2 +- 29 files changed, 61 insertions(+), 51 deletions(-) delete mode 100644 x-pack/plugins/siem/common/default_index_pattern.ts create mode 100644 x-pack/plugins/siem/server/mocks.ts diff --git a/x-pack/plugins/siem/common/default_index_pattern.ts b/x-pack/plugins/siem/common/default_index_pattern.ts deleted file mode 100644 index 4d53aeb000c557..00000000000000 --- a/x-pack/plugins/siem/common/default_index_pattern.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -/** The comma-delimited list of Elasticsearch indices from which the SIEM app collects events */ -export const defaultIndexPattern = [ - 'apm-*-transaction*', - 'auditbeat-*', - 'endgame-*', - 'filebeat-*', - 'packetbeat-*', - 'winlogbeat-*', -]; diff --git a/x-pack/plugins/siem/common/utility_types.ts b/x-pack/plugins/siem/common/utility_types.ts index c7bbdbfccf0822..b46ccdbbe3d05a 100644 --- a/x-pack/plugins/siem/common/utility_types.ts +++ b/x-pack/plugins/siem/common/utility_types.ts @@ -6,12 +6,6 @@ import { ReactNode } from 'react'; -export type Pick3 = { - [P1 in K1]: { [P2 in K2]: { [P3 in K3]: T[K1][K2][P3] } }; -}; - -export type Omit = Pick>; - // This type is for typing EuiDescriptionList export interface DescriptionList { title: NonNullable; diff --git a/x-pack/plugins/siem/package.json b/x-pack/plugins/siem/package.json index 1fcef46243628c..31c930dce71c06 100644 --- a/x-pack/plugins/siem/package.json +++ b/x-pack/plugins/siem/package.json @@ -5,7 +5,7 @@ "private": true, "license": "Elastic-License", "scripts": { - "extract-mitre-attacks": "node scripts/extract_tactics_techniques_mitre.js & node ../../../scripts/eslint ../../legacy/plugins/siem/public/pages/detection_engine/mitre/mitre_tactics_techniques.ts --fix", + "extract-mitre-attacks": "node scripts/extract_tactics_techniques_mitre.js && node ../../../scripts/eslint ../../legacy/plugins/siem/public/pages/detection_engine/mitre/mitre_tactics_techniques.ts --fix", "build-graphql-types": "node scripts/generate_types_from_graphql.js", "cypress:open": "cypress open --config-file ./cypress/cypress.json", "cypress:run": "cypress run --spec ./cypress/integration/**/*.spec.ts --config-file ./cypress/cypress.json --reporter ../../node_modules/cypress-multi-reporters --reporter-options configFile=./cypress/reporter_config.json; status=$?; ../../node_modules/.bin/mochawesome-merge --reportDir ../../../target/kibana-siem/cypress/results > ../../../target/kibana-siem/cypress/results/output.json; ../../../node_modules/.bin/marge ../../../target/kibana-siem/cypress/results/output.json --reportDir ../../../target/kibana-siem/cypress/results; mkdir -p ../../../target/junit && cp ../../../target/kibana-siem/cypress/results/*.xml ../../../target/junit/ && exit $status;", diff --git a/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js b/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js index 478463b1a80640..145d9715970c87 100644 --- a/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js +++ b/x-pack/plugins/siem/scripts/extract_tactics_techniques_mitre.js @@ -123,7 +123,7 @@ async function main() { .replace(/}"/g, '}') .replace(/"{/g, '{')}; - export const techniques = ${JSON.stringify(techniques, null, 2)}; + export const technique = ${JSON.stringify(techniques, null, 2)}; export const techniquesOptions: MitreTechniquesOptions[] = ${JSON.stringify(getTechniquesOptions(techniques), null, 2) diff --git a/x-pack/plugins/siem/server/client/client.test.ts b/x-pack/plugins/siem/server/client/client.test.ts index 94ff2149b8c64d..c0ae15cb73f4e6 100644 --- a/x-pack/plugins/siem/server/client/client.test.ts +++ b/x-pack/plugins/siem/server/client/client.test.ts @@ -9,7 +9,7 @@ import { createMockConfig } from '../lib/detection_engine/routes/__mocks__'; import { SiemClient } from './client'; describe('SiemClient', () => { - describe('#signalsIndex', () => { + describe('#getSignalsIndex', () => { it('returns the index scoped to the specified spaceId', () => { const mockConfig = { ...createMockConfig(), @@ -18,7 +18,7 @@ describe('SiemClient', () => { const spaceId = 'fooSpace'; const client = new SiemClient(spaceId, mockConfig); - expect(client.signalsIndex).toEqual('mockSignalsIndex-fooSpace'); + expect(client.getSignalsIndex()).toEqual('mockSignalsIndex-fooSpace'); }); }); }); diff --git a/x-pack/plugins/siem/server/client/client.ts b/x-pack/plugins/siem/server/client/client.ts index 6cb0d4cfade77e..5780bb4173f792 100644 --- a/x-pack/plugins/siem/server/client/client.ts +++ b/x-pack/plugins/siem/server/client/client.ts @@ -4,14 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ConfigType } from '..'; +import { ConfigType } from '../config'; export class SiemClient { - public readonly signalsIndex: string; + private readonly signalsIndex: string; constructor(private spaceId: string, private config: ConfigType) { const configuredSignalsIndex = this.config.signalsIndex; this.signalsIndex = `${configuredSignalsIndex}-${this.spaceId}`; } + + public getSignalsIndex = (): string => this.signalsIndex; } diff --git a/x-pack/plugins/siem/server/client/factory.ts b/x-pack/plugins/siem/server/client/factory.ts index d3d6b84e5b090a..69db4d7eed98f3 100644 --- a/x-pack/plugins/siem/server/client/factory.ts +++ b/x-pack/plugins/siem/server/client/factory.ts @@ -6,7 +6,7 @@ import { KibanaRequest } from '../../../../../src/core/server'; import { SiemClient } from './client'; -import { ConfigType } from '..'; +import { ConfigType } from '../config'; interface SetupDependencies { getSpaceId?: (request: KibanaRequest) => string | undefined; diff --git a/x-pack/plugins/siem/server/index.ts b/x-pack/plugins/siem/server/index.ts index 83e2f900a3b90e..e9cd78589fac91 100644 --- a/x-pack/plugins/siem/server/index.ts +++ b/x-pack/plugins/siem/server/index.ts @@ -5,7 +5,7 @@ */ import { PluginInitializerContext } from '../../../../src/core/server'; -import { Plugin } from './plugin'; +import { Plugin, PluginSetup, PluginStart } from './plugin'; import { configSchema, ConfigType } from './config'; export const plugin = (context: PluginInitializerContext) => { @@ -14,4 +14,4 @@ export const plugin = (context: PluginInitializerContext) => { export const config = { schema: configSchema }; -export { ConfigType }; +export { ConfigType, Plugin, PluginSetup, PluginStart }; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts index 10efdb518f7b7e..f3b4068f6dd2d4 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/__mocks__/request_context.ts @@ -13,6 +13,7 @@ import { import { alertsClientMock } from '../../../../../../alerting/server/mocks'; import { actionsClientMock } from '../../../../../../actions/server/mocks'; import { licensingMock } from '../../../../../../licensing/server/mocks'; +import { siemMock } from '../../../../mocks'; const createMockClients = () => ({ actionsClient: actionsClientMock.create(), @@ -20,7 +21,7 @@ const createMockClients = () => ({ clusterClient: elasticsearchServiceMock.createScopedClusterClient(), licensing: { license: licensingMock.createLicenseMock() }, savedObjectsClient: savedObjectsClientMock.create(), - siemClient: { signalsIndex: 'mockSignalsIndex' }, + siemClient: siemMock.createClient(), }); const createRequestContextMock = ( diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts index cb48e352288586..20b8ad29d27155 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/create_index_route.ts @@ -37,7 +37,7 @@ export const createIndexRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(callCluster, index); if (indexExists) { return siemResponse.error({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts index 5eff38b778492e..79cf4851f9ab81 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/delete_index_route.ts @@ -45,7 +45,7 @@ export const deleteIndexRoute = (router: IRouter) => { } const callCluster = clusterClient.callAsCurrentUser; - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(callCluster, index); if (!indexExists) { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts index 8ff8d7461ecd11..2b418892f0f392 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/read_index_route.ts @@ -29,7 +29,7 @@ export const readIndexRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, index); if (indexExists) { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts index 7dbbe837e656d9..e3c41c555f2972 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/privileges/read_privileges_route.ts @@ -36,7 +36,7 @@ export const readPrivilegesRoute = ( return siemResponse.error({ statusCode: 404 }); } - const index = siemClient.signalsIndex; + const index = siemClient.getSignalsIndex(); const clusterPrivileges = await readPrivileges(clusterClient.callAsCurrentUser, index); const privileges = merge(clusterPrivileges, { is_authenticated: security?.authc.isAuthenticated(request) ?? false, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts index bfc8c9c54b2c04..3c6adce45f959f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/add_prepackaged_rules_route.ts @@ -49,7 +49,7 @@ export const addPrepackedRulesRoute = (router: IRouter) => { const rulesToInstall = getRulesToInstall(rulesFromFileSystem, prepackagedRules); const rulesToUpdate = getRulesToUpdate(rulesFromFileSystem, prepackagedRules); - const { signalsIndex } = siemClient; + const signalsIndex = siemClient.getSignalsIndex(); if (rulesToInstall.length !== 0 || rulesToUpdate.length !== 0) { const signalsIndexExists = await getIndexExists( clusterClient.callAsCurrentUser, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index 2d7ddb79e5af55..133c98a6af7b3e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -92,7 +92,7 @@ export const createRulesBulkRoute = (router: IRouter) => { try { validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return createBulkErrorObject({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 1f0896686aca05..aa7a5cb0da7fd6 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -82,7 +82,7 @@ export const createRulesRoute = (router: IRouter): void => { return siemResponse.error({ statusCode: 404 }); } - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { return siemResponse.error({ diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts index 8433b74adf3100..bc4568dd0a40b9 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/export_rules_route.ts @@ -6,7 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { ConfigType } from '../../../..'; +import { ConfigType } from '../../../../config'; import { ExportRulesRequestParams } from '../../rules/types'; import { getNonPackagedRulesCount } from '../../rules/get_existing_prepackaged_rules'; import { exportRulesSchema, exportRulesQuerySchema } from '../schemas/export_rules_schema'; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index 8c052cfdf4024b..1233e01a677626 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -126,6 +126,7 @@ describe('import_rules_route', () => { }); test('returns an error if the index does not exist', async () => { + clients.siemClient.getSignalsIndex.mockReturnValue('mockSignalsIndex'); clients.clusterClient.callAsCurrentUser.mockResolvedValue(getEmptyIndex()); const response = await server.inject(request, context); expect(response.status).toEqual(200); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 527fab786910fc..202252da293ee1 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -10,7 +10,7 @@ import { extname } from 'path'; import { IRouter } from '../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { ConfigType } from '../../../..'; +import { ConfigType } from '../../../../config'; import { createRules } from '../../rules/create_rules'; import { ImportRulesRequestParams } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; @@ -147,7 +147,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { ruleType: type, }); - const signalsIndex = siemClient.signalsIndex; + const signalsIndex = siemClient.getSignalsIndex(); const indexExists = await getIndexExists( clusterClient.callAsCurrentUser, signalsIndex diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 6db91d74294fc6..a2fb78747ff047 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -83,7 +83,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { version, exceptions_list, } = payloadRule; - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 7dbbe5a22ab46a..91a32c19eb5e7b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -83,7 +83,7 @@ export const updateRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } - const finalIndex = outputIndex ?? siemClient.signalsIndex; + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const rule = await updateRules({ alertsClient, actionsClient, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts index c71761fcc39dbd..bcb70b6b4f0dd8 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/open_close_signals_route.ts @@ -44,7 +44,7 @@ export const setSignalsStatusRoute = (router: IRouter) => { } try { const result = await clusterClient.callAsCurrentUser('updateByQuery', { - index: siemClient.signalsIndex, + index: siemClient.getSignalsIndex(), body: { script: { source: `ctx._source.signal.status = '${status}'`, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts index fd02b3371ed38e..41896c725b903d 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/signals/query_signals_route.ts @@ -29,7 +29,7 @@ export const querySignalsRoute = (router: IRouter) => { try { const result = await clusterClient.callAsCurrentUser('search', { - index: siemClient.signalsIndex, + index: siemClient.getSignalsIndex(), body: { query, aggs, _source, track_total_hits, size }, ignoreUnavailable: true, }); diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts index c59f6eb6ce3daa..e0eefbf811a565 100644 --- a/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts +++ b/x-pack/plugins/siem/server/lib/timeline/routes/export_timelines_route.ts @@ -8,7 +8,7 @@ import { set as _set } from 'lodash/fp'; import { TIMELINE_EXPORT_URL } from '../../../../common/constants'; import { IRouter } from '../../../../../../../src/core/server'; -import { ConfigType } from '../../..'; +import { ConfigType } from '../../../config'; import { transformError, buildSiemResponse } from '../../detection_engine/routes/utils'; import { getExportTimelineByObjectIds } from './utils/export_timelines'; diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts index 258ef9faf671bd..9d148abf82cddd 100644 --- a/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts +++ b/x-pack/plugins/siem/server/lib/timeline/routes/import_timelines_route.ts @@ -32,7 +32,7 @@ import { IRouter } from '../../../../../../../src/core/server'; import { SetupPlugins } from '../../../plugin'; import { ImportTimelinesPayloadSchemaRt } from './schemas/import_timelines_schema'; import { importRulesSchema } from '../../detection_engine/routes/schemas/response/import_rules_schema'; -import { ConfigType } from '../../..'; +import { ConfigType } from '../../../config'; import { Timeline } from '../saved_object'; import { validate } from '../../detection_engine/routes/rules/validate'; diff --git a/x-pack/plugins/siem/server/lib/types.ts b/x-pack/plugins/siem/server/lib/types.ts index a74fe8f778ba94..2a897806dc6287 100644 --- a/x-pack/plugins/siem/server/lib/types.ts +++ b/x-pack/plugins/siem/server/lib/types.ts @@ -6,7 +6,7 @@ import { AuthenticatedUser } from '../../../security/public'; import { RequestHandlerContext } from '../../../../../src/core/server'; -export { ConfigType as Configuration } from '../'; +export { ConfigType as Configuration } from '../config'; import { Authentications } from './authentications'; import { Events } from './events'; diff --git a/x-pack/plugins/siem/server/mocks.ts b/x-pack/plugins/siem/server/mocks.ts new file mode 100644 index 00000000000000..44c41be86b6ffe --- /dev/null +++ b/x-pack/plugins/siem/server/mocks.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SiemClient } from './types'; + +type SiemClientMock = jest.Mocked; +const createSiemClientMock = (): SiemClientMock => + (({ + getSignalsIndex: jest.fn(), + } as unknown) as SiemClientMock); + +export const siemMock = { + createClient: createSiemClientMock, +}; diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index 29a6999025e1fc..e12832dc876bf8 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -11,6 +11,7 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, CoreStart, + Plugin as IPlugin, PluginInitializerContext, Logger, } from '../../../../src/core/server'; @@ -61,7 +62,12 @@ export interface StartPlugins { alerting: AlertingStart; } -export class Plugin { +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface PluginStart {} + +export class Plugin implements IPlugin { readonly name = 'siem'; private readonly logger: Logger; private readonly config$: Observable; @@ -204,7 +210,11 @@ export class Plugin { const libs = compose(core, plugins, this.context.env.mode.prod); initServer(libs); + + return {}; } - public start(core: CoreStart, plugins: StartPlugins) {} + public start(core: CoreStart, plugins: StartPlugins) { + return {}; + } } diff --git a/x-pack/plugins/siem/server/routes/index.ts b/x-pack/plugins/siem/server/routes/index.ts index 64b232a2686b87..1c03823e85fd7a 100644 --- a/x-pack/plugins/siem/server/routes/index.ts +++ b/x-pack/plugins/siem/server/routes/index.ts @@ -31,7 +31,7 @@ import { getPrepackagedRulesStatusRoute } from '../lib/detection_engine/routes/r import { importTimelinesRoute } from '../lib/timeline/routes/import_timelines_route'; import { exportTimelinesRoute } from '../lib/timeline/routes/export_timelines_route'; import { SetupPlugins } from '../plugin'; -import { ConfigType } from '..'; +import { ConfigType } from '../config'; export const initRoutes = ( router: IRouter, From 4ca86103b34c53e8da1e61a9aba3a77986070e64 Mon Sep 17 00:00:00 2001 From: nnamdifrankie <56440728+nnamdifrankie@users.noreply.github.com> Date: Tue, 21 Apr 2020 15:51:51 -0400 Subject: [PATCH 09/34] [Endpoint]EMT-146: use ingest agent for status info (#63921) [Endpoint]EMT-146: use ingest agent for status info --- x-pack/plugins/endpoint/server/mocks.ts | 17 ++- x-pack/plugins/endpoint/server/plugin.test.ts | 4 +- x-pack/plugins/endpoint/server/plugin.ts | 1 + .../server/routes/alerts/alerts.test.ts | 3 +- .../server/routes/alerts/details/handlers.ts | 8 +- .../endpoint/server/routes/metadata/index.ts | 99 ++++++++++++++---- .../server/routes/metadata/metadata.test.ts | 76 +++++++++++++- .../routes/metadata/query_builders.test.ts | 8 +- x-pack/plugins/endpoint/server/types.ts | 2 + .../ingest_manager/common/types/index.ts | 15 +++ .../plugins/ingest_manager/server/plugin.ts | 7 +- .../server/services/agents/status.test.ts | 43 ++++++++ .../server/services/agents/status.ts | 10 +- .../alerts/host_api_feature/data.json.gz | Bin 753 -> 849 bytes 14 files changed, 260 insertions(+), 33 deletions(-) create mode 100644 x-pack/plugins/ingest_manager/server/services/agents/status.test.ts diff --git a/x-pack/plugins/endpoint/server/mocks.ts b/x-pack/plugins/endpoint/server/mocks.ts index 903aa19cd88431..3881840efe9df0 100644 --- a/x-pack/plugins/endpoint/server/mocks.ts +++ b/x-pack/plugins/endpoint/server/mocks.ts @@ -4,6 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ +import { IngestManagerSetupContract } from '../../ingest_manager/server'; +import { AgentService } from '../../ingest_manager/common/types'; + /** * Creates a mock IndexPatternRetriever for use in tests. * @@ -28,6 +31,15 @@ export const createMockMetadataIndexPatternRetriever = () => { return createMockIndexPatternRetriever(MetadataIndexPattern); }; +/** + * Creates a mock AgentService + */ +export const createMockAgentService = (): jest.Mocked => { + return { + getAgentStatusById: jest.fn(), + }; +}; + /** * Creates a mock IndexPatternService for use in tests that need to interact with the Ingest Manager's * ESIndexPatternService. @@ -35,10 +47,13 @@ export const createMockMetadataIndexPatternRetriever = () => { * @param indexPattern a string index pattern to return when called by a test * @returns the same value as `indexPattern` parameter */ -export const createMockIndexPatternService = (indexPattern: string) => { +export const createMockIngestManagerSetupContract = ( + indexPattern: string +): IngestManagerSetupContract => { return { esIndexPatternService: { getESIndexPattern: jest.fn().mockResolvedValue(indexPattern), }, + agentService: createMockAgentService(), }; }; diff --git a/x-pack/plugins/endpoint/server/plugin.test.ts b/x-pack/plugins/endpoint/server/plugin.test.ts index 8d55e64f16dcfa..c380bc5c3e3d05 100644 --- a/x-pack/plugins/endpoint/server/plugin.test.ts +++ b/x-pack/plugins/endpoint/server/plugin.test.ts @@ -7,7 +7,7 @@ import { EndpointPlugin, EndpointPluginSetupDependencies } from './plugin'; import { coreMock } from '../../../../src/core/server/mocks'; import { PluginSetupContract } from '../../features/server'; -import { createMockIndexPatternService } from './mocks'; +import { createMockIngestManagerSetupContract } from './mocks'; describe('test endpoint plugin', () => { let plugin: EndpointPlugin; @@ -31,7 +31,7 @@ describe('test endpoint plugin', () => { }; mockedEndpointPluginSetupDependencies = { features: mockedPluginSetupContract, - ingestManager: createMockIndexPatternService(''), + ingestManager: createMockIngestManagerSetupContract(''), }; }); diff --git a/x-pack/plugins/endpoint/server/plugin.ts b/x-pack/plugins/endpoint/server/plugin.ts index 6a42014e911303..ce6be5aeaf6db4 100644 --- a/x-pack/plugins/endpoint/server/plugin.ts +++ b/x-pack/plugins/endpoint/server/plugin.ts @@ -70,6 +70,7 @@ export class EndpointPlugin plugins.ingestManager.esIndexPatternService, this.initializerContext.logger ), + agentService: plugins.ingestManager.agentService, logFactory: this.initializerContext.logger, config: (): Promise => { return createConfig$(this.initializerContext) diff --git a/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts b/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts index 6be7b268982060..39fc2ba4c74bb2 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/alerts.test.ts @@ -12,7 +12,7 @@ import { import { registerAlertRoutes } from './index'; import { EndpointConfigSchema } from '../../config'; import { alertingIndexGetQuerySchema } from '../../../common/schema/alert_index'; -import { createMockIndexPatternRetriever } from '../../mocks'; +import { createMockAgentService, createMockIndexPatternRetriever } from '../../mocks'; describe('test alerts route', () => { let routerMock: jest.Mocked; @@ -26,6 +26,7 @@ describe('test alerts route', () => { routerMock = httpServiceMock.createRouter(); registerAlertRoutes(routerMock, { indexPatternRetriever: createMockIndexPatternRetriever('events-endpoint-*'), + agentService: createMockAgentService(), logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }); diff --git a/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts b/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts index 86e9f55da56970..9055ee4110fbba 100644 --- a/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts +++ b/x-pack/plugins/endpoint/server/routes/alerts/details/handlers.ts @@ -37,7 +37,13 @@ export const alertDetailsHandlerWrapper = function( indexPattern ); - const currentHostInfo = await getHostData(ctx, response._source.host.id, indexPattern); + const currentHostInfo = await getHostData( + { + endpointAppContext, + requestHandlerContext: ctx, + }, + response._source.host.id + ); return res.ok({ body: { diff --git a/x-pack/plugins/endpoint/server/routes/metadata/index.ts b/x-pack/plugins/endpoint/server/routes/metadata/index.ts index 883bb88204fd4f..bc79b828576e04 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata/index.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata/index.ts @@ -4,18 +4,29 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IRouter, RequestHandlerContext } from 'kibana/server'; +import { IRouter, Logger, RequestHandlerContext } from 'kibana/server'; import { SearchResponse } from 'elasticsearch'; import { schema } from '@kbn/config-schema'; -import { kibanaRequestToMetadataListESQuery, getESQueryHostMetadataByID } from './query_builders'; +import { getESQueryHostMetadataByID, kibanaRequestToMetadataListESQuery } from './query_builders'; import { HostInfo, HostMetadata, HostResultList, HostStatus } from '../../../common/types'; import { EndpointAppContext } from '../../types'; +import { AgentStatus } from '../../../../ingest_manager/common/types/models'; interface HitSource { _source: HostMetadata; } +interface MetadataRequestContext { + requestHandlerContext: RequestHandlerContext; + endpointAppContext: EndpointAppContext; +} + +const HOST_STATUS_MAPPING = new Map([ + ['online', HostStatus.ONLINE], + ['offline', HostStatus.OFFLINE], +]); + export function registerEndpointRoutes(router: IRouter, endpointAppContext: EndpointAppContext) { router.post( { @@ -62,7 +73,12 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp 'search', queryParams )) as SearchResponse; - return res.ok({ body: mapToHostResultList(queryParams, response) }); + return res.ok({ + body: await mapToHostResultList(queryParams, response, { + endpointAppContext, + requestHandlerContext: context, + }), + }); } catch (err) { return res.internalError({ body: err }); } @@ -79,11 +95,13 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp }, async (context, req, res) => { try { - const index = await endpointAppContext.indexPatternRetriever.getMetadataIndexPattern( - context + const doc = await getHostData( + { + endpointAppContext, + requestHandlerContext: context, + }, + req.params.id ); - - const doc = await getHostData(context, req.params.id, index); if (doc) { return res.ok({ body: doc }); } @@ -96,12 +114,14 @@ export function registerEndpointRoutes(router: IRouter, endpointAppContext: Endp } export async function getHostData( - context: RequestHandlerContext, - id: string, - index: string + metadataRequestContext: MetadataRequestContext, + id: string ): Promise { + const index = await metadataRequestContext.endpointAppContext.indexPatternRetriever.getMetadataIndexPattern( + metadataRequestContext.requestHandlerContext + ); const query = getESQueryHostMetadataByID(id, index); - const response = (await context.core.elasticsearch.dataClient.callAsCurrentUser( + const response = (await metadataRequestContext.requestHandlerContext.core.elasticsearch.dataClient.callAsCurrentUser( 'search', query )) as SearchResponse; @@ -110,22 +130,25 @@ export async function getHostData( return undefined; } - return enrichHostMetadata(response.hits.hits[0]._source); + return await enrichHostMetadata(response.hits.hits[0]._source, metadataRequestContext); } -function mapToHostResultList( +async function mapToHostResultList( queryParams: Record, - searchResponse: SearchResponse -): HostResultList { + searchResponse: SearchResponse, + metadataRequestContext: MetadataRequestContext +): Promise { const totalNumberOfHosts = searchResponse?.aggregations?.total?.value || 0; if (searchResponse.hits.hits.length > 0) { return { request_page_size: queryParams.size, request_page_index: queryParams.from, - hosts: searchResponse.hits.hits - .map(response => response.inner_hits.most_recent.hits.hits) - .flatMap(data => data as HitSource) - .map(entry => enrichHostMetadata(entry._source)), + hosts: await Promise.all( + searchResponse.hits.hits + .map(response => response.inner_hits.most_recent.hits.hits) + .flatMap(data => data as HitSource) + .map(async entry => enrichHostMetadata(entry._source, metadataRequestContext)) + ), total: totalNumberOfHosts, }; } else { @@ -138,9 +161,43 @@ function mapToHostResultList( } } -function enrichHostMetadata(hostMetadata: HostMetadata): HostInfo { +async function enrichHostMetadata( + hostMetadata: HostMetadata, + metadataRequestContext: MetadataRequestContext +): Promise { + let hostStatus = HostStatus.ERROR; + let elasticAgentId = hostMetadata?.elastic?.agent?.id; + const log = logger(metadataRequestContext.endpointAppContext); + try { + /** + * Get agent status by elastic agent id if available or use the host id. + * https://github.com/elastic/endpoint-app-team/issues/354 + */ + + if (!elasticAgentId) { + elasticAgentId = hostMetadata.host.id; + log.warn(`Missing elastic agent id, using host id instead ${elasticAgentId}`); + } + + const status = await metadataRequestContext.endpointAppContext.agentService.getAgentStatusById( + metadataRequestContext.requestHandlerContext.core.savedObjects.client, + elasticAgentId + ); + hostStatus = HOST_STATUS_MAPPING.get(status) || HostStatus.ERROR; + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + log.warn(`agent with id ${elasticAgentId} not found`); + } else { + log.error(e); + throw e; + } + } return { metadata: hostMetadata, - host_status: HostStatus.ERROR, + host_status: hostStatus, }; } + +const logger = (endpointAppContext: EndpointAppContext): Logger => { + return endpointAppContext.logFactory.get('metadata'); +}; diff --git a/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts b/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts index 9a7d3fb3188a64..a1186aabc7a66a 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata/metadata.test.ts @@ -25,7 +25,9 @@ import { SearchResponse } from 'elasticsearch'; import { registerEndpointRoutes } from './index'; import { EndpointConfigSchema } from '../../config'; import * as data from '../../test_data/all_metadata_data.json'; -import { createMockMetadataIndexPatternRetriever } from '../../mocks'; +import { createMockAgentService, createMockMetadataIndexPatternRetriever } from '../../mocks'; +import { AgentService } from '../../../../ingest_manager/common/types'; +import Boom from 'boom'; describe('test endpoint route', () => { let routerMock: jest.Mocked; @@ -35,6 +37,7 @@ describe('test endpoint route', () => { let mockSavedObjectClient: jest.Mocked; let routeHandler: RequestHandler; let routeConfig: RouteConfig; + let mockAgentService: jest.Mocked; beforeEach(() => { mockClusterClient = elasticsearchServiceMock.createClusterClient() as jest.Mocked< @@ -45,8 +48,10 @@ describe('test endpoint route', () => { mockClusterClient.asScoped.mockReturnValue(mockScopedClient); routerMock = httpServiceMock.createRouter(); mockResponse = httpServerMock.createResponseFactory(); + mockAgentService = createMockAgentService(); registerEndpointRoutes(routerMock, { indexPatternRetriever: createMockMetadataIndexPatternRetriever(), + agentService: mockAgentService, logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }); @@ -83,7 +88,7 @@ describe('test endpoint route', () => { [routeConfig, routeHandler] = routerMock.post.mock.calls.find(([{ path }]) => path.startsWith('/api/endpoint/metadata') )!; - + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -113,6 +118,8 @@ describe('test endpoint route', () => { ], }, }); + + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve((data as unknown) as SearchResponse) ); @@ -154,6 +161,8 @@ describe('test endpoint route', () => { filter: 'not host.ip:10.140.73.246', }, }); + + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve((data as unknown) as SearchResponse) ); @@ -216,10 +225,10 @@ describe('test endpoint route', () => { }, }) ); + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('error'); [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => path.startsWith('/api/endpoint/metadata') )!; - await routeHandler( createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), mockRequest, @@ -233,13 +242,14 @@ describe('test endpoint route', () => { expect(message).toEqual('Endpoint Not Found'); }); - it('should return a single endpoint with status error', async () => { + it('should return a single endpoint with status online', async () => { const mockRequest = httpServerMock.createKibanaRequest({ params: { id: (data as any).hits.hits[0]._id }, }); const response: SearchResponse = (data as unknown) as SearchResponse< HostMetadata >; + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('online'); mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => path.startsWith('/api/endpoint/metadata') @@ -256,6 +266,64 @@ describe('test endpoint route', () => { expect(mockResponse.ok).toBeCalled(); const result = mockResponse.ok.mock.calls[0][0]?.body as HostInfo; expect(result).toHaveProperty('metadata.endpoint'); + expect(result.host_status).toEqual(HostStatus.ONLINE); + }); + + it('should return a single endpoint with status error when AgentService throw 404', async () => { + const response: SearchResponse = (data as unknown) as SearchResponse< + HostMetadata + >; + + const mockRequest = httpServerMock.createKibanaRequest({ + params: { id: response.hits.hits[0]._id }, + }); + + mockAgentService.getAgentStatusById = jest.fn().mockImplementation(() => { + throw Boom.notFound('Agent not found'); + }); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); + [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/metadata') + )!; + + await routeHandler( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as HostInfo; + expect(result.host_status).toEqual(HostStatus.ERROR); + }); + + it('should return a single endpoint with status error when status is not offline or online', async () => { + const response: SearchResponse = (data as unknown) as SearchResponse< + HostMetadata + >; + + const mockRequest = httpServerMock.createKibanaRequest({ + params: { id: response.hits.hits[0]._id }, + }); + + mockAgentService.getAgentStatusById = jest.fn().mockReturnValue('warning'); + mockScopedClient.callAsCurrentUser.mockImplementationOnce(() => Promise.resolve(response)); + [routeConfig, routeHandler] = routerMock.get.mock.calls.find(([{ path }]) => + path.startsWith('/api/endpoint/metadata') + )!; + + await routeHandler( + createRouteHandlerContext(mockScopedClient, mockSavedObjectClient), + mockRequest, + mockResponse + ); + + expect(mockScopedClient.callAsCurrentUser).toBeCalled(); + expect(routeConfig.options).toEqual({ authRequired: true }); + expect(mockResponse.ok).toBeCalled(); + const result = mockResponse.ok.mock.calls[0][0]?.body as HostInfo; expect(result.host_status).toEqual(HostStatus.ERROR); }); }); diff --git a/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts b/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts index c8143fbdda1ea1..7e6e3f875cd4ca 100644 --- a/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts +++ b/x-pack/plugins/endpoint/server/routes/metadata/query_builders.test.ts @@ -6,7 +6,11 @@ import { httpServerMock, loggingServiceMock } from '../../../../../../src/core/server/mocks'; import { EndpointConfigSchema } from '../../config'; import { kibanaRequestToMetadataListESQuery, getESQueryHostMetadataByID } from './query_builders'; -import { createMockMetadataIndexPatternRetriever, MetadataIndexPattern } from '../../mocks'; +import { + createMockAgentService, + createMockMetadataIndexPatternRetriever, + MetadataIndexPattern, +} from '../../mocks'; describe('query builder', () => { describe('MetadataListESQuery', () => { @@ -18,6 +22,7 @@ describe('query builder', () => { mockRequest, { indexPatternRetriever: createMockMetadataIndexPatternRetriever(), + agentService: createMockAgentService(), logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }, @@ -69,6 +74,7 @@ describe('query builder', () => { mockRequest, { indexPatternRetriever: createMockMetadataIndexPatternRetriever(), + agentService: createMockAgentService(), logFactory: loggingServiceMock.create(), config: () => Promise.resolve(EndpointConfigSchema.validate({})), }, diff --git a/x-pack/plugins/endpoint/server/types.ts b/x-pack/plugins/endpoint/server/types.ts index 46a23060339f41..d43ec58aec4282 100644 --- a/x-pack/plugins/endpoint/server/types.ts +++ b/x-pack/plugins/endpoint/server/types.ts @@ -6,12 +6,14 @@ import { LoggerFactory } from 'kibana/server'; import { EndpointConfigType } from './config'; import { IndexPatternRetriever } from './index_pattern'; +import { AgentService } from '../../ingest_manager/common/types'; /** * The context for Endpoint apps. */ export interface EndpointAppContext { indexPatternRetriever: IndexPatternRetriever; + agentService: AgentService; logFactory: LoggerFactory; config(): Promise; } diff --git a/x-pack/plugins/ingest_manager/common/types/index.ts b/x-pack/plugins/ingest_manager/common/types/index.ts index 42f7a9333118e5..150a4c9d602802 100644 --- a/x-pack/plugins/ingest_manager/common/types/index.ts +++ b/x-pack/plugins/ingest_manager/common/types/index.ts @@ -3,9 +3,24 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsClientContract } from 'kibana/server'; +import { AgentStatus } from './models'; + export * from './models'; export * from './rest_spec'; +/** + * A service that provides exported functions that return information about an Agent + */ +export interface AgentService { + /** + * Return the status by the Agent's id + * @param soClient + * @param agentId + */ + getAgentStatusById(soClient: SavedObjectsClientContract, agentId: string): Promise; +} + export interface IngestManagerConfigType { enabled: boolean; epm: { diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 4dd070a7414f06..075a0917b9faed 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -39,18 +39,20 @@ import { registerInstallScriptRoutes, } from './routes'; -import { IngestManagerConfigType } from '../common'; +import { AgentService, IngestManagerConfigType } from '../common'; import { appContextService, ESIndexPatternService, ESIndexPatternSavedObjectService, } from './services'; +import { getAgentStatusById } from './services/agents'; /** * Describes public IngestManager plugin contract returned at the `setup` stage. */ export interface IngestManagerSetupContract { esIndexPatternService: ESIndexPatternService; + agentService: AgentService; } export interface IngestManagerSetupDeps { @@ -148,6 +150,9 @@ export class IngestManagerPlugin implements Plugin { } return deepFreeze({ esIndexPatternService: new ESIndexPatternSavedObjectService(), + agentService: { + getAgentStatusById, + }, }); } diff --git a/x-pack/plugins/ingest_manager/server/services/agents/status.test.ts b/x-pack/plugins/ingest_manager/server/services/agents/status.test.ts new file mode 100644 index 00000000000000..d19fe883a7780e --- /dev/null +++ b/x-pack/plugins/ingest_manager/server/services/agents/status.test.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { savedObjectsClientMock } from '../../../../../../src/core/server/saved_objects/service/saved_objects_client.mock'; +import { getAgentStatusById } from './status'; +import { AGENT_TYPE_PERMANENT } from '../../../common/constants'; +import { AgentSOAttributes } from '../../../common/types/models'; +import { SavedObject } from 'kibana/server'; + +describe('Agent status service', () => { + it('should return inactive when agent is not active', async () => { + const mockSavedObjectsClient = savedObjectsClientMock.create(); + mockSavedObjectsClient.get = jest.fn().mockReturnValue({ + id: 'id', + type: AGENT_TYPE_PERMANENT, + attributes: { + active: false, + local_metadata: '{}', + user_provided_metadata: '{}', + }, + } as SavedObject); + const status = await getAgentStatusById(mockSavedObjectsClient, 'id'); + expect(status).toEqual('inactive'); + }); + + it('should return online when agent is active', async () => { + const mockSavedObjectsClient = savedObjectsClientMock.create(); + mockSavedObjectsClient.get = jest.fn().mockReturnValue({ + id: 'id', + type: AGENT_TYPE_PERMANENT, + attributes: { + active: true, + local_metadata: '{}', + user_provided_metadata: '{}', + }, + } as SavedObject); + const status = await getAgentStatusById(mockSavedObjectsClient, 'id'); + expect(status).toEqual('online'); + }); +}); diff --git a/x-pack/plugins/ingest_manager/server/services/agents/status.ts b/x-pack/plugins/ingest_manager/server/services/agents/status.ts index 21e200d701e69d..001b6d01f078ee 100644 --- a/x-pack/plugins/ingest_manager/server/services/agents/status.ts +++ b/x-pack/plugins/ingest_manager/server/services/agents/status.ts @@ -5,7 +5,7 @@ */ import { SavedObjectsClientContract } from 'src/core/server'; -import { listAgents } from './crud'; +import { getAgent, listAgents } from './crud'; import { AGENT_EVENT_SAVED_OBJECT_TYPE } from '../../constants'; import { AgentStatus, Agent } from '../../types'; @@ -17,6 +17,14 @@ import { } from '../../constants'; import { AgentStatusKueryHelper } from '../../../common/services'; +export async function getAgentStatusById( + soClient: SavedObjectsClientContract, + agentId: string +): Promise { + const agent = await getAgent(soClient, agentId); + return getAgentStatus(agent); +} + export function getAgentStatus(agent: Agent, now: number = Date.now()): AgentStatus { const { type, last_checkin: lastCheckIn } = agent; const msLastCheckIn = new Date(lastCheckIn || 0).getTime(); diff --git a/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz b/x-pack/test/functional/es_archives/endpoint/alerts/host_api_feature/data.json.gz index a71281c0ecfec93e0a51aa3473dbbbf565a10f9b..3d4f0e11a7cc670366fa6098143b6306a1a1c72b 100644 GIT binary patch literal 849 zcmV-X1FrlZiwFo(DwQOZ*BnHmQ8QtHV}sI{uPGL8G#%QsbNp`rYZIi z6fG9$q9}Ucr{mVP3|sbY8sxv1$|hMyaz2pmUIJK#M9yf2e20(bYBU~C+RJsC{4k!x zCQMGcfxTPox{<5$P#)*8o4q{$WhvfI-^HJ5{qg+o^FMyezu%a57OR*(cSg(9ZsuVN zX%*MaeAPls+3glB$UD<*v)hEPFE1lMw)17$wr;sDqf#>oBBeBGdva&uW@*(P_}nLz zT=JBBgzQ2B3Rr_DVSr5_>71xp_{qsvuYKBV=gq2fHI=IDT#g;YP>h;B}*3Pri>V2V}6vXXS5*Ix&rmM-*T=~8nRBtf!JwD97%XS3}qnRkoD z7e!XF`LrE>NSjicV-ymPOZVy4&{RExz1z&)jaa>x^~??nACG81y8FK#U5`drFXzHL z-{Zn;w*H=6FxtF;3p$#RD1(xLx>H%oNJfO(r6kJX(U$F_Trd^?e=cb6rS*j1HD@5= zazH5ws70t<#fR@o3d_%vq7K>S+9^PGrhIT@0`EzK5ZXE9EIEoN zNbwCi2%)U@2@NQ%3Mq`>!VFVBC|+^NKoeW_W=UcBHKYii|JAcaDTMWr4#FoELMSlS zbm$kkoHQpPTM7z2QL_43QV>_N^a6-@q=6{9WBCnd1a>`ydZY_DLJCeD2)qS!z#1a= bNFl(AQj>tC8akZ3k@n(0L$8A>b_@Uj^{t;- literal 753 zcmVQOZ*BnHl}k_CKoEfM`4v&ljJ0p?_EbZuIH0N( zQc+d)u+PM8Y)6h0post8bs!musT1Ah2*=*TtobuWm=8c1(tp{dF z3Wgy8QdowyMyW(*bo6Mo^z}Ti%GOjQG*P36rMt~hYtMI2n^n`?-t5RWKAezDAw^H& zlt=~a1Z9wAjDb9%Bx9I;&eCklhiF&oVwLdAyqOG7moc`y9FH~{cYUXpz4&eIb>m$( zWj)hLHSbuqlC=kC@g1}&!lbbL&tf}O_rY0a9JVF^PE`ubc?^nJ0))ww8b!I3XveB8 z;?M11F-kCsPl^)4(%nR~YnUbk#Ygp)BuykvFcXid`L%Uap>6jp9(zCmX5baXS{St7 zvYK}*85Yy&eML%FUCoCVzK*RjBnXrJrMr4i6iG*6sq0*?iq+Yyqqg0MWKZn}>;JpK z-C%HgIH$*^!|8ZDdrM9Q7YA_4ov@w-px82CK8S2DNcmw^Gjqx zC{L(7m{LZggJ3KK0z!lCkk1(i;3i&6;2e1NT81%t9^L3XdXe3)b@e2;s}24mxwc2{ z Date: Tue, 21 Apr 2020 15:57:50 -0400 Subject: [PATCH 10/34] Fixed small issue in clone functionality (#64085) --- .../embeddable/placeholder/placeholder_embeddable_factory.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts b/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts index 30a93989649a7a..b3ce2f1e57d5fc 100644 --- a/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts +++ b/src/plugins/dashboard/public/application/embeddable/placeholder/placeholder_embeddable_factory.ts @@ -33,6 +33,10 @@ export class PlaceholderEmbeddableFactory implements EmbeddableFactoryDefinition return false; } + public canCreateNew() { + return false; + } + public async create(initialInput: EmbeddableInput, parent?: IContainer) { return new PlaceholderEmbeddable(initialInput, parent); } From ed912751c142e1cea77927d6e6a6a722ecf7f9c2 Mon Sep 17 00:00:00 2001 From: Paul Tavares <56442535+paul-tavares@users.noreply.github.com> Date: Tue, 21 Apr 2020 16:30:09 -0400 Subject: [PATCH 11/34] [Endpoint] Hook to handle events needing navigation via Router (#63863) * new hook providing generic event handler for use with react router * Refactor of Header Naviagtion to use useNavigateByRouterEventHandler * Policy list refactor to use useNavigateByRouterEventHandler hook * Policy list Policy name link to use useNavigateByRouterEventHandler hook * Host list use of useNavigateByRouteEventHandler --- .../view/components/header_navigation.tsx | 44 +++++---- .../view/components/link_to_app.test.tsx | 2 +- ..._navigate_by_router_event_handler.test.tsx | 90 +++++++++++++++++++ .../use_navigate_by_router_event_handler.ts | 70 +++++++++++++++ .../details/components/flyout_sub_header.tsx | 4 +- .../view/hosts/details/host_details.tsx | 13 ++- .../endpoint/view/hosts/details/index.tsx | 22 ++--- .../endpoint/view/hosts/index.tsx | 35 ++++---- .../view/policy/policy_details.test.tsx | 4 +- .../endpoint/view/policy/policy_details.tsx | 11 +-- .../endpoint/view/policy/policy_list.tsx | 33 ++++--- 11 files changed, 244 insertions(+), 84 deletions(-) create mode 100644 x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx create mode 100644 x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx index 6c294d9c865488..7475229853698b 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/header_navigation.tsx @@ -4,12 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { MouseEvent, useMemo } from 'react'; +import React, { memo, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiTabs, EuiTab } from '@elastic/eui'; -import { useHistory, useLocation } from 'react-router-dom'; +import { useLocation } from 'react-router-dom'; import { useKibana } from '../../../../../../../../src/plugins/kibana_react/public'; import { Immutable } from '../../../../../common/types'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; interface NavTabs { name: string; @@ -48,33 +49,30 @@ const navTabs: Immutable = [ }, ]; -export const HeaderNavigation: React.FunctionComponent = React.memo(() => { - const history = useHistory(); - const location = useLocation(); +const NavTab = memo<{ tab: NavTabs }>(({ tab }) => { + const { pathname } = useLocation(); const { services } = useKibana(); + const onClickHandler = useNavigateByRouterEventHandler(tab.href); const BASE_PATH = services.application.getUrlForApp('endpoint'); + return ( + + {tab.name} + + ); +}); + +export const HeaderNavigation: React.FunctionComponent = React.memo(() => { const tabList = useMemo(() => { return navTabs.map((tab, index) => { - return ( - { - event.preventDefault(); - history.push(tab.href); - }} - isSelected={ - tab.href === location.pathname || - (tab.href !== '/' && location.pathname.startsWith(tab.href)) - } - > - {tab.name} - - ); + return ; }); - }, [BASE_PATH, history, location.pathname]); + }, []); return {tabList}; }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx index d0a8f9690dafbf..2d4d1ca8a1b5b0 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/components/link_to_app.test.tsx @@ -110,7 +110,7 @@ describe('LinkToApp component', () => { const clickEventArg = spyOnClickHandler.mock.calls[0][0]; expect(clickEventArg.isDefaultPrevented()).toBe(true); }); - it('should not navigate if onClick callback prevents defalut', () => { + it('should not navigate if onClick callback prevents default', () => { const spyOnClickHandler: LinkToAppOnClickMock = jest.fn(ev => { ev.preventDefault(); }); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx new file mode 100644 index 00000000000000..b1f09617f01744 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.test.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { AppContextTestRender, createAppRootMockRenderer } from '../../mocks'; +import { useNavigateByRouterEventHandler } from './use_navigate_by_router_event_handler'; +import { act, fireEvent, cleanup } from '@testing-library/react'; + +type ClickHandlerMock = jest.Mock< + Return, + [React.MouseEvent] +>; + +describe('useNavigateByRouterEventHandler hook', () => { + let render: AppContextTestRender['render']; + let history: AppContextTestRender['history']; + let renderResult: ReturnType; + let linkEle: HTMLAnchorElement; + let clickHandlerSpy: ClickHandlerMock; + const Link = React.memo<{ + routeTo: Parameters[0]; + onClick?: Parameters[1]; + }>(({ routeTo, onClick }) => { + const onClickHandler = useNavigateByRouterEventHandler(routeTo, onClick); + return ( +
+ mock link + + ); + }); + + beforeEach(async () => { + ({ render, history } = createAppRootMockRenderer()); + clickHandlerSpy = jest.fn(); + renderResult = render(); + linkEle = (await renderResult.findByText('mock link')) as HTMLAnchorElement; + }); + afterEach(cleanup); + + it('should navigate to path via Router', () => { + const containerClickSpy = jest.fn(); + renderResult.container.addEventListener('click', containerClickSpy); + expect(history.location.pathname).not.toEqual('/mock/path'); + act(() => { + fireEvent.click(linkEle); + }); + expect(containerClickSpy.mock.calls[0][0].defaultPrevented).toBe(true); + expect(history.location.pathname).toEqual('/mock/path'); + renderResult.container.removeEventListener('click', containerClickSpy); + }); + it('should support onClick prop', () => { + act(() => { + fireEvent.click(linkEle); + }); + expect(clickHandlerSpy).toHaveBeenCalled(); + expect(history.location.pathname).toEqual('/mock/path'); + }); + it('should not navigate if preventDefault is true', () => { + clickHandlerSpy.mockImplementation(event => { + event.preventDefault(); + }); + act(() => { + fireEvent.click(linkEle); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + it('should not navigate via router if click was not the primary mouse button', async () => { + act(() => { + fireEvent.click(linkEle, { button: 2 }); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + it('should not navigate via router if anchor has target', () => { + linkEle.setAttribute('target', '_top'); + act(() => { + fireEvent.click(linkEle, { button: 2 }); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + it('should not to navigate if meta|alt|ctrl|shift keys are pressed', () => { + ['meta', 'alt', 'ctrl', 'shift'].forEach(key => { + act(() => { + fireEvent.click(linkEle, { [`${key}Key`]: true }); + }); + expect(history.location.pathname).not.toEqual('/mock/path'); + }); + }); +}); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts new file mode 100644 index 00000000000000..dc33f0befaf357 --- /dev/null +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hooks/use_navigate_by_router_event_handler.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MouseEventHandler, useCallback } from 'react'; +import { useHistory } from 'react-router-dom'; +import { LocationDescriptorObject } from 'history'; + +type EventHandlerCallback = MouseEventHandler; + +/** + * Provides an event handler that can be used with (for example) `onClick` props to prevent the + * event's default behaviour and instead navigate to to a route via the Router + * + * @param routeTo + * @param onClick + */ +export const useNavigateByRouterEventHandler = ( + routeTo: string | [string, unknown] | LocationDescriptorObject, // Cover the calling signature of `history.push()` + + /** Additional onClick callback */ + onClick?: EventHandlerCallback +): EventHandlerCallback => { + const history = useHistory(); + return useCallback( + ev => { + try { + if (onClick) { + onClick(ev); + } + } catch (error) { + ev.preventDefault(); + throw error; + } + + if (ev.defaultPrevented) { + return; + } + + if (ev.button !== 0) { + return; + } + + if ( + ev.currentTarget instanceof HTMLAnchorElement && + ev.currentTarget.target !== '' && + ev.currentTarget.target !== '_self' + ) { + return; + } + + if (ev.metaKey || ev.altKey || ev.ctrlKey || ev.shiftKey) { + return; + } + + ev.preventDefault(); + + if (Array.isArray(routeTo)) { + history.push(...routeTo); + } else if (typeof routeTo === 'string') { + history.push(routeTo); + } else { + history.push(routeTo); + } + }, + [history, onClick, routeTo] + ); +}; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx index 26f2203790a9e2..02f91307c988ec 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/components/flyout_sub_header.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { memo } from 'react'; +import React, { memo, MouseEventHandler } from 'react'; import { EuiFlyoutHeader, CommonProps, EuiButtonEmpty } from '@elastic/eui'; import styled from 'styled-components'; @@ -12,7 +12,7 @@ export type FlyoutSubHeaderProps = CommonProps & { children: React.ReactNode; backButton?: { title: string; - onClick: (event: React.MouseEvent) => void; + onClick: MouseEventHandler; href?: string; }; }; diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx index 32c69426b03f33..336308b2ee2716 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/host_details.tsx @@ -16,13 +16,13 @@ import { import React, { memo, useMemo } from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { useHistory } from 'react-router-dom'; import { HostMetadata } from '../../../../../../common/types'; import { FormattedDateAndTime } from '../../formatted_date_time'; import { LinkToApp } from '../../components/link_to_app'; import { useHostListSelector, useHostLogsUrl } from '../hooks'; import { urlFromQueryParams } from '../url_from_query_params'; import { uiQueryParams } from '../../../store/hosts/selectors'; +import { useNavigateByRouterEventHandler } from '../../hooks/use_navigate_by_router_event_handler'; const HostIds = styled(EuiListGroupItem)` margin-top: 0; @@ -34,7 +34,6 @@ const HostIds = styled(EuiListGroupItem)` export const HostDetails = memo(({ details }: { details: HostMetadata }) => { const { appId, appPath, url } = useHostLogsUrl(details.host.id); const queryParams = useHostListSelector(uiQueryParams); - const history = useHistory(); const detailsResultsUpper = useMemo(() => { return [ { @@ -65,6 +64,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { show: 'policy_response', }); }, [details.host.id, queryParams]); + const policyStatusClickHandler = useNavigateByRouterEventHandler(policyResponseUri); const detailsResultsLower = useMemo(() => { return [ @@ -84,10 +84,7 @@ export const HostDetails = memo(({ details }: { details: HostMetadata }) => { { - ev.preventDefault(); - history.push(policyResponseUri); - }} + onClick={policyStatusClickHandler} > { details.endpoint.policy.id, details.host.hostname, details.host.ip, - history, - policyResponseUri, + policyResponseUri.search, + policyStatusClickHandler, ]); return ( diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx index a41d4a968f177d..0c43e188225082 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/details/index.tsx @@ -24,6 +24,7 @@ import { HostDetails } from './host_details'; import { PolicyResponse } from './policy_response'; import { HostMetadata } from '../../../../../../common/types'; import { FlyoutSubHeader, FlyoutSubHeaderProps } from './components/flyout_sub_header'; +import { useNavigateByRouterEventHandler } from '../../hooks/use_navigate_by_router_event_handler'; export const HostDetailsFlyout = memo(() => { const history = useHistory(); @@ -92,24 +93,25 @@ export const HostDetailsFlyout = memo(() => { const PolicyResponseFlyoutPanel = memo<{ hostMeta: HostMetadata; }>(({ hostMeta }) => { - const history = useHistory(); const { show, ...queryParams } = useHostListSelector(uiQueryParams); + const detailsUri = useMemo( + () => + urlFromQueryParams({ + ...queryParams, + selected_host: hostMeta.host.id, + }), + [hostMeta.host.id, queryParams] + ); + const backToDetailsClickHandler = useNavigateByRouterEventHandler(detailsUri); const backButtonProp = useMemo((): FlyoutSubHeaderProps['backButton'] => { - const detailsUri = urlFromQueryParams({ - ...queryParams, - selected_host: hostMeta.host.id, - }); return { title: i18n.translate('xpack.endpoint.host.policyResponse.backLinkTitle', { defaultMessage: 'Endpoint Details', }), href: '?' + detailsUri.search, - onClick: ev => { - ev.preventDefault(); - history.push(detailsUri); - }, + onClick: backToDetailsClickHandler, }; - }, [history, hostMeta.host.id, queryParams]); + }, [backToDetailsClickHandler, detailsUri.search]); return ( <> diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx index 1d81d6e8a16dbe..e662bafed64926 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.tsx @@ -4,9 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { useMemo, useCallback } from 'react'; +import React, { useMemo, useCallback, memo } from 'react'; import { useDispatch } from 'react-redux'; -import { useHistory } from 'react-router-dom'; import { EuiPage, EuiPageBody, @@ -31,11 +30,26 @@ import { useHostListSelector } from './hooks'; import { CreateStructuredSelector } from '../../types'; import { urlFromQueryParams } from './url_from_query_params'; import { HostMetadata, Immutable } from '../../../../../common/types'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; + +const HostLink = memo<{ + name: string; + href: string; + route: ReturnType; +}>(({ name, href, route }) => { + const clickHandler = useNavigateByRouterEventHandler(route); + + return ( + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {name} + + ); +}); const selector = (createStructuredSelector as CreateStructuredSelector)(selectors); export const HostList = () => { const dispatch = useDispatch<(a: HostAction) => void>(); - const history = useHistory(); const { listData, pageIndex, @@ -75,18 +89,9 @@ export const HostList = () => { defaultMessage: 'Hostname', }), render: ({ host: { hostname, id } }: { host: { hostname: string; id: string } }) => { + const newQueryParams = urlFromQueryParams({ ...queryParams, selected_host: id }); return ( - // eslint-disable-next-line @elastic/eui/href-or-on-click - { - ev.preventDefault(); - history.push(urlFromQueryParams({ ...queryParams, selected_host: id })); - }} - > - {hostname} - + ); }, }, @@ -150,7 +155,7 @@ export const HostList = () => { }, }, ]; - }, [queryParams, history]); + }, [queryParams]); return ( diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx index 2ecc2b117bf017..d780b7bde8af34 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.test.tsx @@ -101,7 +101,7 @@ describe('Policy Details', () => { 'EuiPageHeaderSection[data-test-subj="pageViewHeaderLeft"] EuiButtonEmpty' ); expect(history.location.pathname).toEqual('/policy/1'); - backToListButton.simulate('click'); + backToListButton.simulate('click', { button: 0 }); expect(history.location.pathname).toEqual('/policy'); }); it('should display agent stats', async () => { @@ -130,7 +130,7 @@ describe('Policy Details', () => { 'EuiButtonEmpty[data-test-subj="policyDetailsCancelButton"]' ); expect(history.location.pathname).toEqual('/policy/1'); - cancelbutton.simulate('click'); + cancelbutton.simulate('click', { button: 0 }); expect(history.location.pathname).toEqual('/policy'); }); it('should display save button', async () => { diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx index 076de7b57b44b4..ea9eb292dba1a9 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_details.tsx @@ -20,7 +20,6 @@ import { import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { useDispatch } from 'react-redux'; -import { useHistory } from 'react-router-dom'; import { usePolicyDetailsSelector } from './policy_hooks'; import { policyDetails, @@ -36,11 +35,11 @@ import { AgentsSummary } from './agents_summary'; import { VerticalDivider } from './vertical_divider'; import { WindowsEvents, MacEvents, LinuxEvents } from './policy_forms/events'; import { MalwareProtections } from './policy_forms/protections/malware'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; export const PolicyDetails = React.memo(() => { const dispatch = useDispatch<(action: AppAction) => void>(); const { notifications, services } = useKibana(); - const history = useHistory(); // Store values const policyItem = usePolicyDetailsSelector(policyDetails); @@ -82,13 +81,7 @@ export const PolicyDetails = React.memo(() => { } }, [notifications.toasts, policyItem, policyName, policyUpdateStatus]); - const handleBackToListOnClick: React.MouseEventHandler = useCallback( - ev => { - ev.preventDefault(); - history.push(`/policy`); - }, - [history] - ); + const handleBackToListOnClick = useNavigateByRouterEventHandler('/policy'); const handleSaveOnClick = useCallback(() => { setShowConfirm(true); diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx index 062c7afb6706dd..f7eafff137f519 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/policy/policy_list.tsx @@ -24,30 +24,26 @@ import { useKibana } from '../../../../../../../../src/plugins/kibana_react/publ import { PageView } from '../components/page_view'; import { LinkToApp } from '../components/link_to_app'; import { Immutable, PolicyData } from '../../../../../common/types'; +import { useNavigateByRouterEventHandler } from '../hooks/use_navigate_by_router_event_handler'; interface TableChangeCallbackArguments { page: { index: number; size: number }; } -const PolicyLink: React.FC<{ name: string; route: string }> = ({ name, route }) => { - const history = useHistory(); - +const PolicyLink: React.FC<{ name: string; route: string; href: string }> = ({ + name, + route, + href, +}) => { + const clickHandler = useNavigateByRouterEventHandler(route); return ( - { - event.preventDefault(); - history.push(route); - }} - > + // eslint-disable-next-line @elastic/eui/href-or-on-click + {name} ); }; -const renderPolicyNameLink = (value: string, item: Immutable) => { - return ; -}; - export const PolicyList = React.memo(() => { const { services, notifications } = useKibana(); const history = useHistory(); @@ -95,7 +91,16 @@ export const PolicyList = React.memo(() => { name: i18n.translate('xpack.endpoint.policyList.nameField', { defaultMessage: 'Policy Name', }), - render: renderPolicyNameLink, + render: (value: string, item: Immutable) => { + const routeUri = `/policy/${item.id}`; + return ( + + ); + }, truncateText: true, }, { From 592a0ff22423387600258fecdb3f44c0a39e4dda Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 21 Apr 2020 15:33:27 -0500 Subject: [PATCH 12/34] [SIEM] New Platform Saved Objects Registration (#64029) * WIP: Register saved objects types in NP This works, but responsibilities are spread around. Refactor incoming. * Moves new SO definitions into corresponding folders This way our top-level file still acts as the index, but these are more/less unconnected if/when we split these out into separate applications. * Replace raw SO updates with our ruleStatusSavedObjectsClient This mainly consolidates the SO type name and the attributes type to a single file so that we don't have to import both any time we want to work with RuleStatus SavedObjects. --- x-pack/legacy/plugins/siem/index.ts | 4 - .../routes/rules/create_rules_route.ts | 8 +- .../routes/rules/delete_rules_bulk_route.ts | 18 +- .../routes/rules/delete_rules_route.ts | 17 +- .../routes/rules/find_rules_route.ts | 13 +- .../routes/rules/find_rules_status_route.ts | 9 +- .../routes/rules/patch_rules_bulk_route.ts | 13 +- .../routes/rules/patch_rules_route.ts | 13 +- .../routes/rules/read_rules_route.ts | 13 +- .../routes/rules/update_rules_bulk_route.ts | 13 +- .../routes/rules/update_rules_route.ts | 13 +- .../rule_actions/saved_object_mappings.ts | 60 ++- .../lib/detection_engine/rules/patch_rules.ts | 28 +- .../rules/saved_object_mappings.ts | 77 +-- .../detection_engine/rules/update_rules.ts | 28 +- .../signals/__mocks__/es_results.ts | 2 +- .../siem/server/lib/note/saved_object.ts | 2 +- .../server/lib/note/saved_object_mappings.ts | 58 +-- .../server/lib/pinned_event/saved_object.ts | 3 +- .../lib/pinned_event/saved_object_mappings.ts | 52 +- .../timeline/routes/utils/export_timelines.ts | 9 +- .../lib/timeline/saved_object_mappings.ts | 476 +++++++++--------- x-pack/plugins/siem/server/plugin.ts | 21 +- x-pack/plugins/siem/server/saved_objects.ts | 43 +- 24 files changed, 464 insertions(+), 529 deletions(-) diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 5ffaea1ee73dfb..d572561944a76d 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -8,9 +8,6 @@ import { i18n } from '@kbn/i18n'; import { resolve } from 'path'; import { Root } from 'joi'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { savedObjectMappings } from '../../../plugins/siem/server/saved_objects'; - import { APP_ID, APP_NAME } from '../../../plugins/siem/common/constants'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/utils'; @@ -46,7 +43,6 @@ export const siem = (kibana: any) => { category: DEFAULT_APP_CATEGORIES.security, }, ], - mappings: savedObjectMappings, }, config(Joi: Root) { return Joi.object() diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index aa7a5cb0da7fd6..9f1cddb2051c9b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -9,10 +9,8 @@ import uuid from 'uuid'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { createRules } from '../../rules/create_rules'; -import { IRuleSavedAttributesSavedObjectAttributes } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; import { RuleAlertParamsRest } from '../../types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { transformValidate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; import { createRulesSchema } from '../schemas/create_rules_schema'; @@ -23,6 +21,7 @@ import { validateLicenseForRuleType, } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const createRulesRoute = (router: IRouter): void => { router.post( @@ -145,10 +144,7 @@ export const createRulesRoute = (router: IRouter): void => { name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusSavedObjectsClientFactory(savedObjectsClient).find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts index 38748e287ab451..b35ba27ef35619 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_bulk_route.ts @@ -11,14 +11,11 @@ import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; -import { - IRuleSavedAttributesSavedObjectAttributes, - DeleteRulesRequestParams, -} from '../../rules/types'; +import { DeleteRulesRequestParams } from '../../rules/types'; import { deleteRules } from '../../rules/delete_rules'; import { deleteNotifications } from '../../notifications/delete_notifications'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; type Config = RouteConfig; type Handler = RequestHandler; @@ -44,6 +41,8 @@ export const deleteRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); + const rules = await Promise.all( request.body.map(async payloadRule => { const { id, rule_id: ruleId } = payloadRule; @@ -61,17 +60,12 @@ export const deleteRulesBulkRoute = (router: IRouter) => { ruleAlertId: rule.id, savedObjectsClient, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 6, search: rule.id, searchFields: ['alertId'], }); - ruleStatuses.saved_objects.forEach(async obj => - savedObjectsClient.delete(ruleStatusSavedObjectType, obj.id) - ); + ruleStatuses.saved_objects.forEach(async obj => ruleStatusClient.delete(obj.id)); return transformValidateBulkError(idOrRuleIdOrUnknown, rule, undefined, ruleStatuses); } else { return getIdBulkError({ id, ruleId }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts index 098d556741fed5..2288633ee8d2e0 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/delete_rules_route.ts @@ -11,13 +11,10 @@ import { queryRulesSchema } from '../schemas/query_rules_schema'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; -import { - DeleteRuleRequestParams, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; +import { DeleteRuleRequestParams } from '../../rules/types'; import { deleteNotifications } from '../../notifications/delete_notifications'; import { deleteRuleActionsSavedObject } from '../../rule_actions/delete_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const deleteRulesRoute = (router: IRouter) => { router.delete( @@ -44,6 +41,7 @@ export const deleteRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await deleteRules({ actionsClient, alertsClient, @@ -56,17 +54,12 @@ export const deleteRulesRoute = (router: IRouter) => { ruleAlertId: rule.id, savedObjectsClient, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 6, search: rule.id, searchFields: ['alertId'], }); - ruleStatuses.saved_objects.forEach(async obj => - savedObjectsClient.delete(ruleStatusSavedObjectType, obj.id) - ); + ruleStatuses.saved_objects.forEach(async obj => ruleStatusClient.delete(obj.id)); const [validated, errors] = transformValidate( rule, undefined, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts index 9661fac81497cb..f293b9e64a316a 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_route.ts @@ -7,15 +7,12 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRules } from '../../rules/find_rules'; -import { - FindRulesRequestParams, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; +import { FindRulesRequestParams } from '../../rules/types'; import { findRulesSchema } from '../schemas/find_rules_schema'; import { transformValidateFindAlerts } from './validate'; import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const findRulesRoute = (router: IRouter) => { router.get( @@ -40,6 +37,7 @@ export const findRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await findRules({ alertsClient, perPage: query.per_page, @@ -50,10 +48,7 @@ export const findRulesRoute = (router: IRouter) => { }); const ruleStatuses = await Promise.all( rules.data.map(async rule => { - const results = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const results = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts index 6b54a25a1b1c47..8e35fecf6a6523 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/find_rules_status_route.ts @@ -9,17 +9,16 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { findRulesStatusesSchema } from '../schemas/find_rules_statuses_schema'; import { FindRulesStatusesRequestParams, - IRuleSavedAttributesSavedObjectAttributes, RuleStatusResponse, IRuleStatusAttributes, } from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { buildRouteValidation, transformError, convertToSnakeCase, buildSiemResponse, } from '../utils'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const findRulesStatusesRoute = (router: IRouter) => { router.post( @@ -50,12 +49,10 @@ export const findRulesStatusesRoute = (router: IRouter) => { } */ try { + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const statuses = await body.ids.reduce>( async (acc, id) => { - const lastFiveErrorsForId = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const lastFiveErrorsForId = await ruleStatusClient.find({ perPage: 6, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts index e4236f4632dcd0..534253db65d787 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts @@ -6,10 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { - IRuleSavedAttributesSavedObjectAttributes, - PatchRuleAlertParamsRest, -} from '../../rules/types'; +import { PatchRuleAlertParamsRest } from '../../rules/types'; import { transformBulkError, buildRouteValidation, @@ -21,8 +18,8 @@ import { transformValidateBulkError, validate } from './validate'; import { patchRulesBulkSchema } from '../schemas/patch_rules_bulk_schema'; import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { patchRules } from '../../rules/patch_rules'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const patchRulesBulkRoute = (router: IRouter) => { router.patch( @@ -46,6 +43,7 @@ export const patchRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await Promise.all( request.body.map(async payloadRule => { const { @@ -131,10 +129,7 @@ export const patchRulesBulkRoute = (router: IRouter) => { throttle, name: rule.name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts index 23469144e11f8b..f7932cb016ba7b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts @@ -7,10 +7,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { patchRules } from '../../rules/patch_rules'; -import { - PatchRuleAlertParamsRest, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; +import { PatchRuleAlertParamsRest } from '../../rules/types'; import { patchRulesSchema } from '../schemas/patch_rules_schema'; import { buildRouteValidation, @@ -20,8 +17,8 @@ import { } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const patchRulesRoute = (router: IRouter) => { router.patch( @@ -83,6 +80,7 @@ export const patchRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await patchRules({ actionsClient, alertsClient, @@ -127,10 +125,7 @@ export const patchRulesRoute = (router: IRouter) => { throttle, name: rule.name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts index 4d23e0217f2e8b..cedd7ccd1a411b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/read_rules_route.ts @@ -11,12 +11,9 @@ import { transformValidate } from './validate'; import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; import { readRules } from '../../rules/read_rules'; import { queryRulesSchema } from '../schemas/query_rules_schema'; -import { - ReadRuleRequestParams, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; +import { ReadRuleRequestParams } from '../../rules/types'; import { getRuleActionsSavedObject } from '../../rule_actions/get_rule_actions_saved_object'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const readRulesRoute = (router: IRouter) => { router.get( @@ -41,6 +38,7 @@ export const readRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await readRules({ alertsClient, id, @@ -51,10 +49,7 @@ export const readRulesRoute = (router: IRouter) => { savedObjectsClient, ruleAlertId: rule.id, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index a2fb78747ff047..f929f2fb3f6495 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -6,10 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { - IRuleSavedAttributesSavedObjectAttributes, - UpdateRuleAlertParamsRest, -} from '../../rules/types'; +import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { @@ -19,10 +16,10 @@ import { validateLicenseForRuleType, } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRules } from '../../rules/update_rules'; import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const updateRulesBulkRoute = (router: IRouter) => { router.put( @@ -47,6 +44,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await Promise.all( request.body.map(async payloadRule => { const { @@ -134,10 +132,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { throttle, name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index 91a32c19eb5e7b..dedc2c914410a9 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -6,10 +6,7 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; -import { - UpdateRuleAlertParamsRest, - IRuleSavedAttributesSavedObjectAttributes, -} from '../../rules/types'; +import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { updateRulesSchema } from '../schemas/update_rules_schema'; import { buildRouteValidation, @@ -19,9 +16,9 @@ import { } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; -import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; export const updateRulesRoute = (router: IRouter) => { router.put( @@ -78,6 +75,7 @@ export const updateRulesRoute = (router: IRouter) => { const actionsClient = context.actions?.getActionsClient(); const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.siem?.getSiemClient(); + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); if (!siemClient || !actionsClient || !alertsClient) { return siemResponse.error({ statusCode: 404 }); @@ -131,10 +129,7 @@ export const updateRulesRoute = (router: IRouter) => { throttle, name, }); - const ruleStatuses = await savedObjectsClient.find< - IRuleSavedAttributesSavedObjectAttributes - >({ - type: ruleStatusSavedObjectType, + const ruleStatuses = await ruleStatusClient.find({ perPage: 1, sortField: 'statusDate', sortOrder: 'desc', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts index f54f43c41ef6ee..d50c339c95266c 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts @@ -4,37 +4,45 @@ * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsType } from '../../../../../../../src/core/server'; + export const ruleActionsSavedObjectType = 'siem-detection-engine-rule-actions'; export const ruleActionsSavedObjectMappings = { - [ruleActionsSavedObjectType]: { - properties: { - alertThrottle: { - type: 'keyword', - }, - ruleAlertId: { - type: 'keyword', - }, - ruleThrottle: { - type: 'keyword', - }, - actions: { - properties: { - group: { - type: 'keyword', - }, - id: { - type: 'keyword', - }, - action_type_id: { - type: 'keyword', - }, - params: { - dynamic: true, - properties: {}, - }, + properties: { + alertThrottle: { + type: 'keyword', + }, + ruleAlertId: { + type: 'keyword', + }, + ruleThrottle: { + type: 'keyword', + }, + actions: { + properties: { + group: { + type: 'keyword', + }, + id: { + type: 'keyword', + }, + action_type_id: { + type: 'keyword', + }, + params: { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + dynamic: true as any, + properties: {}, }, }, }, }, }; + +export const type: SavedObjectsType = { + name: ruleActionsSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: ruleActionsSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts index c23f539b581606..85b13ed9cf4ed8 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts @@ -7,10 +7,10 @@ import { defaults } from 'lodash/fp'; import { PartialAlert } from '../../../../../alerting/server'; import { readRules } from './read_rules'; -import { PatchRuleParams, IRuleSavedAttributesSavedObjectAttributes } from './types'; +import { PatchRuleParams } from './types'; import { addTags } from './add_tags'; -import { ruleStatusSavedObjectType } from './saved_object_mappings'; import { calculateVersion, calculateName, calculateInterval } from './utils'; +import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; export const patchRules = async ({ alertsClient, @@ -134,22 +134,22 @@ export const patchRules = async ({ await alertsClient.disable({ id: rule.id }); } else if (!rule.enabled && enabled === true) { await alertsClient.enable({ id: rule.id }); - const ruleCurrentStatus = savedObjectsClient - ? await savedObjectsClient.find({ - type: ruleStatusSavedObjectType, - perPage: 1, - sortField: 'statusDate', - sortOrder: 'desc', - search: rule.id, - searchFields: ['alertId'], - }) - : null; + + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); + const ruleCurrentStatus = await ruleStatusClient.find({ + perPage: 1, + sortField: 'statusDate', + sortOrder: 'desc', + search: rule.id, + searchFields: ['alertId'], + }); + // set current status for this rule to be 'going to run' if (ruleCurrentStatus && ruleCurrentStatus.saved_objects.length > 0) { const currentStatusToDisable = ruleCurrentStatus.saved_objects[0]; - currentStatusToDisable.attributes.status = 'going to run'; - await savedObjectsClient?.update(ruleStatusSavedObjectType, currentStatusToDisable.id, { + await ruleStatusClient.update(currentStatusToDisable.id, { ...currentStatusToDisable.attributes, + status: 'going to run', }); } } else { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts index 1d91def5fa6cc9..2dcc90240ad407 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts @@ -4,44 +4,51 @@ * you may not use this file except in compliance with the Elastic License. */ +import { SavedObjectsType } from '../../../../../../../src/core/server'; + export const ruleStatusSavedObjectType = 'siem-detection-engine-rule-status'; export const ruleStatusSavedObjectMappings = { - [ruleStatusSavedObjectType]: { - properties: { - alertId: { - type: 'keyword', - }, - status: { - type: 'keyword', - }, - statusDate: { - type: 'date', - }, - lastFailureAt: { - type: 'date', - }, - lastSuccessAt: { - type: 'date', - }, - lastFailureMessage: { - type: 'text', - }, - lastSuccessMessage: { - type: 'text', - }, - lastLookBackDate: { - type: 'date', - }, - gap: { - type: 'text', - }, - bulkCreateTimeDurations: { - type: 'float', - }, - searchAfterTimeDurations: { - type: 'float', - }, + properties: { + alertId: { + type: 'keyword', + }, + status: { + type: 'keyword', + }, + statusDate: { + type: 'date', + }, + lastFailureAt: { + type: 'date', + }, + lastSuccessAt: { + type: 'date', + }, + lastFailureMessage: { + type: 'text', + }, + lastSuccessMessage: { + type: 'text', + }, + lastLookBackDate: { + type: 'date', + }, + gap: { + type: 'text', + }, + bulkCreateTimeDurations: { + type: 'float', + }, + searchAfterTimeDurations: { + type: 'float', }, }, }; + +export const type: SavedObjectsType = { + name: ruleStatusSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: ruleStatusSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts index 7ddbbd76b06618..29c2cfdf91076a 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_rules.ts @@ -7,11 +7,11 @@ import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { PartialAlert } from '../../../../../alerting/server'; import { readRules } from './read_rules'; -import { IRuleSavedAttributesSavedObjectAttributes, UpdateRuleParams } from './types'; +import { UpdateRuleParams } from './types'; import { addTags } from './add_tags'; -import { ruleStatusSavedObjectType } from './saved_object_mappings'; import { calculateVersion } from './utils'; import { hasListsFeature } from '../feature_flags'; +import { ruleStatusSavedObjectsClientFactory } from '../signals/rule_status_saved_objects_client'; export const updateRules = async ({ alertsClient, @@ -129,22 +129,22 @@ export const updateRules = async ({ await alertsClient.disable({ id: rule.id }); } else if (!rule.enabled && enabled === true) { await alertsClient.enable({ id: rule.id }); - const ruleCurrentStatus = savedObjectsClient - ? await savedObjectsClient.find({ - type: ruleStatusSavedObjectType, - perPage: 1, - sortField: 'statusDate', - sortOrder: 'desc', - search: rule.id, - searchFields: ['alertId'], - }) - : null; + + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); + const ruleCurrentStatus = await ruleStatusClient.find({ + perPage: 1, + sortField: 'statusDate', + sortOrder: 'desc', + search: rule.id, + searchFields: ['alertId'], + }); + // set current status for this rule to be 'going to run' if (ruleCurrentStatus && ruleCurrentStatus.saved_objects.length > 0) { const currentStatusToDisable = ruleCurrentStatus.saved_objects[0]; - currentStatusToDisable.attributes.status = 'going to run'; - await savedObjectsClient?.update(ruleStatusSavedObjectType, currentStatusToDisable.id, { + await ruleStatusClient.update(currentStatusToDisable.id, { ...currentStatusToDisable.attributes, + status: 'going to run', }); } } diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts index 731fffcac1bb0e..251a1e6d118ff1 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/__mocks__/es_results.ts @@ -13,7 +13,7 @@ import { import { loggingServiceMock } from '../../../../../../../../src/core/server/mocks'; import { RuleTypeParams, OutputRuleAlertRest } from '../../types'; import { IRuleStatusAttributes } from '../../rules/types'; -import { ruleStatusSavedObjectType } from '../../../../saved_objects'; +import { ruleStatusSavedObjectType } from '../../rules/saved_object_mappings'; export const sampleRuleAlertParams = ( maxSignals?: number | undefined, diff --git a/x-pack/plugins/siem/server/lib/note/saved_object.ts b/x-pack/plugins/siem/server/lib/note/saved_object.ts index 2b94fd4516786e..3eae30625e4223 100644 --- a/x-pack/plugins/siem/server/lib/note/saved_object.ts +++ b/x-pack/plugins/siem/server/lib/note/saved_object.ts @@ -25,9 +25,9 @@ import { import { FrameworkRequest } from '../framework'; import { SavedNote, NoteSavedObjectRuntimeType, NoteSavedObject } from './types'; import { noteSavedObjectType } from './saved_object_mappings'; -import { timelineSavedObjectType } from '../../saved_objects'; import { pickSavedTimeline } from '../timeline/pick_saved_timeline'; import { convertSavedObjectToSavedTimeline } from '../timeline/convert_saved_object_to_savedtimeline'; +import { timelineSavedObjectType } from '../timeline/saved_object_mappings'; export class Note { public async deleteNote(request: FrameworkRequest, noteIds: string[]) { diff --git a/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts index b001e30e523362..0f079571b868b5 100644 --- a/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts @@ -4,37 +4,39 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; -import { SavedNote } from './types'; +import { SavedObjectsType } from '../../../../../../src/core/server'; export const noteSavedObjectType = 'siem-ui-timeline-note'; -export const noteSavedObjectMappings: { - [noteSavedObjectType]: ElasticsearchMappingOf; -} = { - [noteSavedObjectType]: { - properties: { - timelineId: { - type: 'keyword', - }, - eventId: { - type: 'keyword', - }, - note: { - type: 'text', - }, - created: { - type: 'date', - }, - createdBy: { - type: 'text', - }, - updated: { - type: 'date', - }, - updatedBy: { - type: 'text', - }, +export const noteSavedObjectMappings = { + properties: { + timelineId: { + type: 'keyword', + }, + eventId: { + type: 'keyword', + }, + note: { + type: 'text', + }, + created: { + type: 'date', + }, + createdBy: { + type: 'text', + }, + updated: { + type: 'date', + }, + updatedBy: { + type: 'text', }, }, }; + +export const type: SavedObjectsType = { + name: noteSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: noteSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts b/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts index 7fc23d86d82186..1e3a481e17106f 100644 --- a/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts +++ b/x-pack/plugins/siem/server/lib/pinned_event/saved_object.ts @@ -20,9 +20,10 @@ import { SavedPinnedEvent, } from './types'; import { PageInfoNote, SortNote, PinnedEvent as PinnedEventResponse } from '../../graphql/types'; -import { pinnedEventSavedObjectType, timelineSavedObjectType } from '../../saved_objects'; import { pickSavedTimeline } from '../timeline/pick_saved_timeline'; import { convertSavedObjectToSavedTimeline } from '../timeline/convert_saved_object_to_savedtimeline'; +import { pinnedEventSavedObjectType } from './saved_object_mappings'; +import { timelineSavedObjectType } from '../timeline/saved_object_mappings'; export class PinnedEvent { public async deletePinnedEventOnTimeline(request: FrameworkRequest, pinnedEventIds: string[]) { diff --git a/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts index 322f585ae8ff28..1a4cd3fce575d6 100644 --- a/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts @@ -4,34 +4,36 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; -import { SavedPinnedEvent } from './types'; +import { SavedObjectsType } from '../../../../../../src/core/server'; export const pinnedEventSavedObjectType = 'siem-ui-timeline-pinned-event'; -export const pinnedEventSavedObjectMappings: { - [pinnedEventSavedObjectType]: ElasticsearchMappingOf; -} = { - [pinnedEventSavedObjectType]: { - properties: { - timelineId: { - type: 'keyword', - }, - eventId: { - type: 'keyword', - }, - created: { - type: 'date', - }, - createdBy: { - type: 'text', - }, - updated: { - type: 'date', - }, - updatedBy: { - type: 'text', - }, +export const pinnedEventSavedObjectMappings = { + properties: { + timelineId: { + type: 'keyword', + }, + eventId: { + type: 'keyword', + }, + created: { + type: 'date', + }, + createdBy: { + type: 'text', + }, + updated: { + type: 'date', + }, + updatedBy: { + type: 'text', }, }, }; + +export const type: SavedObjectsType = { + name: pinnedEventSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: pinnedEventSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts b/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts index edd4abe0d76b5f..677891fa16c024 100644 --- a/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts +++ b/x-pack/plugins/siem/server/lib/timeline/routes/utils/export_timelines.ts @@ -4,12 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { set as _set } from 'lodash/fp'; -import { - noteSavedObjectType, - pinnedEventSavedObjectType, - timelineSavedObjectType, -} from '../../../../saved_objects'; import { NoteSavedObject } from '../../../note/types'; import { PinnedEventSavedObject } from '../../../pinned_event/types'; import { convertSavedObjectToSavedTimeline } from '../../convert_saved_object_to_savedtimeline'; @@ -30,6 +24,9 @@ import { TimelineSavedObject, } from '../../types'; import { transformDataToNdjson } from '../../../../utils/read_stream/create_stream_from_ndjson'; +import { pinnedEventSavedObjectType } from '../../../pinned_event/saved_object_mappings'; +import { noteSavedObjectType } from '../../../note/saved_object_mappings'; +import { timelineSavedObjectType } from '../../saved_object_mappings'; export type TimelineSavedObjectsClient = Pick< SavedObjectsClient, diff --git a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts index 8fc12fd56a8f60..b956e0f98fcb62 100644 --- a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts @@ -4,272 +4,274 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ElasticsearchMappingOf } from '../../utils/typed_elasticsearch_mappings'; -import { SavedTimeline } from './types'; +import { SavedObjectsType } from '../../../../../../src/core/server'; export const timelineSavedObjectType = 'siem-ui-timeline'; -export const timelineSavedObjectMappings: { - [timelineSavedObjectType]: ElasticsearchMappingOf; -} = { - [timelineSavedObjectType]: { - properties: { - columns: { - properties: { - aggregatable: { - type: 'boolean', - }, - category: { - type: 'keyword', - }, - columnHeaderType: { - type: 'keyword', - }, - description: { - type: 'text', - }, - example: { - type: 'text', - }, - indexes: { - type: 'keyword', - }, - id: { - type: 'keyword', - }, - name: { - type: 'text', - }, - placeholder: { - type: 'text', - }, - searchable: { - type: 'boolean', - }, - type: { - type: 'keyword', - }, +export const timelineSavedObjectMappings = { + properties: { + columns: { + properties: { + aggregatable: { + type: 'boolean', + }, + category: { + type: 'keyword', + }, + columnHeaderType: { + type: 'keyword', + }, + description: { + type: 'text', + }, + example: { + type: 'text', + }, + indexes: { + type: 'keyword', + }, + id: { + type: 'keyword', + }, + name: { + type: 'text', + }, + placeholder: { + type: 'text', + }, + searchable: { + type: 'boolean', + }, + type: { + type: 'keyword', }, }, - dataProviders: { - properties: { - id: { - type: 'keyword', - }, - name: { - type: 'text', - }, - enabled: { - type: 'boolean', - }, - excluded: { - type: 'boolean', - }, - kqlQuery: { - type: 'text', - }, - queryMatch: { - properties: { - field: { - type: 'text', - }, - displayField: { - type: 'text', - }, - value: { - type: 'text', - }, - displayValue: { - type: 'text', - }, - operator: { - type: 'text', - }, + }, + dataProviders: { + properties: { + id: { + type: 'keyword', + }, + name: { + type: 'text', + }, + enabled: { + type: 'boolean', + }, + excluded: { + type: 'boolean', + }, + kqlQuery: { + type: 'text', + }, + queryMatch: { + properties: { + field: { + type: 'text', + }, + displayField: { + type: 'text', + }, + value: { + type: 'text', + }, + displayValue: { + type: 'text', + }, + operator: { + type: 'text', }, }, - and: { - properties: { - id: { - type: 'keyword', - }, - name: { - type: 'text', - }, - enabled: { - type: 'boolean', - }, - excluded: { - type: 'boolean', - }, - kqlQuery: { - type: 'text', - }, - queryMatch: { - properties: { - field: { - type: 'text', - }, - displayField: { - type: 'text', - }, - value: { - type: 'text', - }, - displayValue: { - type: 'text', - }, - operator: { - type: 'text', - }, + }, + and: { + properties: { + id: { + type: 'keyword', + }, + name: { + type: 'text', + }, + enabled: { + type: 'boolean', + }, + excluded: { + type: 'boolean', + }, + kqlQuery: { + type: 'text', + }, + queryMatch: { + properties: { + field: { + type: 'text', + }, + displayField: { + type: 'text', + }, + value: { + type: 'text', + }, + displayValue: { + type: 'text', + }, + operator: { + type: 'text', }, }, }, }, }, }, - description: { - type: 'text', - }, - eventType: { - type: 'keyword', - }, - favorite: { - properties: { - keySearch: { - type: 'text', - }, - fullName: { - type: 'text', - }, - userName: { - type: 'text', - }, - favoriteDate: { - type: 'date', - }, + }, + description: { + type: 'text', + }, + eventType: { + type: 'keyword', + }, + favorite: { + properties: { + keySearch: { + type: 'text', + }, + fullName: { + type: 'text', + }, + userName: { + type: 'text', + }, + favoriteDate: { + type: 'date', }, }, - filters: { - properties: { - meta: { - properties: { - alias: { - type: 'text', - }, - controlledBy: { - type: 'text', - }, - disabled: { - type: 'boolean', - }, - field: { - type: 'text', - }, - formattedValue: { - type: 'text', - }, - index: { - type: 'keyword', - }, - key: { - type: 'keyword', - }, - negate: { - type: 'boolean', - }, - params: { - type: 'text', - }, - type: { - type: 'keyword', - }, - value: { - type: 'text', - }, + }, + filters: { + properties: { + meta: { + properties: { + alias: { + type: 'text', + }, + controlledBy: { + type: 'text', + }, + disabled: { + type: 'boolean', + }, + field: { + type: 'text', + }, + formattedValue: { + type: 'text', + }, + index: { + type: 'keyword', + }, + key: { + type: 'keyword', + }, + negate: { + type: 'boolean', + }, + params: { + type: 'text', + }, + type: { + type: 'keyword', + }, + value: { + type: 'text', }, - }, - exists: { - type: 'text', - }, - match_all: { - type: 'text', - }, - missing: { - type: 'text', - }, - query: { - type: 'text', - }, - range: { - type: 'text', - }, - script: { - type: 'text', }, }, + exists: { + type: 'text', + }, + match_all: { + type: 'text', + }, + missing: { + type: 'text', + }, + query: { + type: 'text', + }, + range: { + type: 'text', + }, + script: { + type: 'text', + }, }, - kqlMode: { - type: 'keyword', - }, - kqlQuery: { - properties: { - filterQuery: { - properties: { - kuery: { - properties: { - kind: { - type: 'keyword', - }, - expression: { - type: 'text', - }, + }, + kqlMode: { + type: 'keyword', + }, + kqlQuery: { + properties: { + filterQuery: { + properties: { + kuery: { + properties: { + kind: { + type: 'keyword', + }, + expression: { + type: 'text', }, }, - serializedQuery: { - type: 'text', - }, + }, + serializedQuery: { + type: 'text', }, }, }, }, - title: { - type: 'text', - }, - dateRange: { - properties: { - start: { - type: 'date', - }, - end: { - type: 'date', - }, + }, + title: { + type: 'text', + }, + dateRange: { + properties: { + start: { + type: 'date', }, - }, - savedQueryId: { - type: 'keyword', - }, - sort: { - properties: { - columnId: { - type: 'keyword', - }, - sortDirection: { - type: 'keyword', - }, + end: { + type: 'date', }, }, - created: { - type: 'date', - }, - createdBy: { - type: 'text', - }, - updated: { - type: 'date', - }, - updatedBy: { - type: 'text', + }, + savedQueryId: { + type: 'keyword', + }, + sort: { + properties: { + columnId: { + type: 'keyword', + }, + sortDirection: { + type: 'keyword', + }, }, }, + created: { + type: 'date', + }, + createdBy: { + type: 'text', + }, + updated: { + type: 'date', + }, + updatedBy: { + type: 'text', + }, }, }; + +export const type: SavedObjectsType = { + name: timelineSavedObjectType, + hidden: false, + namespaceType: 'single', + mappings: timelineSavedObjectMappings, +}; diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index e12832dc876bf8..3988fbec05de4f 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -34,13 +34,7 @@ import { signalRulesAlertType } from './lib/detection_engine/signals/signal_rule import { rulesNotificationAlertType } from './lib/detection_engine/notifications/rules_notification_alert_type'; import { isNotificationAlertExecutor } from './lib/detection_engine/notifications/types'; import { hasListsFeature, listsEnvFeatureFlagName } from './lib/detection_engine/feature_flags'; -import { - noteSavedObjectType, - pinnedEventSavedObjectType, - timelineSavedObjectType, - ruleStatusSavedObjectType, - ruleActionsSavedObjectType, -} from './saved_objects'; +import { initSavedObjects, savedObjectTypes } from './saved_objects'; import { SiemClientFactory } from './client'; import { createConfig$, ConfigType } from './config'; import { initUiSettings } from './ui_settings'; @@ -93,6 +87,7 @@ export class Plugin implements IPlugin type.name); + +export const initSavedObjects = (savedObjects: CoreSetup['savedObjects']) => { + types.forEach(type => savedObjects.registerType(type)); }; From adc9b0d7577f66ce5e23e6728acaa1a1b2288478 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Tue, 21 Apr 2020 16:39:32 -0400 Subject: [PATCH 13/34] [EPM] /packages/{package} endpoint to support upgrades (#63629) * install template after pipeline creation * return installed pkg if this pkg version is already installed * remove pipelines after templates are updated * remove kibana saved objects assets before installing * update current write indices * add back removal of merging previous references lost in rebase * improve some typing names, consolidate, fix bad merges * update query to use aggregate on _index Co-authored-by: Elastic Machine --- .../ingest_manager/common/types/models/epm.ts | 9 ++ .../__snapshots__/template.test.ts.snap | 9 -- .../epm/elasticsearch/template/install.ts | 26 ++- .../epm/elasticsearch/template/template.ts | 153 +++++++++++++++--- .../server/services/epm/packages/install.ts | 113 ++++++++----- .../server/services/epm/packages/remove.ts | 66 +++++++- .../ingest_manager/server/types/index.tsx | 2 + 7 files changed, 286 insertions(+), 92 deletions(-) diff --git a/x-pack/plugins/ingest_manager/common/types/models/epm.ts b/x-pack/plugins/ingest_manager/common/types/models/epm.ts index 53ad0310ea6134..a13e1655d56665 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -256,6 +256,10 @@ export enum DefaultPackages { endpoint = 'endpoint', } +export interface IndexTemplateMappings { + properties: any; +} + export interface IndexTemplate { order: number; index_patterns: string[]; @@ -263,3 +267,8 @@ export interface IndexTemplate { mappings: object; aliases: object; } + +export interface TemplateRef { + templateName: string; + indexTemplate: IndexTemplate; +} diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap index 166983fbccc35a..5cf1f241a709fe 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/__snapshots__/template.test.ts.snap @@ -28,9 +28,6 @@ exports[`tests loading base.yml: base.yml 1`] = ` } }, "mappings": { - "_meta": { - "package": "foo" - }, "dynamic_templates": [ { "strings_as_keyword": { @@ -123,9 +120,6 @@ exports[`tests loading coredns.logs.yml: coredns.logs.yml 1`] = ` } }, "mappings": { - "_meta": { - "package": "foo" - }, "dynamic_templates": [ { "strings_as_keyword": { @@ -218,9 +212,6 @@ exports[`tests loading system.yml: system.yml 1`] = ` } }, "mappings": { - "_meta": { - "package": "foo" - }, "dynamic_templates": [ { "strings_as_keyword": { diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts index 560ddfc1f68857..4df626259ece76 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/install.ts @@ -4,13 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - AssetReference, - Dataset, - RegistryPackage, - IngestAssetType, - ElasticsearchAssetType, -} from '../../../../types'; +import { Dataset, RegistryPackage, ElasticsearchAssetType, TemplateRef } from '../../../../types'; import { CallESAsCurrentUser } from '../../../../types'; import { Field, loadFieldsFromYaml, processFields } from '../../fields/field'; import { getPipelineNameForInstallation } from '../ingest_pipeline/install'; @@ -22,7 +16,7 @@ export const installTemplates = async ( callCluster: CallESAsCurrentUser, pkgName: string, pkgVersion: string -) => { +): Promise => { // install any pre-built index template assets, // atm, this is only the base package's global template installPreBuiltTemplates(pkgName, pkgVersion, callCluster); @@ -30,7 +24,7 @@ export const installTemplates = async ( // build templates per dataset from yml files const datasets = registryPackage.datasets; if (datasets) { - const templates = datasets.reduce>>((acc, dataset) => { + const installTemplatePromises = datasets.reduce>>((acc, dataset) => { acc.push( installTemplateForDataset({ pkg: registryPackage, @@ -40,7 +34,9 @@ export const installTemplates = async ( ); return acc; }, []); - return Promise.all(templates).then(results => results.flat()); + + const res = await Promise.all(installTemplatePromises); + return res.flat(); } return []; }; @@ -84,7 +80,7 @@ export async function installTemplateForDataset({ pkg: RegistryPackage; callCluster: CallESAsCurrentUser; dataset: Dataset; -}): Promise { +}): Promise { const fields = await loadFieldsFromYaml(pkg, dataset.path); return installTemplate({ callCluster, @@ -104,7 +100,7 @@ export async function installTemplate({ fields: Field[]; dataset: Dataset; packageVersion: string; -}): Promise { +}): Promise { const mappings = generateMappings(processFields(fields)); const templateName = generateTemplateName(dataset); let pipelineName; @@ -122,6 +118,8 @@ export async function installTemplate({ body: template, }); - // The id of a template is its name - return { id: templateName, type: IngestAssetType.IndexTemplate }; + return { + templateName, + indexTemplate: template, + }; } diff --git a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts index 22a61d2bdfb7c3..46b6923962462e 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/elasticsearch/template/template.ts @@ -5,24 +5,30 @@ */ import { Field, Fields } from '../../fields/field'; -import { Dataset, IndexTemplate } from '../../../../types'; +import { + Dataset, + CallESAsCurrentUser, + TemplateRef, + IndexTemplate, + IndexTemplateMappings, +} from '../../../../types'; import { getDatasetAssetBaseName } from '../index'; interface Properties { [key: string]: any; } -interface Mappings { - properties: any; -} - -interface Mapping { - [key: string]: any; -} interface MultiFields { [key: string]: object; } +export interface IndexTemplateMapping { + [key: string]: any; +} +export interface CurrentIndex { + indexName: string; + indexTemplate: IndexTemplate; +} const DEFAULT_SCALING_FACTOR = 1000; const DEFAULT_IGNORE_ABOVE = 1024; @@ -34,7 +40,7 @@ const DEFAULT_IGNORE_ABOVE = 1024; export function getTemplate( type: string, templateName: string, - mappings: Mappings, + mappings: IndexTemplateMappings, pipelineName?: string | undefined ): IndexTemplate { const template = getBaseTemplate(type, templateName, mappings); @@ -52,7 +58,7 @@ export function getTemplate( * * @param fields */ -export function generateMappings(fields: Field[]): Mappings { +export function generateMappings(fields: Field[]): IndexTemplateMappings { const props: Properties = {}; // TODO: this can happen when the fields property in fields.yml is present but empty // Maybe validation should be moved to fields/field.ts @@ -140,8 +146,8 @@ function generateMultiFields(fields: Fields): MultiFields { return multiFields; } -function generateKeywordMapping(field: Field): Mapping { - const mapping: Mapping = { +function generateKeywordMapping(field: Field): IndexTemplateMapping { + const mapping: IndexTemplateMapping = { ignore_above: DEFAULT_IGNORE_ABOVE, }; if (field.ignore_above) { @@ -150,8 +156,8 @@ function generateKeywordMapping(field: Field): Mapping { return mapping; } -function generateTextMapping(field: Field): Mapping { - const mapping: Mapping = {}; +function generateTextMapping(field: Field): IndexTemplateMapping { + const mapping: IndexTemplateMapping = {}; if (field.analyzer) { mapping.analyzer = field.analyzer; } @@ -200,7 +206,11 @@ export function generateESIndexPatterns(datasets: Dataset[] | undefined): Record return patterns; } -function getBaseTemplate(type: string, templateName: string, mappings: Mappings): IndexTemplate { +function getBaseTemplate( + type: string, + templateName: string, + mappings: IndexTemplateMappings +): IndexTemplate { return { // We need to decide which order we use for the templates order: 1, @@ -234,10 +244,6 @@ function getBaseTemplate(type: string, templateName: string, mappings: Mappings) }, }, mappings: { - // To be filled with interesting information about this specific index - _meta: { - package: 'foo', - }, // All the dynamic field mappings dynamic_templates: [ // This makes sure all mappings are keywords by default @@ -261,3 +267,112 @@ function getBaseTemplate(type: string, templateName: string, mappings: Mappings) aliases: {}, }; } + +export const updateCurrentWriteIndices = async ( + callCluster: CallESAsCurrentUser, + templates: TemplateRef[] +): Promise => { + if (!templates) return; + + const allIndices = await queryIndicesFromTemplates(callCluster, templates); + return updateAllIndices(allIndices, callCluster); +}; + +const queryIndicesFromTemplates = async ( + callCluster: CallESAsCurrentUser, + templates: TemplateRef[] +): Promise => { + const indexPromises = templates.map(template => { + return getIndices(callCluster, template); + }); + const indexObjects = await Promise.all(indexPromises); + return indexObjects.filter(item => item !== undefined).flat(); +}; + +const getIndices = async ( + callCluster: CallESAsCurrentUser, + template: TemplateRef +): Promise => { + const { templateName, indexTemplate } = template; + const res = await callCluster('search', getIndexQuery(templateName)); + const indices: any[] = res?.aggregations?.index.buckets; + if (indices) { + return indices.map(index => ({ + indexName: index.key, + indexTemplate, + })); + } +}; + +const updateAllIndices = async ( + indexNameWithTemplates: CurrentIndex[], + callCluster: CallESAsCurrentUser +): Promise => { + const updateIndexPromises = indexNameWithTemplates.map(({ indexName, indexTemplate }) => { + return updateExistingIndex({ indexName, callCluster, indexTemplate }); + }); + await Promise.all(updateIndexPromises); +}; +const updateExistingIndex = async ({ + indexName, + callCluster, + indexTemplate, +}: { + indexName: string; + callCluster: CallESAsCurrentUser; + indexTemplate: IndexTemplate; +}) => { + const { settings, mappings } = indexTemplate; + // try to update the mappings first + // for now we assume updates are compatible + try { + await callCluster('indices.putMapping', { + index: indexName, + body: mappings, + }); + } catch (err) { + throw new Error('incompatible mappings update'); + } + // update settings after mappings was successful to ensure + // pointing to theme new pipeline is safe + // for now, only update the pipeline + if (!settings.index.default_pipeline) return; + try { + await callCluster('indices.putSettings', { + index: indexName, + body: { index: { default_pipeline: settings.index.default_pipeline } }, + }); + } catch (err) { + throw new Error('incompatible settings update'); + } +}; + +const getIndexQuery = (templateName: string) => ({ + index: `${templateName}-*`, + size: 0, + body: { + query: { + bool: { + must: [ + { + exists: { + field: 'stream.namespace', + }, + }, + { + exists: { + field: 'stream.dataset', + }, + }, + ], + }, + }, + aggs: { + index: { + terms: { + field: '_index', + }, + }, + }, + }, +}); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts index 0a7642752b3e98..f3bd49eab6038b 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts @@ -12,15 +12,19 @@ import { KibanaAssetType, CallESAsCurrentUser, DefaultPackages, + ElasticsearchAssetType, + IngestAssetType, } from '../../../types'; import { installIndexPatterns } from '../kibana/index_pattern/install'; import * as Registry from '../registry'; import { getObject } from './get_objects'; -import { getInstallation } from './index'; +import { getInstallation, getInstallationObject } from './index'; import { installTemplates } from '../elasticsearch/template/install'; import { generateESIndexPatterns } from '../elasticsearch/template/template'; import { installPipelines } from '../elasticsearch/ingest_pipeline/install'; import { installILMPolicy } from '../elasticsearch/ilm/install'; +import { deleteAssetsByType, deleteKibanaSavedObjectsAssets } from './remove'; +import { updateCurrentWriteIndices } from '../elasticsearch/template/template'; export async function installLatestPackage(options: { savedObjectsClient: SavedObjectsClientContract; @@ -89,41 +93,80 @@ export async function installPackage(options: { const { savedObjectsClient, pkgkey, callCluster } = options; // TODO: change epm API to /packageName/version so we don't need to do this const [pkgName, pkgVersion] = pkgkey.split('-'); + // see if some version of this package is already installed + const installedPkg = await getInstallationObject({ savedObjectsClient, pkgName }); + const reinstall = pkgVersion === installedPkg?.attributes.version; + const registryPackageInfo = await Registry.fetchInfo(pkgName, pkgVersion); const { internal = false } = registryPackageInfo; - const installKibanaAssetsPromise = installKibanaAssets({ - savedObjectsClient, - pkgName, - pkgVersion, - }); - const installPipelinePromises = installPipelines(registryPackageInfo, callCluster); - const installTemplatePromises = installTemplates( + // delete the previous version's installation's SO kibana assets before installing new ones + // in case some assets were removed in the new version + if (installedPkg) { + try { + await deleteKibanaSavedObjectsAssets(savedObjectsClient, installedPkg.attributes.installed); + } catch (err) { + // some assets may not exist if deleting during a failed update + } + } + + const [installedKibanaAssets, installedPipelines] = await Promise.all([ + installKibanaAssets({ + savedObjectsClient, + pkgName, + pkgVersion, + }), + installPipelines(registryPackageInfo, callCluster), + // index patterns and ilm policies are not currently associated with a particular package + // so we do not save them in the package saved object state. + installIndexPatterns(savedObjectsClient, pkgName, pkgVersion), + // currenly only the base package has an ILM policy + // at some point ILM policies can be installed/modified + // per dataset and we should then save them + installILMPolicy(pkgName, pkgVersion, callCluster), + ]); + + // install or update the templates + const installedTemplates = await installTemplates( registryPackageInfo, callCluster, pkgName, pkgVersion ); + const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.datasets); - // index patterns and ilm policies are not currently associated with a particular package - // so we do not save them in the package saved object state. at some point ILM policies can be installed/modified - // per dataset and we should then save them - await installIndexPatterns(savedObjectsClient, pkgName, pkgVersion); - // currenly only the base package has an ILM policy - await installILMPolicy(pkgName, pkgVersion, callCluster); - - const res = await Promise.all([ - installKibanaAssetsPromise, - installPipelinePromises, - installTemplatePromises, - ]); + // get template refs to save + const installedTemplateRefs = installedTemplates.map(template => ({ + id: template.templateName, + type: IngestAssetType.IndexTemplate, + })); - const toSaveAssetRefs: AssetReference[] = res.flat(); - const toSaveESIndexPatterns = generateESIndexPatterns(registryPackageInfo.datasets); - // Save those references in the package manager's state saved object - return await saveInstallationReferences({ + if (installedPkg) { + // update current index for every index template created + await updateCurrentWriteIndices(callCluster, installedTemplates); + if (!reinstall) { + try { + // delete the previous version's installation's pipelines + // this must happen after the template is updated + await deleteAssetsByType({ + savedObjectsClient, + callCluster, + installedObjects: installedPkg.attributes.installed, + assetType: ElasticsearchAssetType.ingestPipeline, + }); + } catch (err) { + throw new Error(err.message); + } + } + } + const toSaveAssetRefs: AssetReference[] = [ + ...installedKibanaAssets, + ...installedPipelines, + ...installedTemplateRefs, + ]; + // Save references to installed assets in the package's saved object state + return saveInstallationReferences({ savedObjectsClient, - pkgkey, pkgName, pkgVersion, internal, @@ -154,7 +197,6 @@ export async function installKibanaAssets(options: { export async function saveInstallationReferences(options: { savedObjectsClient: SavedObjectsClientContract; - pkgkey: string; pkgName: string; pkgVersion: string; internal: boolean; @@ -169,25 +211,12 @@ export async function saveInstallationReferences(options: { toSaveAssetRefs, toSaveESIndexPatterns, } = options; - const installation = await getInstallation({ savedObjectsClient, pkgName }); - const savedAssetRefs = installation?.installed || []; - const toInstallESIndexPatterns = Object.assign( - installation?.es_index_patterns || {}, - toSaveESIndexPatterns - ); - - const mergeRefsReducer = (current: AssetReference[], pending: AssetReference) => { - const hasRef = current.find(c => c.id === pending.id && c.type === pending.type); - if (!hasRef) current.push(pending); - return current; - }; - const toInstallAssetsRefs = toSaveAssetRefs.reduce(mergeRefsReducer, savedAssetRefs); await savedObjectsClient.create( PACKAGES_SAVED_OBJECT_TYPE, { - installed: toInstallAssetsRefs, - es_index_patterns: toInstallESIndexPatterns, + installed: toSaveAssetRefs, + es_index_patterns: toSaveESIndexPatterns, name: pkgName, version: pkgVersion, internal, @@ -195,7 +224,7 @@ export async function saveInstallationReferences(options: { { id: pkgName, overwrite: true } ); - return toInstallAssetsRefs; + return toSaveAssetRefs; } async function installKibanaSavedObjects({ diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts index a30acb97b99cf0..ed7b7f33013277 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts @@ -29,7 +29,17 @@ export async function removeInstallation(options: { // recreate or delete index patterns when a package is uninstalled await installIndexPatterns(savedObjectsClient); - // Delete the installed assets + // Delete the installed asset + await deleteAssets(installedObjects, savedObjectsClient, callCluster); + + // successful delete's in SO client return {}. return something more useful + return installedObjects; +} +async function deleteAssets( + installedObjects: AssetReference[], + savedObjectsClient: SavedObjectsClientContract, + callCluster: CallESAsCurrentUser +) { const deletePromises = installedObjects.map(async ({ id, type }) => { const assetType = type as AssetType; if (savedObjectTypes.includes(assetType)) { @@ -40,22 +50,62 @@ export async function removeInstallation(options: { deleteTemplate(callCluster, id); } }); - await Promise.all([...deletePromises]); - - // successful delete's in SO client return {}. return something more useful - return installedObjects; + try { + await Promise.all([...deletePromises]); + } catch (err) { + throw new Error(err.message); + } } - async function deletePipeline(callCluster: CallESAsCurrentUser, id: string): Promise { // '*' shouldn't ever appear here, but it still would delete all ingest pipelines if (id && id !== '*') { - await callCluster('ingest.deletePipeline', { id }); + try { + await callCluster('ingest.deletePipeline', { id }); + } catch (err) { + throw new Error(`error deleting pipeline ${id}`); + } } } async function deleteTemplate(callCluster: CallESAsCurrentUser, name: string): Promise { // '*' shouldn't ever appear here, but it still would delete all templates if (name && name !== '*') { - await callCluster('indices.deleteTemplate', { name }); + try { + await callCluster('indices.deleteTemplate', { name }); + } catch { + throw new Error(`error deleting template ${name}`); + } } } + +export async function deleteAssetsByType({ + savedObjectsClient, + callCluster, + installedObjects, + assetType, +}: { + savedObjectsClient: SavedObjectsClientContract; + callCluster: CallESAsCurrentUser; + installedObjects: AssetReference[]; + assetType: ElasticsearchAssetType; +}) { + const toDelete = installedObjects.filter(asset => asset.type === assetType); + try { + await deleteAssets(toDelete, savedObjectsClient, callCluster); + } catch (err) { + throw new Error(err.message); + } +} + +export async function deleteKibanaSavedObjectsAssets( + savedObjectsClient: SavedObjectsClientContract, + installedObjects: AssetReference[] +) { + const deletePromises = installedObjects.map(({ id, type }) => { + const assetType = type as AssetType; + if (savedObjectTypes.includes(assetType)) { + savedObjectsClient.delete(assetType, id); + } + }); + await Promise.all(deletePromises); +} diff --git a/x-pack/plugins/ingest_manager/server/types/index.tsx b/x-pack/plugins/ingest_manager/server/types/index.tsx index 1cd5622c0c7b04..105f9039f1e98d 100644 --- a/x-pack/plugins/ingest_manager/server/types/index.tsx +++ b/x-pack/plugins/ingest_manager/server/types/index.tsx @@ -47,6 +47,8 @@ export { RegistrySearchResults, RegistrySearchResult, DefaultPackages, + TemplateRef, + IndexTemplateMappings, } from '../../common'; export type CallESAsCurrentUser = ScopedClusterClient['callAsCurrentUser']; From f254ee682c5849920f853da513fe542d63786ad3 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 21 Apr 2020 17:12:36 -0500 Subject: [PATCH 14/34] [kbn-storybook] Use raw loader for text files (#64108) Starting Storybook (with `yarn storybook apm`) was failing to start because it was having trouble loading Angular .html templates. Use the raw loader in the webpack config for storybook, same as the Webpack config in kbn-optimizer. --- packages/kbn-storybook/storybook_config/webpack.config.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/kbn-storybook/storybook_config/webpack.config.js b/packages/kbn-storybook/storybook_config/webpack.config.js index 1531c1d22b01bc..779d8a41536445 100644 --- a/packages/kbn-storybook/storybook_config/webpack.config.js +++ b/packages/kbn-storybook/storybook_config/webpack.config.js @@ -49,6 +49,13 @@ module.exports = async ({ config }) => { }, }); + config.module.rules.push({ + test: /\.(html|md|txt|tmpl)$/, + use: { + loader: 'raw-loader', + }, + }); + // Handle Typescript files config.module.rules.push({ test: /\.tsx?$/, From ea4eb3385b855a9ae7e8e17ab5166a22ce96252c Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 21 Apr 2020 16:27:00 -0600 Subject: [PATCH 15/34] [Maps] Map settings: min and max zoom (#63714) * [Maps] Map settings: min and max zoom * eslint * header and footer * zoom range UI * save session state in mapStateJSON * disable button when flyout is open * tslint * update layer_control jest test * tslint * move settings button to top map chrome * move map_settings_panel to NP * remove merge conflict artifact * fix import for NP migration * remove unused CSS class * fix path from NP move * review feedback * load map settings in embeddable --- .../maps/public/angular/map_controller.js | 37 ++++++- .../maps/public/actions/map_actions.d.ts | 12 +++ .../maps/public/actions/map_actions.js | 27 ++++++ .../maps/public/actions/ui_actions.d.ts | 3 + .../plugins/maps/public/actions/ui_actions.js | 15 +++ .../public/angular/services/saved_gis_map.js | 2 + .../connected_components/gis_map/index.js | 7 +- .../connected_components/gis_map/view.js | 33 ++++--- .../connected_components/map/mb/index.js | 2 + .../connected_components/map/mb/view.js | 42 +++++--- .../map_settings_panel/index.ts | 39 ++++++++ .../map_settings_panel/map_settings_panel.tsx | 97 +++++++++++++++++++ .../map_settings_panel/navigation_panel.tsx | 55 +++++++++++ .../toolbar_overlay/set_view_control/index.js | 3 +- .../set_view_control/set_view_control.js | 5 +- .../__snapshots__/view.test.js.snap | 79 ++++++++++++++- .../widget_overlay/layer_control/index.js | 2 +- .../widget_overlay/layer_control/view.js | 4 +- .../widget_overlay/layer_control/view.test.js | 7 ++ .../maps/public/embeddable/map_embeddable.tsx | 9 ++ .../embeddable/map_embeddable_factory.ts | 9 ++ .../public/reducers/default_map_settings.ts | 15 +++ x-pack/plugins/maps/public/reducers/map.d.ts | 7 ++ x-pack/plugins/maps/public/reducers/map.js | 33 +++++++ x-pack/plugins/maps/public/reducers/ui.ts | 1 + .../maps/public/selectors/map_selectors.d.ts | 6 +- .../maps/public/selectors/map_selectors.js | 12 +++ 27 files changed, 516 insertions(+), 47 deletions(-) create mode 100644 x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts create mode 100644 x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx create mode 100644 x-pack/plugins/maps/public/reducers/default_map_settings.ts diff --git a/x-pack/legacy/plugins/maps/public/angular/map_controller.js b/x-pack/legacy/plugins/maps/public/angular/map_controller.js index 9522fd12ad37d1..1b1fbf111fe04b 100644 --- a/x-pack/legacy/plugins/maps/public/angular/map_controller.js +++ b/x-pack/legacy/plugins/maps/public/angular/map_controller.js @@ -39,6 +39,7 @@ import { replaceLayerList, setQuery, clearTransientLayerStateAndCloseFlyout, + setMapSettings, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../../plugins/maps/public/actions/map_actions'; import { @@ -52,10 +53,14 @@ import { setReadOnly, setIsLayerTOCOpen, setOpenTOCDetails, + openMapSettings, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../../plugins/maps/public/actions/ui_actions'; -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { getIsFullScreen } from '../../../../../plugins/maps/public/selectors/ui_selectors'; +import { + getIsFullScreen, + getFlyoutDisplay, + // eslint-disable-next-line @kbn/eslint/no-restricted-paths +} from '../../../../../plugins/maps/public/selectors/ui_selectors'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { copyPersistentState } from '../../../../../plugins/maps/public/reducers/util'; import { @@ -395,6 +400,9 @@ app.controller( if (mapState.filters) { savedObjectFilters = mapState.filters; } + if (mapState.settings) { + store.dispatch(setMapSettings(mapState.settings)); + } } if (savedMap.uiStateJSON) { @@ -453,6 +461,7 @@ app.controller( $scope.isFullScreen = false; $scope.isSaveDisabled = false; + $scope.isOpenSettingsDisabled = false; function handleStoreChanges(store) { const nextIsFullScreen = getIsFullScreen(store.getState()); if (nextIsFullScreen !== $scope.isFullScreen) { @@ -474,6 +483,14 @@ app.controller( $scope.isSaveDisabled = nextIsSaveDisabled; }); } + + const flyoutDisplay = getFlyoutDisplay(store.getState()); + const nextIsOpenSettingsDisabled = flyoutDisplay !== FLYOUT_STATE.NONE; + if (nextIsOpenSettingsDisabled !== $scope.isOpenSettingsDisabled) { + $scope.$evalAsync(() => { + $scope.isOpenSettingsDisabled = nextIsOpenSettingsDisabled; + }); + } } $scope.$on('$destroy', () => { @@ -591,6 +608,22 @@ app.controller( getInspector().open(inspectorAdapters, {}); }, }, + { + id: 'mapSettings', + label: i18n.translate('xpack.maps.mapController.openSettingsButtonLabel', { + defaultMessage: `Map settings`, + }), + description: i18n.translate('xpack.maps.mapController.openSettingsDescription', { + defaultMessage: `Open map settings`, + }), + testId: 'openSettingsButton', + disableButton() { + return $scope.isOpenSettingsDisabled; + }, + run() { + store.dispatch(openMapSettings()); + }, + }, ...(getMapsCapabilities().save ? [ { diff --git a/x-pack/plugins/maps/public/actions/map_actions.d.ts b/x-pack/plugins/maps/public/actions/map_actions.d.ts index debead3ad5c45d..c8db284a5c4f1a 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.d.ts +++ b/x-pack/plugins/maps/public/actions/map_actions.d.ts @@ -14,6 +14,7 @@ import { MapCenterAndZoom, MapRefreshConfig, } from '../../common/descriptor_types'; +import { MapSettings } from '../reducers/map'; export type SyncContext = { startLoading(dataId: string, requestToken: symbol, meta: DataMeta): void; @@ -62,3 +63,14 @@ export function hideViewControl(): AnyAction; export function setHiddenLayers(hiddenLayerIds: string[]): AnyAction; export function addLayerWithoutDataSync(layerDescriptor: unknown): AnyAction; + +export function setMapSettings(settings: MapSettings): AnyAction; + +export function rollbackMapSettings(): AnyAction; + +export function trackMapSettings(): AnyAction; + +export function updateMapSetting( + settingKey: string, + settingValue: string | boolean | number +): AnyAction; diff --git a/x-pack/plugins/maps/public/actions/map_actions.js b/x-pack/plugins/maps/public/actions/map_actions.js index 572385d628b16a..da6ba6b481054b 100644 --- a/x-pack/plugins/maps/public/actions/map_actions.js +++ b/x-pack/plugins/maps/public/actions/map_actions.js @@ -76,6 +76,10 @@ export const HIDE_TOOLBAR_OVERLAY = 'HIDE_TOOLBAR_OVERLAY'; export const HIDE_LAYER_CONTROL = 'HIDE_LAYER_CONTROL'; export const HIDE_VIEW_CONTROL = 'HIDE_VIEW_CONTROL'; export const SET_WAITING_FOR_READY_HIDDEN_LAYERS = 'SET_WAITING_FOR_READY_HIDDEN_LAYERS'; +export const SET_MAP_SETTINGS = 'SET_MAP_SETTINGS'; +export const ROLLBACK_MAP_SETTINGS = 'ROLLBACK_MAP_SETTINGS'; +export const TRACK_MAP_SETTINGS = 'TRACK_MAP_SETTINGS'; +export const UPDATE_MAP_SETTING = 'UPDATE_MAP_SETTING'; function getLayerLoadingCallbacks(dispatch, getState, layerId) { return { @@ -145,6 +149,29 @@ export function setMapInitError(errorMessage) { }; } +export function setMapSettings(settings) { + return { + type: SET_MAP_SETTINGS, + settings, + }; +} + +export function rollbackMapSettings() { + return { type: ROLLBACK_MAP_SETTINGS }; +} + +export function trackMapSettings() { + return { type: TRACK_MAP_SETTINGS }; +} + +export function updateMapSetting(settingKey, settingValue) { + return { + type: UPDATE_MAP_SETTING, + settingKey, + settingValue, + }; +} + export function trackCurrentLayerState(layerId) { return { type: TRACK_CURRENT_LAYER_STATE, diff --git a/x-pack/plugins/maps/public/actions/ui_actions.d.ts b/x-pack/plugins/maps/public/actions/ui_actions.d.ts index e087dc70256f06..43cdcff7d2d697 100644 --- a/x-pack/plugins/maps/public/actions/ui_actions.d.ts +++ b/x-pack/plugins/maps/public/actions/ui_actions.d.ts @@ -5,6 +5,7 @@ */ import { AnyAction } from 'redux'; +import { FLYOUT_STATE } from '../reducers/ui'; export const UPDATE_FLYOUT: string; export const CLOSE_SET_VIEW: string; @@ -17,6 +18,8 @@ export const SHOW_TOC_DETAILS: string; export const HIDE_TOC_DETAILS: string; export const UPDATE_INDEXING_STAGE: string; +export function updateFlyout(display: FLYOUT_STATE): AnyAction; + export function setOpenTOCDetails(layerIds?: string[]): AnyAction; export function setIsLayerTOCOpen(open: boolean): AnyAction; diff --git a/x-pack/plugins/maps/public/actions/ui_actions.js b/x-pack/plugins/maps/public/actions/ui_actions.js index 77fdf6b0f12d23..e2a36e33e7db09 100644 --- a/x-pack/plugins/maps/public/actions/ui_actions.js +++ b/x-pack/plugins/maps/public/actions/ui_actions.js @@ -4,6 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { getFlyoutDisplay } from '../selectors/ui_selectors'; +import { FLYOUT_STATE } from '../reducers/ui'; +import { setSelectedLayer, trackMapSettings } from './map_actions'; + export const UPDATE_FLYOUT = 'UPDATE_FLYOUT'; export const CLOSE_SET_VIEW = 'CLOSE_SET_VIEW'; export const OPEN_SET_VIEW = 'OPEN_SET_VIEW'; @@ -28,6 +32,17 @@ export function updateFlyout(display) { display, }; } +export function openMapSettings() { + return (dispatch, getState) => { + const flyoutDisplay = getFlyoutDisplay(getState()); + if (flyoutDisplay === FLYOUT_STATE.MAP_SETTINGS_PANEL) { + return; + } + dispatch(setSelectedLayer(null)); + dispatch(trackMapSettings()); + dispatch(updateFlyout(FLYOUT_STATE.MAP_SETTINGS_PANEL)); + }; +} export function closeSetView() { return { type: CLOSE_SET_VIEW, diff --git a/x-pack/plugins/maps/public/angular/services/saved_gis_map.js b/x-pack/plugins/maps/public/angular/services/saved_gis_map.js index 1c47e0ab7dc2a4..1a58b0cefaed97 100644 --- a/x-pack/plugins/maps/public/angular/services/saved_gis_map.js +++ b/x-pack/plugins/maps/public/angular/services/saved_gis_map.js @@ -15,6 +15,7 @@ import { getRefreshConfig, getQuery, getFilters, + getMapSettings, } from '../../selectors/map_selectors'; import { getIsLayerTOCOpen, getOpenTOCDetails } from '../../selectors/ui_selectors'; @@ -98,6 +99,7 @@ export function createSavedGisMapClass(services) { refreshConfig: getRefreshConfig(state), query: _.omit(getQuery(state), 'queryLastTriggeredAt'), filters: getFilters(state), + settings: getMapSettings(state), }); this.uiStateJSON = JSON.stringify({ diff --git a/x-pack/plugins/maps/public/connected_components/gis_map/index.js b/x-pack/plugins/maps/public/connected_components/gis_map/index.js index c825fdab75ca74..f8769d0bb898ad 100644 --- a/x-pack/plugins/maps/public/connected_components/gis_map/index.js +++ b/x-pack/plugins/maps/public/connected_components/gis_map/index.js @@ -6,8 +6,6 @@ import { connect } from 'react-redux'; import { GisMap } from './view'; - -import { FLYOUT_STATE } from '../../reducers/ui'; import { exitFullScreen } from '../../actions/ui_actions'; import { getFlyoutDisplay, getIsFullScreen } from '../../selectors/ui_selectors'; import { triggerRefreshTimer, cancelAllInFlightRequests } from '../../actions/map_actions'; @@ -22,12 +20,9 @@ import { import { getCoreChrome } from '../../kibana_services'; function mapStateToProps(state = {}) { - const flyoutDisplay = getFlyoutDisplay(state); return { areLayersLoaded: areLayersLoaded(state), - layerDetailsVisible: flyoutDisplay === FLYOUT_STATE.LAYER_PANEL, - addLayerVisible: flyoutDisplay === FLYOUT_STATE.ADD_LAYER_WIZARD, - noFlyoutVisible: flyoutDisplay === FLYOUT_STATE.NONE, + flyoutDisplay: getFlyoutDisplay(state), isFullScreen: getIsFullScreen(state), refreshConfig: getRefreshConfig(state), mapInitError: getMapInitError(state), diff --git a/x-pack/plugins/maps/public/connected_components/gis_map/view.js b/x-pack/plugins/maps/public/connected_components/gis_map/view.js index 28ad12133d6118..6eb173a001d018 100644 --- a/x-pack/plugins/maps/public/connected_components/gis_map/view.js +++ b/x-pack/plugins/maps/public/connected_components/gis_map/view.js @@ -6,6 +6,7 @@ import _ from 'lodash'; import React, { Component } from 'react'; +import classNames from 'classnames'; import { MBMapContainer } from '../map/mb'; import { WidgetOverlay } from '../widget_overlay'; import { ToolbarOverlay } from '../toolbar_overlay'; @@ -19,6 +20,8 @@ import { ES_GEO_FIELD_TYPE } from '../../../common/constants'; import { indexPatterns as indexPatternsUtils } from '../../../../../../src/plugins/data/public'; import { i18n } from '@kbn/i18n'; import uuid from 'uuid/v4'; +import { FLYOUT_STATE } from '../../reducers/ui'; +import { MapSettingsPanel } from '../map_settings_panel'; const RENDER_COMPLETE_EVENT = 'renderComplete'; @@ -147,9 +150,7 @@ export class GisMap extends Component { render() { const { addFilters, - layerDetailsVisible, - addLayerVisible, - noFlyoutVisible, + flyoutDisplay, isFullScreen, exitFullScreen, mapInitError, @@ -174,16 +175,13 @@ export class GisMap extends Component { ); } - let currentPanel; - let currentPanelClassName; - if (noFlyoutVisible) { - currentPanel = null; - } else if (addLayerVisible) { - currentPanelClassName = 'mapMapLayerPanel-isVisible'; - currentPanel = ; - } else if (layerDetailsVisible) { - currentPanelClassName = 'mapMapLayerPanel-isVisible'; - currentPanel = ; + let flyoutPanel = null; + if (flyoutDisplay === FLYOUT_STATE.ADD_LAYER_WIZARD) { + flyoutPanel = ; + } else if (flyoutDisplay === FLYOUT_STATE.LAYER_PANEL) { + flyoutPanel = ; + } else if (flyoutDisplay === FLYOUT_STATE.MAP_SETTINGS_PANEL) { + flyoutPanel = ; } let exitFullScreenButton; @@ -210,8 +208,13 @@ export class GisMap extends Component { - - {currentPanel} + + {flyoutPanel} {exitFullScreenButton} diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/index.js b/x-pack/plugins/maps/public/connected_components/map/mb/index.js index d864b60eb433bf..459b38d4226948 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/index.js +++ b/x-pack/plugins/maps/public/connected_components/map/mb/index.js @@ -23,6 +23,7 @@ import { isInteractiveDisabled, isTooltipControlDisabled, isViewControlHidden, + getMapSettings, } from '../../../selectors/map_selectors'; import { getInspectorAdapters } from '../../../reducers/non_serializable_instances'; @@ -30,6 +31,7 @@ import { getInspectorAdapters } from '../../../reducers/non_serializable_instanc function mapStateToProps(state = {}) { return { isMapReady: getMapReady(state), + settings: getMapSettings(state), layerList: getLayerList(state), goto: getGoto(state), inspectorAdapters: getInspectorAdapters(state), diff --git a/x-pack/plugins/maps/public/connected_components/map/mb/view.js b/x-pack/plugins/maps/public/connected_components/map/mb/view.js index 2d95de184f0f4e..71c1af44e493bd 100644 --- a/x-pack/plugins/maps/public/connected_components/map/mb/view.js +++ b/x-pack/plugins/maps/public/connected_components/map/mb/view.js @@ -12,14 +12,8 @@ import { removeOrphanedSourcesAndLayers, addSpritesheetToMap, } from './utils'; - import { getGlyphUrl, isRetina } from '../../../meta'; -import { - DECIMAL_DEGREES_PRECISION, - MAX_ZOOM, - MIN_ZOOM, - ZOOM_PRECISION, -} from '../../../../common/constants'; +import { DECIMAL_DEGREES_PRECISION, ZOOM_PRECISION } from '../../../../common/constants'; import mapboxgl from 'mapbox-gl/dist/mapbox-gl-csp'; import mbWorkerUrl from '!!file-loader!mapbox-gl/dist/mapbox-gl-csp-worker'; import mbRtlPlugin from '!!file-loader!@mapbox/mapbox-gl-rtl-text/mapbox-gl-rtl-text.min.js'; @@ -80,7 +74,7 @@ export class MBMapContainer extends React.Component { } _debouncedSync = _.debounce(() => { - if (this._isMounted) { + if (this._isMounted || !this.props.isMapReady) { if (!this.state.hasSyncedLayerList) { this.setState( { @@ -92,6 +86,7 @@ export class MBMapContainer extends React.Component { } ); } + this._syncSettings(); } }, 256); @@ -133,8 +128,8 @@ export class MBMapContainer extends React.Component { scrollZoom: this.props.scrollZoom, preserveDrawingBuffer: getInjectedVarFunc()('preserveDrawingBuffer', false), interactive: !this.props.disableInteractive, - minZoom: MIN_ZOOM, - maxZoom: MAX_ZOOM, + maxZoom: this.props.settings.maxZoom, + minZoom: this.props.settings.minZoom, }; const initialView = _.get(this.props.goto, 'center'); if (initialView) { @@ -265,17 +260,13 @@ export class MBMapContainer extends React.Component { }; _syncMbMapWithLayerList = () => { - if (!this.props.isMapReady) { - return; - } - removeOrphanedSourcesAndLayers(this.state.mbMap, this.props.layerList); this.props.layerList.forEach(layer => layer.syncLayerWithMB(this.state.mbMap)); syncLayerOrderForSingleLayer(this.state.mbMap, this.props.layerList); }; _syncMbMapWithInspector = () => { - if (!this.props.isMapReady || !this.props.inspectorAdapters.map) { + if (!this.props.inspectorAdapters.map) { return; } @@ -289,6 +280,27 @@ export class MBMapContainer extends React.Component { }); }; + _syncSettings() { + let zoomRangeChanged = false; + if (this.props.settings.minZoom !== this.state.mbMap.getMinZoom()) { + this.state.mbMap.setMinZoom(this.props.settings.minZoom); + zoomRangeChanged = true; + } + if (this.props.settings.maxZoom !== this.state.mbMap.getMaxZoom()) { + this.state.mbMap.setMaxZoom(this.props.settings.maxZoom); + zoomRangeChanged = true; + } + + // 'moveend' event not fired when map moves from setMinZoom or setMaxZoom + // https://github.com/mapbox/mapbox-gl-js/issues/9610 + // hack to update extent after zoom update finishes moving map. + if (zoomRangeChanged) { + setTimeout(() => { + this.props.extentChanged(this._getMapState()); + }, 300); + } + } + render() { let drawControl; let tooltipControl; diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts b/x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts new file mode 100644 index 00000000000000..329fac28d7d2ee --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/index.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AnyAction, Dispatch } from 'redux'; +import { connect } from 'react-redux'; +import { FLYOUT_STATE } from '../../reducers/ui'; +import { MapStoreState } from '../../reducers/store'; +import { MapSettingsPanel } from './map_settings_panel'; +import { rollbackMapSettings, updateMapSetting } from '../../actions/map_actions'; +import { getMapSettings, hasMapSettingsChanges } from '../../selectors/map_selectors'; +import { updateFlyout } from '../../actions/ui_actions'; + +function mapStateToProps(state: MapStoreState) { + return { + settings: getMapSettings(state), + hasMapSettingsChanges: hasMapSettingsChanges(state), + }; +} + +function mapDispatchToProps(dispatch: Dispatch) { + return { + cancelChanges: () => { + dispatch(rollbackMapSettings()); + dispatch(updateFlyout(FLYOUT_STATE.NONE)); + }, + keepChanges: () => { + dispatch(updateFlyout(FLYOUT_STATE.NONE)); + }, + updateMapSetting: (settingKey: string, settingValue: string | number | boolean) => { + dispatch(updateMapSetting(settingKey, settingValue)); + }, + }; +} + +const connectedMapSettingsPanel = connect(mapStateToProps, mapDispatchToProps)(MapSettingsPanel); +export { connectedMapSettingsPanel as MapSettingsPanel }; diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx new file mode 100644 index 00000000000000..36ed29e92cf69a --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/map_settings_panel.tsx @@ -0,0 +1,97 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiSpacer, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { MapSettings } from '../../reducers/map'; +import { NavigationPanel } from './navigation_panel'; + +interface Props { + cancelChanges: () => void; + hasMapSettingsChanges: boolean; + keepChanges: () => void; + settings: MapSettings; + updateMapSetting: (settingKey: string, settingValue: string | number | boolean) => void; +} + +export function MapSettingsPanel({ + cancelChanges, + hasMapSettingsChanges, + keepChanges, + settings, + updateMapSetting, +}: Props) { + // TODO move common text like Cancel and Close to common i18n translation + const closeBtnLabel = hasMapSettingsChanges + ? i18n.translate('xpack.maps.mapSettingsPanel.cancelLabel', { + defaultMessage: 'Cancel', + }) + : i18n.translate('xpack.maps.mapSettingsPanel.closeLabel', { + defaultMessage: 'Close', + }); + + return ( + + + +

+ +

+
+
+ +
+
+ +
+
+ + + + + + {closeBtnLabel} + + + + + + + + + + + + +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx new file mode 100644 index 00000000000000..ed83e838f44f6f --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/navigation_panel.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { MapSettings } from '../../reducers/map'; +import { ValidatedDualRange, Value } from '../../../../../../src/plugins/kibana_react/public'; +import { MAX_ZOOM, MIN_ZOOM } from '../../../common/constants'; + +interface Props { + settings: MapSettings; + updateMapSetting: (settingKey: string, settingValue: string | number | boolean) => void; +} + +export function NavigationPanel({ settings, updateMapSetting }: Props) { + const onZoomChange = (value: Value) => { + updateMapSetting('minZoom', Math.max(MIN_ZOOM, parseInt(value[0] as string, 10))); + updateMapSetting('maxZoom', Math.min(MAX_ZOOM, parseInt(value[1] as string, 10))); + }; + + return ( + + +
+ +
+
+ + + +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js index 2b6fae26098beb..c3cc4090ab9522 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/index.js @@ -7,12 +7,13 @@ import { connect } from 'react-redux'; import { SetViewControl } from './set_view_control'; import { setGotoWithCenter } from '../../../actions/map_actions'; -import { getMapZoom, getMapCenter } from '../../../selectors/map_selectors'; +import { getMapZoom, getMapCenter, getMapSettings } from '../../../selectors/map_selectors'; import { closeSetView, openSetView } from '../../../actions/ui_actions'; import { getIsSetViewOpen } from '../../../selectors/ui_selectors'; function mapStateToProps(state = {}) { return { + settings: getMapSettings(state), isSetViewOpen: getIsSetViewOpen(state), zoom: getMapZoom(state), center: getMapCenter(state), diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js index 9c983447bfbf62..2c10728f78e5c5 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/set_view_control.js @@ -18,7 +18,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { MAX_ZOOM, MIN_ZOOM } from '../../../../common/constants'; function getViewString(lat, lon, zoom) { return `${lat},${lon},${zoom}`; @@ -118,8 +117,8 @@ export class SetViewControl extends Component { const { isInvalid: isZoomInvalid, component: zoomFormRow } = this._renderNumberFormRow({ value: this.state.zoom, - min: MIN_ZOOM, - max: MAX_ZOOM, + min: this.props.settings.minZoom, + max: this.props.settings.maxZoom, onChange: this._onZoomChange, label: i18n.translate('xpack.maps.setViewControl.zoomLabel', { defaultMessage: 'Zoom', diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap index 560ebad89c50ea..0af4eb0793f035 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/__snapshots__/view.test.js.snap @@ -65,7 +65,7 @@ exports[`LayerControl is rendered 1`] = ` data-test-subj="addLayerButton" fill={true} fullWidth={true} - isDisabled={true} + isDisabled={false} onClick={[Function]} > `; + +exports[`LayerControl should disable buttons when flyout is open 1`] = ` + + + + + + +

+ +

+
+
+ + + + + +
+
+ + + +
+ + + + +
+`; diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js index 8780bac59e4b72..915f808b8e3589 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/index.js @@ -22,7 +22,7 @@ function mapStateToProps(state = {}) { isReadOnly: getIsReadOnly(state), isLayerTOCOpen: getIsLayerTOCOpen(state), layerList: getLayerList(state), - isAddButtonActive: getFlyoutDisplay(state) === FLYOUT_STATE.NONE, + isFlyoutOpen: getFlyoutDisplay(state) !== FLYOUT_STATE.NONE, }; } diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js index 537a676287042f..180dc2e3933c36 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/view.js @@ -57,7 +57,7 @@ export function LayerControl({ closeLayerTOC, openLayerTOC, layerList, - isAddButtonActive, + isFlyoutOpen, }) { if (!isLayerTOCOpen) { const hasErrors = layerList.some(layer => { @@ -86,7 +86,7 @@ export function LayerControl({ {}, isLayerTOCOpen: true, layerList: [], + isFlyoutOpen: false, }; describe('LayerControl', () => { @@ -30,6 +31,12 @@ describe('LayerControl', () => { expect(component).toMatchSnapshot(); }); + test('should disable buttons when flyout is open', () => { + const component = shallow(); + + expect(component).toMatchSnapshot(); + }); + test('isReadOnly', () => { const component = shallow(); diff --git a/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx b/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx index dbd48d614e99b4..467cf4727edb78 100644 --- a/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx +++ b/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx @@ -28,6 +28,7 @@ import { } from '../../../../../src/plugins/data/public'; import { GisMap } from '../connected_components/gis_map'; import { createMapStore, MapStore } from '../reducers/store'; +import { MapSettings } from '../reducers/map'; import { setGotoWithCenter, replaceLayerList, @@ -40,6 +41,7 @@ import { hideLayerControl, hideViewControl, setHiddenLayers, + setMapSettings, } from '../actions/map_actions'; import { MapCenterAndZoom } from '../../common/descriptor_types'; import { setReadOnly, setIsLayerTOCOpen, setOpenTOCDetails } from '../actions/ui_actions'; @@ -60,6 +62,7 @@ interface MapEmbeddableConfig { editable: boolean; title?: string; layerList: unknown[]; + settings?: MapSettings; } export interface MapEmbeddableInput extends EmbeddableInput { @@ -97,6 +100,7 @@ export class MapEmbeddable extends Embeddable this.onContainerStateChanged(input)); @@ -194,6 +199,10 @@ export class MapEmbeddable extends Embeddable map.settings; + +const getRollbackMapSettings = ({ map }) => map.__rollbackSettings; + +export const hasMapSettingsChanges = createSelector( + getMapSettings, + getRollbackMapSettings, + (settings, rollbackSettings) => { + return rollbackSettings ? !_.isEqual(settings, rollbackSettings) : false; + } +); + export const getOpenTooltips = ({ map }) => { return map && map.openTooltips ? map.openTooltips : []; }; From 28313c4890cc5749eea138f0d3a6583e861a7eac Mon Sep 17 00:00:00 2001 From: Yuliia Naumenko Date: Tue, 21 Apr 2020 17:00:55 -0700 Subject: [PATCH 16/34] [Alerting] Fixed bug with no possibility to edit the index name after adding (#64033) * Fixed bug with no possibility to edit the index name after adding * fixed test * fixed test * fixed selector * Move the testing to unit tests --- .../builtin_action_types/es_index.test.tsx | 68 ++++++++++++++++++- .../builtin_action_types/es_index.tsx | 2 +- 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx index 658a0e869548fa..fdfaf70648694b 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx @@ -4,12 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { FunctionComponent } from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { act } from 'react-dom/test-utils'; import { TypeRegistry } from '../../type_registry'; import { registerBuiltInActionTypes } from './index'; import { ActionTypeModel, ActionParamsProps } from '../../../types'; import { IndexActionParams, EsIndexActionConnector } from './types'; import { coreMock } from '../../../../../../../src/core/public/mocks'; +jest.mock('../../../common/index_controls', () => ({ + firstFieldOption: jest.fn(), + getFields: jest.fn(), + getIndexOptions: jest.fn(), + getIndexPatterns: jest.fn(), +})); const ACTION_TYPE_ID = '.index'; let actionTypeModel: ActionTypeModel; @@ -91,13 +98,40 @@ describe('action params validation', () => { }); describe('IndexActionConnectorFields renders', () => { - test('all connector fields is rendered', () => { + test('all connector fields is rendered', async () => { const mocks = coreMock.createSetup(); expect(actionTypeModel.actionConnectorFields).not.toBeNull(); if (!actionTypeModel.actionConnectorFields) { return; } + + const { getIndexPatterns } = jest.requireMock('../../../common/index_controls'); + getIndexPatterns.mockResolvedValueOnce([ + { + id: 'indexPattern1', + attributes: { + title: 'indexPattern1', + }, + }, + { + id: 'indexPattern2', + attributes: { + title: 'indexPattern2', + }, + }, + ]); + const { getFields } = jest.requireMock('../../../common/index_controls'); + getFields.mockResolvedValueOnce([ + { + type: 'date', + name: 'test1', + }, + { + type: 'text', + name: 'test2', + }, + ]); const ConnectorFields = actionTypeModel.actionConnectorFields; const actionConnector = { secrets: {}, @@ -119,8 +153,38 @@ describe('IndexActionConnectorFields renders', () => { http={mocks.http} /> ); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + expect(wrapper.find('[data-test-subj="connectorIndexesComboBox"]').length > 0).toBeTruthy(); expect(wrapper.find('[data-test-subj="indexRefreshCheckbox"]').length > 0).toBeTruthy(); + + const indexSearchBoxValue = wrapper.find('[data-test-subj="comboBoxSearchInput"]'); + expect(indexSearchBoxValue.first().props().value).toEqual(''); + + const indexComboBox = wrapper.find('#indexConnectorSelectSearchBox'); + indexComboBox.first().simulate('click'); + const event = { target: { value: 'indexPattern1' } }; + indexComboBox + .find('input') + .first() + .simulate('change', event); + + const indexSearchBoxValueBeforeEnterData = wrapper.find( + '[data-test-subj="comboBoxSearchInput"]' + ); + expect(indexSearchBoxValueBeforeEnterData.first().props().value).toEqual('indexPattern1'); + + const indexComboBoxClear = wrapper.find('[data-test-subj="comboBoxClearButton"]'); + indexComboBoxClear.first().simulate('click'); + + const indexSearchBoxValueAfterEnterData = wrapper.find( + '[data-test-subj="comboBoxSearchInput"]' + ); + expect(indexSearchBoxValueAfterEnterData.first().props().value).toEqual('indexPattern1'); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx index 15f68e6a9f4414..55a219ca94aead 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx @@ -151,7 +151,7 @@ const IndexActionConnectorFields: React.FunctionComponent { - editActionConfig('index', selected[0].value); + editActionConfig('index', selected.length > 0 ? selected[0].value : ''); const indices = selected.map(s => s.value as string); // reset time field and expression fields if indices are deleted From edac6669f75634d87045bda50673352deccfb270 Mon Sep 17 00:00:00 2001 From: John Schulz Date: Tue, 21 Apr 2020 20:41:13 -0400 Subject: [PATCH 17/34] [Ingest] EPM & Fleet are enabled when Ingest is enabled (#64103) --- x-pack/plugins/ingest_manager/README.md | 10 +++++----- x-pack/plugins/ingest_manager/server/index.ts | 4 ++-- x-pack/test/api_integration/config.js | 1 - x-pack/test/epm_api_integration/config.ts | 1 - x-pack/test/functional_endpoint/config.ts | 2 -- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ingest_manager/README.md b/x-pack/plugins/ingest_manager/README.md index 07acdf8affd498..9cd4821c2a727d 100644 --- a/x-pack/plugins/ingest_manager/README.md +++ b/x-pack/plugins/ingest_manager/README.md @@ -1,9 +1,9 @@ # Ingest Manager ## Plugin - - No features enabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/feature-ingest/x-pack/plugins/ingest_manager/common/types/index.ts#L9-L19) - - Setting `xpack.ingestManager.enabled=true` is required to enable the plugin. It adds the `DATASOURCE_API_ROUTES` and `AGENT_CONFIG_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) - - Adding `--xpack.ingestManager.epm.enabled=true` will add the EPM API & UI - - Adding `--xpack.ingestManager.fleet.enabled=true` will add the Fleet API & UI + - The plugin is disabled by default. See the TypeScript type for the [the available plugin configuration options](https://github.com/elastic/kibana/blob/master/x-pack/plugins/ingest_manager/common/types/index.ts#L9-L27) + - Setting `xpack.ingestManager.enabled=true` enables the plugin including the EPM and Fleet features. It also adds the `DATASOURCE_API_ROUTES` and `AGENT_CONFIG_API_ROUTES` values in [`common/constants/routes.ts`](./common/constants/routes.ts) + - Adding `--xpack.ingestManager.epm.enabled=false` will disable the EPM API & UI + - Adding `--xpack.ingestManager.fleet.enabled=false` will disable the Fleet API & UI - [code for adding the routes](https://github.com/elastic/kibana/blob/1f27d349533b1c2865c10c45b2cf705d7416fb36/x-pack/plugins/ingest_manager/server/plugin.ts#L115-L133) - [Integration tests](server/integration_tests/router.test.ts) - Both EPM and Fleet require `ingestManager` be enabled. They are not standalone features. @@ -25,7 +25,7 @@ One common development workflow is: ``` - Start Kibana in another shell ``` - yarn start --xpack.ingestManager.enabled=true --xpack.ingestManager.epm.enabled=true --xpack.ingestManager.fleet.enabled=true --no-base-path --xpack.endpoint.enabled=true + yarn start --xpack.ingestManager.enabled=true --no-base-path --xpack.endpoint.enabled=true ``` This plugin follows the `common`, `server`, `public` structure from the [Architecture Style Guide diff --git a/x-pack/plugins/ingest_manager/server/index.ts b/x-pack/plugins/ingest_manager/server/index.ts index 7859c44ccfd895..d99eb2a9bb4bb6 100644 --- a/x-pack/plugins/ingest_manager/server/index.ts +++ b/x-pack/plugins/ingest_manager/server/index.ts @@ -18,11 +18,11 @@ export const config = { schema: schema.object({ enabled: schema.boolean({ defaultValue: false }), epm: schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), registryUrl: schema.uri({ defaultValue: 'https://epr-staging.elastic.co' }), }), fleet: schema.object({ - enabled: schema.boolean({ defaultValue: false }), + enabled: schema.boolean({ defaultValue: true }), kibana: schema.object({ host: schema.maybe(schema.string()), ca_sha256: schema.maybe(schema.string()), diff --git a/x-pack/test/api_integration/config.js b/x-pack/test/api_integration/config.js index 0eac7c58044e65..dda8c2d888d30b 100644 --- a/x-pack/test/api_integration/config.js +++ b/x-pack/test/api_integration/config.js @@ -30,7 +30,6 @@ export async function getApiIntegrationConfig({ readConfigFile }) { '--telemetry.optIn=true', '--xpack.endpoint.enabled=true', '--xpack.ingestManager.enabled=true', - '--xpack.ingestManager.fleet.enabled=true', '--xpack.endpoint.alertResultListDefaultDateRange.from=2018-01-10T00:00:00.000Z', ], }, diff --git a/x-pack/test/epm_api_integration/config.ts b/x-pack/test/epm_api_integration/config.ts index e95a389ef20edf..b04bc76ccb3151 100644 --- a/x-pack/test/epm_api_integration/config.ts +++ b/x-pack/test/epm_api_integration/config.ts @@ -28,7 +28,6 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) { ...xPackAPITestsConfig.get('kbnTestServer'), serverArgs: [ ...xPackAPITestsConfig.get('kbnTestServer.serverArgs'), - '--xpack.ingestManager.epm.enabled=true', '--xpack.ingestManager.epm.registryUrl=http://localhost:6666', ], }, diff --git a/x-pack/test/functional_endpoint/config.ts b/x-pack/test/functional_endpoint/config.ts index 6ae78ab9d48ac8..d7f1cc21828d18 100644 --- a/x-pack/test/functional_endpoint/config.ts +++ b/x-pack/test/functional_endpoint/config.ts @@ -30,8 +30,6 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) { ...xpackFunctionalConfig.get('kbnTestServer.serverArgs'), '--xpack.endpoint.enabled=true', '--xpack.ingestManager.enabled=true', - '--xpack.ingestManager.epm.enabled=true', - '--xpack.ingestManager.fleet.enabled=true', ], }, }; From aecd00f3d8993e481ad2a3a3adad239bdf798978 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Wed, 22 Apr 2020 06:34:40 +0100 Subject: [PATCH 18/34] [APM]fixing custom link unit tests (#64045) --- .../Settings/CustomizeUI/CustomLink/index.test.tsx | 11 +++++++---- .../__test__/TransactionActionMenu.test.tsx | 8 +++++--- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx b/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx index 0c04b7cccbd236..e5c20b260e0972 100644 --- a/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/app/Settings/CustomizeUI/CustomLink/index.test.tsx @@ -35,7 +35,7 @@ const data = [ ]; describe('CustomLink', () => { - let callApmApiSpy: Function; + let callApmApiSpy: jasmine.Spy; beforeAll(() => { callApmApiSpy = spyOn(apmApi, 'callApmApi').and.returnValue({}); }); @@ -101,7 +101,7 @@ describe('CustomLink', () => { ]); }); - it('checks if create custom link button is available and working', () => { + it('checks if create custom link button is available and working', async () => { const { queryByText, getByText } = render( @@ -113,6 +113,7 @@ describe('CustomLink', () => { act(() => { fireEvent.click(getByText('Create custom link')); }); + await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); expect(queryByText('Create link')).toBeInTheDocument(); }); }); @@ -144,8 +145,10 @@ describe('CustomLink', () => { act(() => { fireEvent.click(component.getByText('Create custom link')); }); - await wait(() => component.queryByText('Create link')); - expect(component.queryByText('Create link')).toBeInTheDocument(); + await wait(() => + expect(component.queryByText('Create link')).toBeInTheDocument() + ); + await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); return component; }; diff --git a/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx b/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx index ce42bd3e39ad1a..8dc2076eab5b56 100644 --- a/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx +++ b/x-pack/legacy/plugins/apm/public/components/shared/TransactionActionMenu/__test__/TransactionActionMenu.test.tsx @@ -5,7 +5,7 @@ */ import React from 'react'; -import { render, fireEvent, act } from '@testing-library/react'; +import { render, fireEvent, act, wait } from '@testing-library/react'; import { TransactionActionMenu } from '../TransactionActionMenu'; import { Transaction } from '../../../../../../../../plugins/apm/typings/es_schemas/ui/transaction'; import * as Transactions from './mockData'; @@ -143,8 +143,9 @@ describe('TransactionActionMenu component', () => { }); describe('Custom links', () => { + let callApmApiSpy: jasmine.Spy; beforeAll(() => { - spyOn(apmApi, 'callApmApi').and.returnValue({}); + callApmApiSpy = spyOn(apmApi, 'callApmApi').and.returnValue({}); }); afterAll(() => { jest.resetAllMocks(); @@ -257,7 +258,7 @@ describe('TransactionActionMenu component', () => { }); expectTextsInDocument(component, ['Custom Links']); }); - it('opens flyout with filters prefilled', () => { + it('opens flyout with filters prefilled', async () => { const license = new License({ signature: 'test signature', license: { @@ -287,6 +288,7 @@ describe('TransactionActionMenu component', () => { fireEvent.click(component.getByText('Create custom link')); }); expectTextsInDocument(component, ['Create link']); + await wait(() => expect(callApmApiSpy).toHaveBeenCalled()); const getFilterKeyValue = (key: string) => { return { [(component.getAllByText(key)[0] as HTMLOptionElement) From 2f794e6c420e9837a2a2ec423dcb9017f9c5abd5 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 22 Apr 2020 09:29:51 +0200 Subject: [PATCH 19/34] Refresh index pattern list before redirecting (#63329) --- src/legacy/core_plugins/kibana/public/discover/plugin.ts | 3 +++ src/plugins/dashboard/public/plugin.tsx | 2 ++ src/plugins/visualize/public/plugin.ts | 2 ++ test/functional/page_objects/dashboard_page.ts | 2 ++ 4 files changed, 9 insertions(+) diff --git a/src/legacy/core_plugins/kibana/public/discover/plugin.ts b/src/legacy/core_plugins/kibana/public/discover/plugin.ts index 42883abe98171b..702331529b8794 100644 --- a/src/legacy/core_plugins/kibana/public/discover/plugin.ts +++ b/src/legacy/core_plugins/kibana/public/discover/plugin.ts @@ -147,6 +147,9 @@ export class DiscoverPlugin implements Plugin { await this.initializeServices(); await this.initializeInnerAngular(); + // make sure the index pattern list is up to date + const [, { data: dataStart }] = await core.getStartServices(); + await dataStart.indexPatterns.clearCache(); const { renderApp } = await import('./np_ready/application'); const unmount = await renderApp(innerAngularName, params.element); return () => { diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index 203c784d9df4e3..5f6b67ee6ad202 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -251,6 +251,8 @@ export class DashboardPlugin localStorage: new Storage(localStorage), usageCollection, }; + // make sure the index pattern list is up to date + await dataStart.indexPatterns.clearCache(); const { renderApp } = await import('./application/application'); const unmount = renderApp(params.element, params.appBasePath, deps); return () => { diff --git a/src/plugins/visualize/public/plugin.ts b/src/plugins/visualize/public/plugin.ts index ab64e083a553dc..df8479bc891b88 100644 --- a/src/plugins/visualize/public/plugin.ts +++ b/src/plugins/visualize/public/plugin.ts @@ -123,6 +123,8 @@ export class VisualizePlugin }; setServices(deps); + // make sure the index pattern list is up to date + await pluginsStart.data.indexPatterns.clearCache(); const { renderApp } = await import('./application/application'); const unmount = renderApp(params.element, params.appBasePath, deps); return () => { diff --git a/test/functional/page_objects/dashboard_page.ts b/test/functional/page_objects/dashboard_page.ts index a20d7ae9a5372f..b76ce141a44184 100644 --- a/test/functional/page_objects/dashboard_page.ts +++ b/test/functional/page_objects/dashboard_page.ts @@ -215,6 +215,8 @@ export function DashboardPageProvider({ getService, getPageObjects }: FtrProvide public async clickNewDashboard() { await listingTable.clickNewButton('createDashboardPromptButton'); + // make sure the dashboard page is shown + await this.waitForRenderComplete(); } public async clickCreateDashboardPrompt() { From 222fdc50294fbe78e40ebbf7f2678e98fd2f0a69 Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Wed, 22 Apr 2020 10:41:58 +0200 Subject: [PATCH 20/34] refactor action filter creation utils (#62969) --- ...ta-public.datapublicpluginstart.actions.md | 3 +- ...ugins-data-public.datapublicpluginstart.md | 2 +- ...plugin-plugins-data-public.fieldformats.md | 2 +- ...plugin-plugins-data-server.fieldformats.md | 2 +- .../vis_type_vislib/public/plugin.ts | 2 +- .../vislib/components/legend/legend.test.tsx | 4 +- .../vislib/components/legend/legend.tsx | 2 +- .../public/vislib/lib/handler.js | 17 ++- .../new_platform/new_platform.karma_mock.js | 3 +- ... create_filters_from_range_select.test.ts} | 120 ++++++++---------- ...ts => create_filters_from_range_select.ts} | 34 ++--- ...> create_filters_from_value_click.test.ts} | 13 +- ....ts => create_filters_from_value_click.ts} | 25 ++-- src/plugins/data/public/actions/index.ts | 3 +- .../public/actions/select_range_action.ts | 18 +-- .../data/public/actions/value_click_action.ts | 27 ++-- src/plugins/data/public/mocks.ts | 3 +- src/plugins/data/public/plugin.ts | 10 +- src/plugins/data/public/public.api.md | 10 +- src/plugins/data/public/types.ts | 5 +- src/plugins/data/server/server.api.md | 2 +- src/plugins/embeddable/public/index.ts | 3 +- .../public/lib/triggers/triggers.ts | 22 +++- src/plugins/ui_actions/public/types.ts | 7 +- .../public/embeddable/visualize_embeddable.ts | 3 +- .../visualizations/public/expressions/vis.ts | 10 +- .../public/xy_visualization/xy_expression.tsx | 4 +- 27 files changed, 184 insertions(+), 172 deletions(-) rename src/plugins/data/public/actions/filters/{brush_event.test.ts => create_filters_from_range_select.test.ts} (58%) rename src/plugins/data/public/actions/filters/{brush_event.ts => create_filters_from_range_select.ts} (74%) rename src/plugins/data/public/actions/filters/{create_filters_from_event.test.ts => create_filters_from_value_click.test.ts} (85%) rename src/plugins/data/public/actions/filters/{create_filters_from_event.ts => create_filters_from_value_click.ts} (90%) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md index 3e966caa307995..25ce6eaa688f8e 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md @@ -8,6 +8,7 @@ ```typescript actions: { - createFiltersFromEvent: typeof createFiltersFromEvent; + createFiltersFromValueClickAction: typeof createFiltersFromValueClickAction; + createFiltersFromRangeSelectAction: typeof createFiltersFromRangeSelectAction; }; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md index a623e91388fd68..4f43f10ce089e3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.datapublicpluginstart.md @@ -14,7 +14,7 @@ export interface DataPublicPluginStart | Property | Type | Description | | --- | --- | --- | -| [actions](./kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md) | {
createFiltersFromEvent: typeof createFiltersFromEvent;
} | | +| [actions](./kibana-plugin-plugins-data-public.datapublicpluginstart.actions.md) | {
createFiltersFromValueClickAction: typeof createFiltersFromValueClickAction;
createFiltersFromRangeSelectAction: typeof createFiltersFromRangeSelectAction;
} | | | [autocomplete](./kibana-plugin-plugins-data-public.datapublicpluginstart.autocomplete.md) | AutocompleteStart | | | [fieldFormats](./kibana-plugin-plugins-data-public.datapublicpluginstart.fieldformats.md) | FieldFormatsStart | | | [indexPatterns](./kibana-plugin-plugins-data-public.datapublicpluginstart.indexpatterns.md) | IndexPatternsContract | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md index 244633c3c4c9ef..d39871b99f7447 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.fieldformats.md @@ -10,7 +10,7 @@ fieldFormats: { FieldFormat: typeof FieldFormat; FieldFormatsRegistry: typeof FieldFormatsRegistry; - serialize: (agg: import("./search").AggConfig) => import("../../expressions/common").SerializedFieldFormat; + serialize: (agg: import("./search").AggConfig) => import("../../expressions").SerializedFieldFormat; DEFAULT_CONVERTER_COLOR: { range: string; regex: string; diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md index 2b986aee508e22..11f18a195d2716 100644 --- a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.fieldformats.md @@ -10,7 +10,7 @@ fieldFormats: { FieldFormatsRegistry: typeof FieldFormatsRegistry; FieldFormat: typeof FieldFormat; - serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions/common").SerializedFieldFormat; + serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions").SerializedFieldFormat; BoolFormat: typeof BoolFormat; BytesFormat: typeof BytesFormat; ColorFormat: typeof ColorFormat; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts index ef3f664252856e..26800f8a1620ed 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts +++ b/src/legacy/core_plugins/vis_type_vislib/public/plugin.ts @@ -108,6 +108,6 @@ export class VisTypeVislibPlugin implements Plugin { public start(core: CoreStart, { data }: VisTypeVislibPluginStartDependencies) { setFormatService(data.fieldFormats); - setDataActions({ createFiltersFromEvent: data.actions.createFiltersFromEvent }); + setDataActions(data.actions); } } diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx index c378ae7b05b376..6bf66c2bdd788b 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.test.tsx @@ -36,7 +36,9 @@ jest.mock('../../../legacy_imports', () => ({ })); jest.mock('../../../services', () => ({ - getDataActions: () => ({ createFiltersFromEvent: jest.fn().mockResolvedValue(['yes']) }), + getDataActions: () => ({ + createFiltersFromValueClickAction: jest.fn().mockResolvedValue(['yes']), + }), })); const vis = { diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx index 2fe16bbfeb6252..7eb25e39307188 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/components/legend/legend.tsx @@ -101,7 +101,7 @@ export class VisLegend extends PureComponent { return false; } - const filters = await getDataActions().createFiltersFromEvent(item.values); + const filters = await getDataActions().createFiltersFromValueClickAction({ data: item.values }); return Boolean(filters.length); }; diff --git a/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js b/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js index ecf67ee3e017c5..f33ce0395af1fd 100644 --- a/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js +++ b/src/legacy/core_plugins/vis_type_vislib/public/vislib/lib/handler.js @@ -83,10 +83,21 @@ export class Handler { // memoize so that the same function is returned every time, // allowing us to remove/re-add the same function - this.getProxyHandler = _.memoize(function(event) { + this.getProxyHandler = _.memoize(function(eventType) { const self = this; - return function(e) { - self.vis.emit(event, e); + return function(eventPayload) { + switch (eventType) { + case 'brush': + const xRaw = _.get(eventPayload.data, 'series[0].values[0].xRaw'); + if (!xRaw) return; // not sure if this is possible? + return self.vis.emit(eventType, { + table: xRaw.table, + range: eventPayload.range, + column: xRaw.column, + }); + case 'click': + return self.vis.emit(eventType, eventPayload); + } }; }); diff --git a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js index f14f26613ef019..271586bb8c5827 100644 --- a/src/legacy/ui/public/new_platform/new_platform.karma_mock.js +++ b/src/legacy/ui/public/new_platform/new_platform.karma_mock.js @@ -377,7 +377,8 @@ export const npStart = { }, data: { actions: { - createFiltersFromEvent: Promise.resolve(['yes']), + createFiltersFromValueClickAction: Promise.resolve(['yes']), + createFiltersFromRangeSelectAction: sinon.fake(), }, autocomplete: { getProvider: sinon.fake(), diff --git a/src/plugins/data/public/actions/filters/brush_event.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts similarity index 58% rename from src/plugins/data/public/actions/filters/brush_event.test.ts rename to src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts index 60244354f06e4b..5d21b395b994f2 100644 --- a/src/plugins/data/public/actions/filters/brush_event.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts @@ -19,30 +19,34 @@ import moment from 'moment'; -import { onBrushEvent, BrushEvent } from './brush_event'; +import { createFiltersFromRangeSelectAction } from './create_filters_from_range_select'; -import { IndexPatternsContract } from '../../../public'; +import { IndexPatternsContract, RangeFilter } from '../../../public'; import { dataPluginMock } from '../../../public/mocks'; import { setIndexPatterns } from '../../../public/services'; import { mockDataServices } from '../../../public/search/aggs/test_helpers'; +import { TriggerContextMapping } from '../../../../ui_actions/public'; describe('brushEvent', () => { const DAY_IN_MS = 24 * 60 * 60 * 1000; const JAN_01_2014 = 1388559600000; - let baseEvent: BrushEvent; + let baseEvent: TriggerContextMapping['SELECT_RANGE_TRIGGER']['data']; + + const indexPattern = { + id: 'indexPatternId', + timeFieldName: 'time', + fields: { + getByName: () => undefined, + filter: () => [], + }, + }; const aggConfigs = [ { params: { field: {}, }, - getIndexPattern: () => ({ - timeFieldName: 'time', - fields: { - getByName: () => undefined, - filter: () => [], - }, - }), + getIndexPattern: () => indexPattern, }, ]; @@ -50,56 +54,37 @@ describe('brushEvent', () => { mockDataServices(); setIndexPatterns(({ ...dataPluginMock.createStartContract().indexPatterns, - get: async () => ({ - id: 'indexPatternId', - timeFieldName: 'time', - fields: { - getByName: () => undefined, - filter: () => [], - }, - }), + get: async () => indexPattern, } as unknown) as IndexPatternsContract); baseEvent = { - data: { - ordered: { - date: false, - }, - series: [ + column: 0, + table: { + type: 'kibana_datatable', + columns: [ { - values: [ - { - xRaw: { - column: 0, - table: { - columns: [ - { - id: '1', - meta: { - type: 'histogram', - indexPatternId: 'indexPatternId', - aggConfigParams: aggConfigs[0].params, - }, - }, - ], - }, - }, - }, - ], + id: '1', + name: '1', + meta: { + type: 'histogram', + indexPatternId: 'indexPatternId', + aggConfigParams: aggConfigs[0].params, + }, }, ], + rows: [], }, range: [], }; }); test('should be a function', () => { - expect(typeof onBrushEvent).toBe('function'); + expect(typeof createFiltersFromRangeSelectAction).toBe('function'); }); test('ignores event when data.xAxisField not provided', async () => { - const filter = await onBrushEvent(baseEvent); - expect(filter).toBeUndefined(); + const filter = await createFiltersFromRangeSelectAction(baseEvent); + expect(filter).toEqual([]); }); describe('handles an event when the x-axis field is a date field', () => { @@ -109,29 +94,29 @@ describe('brushEvent', () => { name: 'time', type: 'date', }; - baseEvent.data.ordered = { date: true }; }); afterAll(() => { baseEvent.range = []; - baseEvent.data.ordered = { date: false }; + aggConfigs[0].params.field = {}; }); test('by ignoring the event when range spans zero time', async () => { baseEvent.range = [JAN_01_2014, JAN_01_2014]; - const filter = await onBrushEvent(baseEvent); - expect(filter).toBeUndefined(); + const filter = await createFiltersFromRangeSelectAction(baseEvent); + expect(filter).toEqual([]); }); test('by updating the timefilter', async () => { baseEvent.range = [JAN_01_2014, JAN_01_2014 + DAY_IN_MS]; - const filter = await onBrushEvent(baseEvent); + const filter = await createFiltersFromRangeSelectAction(baseEvent); expect(filter).toBeDefined(); - if (filter) { - expect(filter.range.time.gte).toBe(new Date(JAN_01_2014).toISOString()); + if (filter.length) { + const rangeFilter = filter[0] as RangeFilter; + expect(rangeFilter.range.time.gte).toBe(new Date(JAN_01_2014).toISOString()); // Set to a baseline timezone for comparison. - expect(filter.range.time.lt).toBe(new Date(JAN_01_2014 + DAY_IN_MS).toISOString()); + expect(rangeFilter.range.time.lt).toBe(new Date(JAN_01_2014 + DAY_IN_MS).toISOString()); } }); }); @@ -142,26 +127,26 @@ describe('brushEvent', () => { name: 'anotherTimeField', type: 'date', }; - baseEvent.data.ordered = { date: true }; }); afterAll(() => { baseEvent.range = []; - baseEvent.data.ordered = { date: false }; + aggConfigs[0].params.field = {}; }); test('creates a new range filter', async () => { const rangeBegin = JAN_01_2014; const rangeEnd = rangeBegin + DAY_IN_MS; baseEvent.range = [rangeBegin, rangeEnd]; - const filter = await onBrushEvent(baseEvent); + const filter = await createFiltersFromRangeSelectAction(baseEvent); expect(filter).toBeDefined(); - if (filter) { - expect(filter.range.anotherTimeField.gte).toBe(moment(rangeBegin).toISOString()); - expect(filter.range.anotherTimeField.lt).toBe(moment(rangeEnd).toISOString()); - expect(filter.range.anotherTimeField).toHaveProperty( + if (filter.length) { + const rangeFilter = filter[0] as RangeFilter; + expect(rangeFilter.range.anotherTimeField.gte).toBe(moment(rangeBegin).toISOString()); + expect(rangeFilter.range.anotherTimeField.lt).toBe(moment(rangeEnd).toISOString()); + expect(rangeFilter.range.anotherTimeField).toHaveProperty( 'format', 'strict_date_optional_time' ); @@ -184,20 +169,21 @@ describe('brushEvent', () => { test('by ignoring the event when range does not span at least 2 values', async () => { baseEvent.range = [1]; - const filter = await onBrushEvent(baseEvent); - expect(filter).toBeUndefined(); + const filter = await createFiltersFromRangeSelectAction(baseEvent); + expect(filter).toEqual([]); }); test('by creating a new filter', async () => { baseEvent.range = [1, 2, 3, 4]; - const filter = await onBrushEvent(baseEvent); + const filter = await createFiltersFromRangeSelectAction(baseEvent); expect(filter).toBeDefined(); - if (filter) { - expect(filter.range.numberField.gte).toBe(1); - expect(filter.range.numberField.lt).toBe(4); - expect(filter.range.numberField).not.toHaveProperty('format'); + if (filter.length) { + const rangeFilter = filter[0] as RangeFilter; + expect(rangeFilter.range.numberField.gte).toBe(1); + expect(rangeFilter.range.numberField.lt).toBe(4); + expect(rangeFilter.range.numberField).not.toHaveProperty('format'); } }); }); diff --git a/src/plugins/data/public/actions/filters/brush_event.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts similarity index 74% rename from src/plugins/data/public/actions/filters/brush_event.ts rename to src/plugins/data/public/actions/filters/create_filters_from_range_select.ts index 714f005fbeb6dd..409614ca9c3802 100644 --- a/src/plugins/data/public/actions/filters/brush_event.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.ts @@ -17,34 +17,18 @@ * under the License. */ -import { get, last } from 'lodash'; +import { last } from 'lodash'; import moment from 'moment'; import { esFilters, IFieldType, RangeFilterParams } from '../../../public'; import { getIndexPatterns } from '../../../public/services'; import { deserializeAggConfig } from '../../search/expressions/utils'; +import { RangeSelectTriggerContext } from '../../../../embeddable/public'; -export interface BrushEvent { - data: { - ordered: { - date: boolean; - }; - series: Array>; - }; - range: number[]; -} - -export async function onBrushEvent(event: BrushEvent) { - const isDate = get(event.data, 'ordered.date'); - const xRaw: Record = get(event.data, 'series[0].values[0].xRaw'); - - if (!xRaw) { - return; - } - - const column: Record = xRaw.table.columns[xRaw.column]; +export async function createFiltersFromRangeSelectAction(event: RangeSelectTriggerContext['data']) { + const column: Record = event.table.columns[event.column]; if (!column || !column.meta) { - return; + return []; } const indexPattern = await getIndexPatterns().get(column.meta.indexPatternId); @@ -55,16 +39,18 @@ export async function onBrushEvent(event: BrushEvent) { const field: IFieldType = aggConfig.params.field; if (!field || event.range.length <= 1) { - return; + return []; } const min = event.range[0]; const max = last(event.range); if (min === max) { - return; + return []; } + const isDate = field.type === 'date'; + const range: RangeFilterParams = { gte: isDate ? moment(min).toISOString() : min, lt: isDate ? moment(max).toISOString() : max, @@ -74,5 +60,5 @@ export async function onBrushEvent(event: BrushEvent) { range.format = 'strict_date_optional_time'; } - return esFilters.buildRangeFilter(field, range, indexPattern); + return esFilters.mapAndFlattenFilters([esFilters.buildRangeFilter(field, range, indexPattern)]); } diff --git a/src/plugins/data/public/actions/filters/create_filters_from_event.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts similarity index 85% rename from src/plugins/data/public/actions/filters/create_filters_from_event.test.ts rename to src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts index 1ed09002816d1f..a0e285c20d776a 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_event.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts @@ -26,7 +26,8 @@ import { import { dataPluginMock } from '../../../public/mocks'; import { setIndexPatterns } from '../../../public/services'; import { mockDataServices } from '../../../public/search/aggs/test_helpers'; -import { createFiltersFromEvent, EventData } from './create_filters_from_event'; +import { createFiltersFromValueClickAction } from './create_filters_from_value_click'; +import { ValueClickTriggerContext } from '../../../../embeddable/public'; const mockField = { name: 'bytes', @@ -37,8 +38,8 @@ const mockField = { format: new fieldFormats.BytesFormat({}, (() => {}) as FieldFormatsGetConfigFn), }; -describe('createFiltersFromEvent', () => { - let dataPoints: EventData[]; +describe('createFiltersFromValueClick', () => { + let dataPoints: ValueClickTriggerContext['data']['data']; beforeEach(() => { dataPoints = [ @@ -86,7 +87,7 @@ describe('createFiltersFromEvent', () => { test('ignores event when value for rows is not provided', async () => { dataPoints[0].table.rows[0]['1-1'] = null; - const filters = await createFiltersFromEvent(dataPoints); + const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(0); }); @@ -95,14 +96,14 @@ describe('createFiltersFromEvent', () => { if (dataPoints[0].table.columns[0].meta) { dataPoints[0].table.columns[0].meta.type = 'terms'; } - const filters = await createFiltersFromEvent(dataPoints); + const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(1); expect(filters[0].query.match_phrase.bytes).toEqual('2048'); }); test('handles an event when aggregations type is not terms', async () => { - const filters = await createFiltersFromEvent(dataPoints); + const filters = await createFiltersFromValueClickAction({ data: dataPoints }); expect(filters.length).toEqual(1); diff --git a/src/plugins/data/public/actions/filters/create_filters_from_event.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts similarity index 90% rename from src/plugins/data/public/actions/filters/create_filters_from_event.ts rename to src/plugins/data/public/actions/filters/create_filters_from_value_click.ts index e62945a5920728..2b426813a98a45 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_event.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.ts @@ -21,13 +21,7 @@ import { KibanaDatatable } from '../../../../../plugins/expressions/public'; import { deserializeAggConfig } from '../../search/expressions'; import { esFilters, Filter } from '../../../public'; import { getIndexPatterns } from '../../../public/services'; - -export interface EventData { - table: Pick; - column: number; - row: number; - value: any; -} +import { ValueClickTriggerContext } from '../../../../embeddable/public'; /** * For terms aggregations on `__other__` buckets, this assembles a list of applicable filter @@ -39,7 +33,7 @@ export interface EventData { * @return {array} - array of terms to filter against */ const getOtherBucketFilterTerms = ( - table: EventData['table'], + table: Pick, columnIndex: number, rowIndex: number ) => { @@ -76,7 +70,11 @@ const getOtherBucketFilterTerms = ( * @param {string} cellValue - value of the current cell * @return {Filter[]|undefined} - list of filters to provide to queryFilter.addFilters() */ -const createFilter = async (table: EventData['table'], columnIndex: number, rowIndex: number) => { +const createFilter = async ( + table: Pick, + columnIndex: number, + rowIndex: number +) => { if (!table || !table.columns || !table.columns[columnIndex]) { return; } @@ -113,11 +111,14 @@ const createFilter = async (table: EventData['table'], columnIndex: number, rowI }; /** @public */ -export const createFiltersFromEvent = async (dataPoints: EventData[], negate?: boolean) => { +export const createFiltersFromValueClickAction = async ({ + data, + negate, +}: ValueClickTriggerContext['data']) => { const filters: Filter[] = []; await Promise.all( - dataPoints + data .filter(point => point) .map(async val => { const { table, column, row } = val; @@ -133,5 +134,5 @@ export const createFiltersFromEvent = async (dataPoints: EventData[], negate?: b }) ); - return filters; + return esFilters.mapAndFlattenFilters(filters); }; diff --git a/src/plugins/data/public/actions/index.ts b/src/plugins/data/public/actions/index.ts index cdb84ff13f25ef..ef9014aafe82d5 100644 --- a/src/plugins/data/public/actions/index.ts +++ b/src/plugins/data/public/actions/index.ts @@ -18,6 +18,7 @@ */ export { ACTION_GLOBAL_APPLY_FILTER, createFilterAction } from './apply_filter_action'; -export { createFiltersFromEvent } from './filters/create_filters_from_event'; +export { createFiltersFromValueClickAction } from './filters/create_filters_from_value_click'; +export { createFiltersFromRangeSelectAction } from './filters/create_filters_from_range_select'; export { selectRangeAction } from './select_range_action'; export { valueClickAction } from './value_click_action'; diff --git a/src/plugins/data/public/actions/select_range_action.ts b/src/plugins/data/public/actions/select_range_action.ts index 6e1f16a09e803f..70a018e3c2bda2 100644 --- a/src/plugins/data/public/actions/select_range_action.ts +++ b/src/plugins/data/public/actions/select_range_action.ts @@ -23,19 +23,17 @@ import { IncompatibleActionError, ActionByType, } from '../../../../plugins/ui_actions/public'; -import { onBrushEvent } from './filters/brush_event'; +import { createFiltersFromRangeSelectAction } from './filters/create_filters_from_range_select'; +import { RangeSelectTriggerContext } from '../../../embeddable/public'; import { FilterManager, TimefilterContract, esFilters } from '..'; export const ACTION_SELECT_RANGE = 'ACTION_SELECT_RANGE'; -export interface SelectRangeActionContext { - data: any; - timeFieldName: string; -} +export type SelectRangeActionContext = RangeSelectTriggerContext; async function isCompatible(context: SelectRangeActionContext) { try { - return Boolean(await onBrushEvent(context.data)); + return Boolean(await createFiltersFromRangeSelectAction(context.data)); } catch { return false; } @@ -59,13 +57,7 @@ export function selectRangeAction( throw new IncompatibleActionError(); } - const filter = await onBrushEvent(data); - - if (!filter) { - return; - } - - const selectedFilters = esFilters.mapAndFlattenFilters([filter]); + const selectedFilters = await createFiltersFromRangeSelectAction(data); if (timeFieldName) { const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter( diff --git a/src/plugins/data/public/actions/value_click_action.ts b/src/plugins/data/public/actions/value_click_action.ts index 01c32e27da07d0..1141e485309cfb 100644 --- a/src/plugins/data/public/actions/value_click_action.ts +++ b/src/plugins/data/public/actions/value_click_action.ts @@ -26,21 +26,17 @@ import { } from '../../../../plugins/ui_actions/public'; import { getOverlays, getIndexPatterns } from '../services'; import { applyFiltersPopover } from '../ui/apply_filters'; -import { createFiltersFromEvent } from './filters/create_filters_from_event'; +import { createFiltersFromValueClickAction } from './filters/create_filters_from_value_click'; +import { ValueClickTriggerContext } from '../../../embeddable/public'; import { Filter, FilterManager, TimefilterContract, esFilters } from '..'; export const ACTION_VALUE_CLICK = 'ACTION_VALUE_CLICK'; -export interface ValueClickActionContext { - data: any; - timeFieldName: string; -} +export type ValueClickActionContext = ValueClickTriggerContext; async function isCompatible(context: ValueClickActionContext) { try { - const filters: Filter[] = - (await createFiltersFromEvent(context.data.data || [context.data], context.data.negate)) || - []; + const filters: Filter[] = await createFiltersFromValueClickAction(context.data); return filters.length > 0; } catch { return false; @@ -60,17 +56,16 @@ export function valueClickAction( }); }, isCompatible, - execute: async ({ timeFieldName, data }: ValueClickActionContext) => { - if (!(await isCompatible({ timeFieldName, data }))) { + execute: async (context: ValueClickActionContext) => { + if (!(await isCompatible(context))) { throw new IncompatibleActionError(); } - const filters: Filter[] = - (await createFiltersFromEvent(data.data || [data], data.negate)) || []; + const filters: Filter[] = await createFiltersFromValueClickAction(context.data); - let selectedFilters: Filter[] = esFilters.mapAndFlattenFilters(filters); + let selectedFilters = filters; - if (selectedFilters.length > 1) { + if (filters.length > 1) { const indexPatterns = await Promise.all( filters.map(filter => { return getIndexPatterns().get(filter.meta.index!); @@ -102,9 +97,9 @@ export function valueClickAction( selectedFilters = await filterSelectionPromise; } - if (timeFieldName) { + if (context.timeFieldName) { const { timeRangeFilter, restOfFilters } = esFilters.extractTimeFilter( - timeFieldName, + context.timeFieldName, selectedFilters ); filterManager.addFilters(restOfFilters); diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 2d43cae79ac989..1f604b9eb6baa1 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -45,7 +45,8 @@ const createStartContract = (): Start => { const queryStartMock = queryServiceMock.createStartContract(); return { actions: { - createFiltersFromEvent: jest.fn().mockResolvedValue(['yes']), + createFiltersFromValueClickAction: jest.fn().mockResolvedValue(['yes']), + createFiltersFromRangeSelectAction: jest.fn(), }, autocomplete: autocompleteMock, search: searchStartMock, diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 1723545b32522b..ccf94171235fed 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -58,7 +58,12 @@ import { VALUE_CLICK_TRIGGER, APPLY_FILTER_TRIGGER, } from '../../ui_actions/public'; -import { ACTION_GLOBAL_APPLY_FILTER, createFilterAction, createFiltersFromEvent } from './actions'; +import { + ACTION_GLOBAL_APPLY_FILTER, + createFilterAction, + createFiltersFromValueClickAction, + createFiltersFromRangeSelectAction, +} from './actions'; import { ApplyGlobalFilterActionContext } from './actions/apply_filter_action'; import { selectRangeAction, @@ -162,7 +167,8 @@ export class DataPublicPlugin implements Plugin import("../../expressions/common").SerializedFieldFormat; + serialize: (agg: import("./search").AggConfig) => import("../../expressions").SerializedFieldFormat; DEFAULT_CONVERTER_COLOR: { range: string; regex: string; @@ -1892,8 +1893,9 @@ export type TSearchStrategyProvider = (context: ISearc // src/plugins/data/public/index.ts:414:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromEvent" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/types.ts:60:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:53:5 - (ae-forgotten-export) The symbol "createFiltersFromRangeSelectAction" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/types.ts:61:5 - (ae-forgotten-export) The symbol "IndexPatternSelectProps" needs to be exported by the entry point index.d.ts // (No @packageDocumentation comment for this package) diff --git a/src/plugins/data/public/types.ts b/src/plugins/data/public/types.ts index e24e01d2412781..5414de16be310a 100644 --- a/src/plugins/data/public/types.ts +++ b/src/plugins/data/public/types.ts @@ -24,7 +24,7 @@ import { ExpressionsSetup } from 'src/plugins/expressions/public'; import { UiActionsSetup, UiActionsStart } from 'src/plugins/ui_actions/public'; import { AutocompleteSetup, AutocompleteStart } from './autocomplete'; import { FieldFormatsSetup, FieldFormatsStart } from './field_formats'; -import { createFiltersFromEvent } from './actions'; +import { createFiltersFromRangeSelectAction, createFiltersFromValueClickAction } from './actions'; import { ISearchSetup, ISearchStart } from './search'; import { QuerySetup, QueryStart } from './query'; import { IndexPatternSelectProps } from './ui/index_pattern_select'; @@ -49,7 +49,8 @@ export interface DataPublicPluginSetup { export interface DataPublicPluginStart { actions: { - createFiltersFromEvent: typeof createFiltersFromEvent; + createFiltersFromValueClickAction: typeof createFiltersFromValueClickAction; + createFiltersFromRangeSelectAction: typeof createFiltersFromRangeSelectAction; }; autocomplete: AutocompleteStart; indexPatterns: IndexPatternsContract; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index c41023eab6d206..f8a9a7792c4921 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -283,7 +283,7 @@ export interface FieldFormatConfig { export const fieldFormats: { FieldFormatsRegistry: typeof FieldFormatsRegistry; FieldFormat: typeof FieldFormat; - serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions/common").SerializedFieldFormat; + serializeFieldFormat: (agg: import("../public/search").AggConfig) => import("../../expressions").SerializedFieldFormat; BoolFormat: typeof BoolFormat; BytesFormat: typeof BytesFormat; ColorFormat: typeof ColorFormat; diff --git a/src/plugins/embeddable/public/index.ts b/src/plugins/embeddable/public/index.ts index bdb7bfbddc308b..5ee66f9d19ac00 100644 --- a/src/plugins/embeddable/public/index.ts +++ b/src/plugins/embeddable/public/index.ts @@ -47,7 +47,8 @@ export { EmbeddableOutput, EmbeddablePanel, EmbeddableRoot, - EmbeddableVisTriggerContext, + ValueClickTriggerContext, + RangeSelectTriggerContext, ErrorEmbeddable, IContainer, IEmbeddable, diff --git a/src/plugins/embeddable/public/lib/triggers/triggers.ts b/src/plugins/embeddable/public/lib/triggers/triggers.ts index e29302fd6cc13f..da7be1eea199a7 100644 --- a/src/plugins/embeddable/public/lib/triggers/triggers.ts +++ b/src/plugins/embeddable/public/lib/triggers/triggers.ts @@ -18,18 +18,34 @@ */ import { Trigger } from '../../../../ui_actions/public'; +import { KibanaDatatable } from '../../../../expressions'; import { IEmbeddable } from '..'; export interface EmbeddableContext { embeddable: IEmbeddable; } -export interface EmbeddableVisTriggerContext { +export interface ValueClickTriggerContext { embeddable?: IEmbeddable; timeFieldName?: string; data: { - e?: MouseEvent; - data: unknown; + data: Array<{ + table: Pick; + column: number; + row: number; + value: any; + }>; + negate?: boolean; + }; +} + +export interface RangeSelectTriggerContext { + embeddable?: IEmbeddable; + timeFieldName?: string; + data: { + table: KibanaDatatable; + column: number; + range: number[]; }; } diff --git a/src/plugins/ui_actions/public/types.ts b/src/plugins/ui_actions/public/types.ts index c7e6d61e15f317..e6247a8bafff79 100644 --- a/src/plugins/ui_actions/public/types.ts +++ b/src/plugins/ui_actions/public/types.ts @@ -19,9 +19,10 @@ import { ActionByType } from './actions/action'; import { TriggerInternal } from './triggers/trigger_internal'; -import { EmbeddableVisTriggerContext, IEmbeddable } from '../../embeddable/public'; import { Filter } from '../../data/public'; import { SELECT_RANGE_TRIGGER, VALUE_CLICK_TRIGGER, APPLY_FILTER_TRIGGER } from './triggers'; +import { IEmbeddable } from '../../embeddable/public'; +import { RangeSelectTriggerContext, ValueClickTriggerContext } from '../../embeddable/public'; export type TriggerRegistry = Map>; export type ActionRegistry = Map>; @@ -36,8 +37,8 @@ export type TriggerContext = BaseContext; export interface TriggerContextMapping { [DEFAULT_TRIGGER]: TriggerContext; - [SELECT_RANGE_TRIGGER]: EmbeddableVisTriggerContext; - [VALUE_CLICK_TRIGGER]: EmbeddableVisTriggerContext; + [SELECT_RANGE_TRIGGER]: RangeSelectTriggerContext; + [VALUE_CLICK_TRIGGER]: ValueClickTriggerContext; [APPLY_FILTER_TRIGGER]: { embeddable: IEmbeddable; filters: Filter[]; diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index ffb028ff131b39..1c545bb36cff03 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -33,7 +33,6 @@ import { EmbeddableInput, EmbeddableOutput, Embeddable, - EmbeddableVisTriggerContext, IContainer, } from '../../../../plugins/embeddable/public'; import { dispatchRenderComplete } from '../../../../plugins/kibana_utils/public'; @@ -261,7 +260,7 @@ export class VisualizeEmbeddable extends Embeddable { if (!this.eventsSubject) return; - this.eventsSubject.next({ name: 'filterBucket', data }); + this.eventsSubject.next({ + name: 'filterBucket', + data: data.data + ? { + data: data.data, + negate: data.negate, + } + : { data: [data] }, + }); }, brush: (data: any) => { if (!this.eventsSubject) return; diff --git a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx index f12a0e5b907c78..d6b6de479acfb2 100644 --- a/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx +++ b/x-pack/plugins/lens/public/xy_visualization/xy_expression.tsx @@ -28,7 +28,7 @@ import { import { EuiIcon, EuiText, IconType, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { EmbeddableVisTriggerContext } from '../../../../../src/plugins/embeddable/public'; +import { ValueClickTriggerContext } from '../../../../../src/plugins/embeddable/public'; import { VIS_EVENT_TO_TRIGGER } from '../../../../../src/plugins/visualizations/public'; import { LensMultiTable, FormatFactory } from '../types'; import { XYArgs, SeriesType, visualizationTypes } from './types'; @@ -277,7 +277,7 @@ export function XYChart({ const timeFieldName = xDomain && xAxisFieldName; - const context: EmbeddableVisTriggerContext = { + const context: ValueClickTriggerContext = { data: { data: points.map(point => ({ row: point.row, From ffc8741da2ffcf4d31ae3ccc143fd483a61cbb1b Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Wed, 22 Apr 2020 09:59:43 +0100 Subject: [PATCH 21/34] [Dashboard] Deangularize navbar, attempt nr. 2 (#61611) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Attempt at deangularization, nr.2 * Remove padding in fullscreen * Fixing failing functional test * Fixing remaining functional test * Fixing typescript errors * Fixing filter bar not being visible in fullscreen * Fixing filter bar not being visible in fullscreen * Rebasing against master * Fixing a small leftover * Fix order of functions * Fixing linting error * Changing noPadding to a custom class * Use filterManagers to handle filters * Rename class * Attempt at deangularization, nr.2 * Remove padding in fullscreen * Fixing failing functional test * Fixing remaining functional test * Fixing typescript errors * Fixing filter bar not being visible in fullscreen * Fixing filter bar not being visible in fullscreen * Rebasing against master * Fixing a small leftover * Fix order of functions * Fixing linting error * [APM] Agent config select box doesn't work on IE (#63236) * adding value property to select options * fixing test * Use globe icon for "ext" span type on service map (#63205) Both "external" and "ext" can be returned and should have the same icon. * Move shared vislib components into Charts plugin (#62957) * Closes #56310 Move shared vislib components into Charts plugin * Fixed imports in tests * Changed i18n IDs to match charts namespace * Renamed ColorSchemaVislibParams to ColorSchemaParams, added enums and got rid of useValidation function * Renamed ColorSchemaVislibParams to ColorSchemaParams and got rid of useValidation function * Fixed merge conflict * Replaced enums with objects again * Make uptime alert flyout test a little more resilient (#62702) * [SIEM] [Cases] Unit tests for case UI components (#63005) * Endpoint: Remove unused `lib` module (#63248) * [Lens] Fix error in query from generated suggestion (#63018) * [Lens] Fix error in query from generated suggestion * Update from review comments * Fix test Co-authored-by: Elastic Machine * Resolver/node svg 2 html (#62958) * Remove some SVG in Resolver nodes and replace with HTML * [Reporting] convert all server unit tests to TypeScript (#62873) * [Reporting] convert all server unit tests to TypeScript * fix ts * revert unrelated change * [SIEM] Link ML Rule card CTA to license_management (#63210) * Link ML Rule card CTA to license_management Taking the user directly to the license management page within kibana (where they could immediately start a trial subscription) is much more actionable than taking them to the subscriptions marketing page. * Revert translation key change Neither of these is totally accurate, and there've already been translations written for the old one. * Correctly type ILM's optional dependencies as optional (#63255) And guard against their absence. * [Telemetry] use prod keys (#63263) * update chromedriver dependency to 81.0.0 (#63266) * task/mac-eventing-form (#62999) adds mac events form for endpoint policy details Co-authored-by: oatkiller * bc6 rule import april 9 (#63152) * bc6 rule import april 9 Increased the lookback of the ML rules * re-import with LF chars Co-authored-by: Elastic Machine * Added UI for pre-configured connectors. (#63074) * Added UI for pre-configured connectors. * fixed due to comments * Fixed jest tests * Fixed due to comments and added some functional tests * test fix * Fixed failed checks * Fixed functional tests failing * TaskManager tasks scheduled without attempting to run (#62078) * TaskManager tasks scheduled without attempting to run * Removing unused import Co-authored-by: Elastic Machine * Changed alerting wrong param name for help xpack.encrypted_saved_objects.encryptionKey to xpack.encryptedSavedObjects.encryptionKey (#63307) * fix ScopedHistory.createHref to prepend location with scoped history basePath (#62407) * fix createHref to prepend with scoped history basePath + add option to exclude it. * fix prependBasePath behavior * fix test plugins urls * add pathname to endpoint url builder methods * Revert "add pathname to endpoint url builder methods" This reverts commit 7604932b * adapt createHref instead of prependBasePath * use object options for createHref * update generated doc * fixing custom link popover size and hiding scroll (#63240) * Changing noPadding to a custom class * Use filterManagers to handle filters * Rename class * Applying some changes * Reverting search_bar code changes * Removing some stuff that was causing functional tests to fail * Removing refresh dashboard container which was causing errors during navigation * Do not destroy dashboardContainer * Adding updateSavedQueryId method Co-authored-by: Elastic Machine Co-authored-by: Cauê Marcondes <55978943+cauemarcondes@users.noreply.github.com> Co-authored-by: Nathan L Smith Co-authored-by: DianaDerevyankina <54894989+DianaDerevyankina@users.noreply.github.com> Co-authored-by: Brian Seeders Co-authored-by: Steph Milovic Co-authored-by: Robert Austin Co-authored-by: Wylie Conlon Co-authored-by: Brent Kimmel Co-authored-by: Tim Sullivan Co-authored-by: Ryland Herrick Co-authored-by: CJ Cenizal Co-authored-by: Ahmad Bamieh Co-authored-by: Dmitry Lemeshko Co-authored-by: Candace Park <56409205+parkiino@users.noreply.github.com> Co-authored-by: The SpaceCake Project Co-authored-by: Yuliia Naumenko Co-authored-by: Brandon Kobel Co-authored-by: Pierre Gayvallet --- .../public/application/application.ts | 16 +-- .../public/application/dashboard_app.html | 47 +------ .../public/application/dashboard_app.tsx | 15 -- .../application/dashboard_app_controller.tsx | 113 +++++++++------- .../public/top_nav_menu/_index.scss | 4 + .../public/top_nav_menu/top_nav_menu.test.tsx | 13 ++ .../public/top_nav_menu/top_nav_menu.tsx | 5 +- .../apps/dashboard/dashboard_saved_query.js | 128 ++++++++++++++++++ .../apps/dashboard/full_screen_mode.js | 18 +++ test/functional/apps/dashboard/index.js | 1 + .../apps/discover/_saved_queries.js | 1 + .../saved_query_management_component.ts | 6 + 12 files changed, 240 insertions(+), 127 deletions(-) create mode 100644 test/functional/apps/dashboard/dashboard_saved_query.js diff --git a/src/plugins/dashboard/public/application/application.ts b/src/plugins/dashboard/public/application/application.ts index 3134a5bfe2c67f..a1696298117b0b 100644 --- a/src/plugins/dashboard/public/application/application.ts +++ b/src/plugins/dashboard/public/application/application.ts @@ -38,12 +38,7 @@ import { EmbeddableStart } from '../../../embeddable/public'; import { NavigationPublicPluginStart as NavigationStart } from '../../../navigation/public'; import { DataPublicPluginStart } from '../../../data/public'; import { SharePluginStart } from '../../../share/public'; -import { - KibanaLegacyStart, - configureAppAngularModule, - createTopNavDirective, - createTopNavHelper, -} from '../../../kibana_legacy/public'; +import { KibanaLegacyStart, configureAppAngularModule } from '../../../kibana_legacy/public'; import { SavedObjectLoader } from '../../../saved_objects/public'; export interface RenderDeps { @@ -114,13 +109,11 @@ function mountDashboardApp(appBasePath: string, element: HTMLElement) { function createLocalAngularModule(core: AppMountContext['core'], navigation: NavigationStart) { createLocalI18nModule(); - createLocalTopNavModule(navigation); createLocalIconModule(); const dashboardAngularModule = angular.module(moduleName, [ ...thirdPartyAngularDependencies, 'app/dashboard/I18n', - 'app/dashboard/TopNav', 'app/dashboard/icon', ]); return dashboardAngularModule; @@ -132,13 +125,6 @@ function createLocalIconModule() { .directive('icon', reactDirective => reactDirective(EuiIcon)); } -function createLocalTopNavModule(navigation: NavigationStart) { - angular - .module('app/dashboard/TopNav', ['react']) - .directive('kbnTopNav', createTopNavDirective) - .directive('kbnTopNavHelper', createTopNavHelper(navigation.ui)); -} - function createLocalI18nModule() { angular .module('app/dashboard/I18n', []) diff --git a/src/plugins/dashboard/public/application/dashboard_app.html b/src/plugins/dashboard/public/application/dashboard_app.html index 3cf8932958b6d8..87a5728ac20599 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.html +++ b/src/plugins/dashboard/public/application/dashboard_app.html @@ -2,52 +2,7 @@ class="app-container dshAppContainer" ng-class="{'dshAppContainer--withMargins': model.useMargins}" > - - - - - - - - +

{{screenTitle}}

diff --git a/src/plugins/dashboard/public/application/dashboard_app.tsx b/src/plugins/dashboard/public/application/dashboard_app.tsx index 150cd8f8fcbb52..f101935b9288d1 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app.tsx @@ -33,7 +33,6 @@ import { SavedObjectDashboard } from '../saved_dashboards'; export interface DashboardAppScope extends ng.IScope { dash: SavedObjectDashboard; appState: DashboardAppState; - screenTitle: string; model: { query: Query; filters: Filter[]; @@ -54,21 +53,7 @@ export interface DashboardAppScope extends ng.IScope { getShouldShowEditHelp: () => boolean; getShouldShowViewHelp: () => boolean; updateQueryAndFetch: ({ query, dateRange }: { query: Query; dateRange?: TimeRange }) => void; - onRefreshChange: ({ - isPaused, - refreshInterval, - }: { - isPaused: boolean; - refreshInterval: any; - }) => void; - onFiltersUpdated: (filters: Filter[]) => void; - onCancelApplyFilters: () => void; - onApplyFilters: (filters: Filter[]) => void; - onQuerySaved: (savedQuery: SavedQuery) => void; - onSavedQueryUpdated: (savedQuery: SavedQuery) => void; - onClearSavedQuery: () => void; topNavMenu: any; - showFilterBar: () => boolean; showAddPanel: any; showSaveQuery: boolean; kbnTopNav: any; diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index 283fe9f0a83a4b..b4a53234bffac5 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -21,12 +21,15 @@ import _, { uniq } from 'lodash'; import { i18n } from '@kbn/i18n'; import { EUI_MODAL_CANCEL_BUTTON } from '@elastic/eui'; import React from 'react'; +import ReactDOM from 'react-dom'; import angular from 'angular'; import { Subscription } from 'rxjs'; import { map } from 'rxjs/operators'; import { History } from 'history'; import { SavedObjectSaveOpts } from 'src/plugins/saved_objects/public'; +import { NavigationPublicPluginStart as NavigationStart } from 'src/plugins/navigation/public'; +import { TimeRange } from 'src/plugins/data/public'; import { DashboardEmptyScreen, DashboardEmptyScreenProps } from './dashboard_empty_screen'; import { @@ -87,6 +90,7 @@ export interface DashboardAppControllerDependencies extends RenderDeps { dashboardConfig: KibanaLegacyStart['dashboardConfig']; history: History; kbnUrlStateStorage: IKbnUrlStateStorage; + navigation: NavigationStart; } export class DashboardAppController { @@ -123,10 +127,13 @@ export class DashboardAppController { history, kbnUrlStateStorage, usageCollection, + navigation, }: DashboardAppControllerDependencies) { const filterManager = queryService.filterManager; const queryFilter = filterManager; const timefilter = queryService.timefilter.timefilter; + let showSearchBar = true; + let showQueryBar = true; let lastReloadRequestTime = 0; const dash = ($scope.dash = $route.current.locals.dash); @@ -243,6 +250,9 @@ export class DashboardAppController { } }; + const showFilterBar = () => + $scope.model.filters.length > 0 || !dashboardStateManager.getFullScreenMode(); + const getEmptyScreenProps = ( shouldShowEditHelp: boolean, isEmptyInReadOnlyMode: boolean @@ -310,7 +320,6 @@ export class DashboardAppController { refreshInterval: timefilter.getRefreshInterval(), }; $scope.panels = dashboardStateManager.getPanels(); - $scope.screenTitle = dashboardStateManager.getTitle(); }; updateState(); @@ -515,49 +524,8 @@ export class DashboardAppController { } }; - $scope.onRefreshChange = function({ isPaused, refreshInterval }) { - timefilter.setRefreshInterval({ - pause: isPaused, - value: refreshInterval ? refreshInterval : $scope.model.refreshInterval.value, - }); - }; - - $scope.onFiltersUpdated = filters => { - // The filters will automatically be set when the queryFilter emits an update event (see below) - queryFilter.setFilters(filters); - }; - - $scope.onQuerySaved = savedQuery => { - $scope.savedQuery = savedQuery; - }; - - $scope.onSavedQueryUpdated = savedQuery => { - $scope.savedQuery = { ...savedQuery }; - }; - - $scope.onClearSavedQuery = () => { - delete $scope.savedQuery; - dashboardStateManager.setSavedQueryId(undefined); - dashboardStateManager.applyFilters( - { - query: '', - language: - localStorage.get('kibana.userQueryLanguage') || uiSettings.get('search:queryLanguage'), - }, - queryFilter.getGlobalFilters() - ); - // Making this method sync broke the updates. - // Temporary fix, until we fix the complex state in this file. - setTimeout(() => { - queryFilter.setFilters(queryFilter.getGlobalFilters()); - }, 0); - }; - const updateStateFromSavedQuery = (savedQuery: SavedQuery) => { - const savedQueryFilters = savedQuery.attributes.filters || []; - const globalFilters = queryFilter.getGlobalFilters(); - const allFilters = [...globalFilters, ...savedQueryFilters]; - + const allFilters = filterManager.getFilters(); dashboardStateManager.applyFilters(savedQuery.attributes.query, allFilters); if (savedQuery.attributes.timefilter) { timefilter.setTime({ @@ -616,6 +584,42 @@ export class DashboardAppController { } ); + const onSavedQueryIdChange = (savedQueryId?: string) => { + dashboardStateManager.setSavedQueryId(savedQueryId); + }; + + const getNavBarProps = () => { + const isFullScreenMode = dashboardStateManager.getFullScreenMode(); + const screenTitle = dashboardStateManager.getTitle(); + return { + appName: 'dashboard', + config: $scope.isVisible ? $scope.topNavMenu : undefined, + className: isFullScreenMode ? 'kbnTopNavMenu-isFullScreen' : undefined, + screenTitle, + showSearchBar, + showQueryBar, + showFilterBar: showFilterBar(), + indexPatterns: $scope.indexPatterns, + showSaveQuery: $scope.showSaveQuery, + query: $scope.model.query, + savedQuery: $scope.savedQuery, + onSavedQueryIdChange, + savedQueryId: dashboardStateManager.getSavedQueryId(), + useDefaultBehaviors: true, + onQuerySubmit: (payload: { dateRange: TimeRange; query?: Query }): void => { + if (!payload.query) { + $scope.updateQueryAndFetch({ query: $scope.model.query, dateRange: payload.dateRange }); + } else { + $scope.updateQueryAndFetch({ query: payload.query, dateRange: payload.dateRange }); + } + }, + }; + }; + const dashboardNavBar = document.getElementById('dashboardChrome'); + const updateNavBar = () => { + ReactDOM.render(, dashboardNavBar); + }; + $scope.timefilterSubscriptions$ = new Subscription(); $scope.timefilterSubscriptions$.add( @@ -707,6 +711,8 @@ export class DashboardAppController { revertChangesAndExitEditMode(); } }); + + updateNavBar(); }; /** @@ -761,9 +767,6 @@ export class DashboardAppController { }); } - $scope.showFilterBar = () => - $scope.model.filters.length > 0 || !dashboardStateManager.getFullScreenMode(); - $scope.showAddPanel = () => { dashboardStateManager.setFullScreenMode(false); /* @@ -785,7 +788,11 @@ export class DashboardAppController { const navActions: { [key: string]: NavAction; } = {}; - navActions[TopNavIds.FULL_SCREEN] = () => dashboardStateManager.setFullScreenMode(true); + navActions[TopNavIds.FULL_SCREEN] = () => { + dashboardStateManager.setFullScreenMode(true); + showQueryBar = false; + updateNavBar(); + }; navActions[TopNavIds.EXIT_EDIT_MODE] = () => onChangeViewMode(ViewMode.VIEW); navActions[TopNavIds.ENTER_EDIT_MODE] = () => onChangeViewMode(ViewMode.EDIT); navActions[TopNavIds.SAVE] = () => { @@ -858,6 +865,7 @@ export class DashboardAppController { if ((response as { error: Error }).error) { dashboardStateManager.setTitle(currentTitle); } + updateNavBar(); return response; }); }; @@ -939,6 +947,9 @@ export class DashboardAppController { const visibleSubscription = chrome.getIsVisible$().subscribe(isVisible => { $scope.$evalAsync(() => { $scope.isVisible = isVisible; + showSearchBar = isVisible || showFilterBar(); + showQueryBar = !dashboardStateManager.getFullScreenMode() && isVisible; + updateNavBar(); }); }); @@ -949,6 +960,11 @@ export class DashboardAppController { navActions, dashboardConfig.getHideWriteControls() ); + updateNavBar(); + }); + + $scope.$watch('indexPatterns', () => { + updateNavBar(); }); $scope.$on('$destroy', () => { @@ -965,9 +981,6 @@ export class DashboardAppController { if (outputSubscription) { outputSubscription.unsubscribe(); } - if (dashboardContainer) { - dashboardContainer.destroy(); - } }); } } diff --git a/src/plugins/navigation/public/top_nav_menu/_index.scss b/src/plugins/navigation/public/top_nav_menu/_index.scss index 5befe4789dd6ca..a6ddf7a8b42644 100644 --- a/src/plugins/navigation/public/top_nav_menu/_index.scss +++ b/src/plugins/navigation/public/top_nav_menu/_index.scss @@ -8,4 +8,8 @@ padding: 0 $euiSizeS; } } + + .kbnTopNavMenu-isFullScreen { + padding: 0; + } } diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx index 8e0e8b3031132b..74cfd125c2e3a0 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.test.tsx @@ -75,4 +75,17 @@ describe('TopNavMenu', () => { expect(component.find(TOP_NAV_ITEM_SELECTOR).length).toBe(0); expect(component.find(SEARCH_BAR_SELECTOR).length).toBe(1); }); + + it('Should render with a class name', () => { + const component = shallowWithIntl( + + ); + expect(component.find('.kbnTopNavMenu').length).toBe(1); + expect(component.find('.myCoolClass').length).toBeTruthy(); + }); }); diff --git a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx index 14ad40f13e3883..d492c7feb61a7f 100644 --- a/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx +++ b/src/plugins/navigation/public/top_nav_menu/top_nav_menu.tsx @@ -21,6 +21,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import classNames from 'classnames'; import { TopNavMenuData } from './top_nav_menu_data'; import { TopNavMenuItem } from './top_nav_menu_item'; import { StatefulSearchBarProps, DataPublicPluginStart } from '../../../data/public'; @@ -29,6 +30,7 @@ export type TopNavMenuProps = StatefulSearchBarProps & { config?: TopNavMenuData[]; showSearchBar?: boolean; data?: DataPublicPluginStart; + className?: string; }; /* @@ -65,6 +67,7 @@ export function TopNavMenu(props: TopNavMenuProps) { } function renderLayout() { + const className = classNames('kbnTopNavMenu', props.className); return ( {renderItems()} diff --git a/test/functional/apps/dashboard/dashboard_saved_query.js b/test/functional/apps/dashboard/dashboard_saved_query.js new file mode 100644 index 00000000000000..99d0aed082e70c --- /dev/null +++ b/test/functional/apps/dashboard/dashboard_saved_query.js @@ -0,0 +1,128 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 expect from '@kbn/expect'; + +export default function({ getService, getPageObjects }) { + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['common', 'dashboard', 'timePicker']); + const browser = getService('browser'); + const queryBar = getService('queryBar'); + const savedQueryManagementComponent = getService('savedQueryManagementComponent'); + const testSubjects = getService('testSubjects'); + + describe('dashboard saved queries', function describeIndexTests() { + before(async function() { + await esArchiver.load('dashboard/current/kibana'); + await kibanaServer.uiSettings.replace({ + defaultIndex: '0bf35f60-3dc9-11e8-8660-4d65aa086b3c', + }); + await PageObjects.common.navigateToApp('dashboard'); + }); + + describe('saved query management component functionality', function() { + before(async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + await PageObjects.dashboard.clickNewDashboard(); + }); + + it('should show the saved query management component when there are no saved queries', async () => { + await savedQueryManagementComponent.openSavedQueryManagementComponent(); + const descriptionText = await testSubjects.getVisibleText('saved-query-management-popover'); + expect(descriptionText).to.eql( + 'SAVED QUERIES\nThere are no saved queries. Save query text and filters that you want to use again.\nSave current query' + ); + }); + + it('should allow a query to be saved via the saved objects management component', async () => { + await queryBar.setQuery('response:200'); + await savedQueryManagementComponent.saveNewQuery( + 'OkResponse', + '200 responses for .jpg over 24 hours', + true, + true + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.savedQueryTextExist('response:200'); + }); + + it('reinstates filters and the time filter when a saved query has filters and a time filter included', async () => { + await PageObjects.timePicker.setDefaultAbsoluteRange(); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + const timePickerValues = await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes(); + expect(timePickerValues.start).to.not.eql(PageObjects.timePicker.defaultStartTime); + expect(timePickerValues.end).to.not.eql(PageObjects.timePicker.defaultEndTime); + }); + + it('preserves the currently loaded query when the page is reloaded', async () => { + await browser.refresh(); + const timePickerValues = await PageObjects.timePicker.getTimeConfigAsAbsoluteTimes(); + expect(timePickerValues.start).to.not.eql(PageObjects.timePicker.defaultStartTime); + expect(timePickerValues.end).to.not.eql(PageObjects.timePicker.defaultEndTime); + expect(await savedQueryManagementComponent.getCurrentlyLoadedQueryID()).to.be('OkResponse'); + }); + + it('allows saving changes to a currently loaded query via the saved query management component', async () => { + await queryBar.setQuery('response:404'); + await savedQueryManagementComponent.updateCurrentlyLoadedQuery( + 'OkResponse', + '404 responses', + false, + false + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + expect(await queryBar.getQueryString()).to.eql(''); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + expect(await queryBar.getQueryString()).to.eql('response:404'); + }); + + it('allows saving the currently loaded query as a new query', async () => { + await savedQueryManagementComponent.saveCurrentlyLoadedAsNewQuery( + 'OkResponseCopy', + '200 responses', + false, + false + ); + await savedQueryManagementComponent.savedQueryExistOrFail('OkResponseCopy'); + }); + + it('allows deleting the currently loaded saved query in the saved query management component and clears the query', async () => { + await savedQueryManagementComponent.deleteSavedQuery('OkResponseCopy'); + await savedQueryManagementComponent.savedQueryMissingOrFail('OkResponseCopy'); + expect(await queryBar.getQueryString()).to.eql(''); + }); + + it('resets any changes to a loaded query on reloading the same saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await queryBar.setQuery('response:503'); + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + expect(await queryBar.getQueryString()).to.eql('response:404'); + }); + + it('allows clearing the currently loaded saved query', async () => { + await savedQueryManagementComponent.loadSavedQuery('OkResponse'); + await savedQueryManagementComponent.clearCurrentlyLoadedQuery(); + expect(await queryBar.getQueryString()).to.eql(''); + }); + }); + }); +} diff --git a/test/functional/apps/dashboard/full_screen_mode.js b/test/functional/apps/dashboard/full_screen_mode.js index df00f64530ca02..17eb6d8f08a9ca 100644 --- a/test/functional/apps/dashboard/full_screen_mode.js +++ b/test/functional/apps/dashboard/full_screen_mode.js @@ -25,6 +25,7 @@ export default function({ getService, getPageObjects }) { const kibanaServer = getService('kibanaServer'); const dashboardPanelActions = getService('dashboardPanelActions'); const PageObjects = getPageObjects(['dashboard', 'common']); + const filterBar = getService('filterBar'); describe('full screen mode', () => { before(async () => { @@ -81,5 +82,22 @@ export default function({ getService, getPageObjects }) { expect(isChromeVisible).to.be(true); }); }); + + it('shows filter bar in fullscreen mode', async () => { + await filterBar.addFilter('bytes', 'is', '12345678'); + await PageObjects.dashboard.waitForRenderComplete(); + await PageObjects.dashboard.clickFullScreenMode(); + await retry.try(async () => { + const isChromeHidden = await PageObjects.common.isChromeHidden(); + expect(isChromeHidden).to.be(true); + }); + expect(await filterBar.getFilterCount()).to.be(1); + await PageObjects.dashboard.clickExitFullScreenLogoButton(); + await retry.try(async () => { + const isChromeVisible = await PageObjects.common.isChromeVisible(); + expect(isChromeVisible).to.be(true); + }); + await filterBar.removeFilter('bytes'); + }); }); } diff --git a/test/functional/apps/dashboard/index.js b/test/functional/apps/dashboard/index.js index 6666ccc57d5845..bd8e6812147e1c 100644 --- a/test/functional/apps/dashboard/index.js +++ b/test/functional/apps/dashboard/index.js @@ -74,6 +74,7 @@ export default function({ getService, loadTestFile }) { loadTestFile(require.resolve('./panel_expand_toggle')); loadTestFile(require.resolve('./dashboard_grid')); loadTestFile(require.resolve('./view_edit')); + loadTestFile(require.resolve('./dashboard_saved_query')); // Order of test suites *shouldn't* be important but there's a bug for the view_edit test above // https://github.com/elastic/kibana/issues/46752 // The dashboard_snapshot test below requires the timestamped URL which breaks the view_edit test. diff --git a/test/functional/apps/discover/_saved_queries.js b/test/functional/apps/discover/_saved_queries.js index 76f3a3aea365f4..9b50eeda200735 100644 --- a/test/functional/apps/discover/_saved_queries.js +++ b/test/functional/apps/discover/_saved_queries.js @@ -74,6 +74,7 @@ export default function({ getService, getPageObjects }) { true ); await savedQueryManagementComponent.savedQueryExistOrFail('OkResponse'); + await savedQueryManagementComponent.savedQueryTextExist('response:200'); }); it('reinstates filters and the time filter when a saved query has filters and a time filter included', async () => { diff --git a/test/functional/services/saved_query_management_component.ts b/test/functional/services/saved_query_management_component.ts index 244c1cd214de56..66bf15f3da53c9 100644 --- a/test/functional/services/saved_query_management_component.ts +++ b/test/functional/services/saved_query_management_component.ts @@ -151,6 +151,12 @@ export function SavedQueryManagementComponentProvider({ getService }: FtrProvide await testSubjects.existOrFail(`~load-saved-query-${title}-button`); } + async savedQueryTextExist(text: string) { + await this.openSavedQueryManagementComponent(); + const queryString = await queryBar.getQueryString(); + expect(queryString).to.eql(text); + } + async savedQueryMissingOrFail(title: string) { await retry.try(async () => { await this.openSavedQueryManagementComponent(); From c6125fc795f72840a91acb31453b67f1a849fa57 Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Wed, 22 Apr 2020 14:06:02 +0200 Subject: [PATCH 22/34] Filter action icons (#64073) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 add filter icons to filter actions * test: 💍 add unit test for icon type for createFilterAction() * test: 💍 fix TypeScript error --- src/plugins/data/public/actions/select_range_action.ts | 1 + src/plugins/data/public/actions/value_click_action.ts | 1 + .../public/lib/actions/apply_filter_action.test.ts | 8 ++++++++ .../embeddable/public/lib/actions/apply_filter_action.ts | 1 + 4 files changed, 11 insertions(+) diff --git a/src/plugins/data/public/actions/select_range_action.ts b/src/plugins/data/public/actions/select_range_action.ts index 70a018e3c2bda2..4882e8eafc0d36 100644 --- a/src/plugins/data/public/actions/select_range_action.ts +++ b/src/plugins/data/public/actions/select_range_action.ts @@ -46,6 +46,7 @@ export function selectRangeAction( return createAction({ type: ACTION_SELECT_RANGE, id: ACTION_SELECT_RANGE, + getIconType: () => 'filter', getDisplayName: () => { return i18n.translate('data.filter.applyFilterActionTitle', { defaultMessage: 'Apply filter to current view', diff --git a/src/plugins/data/public/actions/value_click_action.ts b/src/plugins/data/public/actions/value_click_action.ts index 1141e485309cfb..210a58b3f75aa7 100644 --- a/src/plugins/data/public/actions/value_click_action.ts +++ b/src/plugins/data/public/actions/value_click_action.ts @@ -50,6 +50,7 @@ export function valueClickAction( return createAction({ type: ACTION_VALUE_CLICK, id: ACTION_VALUE_CLICK, + getIconType: () => 'filter', getDisplayName: () => { return i18n.translate('data.filter.applyFilterActionTitle', { defaultMessage: 'Apply filter to current view', diff --git a/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts b/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts index 5297cf6cd365c6..636ce3e623c5bf 100644 --- a/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts +++ b/src/plugins/embeddable/public/lib/actions/apply_filter_action.test.ts @@ -31,6 +31,14 @@ test('has expected display name', () => { expect(action.getDisplayName({} as any)).toMatchInlineSnapshot(`"Apply filter to current view"`); }); +describe('getIconType()', () => { + test('returns "filter" icon', async () => { + const action = createFilterAction(); + const result = action.getIconType({} as any); + expect(result).toBe('filter'); + }); +}); + describe('isCompatible()', () => { test('when embeddable filters and filters exist, returns true', async () => { const action = createFilterAction(); diff --git a/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts b/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts index 4680512fb81c80..1cdb5af00e7483 100644 --- a/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts +++ b/src/plugins/embeddable/public/lib/actions/apply_filter_action.ts @@ -42,6 +42,7 @@ export function createFilterAction(): ActionByType { return createAction({ type: ACTION_APPLY_FILTER, id: ACTION_APPLY_FILTER, + getIconType: () => 'filter', getDisplayName: () => { return i18n.translate('embeddableApi.actions.applyFilterActionTitle', { defaultMessage: 'Apply filter to current view', From 2f75810f16980f8ddea2df07c3cb448ce5fce276 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Wed, 22 Apr 2020 14:29:48 +0200 Subject: [PATCH 23/34] fix dashboard memory leak (#64154) --- .../public/application/dashboard_app_controller.tsx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx index b4a53234bffac5..fa2f06bfcdcdd9 100644 --- a/src/plugins/dashboard/public/application/dashboard_app_controller.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app_controller.tsx @@ -620,6 +620,12 @@ export class DashboardAppController { ReactDOM.render(, dashboardNavBar); }; + const unmountNavBar = () => { + if (dashboardNavBar) { + ReactDOM.unmountComponentAtNode(dashboardNavBar); + } + }; + $scope.timefilterSubscriptions$ = new Subscription(); $scope.timefilterSubscriptions$.add( @@ -968,6 +974,9 @@ export class DashboardAppController { }); $scope.$on('$destroy', () => { + // we have to unmount nav bar manually to make sure all internal subscriptions are unsubscribed + unmountNavBar(); + updateSubscription.unsubscribe(); stopSyncingQueryServiceStateWithUrl(); stopSyncingAppFilters(); @@ -981,6 +990,9 @@ export class DashboardAppController { if (outputSubscription) { outputSubscription.unsubscribe(); } + if (dashboardContainer) { + dashboardContainer.destroy(); + } }); } } From e17755ecef4770c7d11179fa92e7913f6f7ee937 Mon Sep 17 00:00:00 2001 From: MadameSheema Date: Wed, 22 Apr 2020 15:04:00 +0200 Subject: [PATCH 24/34] [SIEM] Adds 'Create new case' Cypress test (#63971) * adds timeline data * adds 'cases' spec * adds test * implements test * refactor * prepares test to be executed with the new platform * finishes refactor * fixes typo * renames case interface --- .../public/components/header_page/index.tsx | 7 +- .../public/components/link_icon/index.tsx | 3 + .../components/markdown_editor/index.tsx | 1 + .../timeline/selectable_timeline/index.tsx | 2 +- .../case/components/all_cases/columns.tsx | 14 +- .../case/components/all_cases/index.test.tsx | 3 +- .../pages/case/components/all_cases/index.tsx | 3 + .../pages/case/components/case_view/index.tsx | 1 + .../components/open_closed_stats/index.tsx | 33 +- .../pages/case/components/tag_list/index.tsx | 2 +- .../siem/cypress/integration/cases.spec.ts | 115 + x-pack/plugins/siem/cypress/objects/case.ts | 29 + .../plugins/siem/cypress/objects/timeline.ts | 3 +- .../plugins/siem/cypress/screens/all_cases.ts | 41 + .../siem/cypress/screens/case_details.ts | 29 + .../siem/cypress/screens/create_new_case.ts | 24 + .../plugins/siem/cypress/screens/timeline.ts | 2 + .../plugins/siem/cypress/tasks/all_cases.ts | 15 + .../siem/cypress/tasks/case_details.ts | 14 + .../siem/cypress/tasks/create_new_case.ts | 42 + .../plugins/siem/cypress/urls/navigation.ts | 1 + .../es_archives/timeline/data.json.gz | Bin 0 -> 1775 bytes .../es_archives/timeline/mappings.json | 2976 +++++++++++++++++ 23 files changed, 3335 insertions(+), 25 deletions(-) create mode 100644 x-pack/plugins/siem/cypress/integration/cases.spec.ts create mode 100644 x-pack/plugins/siem/cypress/objects/case.ts create mode 100644 x-pack/plugins/siem/cypress/screens/all_cases.ts create mode 100644 x-pack/plugins/siem/cypress/screens/case_details.ts create mode 100644 x-pack/plugins/siem/cypress/screens/create_new_case.ts create mode 100644 x-pack/plugins/siem/cypress/tasks/all_cases.ts create mode 100644 x-pack/plugins/siem/cypress/tasks/case_details.ts create mode 100644 x-pack/plugins/siem/cypress/tasks/create_new_case.ts create mode 100644 x-pack/test/siem_cypress/es_archives/timeline/data.json.gz create mode 100644 x-pack/test/siem_cypress/es_archives/timeline/mappings.json diff --git a/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx b/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx index f88ffc3f3c6c44..f75afcd113628d 100644 --- a/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/header_page/index.tsx @@ -60,6 +60,7 @@ Badge.displayName = 'Badge'; interface BackOptions { href: LinkIconProps['href']; text: LinkIconProps['children']; + dataTestSubj?: string; } export interface HeaderPageProps extends HeaderProps { @@ -91,7 +92,11 @@ const HeaderPageComponent: React.FC = ({ {backOptions && ( - + {backOptions.text} diff --git a/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx b/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx index ba5874d42d5150..36f57c46c16285 100644 --- a/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx +++ b/x-pack/legacy/plugins/siem/public/components/link_icon/index.tsx @@ -50,12 +50,14 @@ export interface LinkIconProps extends LinkProps { children: string; iconSize?: IconSize; iconType: IconType; + dataTestSubj?: string; } export const LinkIcon = React.memo( ({ children, color, + dataTestSubj, disabled, href, iconSide = 'left', @@ -67,6 +69,7 @@ export const LinkIcon = React.memo( = ({ - + {isUntitled(option) ? i18nTimeline.UNTITLED_TIMELINE : option.title} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx index e48e5cb0c5959f..9c2a7fc07f2d33 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/columns.tsx @@ -126,10 +126,9 @@ export const getCasesColumns = ( render: (createdAt: Case['createdAt']) => { if (createdAt != null) { return ( - + + + ); } return getEmptyTagValue(); @@ -142,10 +141,9 @@ export const getCasesColumns = ( render: (closedAt: Case['closedAt']) => { if (closedAt != null) { return ( - + + + ); } return getEmptyTagValue(); diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx index 58d0c1b0faaf3c..eb5bca6cc57fff 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.test.tsx @@ -125,8 +125,9 @@ describe('AllCases', () => { wrapper .find(`[data-test-subj="case-table-column-createdAt"]`) .first() + .childAt(0) .prop('value') - ).toEqual(useGetCasesMockState.data.cases[0].createdAt); + ).toBe(useGetCasesMockState.data.cases[0].createdAt); expect( wrapper .find(`[data-test-subj="case-table-case-count"]`) diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx index a6eca717a82a3e..9dd90074a2e7b9 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/all_cases/index.tsx @@ -313,6 +313,7 @@ export const AllCases = React.memo(({ userCanCrud }) => { (({ userCanCrud }) => { (({ userCanCrud }) => { fill href={getCreateCaseUrl(urlSearch)} iconType="plusInCircle" + data-test-subj="createNewCaseBtn" > {i18n.CREATE_TITLE} diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx index 3cf0405f406377..01b9bc42f8e91a 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/case_view/index.tsx @@ -216,6 +216,7 @@ export const CaseComponent = React.memo( backOptions={{ href: getCaseUrl(search), text: i18n.BACK_TO_ALL, + dataTestSubj: 'backToCases', }} data-test-subj="case-view-title" titleNode={ diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx index 75f1d4d911518e..b9dab13090acaf 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx @@ -12,19 +12,28 @@ export interface Props { caseCount: number | null; caseStatus: 'open' | 'closed'; isLoading: boolean; + dataTestSubj?: string; } -export const OpenClosedStats = React.memo(({ caseCount, caseStatus, isLoading }) => { - const openClosedStats = useMemo( - () => [ - { - title: caseStatus === 'open' ? i18n.OPEN_CASES : i18n.CLOSED_CASES, - description: isLoading ? : caseCount ?? 'N/A', - }, - ], - [caseCount, caseStatus, isLoading] - ); - return ; -}); +export const OpenClosedStats = React.memo( + ({ caseCount, caseStatus, isLoading, dataTestSubj }) => { + const openClosedStats = useMemo( + () => [ + { + title: caseStatus === 'open' ? i18n.OPEN_CASES : i18n.CLOSED_CASES, + description: isLoading ? : caseCount ?? 'N/A', + }, + ], + [caseCount, caseStatus, isLoading, dataTestSubj] + ); + return ( + + ); + } +); OpenClosedStats.displayName = 'OpenClosedStats'; diff --git a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx index c96ae09706426c..c61feab0bab989 100644 --- a/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx +++ b/x-pack/legacy/plugins/siem/public/pages/case/components/tag_list/index.tsx @@ -93,7 +93,7 @@ export const TagList = React.memo( )} - + {tags.length === 0 && !isEditTags &&

{i18n.NO_TAGS}

} {tags.length > 0 && !isEditTags && diff --git a/x-pack/plugins/siem/cypress/integration/cases.spec.ts b/x-pack/plugins/siem/cypress/integration/cases.spec.ts new file mode 100644 index 00000000000000..f541555d564408 --- /dev/null +++ b/x-pack/plugins/siem/cypress/integration/cases.spec.ts @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { case1 } from '../objects/case'; + +import { + ALL_CASES_CLOSE_ACTION, + ALL_CASES_CLOSED_CASES_COUNT, + ALL_CASES_CLOSED_CASES_STATS, + ALL_CASES_COMMENTS_COUNT, + ALL_CASES_DELETE_ACTION, + ALL_CASES_NAME, + ALL_CASES_OPEN_CASES_COUNT, + ALL_CASES_OPEN_CASES_STATS, + ALL_CASES_OPENED_ON, + ALL_CASES_PAGE_TITLE, + ALL_CASES_REPORTER, + ALL_CASES_REPORTERS_COUNT, + ALL_CASES_SERVICE_NOW_INCIDENT, + ALL_CASES_TAGS, + ALL_CASES_TAGS_COUNT, +} from '../screens/all_cases'; +import { + ACTION, + CASE_DETAILS_DESCRIPTION, + CASE_DETAILS_PAGE_TITLE, + CASE_DETAILS_PUSH_AS_SERVICE_NOW_BTN, + CASE_DETAILS_STATUS, + CASE_DETAILS_TAGS, + CASE_DETAILS_TIMELINE_MARKDOWN, + CASE_DETAILS_USER_ACTION, + CASE_DETAILS_USERNAMES, + PARTICIPANTS, + REPORTER, + USER, +} from '../screens/case_details'; +import { TIMELINE_DESCRIPTION, TIMELINE_QUERY, TIMELINE_TITLE } from '../screens/timeline'; + +import { goToCaseDetails, goToCreateNewCase } from '../tasks/all_cases'; +import { openCaseTimeline } from '../tasks/case_details'; +import { backToCases, createNewCase } from '../tasks/create_new_case'; +import { loginAndWaitForPageWithoutDateRange } from '../tasks/login'; +import { esArchiverLoad, esArchiverUnload } from '../tasks/es_archiver'; + +import { CASES } from '../urls/navigation'; + +describe('Cases', () => { + before(() => { + esArchiverLoad('timeline'); + }); + + after(() => { + esArchiverUnload('timeline'); + }); + + it('Creates a new case with timeline and opens the timeline', () => { + loginAndWaitForPageWithoutDateRange(CASES); + goToCreateNewCase(); + createNewCase(case1); + backToCases(); + + cy.get(ALL_CASES_PAGE_TITLE).should('have.text', 'Cases Beta'); + cy.get(ALL_CASES_OPEN_CASES_STATS).should('have.text', 'Open cases1'); + cy.get(ALL_CASES_CLOSED_CASES_STATS).should('have.text', 'Closed cases0'); + cy.get(ALL_CASES_OPEN_CASES_COUNT).should('have.text', 'Open cases (1)'); + cy.get(ALL_CASES_CLOSED_CASES_COUNT).should('have.text', 'Closed cases (0)'); + cy.get(ALL_CASES_REPORTERS_COUNT).should('have.text', 'Reporter1'); + cy.get(ALL_CASES_TAGS_COUNT).should('have.text', 'Tags2'); + cy.get(ALL_CASES_NAME).should('have.text', case1.name); + cy.get(ALL_CASES_REPORTER).should('have.text', case1.reporter); + case1.tags.forEach((tag, index) => { + cy.get(ALL_CASES_TAGS(index)).should('have.text', tag); + }); + cy.get(ALL_CASES_COMMENTS_COUNT).should('have.text', '0'); + cy.get(ALL_CASES_OPENED_ON).should('include.text', 'ago'); + cy.get(ALL_CASES_SERVICE_NOW_INCIDENT).should('have.text', 'Not pushed'); + cy.get(ALL_CASES_DELETE_ACTION).should('exist'); + cy.get(ALL_CASES_CLOSE_ACTION).should('exist'); + + goToCaseDetails(); + + const expectedTags = case1.tags.join(''); + cy.get(CASE_DETAILS_PAGE_TITLE).should('have.text', case1.name); + cy.get(CASE_DETAILS_STATUS).should('have.text', 'open'); + cy.get(CASE_DETAILS_USER_ACTION) + .eq(USER) + .should('have.text', case1.reporter); + cy.get(CASE_DETAILS_USER_ACTION) + .eq(ACTION) + .should('have.text', 'added description'); + cy.get(CASE_DETAILS_DESCRIPTION).should( + 'have.text', + `${case1.description} ${case1.timeline.title}` + ); + cy.get(CASE_DETAILS_USERNAMES) + .eq(REPORTER) + .should('have.text', case1.reporter); + cy.get(CASE_DETAILS_USERNAMES) + .eq(PARTICIPANTS) + .should('have.text', case1.reporter); + cy.get(CASE_DETAILS_TAGS).should('have.text', expectedTags); + cy.get(CASE_DETAILS_PUSH_AS_SERVICE_NOW_BTN).should('have.attr', 'disabled'); + cy.get(CASE_DETAILS_TIMELINE_MARKDOWN).then($element => { + const timelineLink = $element.prop('href').match(/http(s?):\/\/\w*:\w*(\S*)/)[0]; + openCaseTimeline(timelineLink); + + cy.get(TIMELINE_TITLE).should('have.attr', 'value', case1.timeline.title); + cy.get(TIMELINE_DESCRIPTION).should('have.attr', 'value', case1.timeline.description); + cy.get(TIMELINE_QUERY).should('have.attr', 'value', case1.timeline.query); + }); + }); +}); diff --git a/x-pack/plugins/siem/cypress/objects/case.ts b/x-pack/plugins/siem/cypress/objects/case.ts new file mode 100644 index 00000000000000..1c7bc34bca417a --- /dev/null +++ b/x-pack/plugins/siem/cypress/objects/case.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Timeline } from './timeline'; + +export interface TestCase { + name: string; + tags: string[]; + description: string; + timeline: Timeline; + reporter: string; +} + +const caseTimeline: Timeline = { + title: 'SIEM test', + description: 'description', + query: 'host.name:*', +}; + +export const case1: TestCase = { + name: 'This is the title of the case', + tags: ['Tag1', 'Tag2'], + description: 'This is the case description', + timeline: caseTimeline, + reporter: 'elastic', +}; diff --git a/x-pack/plugins/siem/cypress/objects/timeline.ts b/x-pack/plugins/siem/cypress/objects/timeline.ts index bca99bfa9266a4..060a1376b46ce1 100644 --- a/x-pack/plugins/siem/cypress/objects/timeline.ts +++ b/x-pack/plugins/siem/cypress/objects/timeline.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -interface Timeline { +export interface Timeline { title: string; + description: string; query: string; } diff --git a/x-pack/plugins/siem/cypress/screens/all_cases.ts b/x-pack/plugins/siem/cypress/screens/all_cases.ts new file mode 100644 index 00000000000000..b1e4c665153522 --- /dev/null +++ b/x-pack/plugins/siem/cypress/screens/all_cases.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const ALL_CASES_CLOSE_ACTION = '[data-test-subj="action-close"]'; + +export const ALL_CASES_CLOSED_CASES_COUNT = '[data-test-subj="closed-case-count"]'; + +export const ALL_CASES_CLOSED_CASES_STATS = '[data-test-subj="closedStatsHeader"]'; + +export const ALL_CASES_COMMENTS_COUNT = '[data-test-subj="case-table-column-commentCount"]'; + +export const ALL_CASES_CREATE_NEW_CASE_BTN = '[data-test-subj="createNewCaseBtn"]'; + +export const ALL_CASES_DELETE_ACTION = '[data-test-subj="action-delete"]'; + +export const ALL_CASES_NAME = '[data-test-subj="case-details-link"]'; + +export const ALL_CASES_OPEN_CASES_COUNT = '[data-test-subj="open-case-count"]'; + +export const ALL_CASES_OPEN_CASES_STATS = '[data-test-subj="openStatsHeader"]'; + +export const ALL_CASES_OPENED_ON = '[data-test-subj="case-table-column-createdAt"]'; + +export const ALL_CASES_PAGE_TITLE = '[data-test-subj="header-page-title"]'; + +export const ALL_CASES_REPORTER = '[data-test-subj="case-table-column-createdBy"]'; + +export const ALL_CASES_REPORTERS_COUNT = + '[data-test-subj="options-filter-popover-button-Reporter"]'; + +export const ALL_CASES_SERVICE_NOW_INCIDENT = + '[data-test-subj="case-table-column-external-notPushed"]'; + +export const ALL_CASES_TAGS = (index: number) => { + return `[data-test-subj="case-table-column-tags-${index}"]`; +}; + +export const ALL_CASES_TAGS_COUNT = '[data-test-subj="options-filter-popover-button-Tags"]'; diff --git a/x-pack/plugins/siem/cypress/screens/case_details.ts b/x-pack/plugins/siem/cypress/screens/case_details.ts new file mode 100644 index 00000000000000..3bd180b1d588f7 --- /dev/null +++ b/x-pack/plugins/siem/cypress/screens/case_details.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const ACTION = 2; + +export const CASE_DETAILS_DESCRIPTION = '[data-test-subj="markdown-root"]'; + +export const CASE_DETAILS_PAGE_TITLE = '[data-test-subj="header-page-title"]'; + +export const CASE_DETAILS_PUSH_AS_SERVICE_NOW_BTN = '[data-test-subj="push-to-service-now"]'; + +export const CASE_DETAILS_STATUS = '[data-test-subj="case-view-status"]'; + +export const CASE_DETAILS_TAGS = '[data-test-subj="case-tags"]'; + +export const CASE_DETAILS_TIMELINE_MARKDOWN = '[data-test-subj="markdown-link"]'; + +export const CASE_DETAILS_USER_ACTION = '[data-test-subj="user-action-title"] .euiFlexItem'; + +export const CASE_DETAILS_USERNAMES = '[data-test-subj="case-view-username"]'; + +export const PARTICIPANTS = 1; + +export const REPORTER = 0; + +export const USER = 1; diff --git a/x-pack/plugins/siem/cypress/screens/create_new_case.ts b/x-pack/plugins/siem/cypress/screens/create_new_case.ts new file mode 100644 index 00000000000000..6e2beb78fff190 --- /dev/null +++ b/x-pack/plugins/siem/cypress/screens/create_new_case.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export const BACK_TO_CASES_BTN = '[data-test-subj="backToCases"]'; + +export const DESCRIPTION_INPUT = + '[data-test-subj="caseDescription"] [data-test-subj="textAreaInput"]'; + +export const INSERT_TIMELINE_BTN = '[data-test-subj="insert-timeline-button"]'; + +export const LOADING_SPINNER = '[data-test-subj="create-case-loading-spinner"]'; + +export const SUBMIT_BTN = '[data-test-subj="create-case-submit"]'; + +export const TAGS_INPUT = '[data-test-subj="caseTags"] [data-test-subj="comboBoxSearchInput"]'; + +export const TIMELINE = '[data-test-subj="timeline"]'; + +export const TIMELINE_SEARCHBOX = '[data-test-subj="timeline-super-select-search-box"]'; + +export const TITLE_INPUT = '[data-test-subj="caseTitle"] [data-test-subj="input"]'; diff --git a/x-pack/plugins/siem/cypress/screens/timeline.ts b/x-pack/plugins/siem/cypress/screens/timeline.ts index 53d8273d9ce6b6..58d2568084f7c5 100644 --- a/x-pack/plugins/siem/cypress/screens/timeline.ts +++ b/x-pack/plugins/siem/cypress/screens/timeline.ts @@ -42,6 +42,8 @@ export const TIMELINE_INSPECT_BUTTON = '[data-test-subj="inspect-empty-button"]' export const TIMELINE_NOT_READY_TO_DROP_BUTTON = '[data-test-subj="flyout-button-not-ready-to-drop"]'; +export const TIMELINE_QUERY = '[data-test-subj="timelineQueryInput"]'; + export const TIMELINE_SETTINGS_ICON = '[data-test-subj="settings-gear"]'; export const TIMELINE_TITLE = '[data-test-subj="timeline-title"]'; diff --git a/x-pack/plugins/siem/cypress/tasks/all_cases.ts b/x-pack/plugins/siem/cypress/tasks/all_cases.ts new file mode 100644 index 00000000000000..f3745322013241 --- /dev/null +++ b/x-pack/plugins/siem/cypress/tasks/all_cases.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ALL_CASES_NAME, ALL_CASES_CREATE_NEW_CASE_BTN } from '../screens/all_cases'; + +export const goToCreateNewCase = () => { + cy.get(ALL_CASES_CREATE_NEW_CASE_BTN).click({ force: true }); +}; + +export const goToCaseDetails = () => { + cy.get(ALL_CASES_NAME).click({ force: true }); +}; diff --git a/x-pack/plugins/siem/cypress/tasks/case_details.ts b/x-pack/plugins/siem/cypress/tasks/case_details.ts new file mode 100644 index 00000000000000..a28f8b8010adb0 --- /dev/null +++ b/x-pack/plugins/siem/cypress/tasks/case_details.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TIMELINE_TITLE } from '../screens/timeline'; + +export const openCaseTimeline = (link: string) => { + cy.visit('/app/kibana'); + cy.visit(link); + cy.contains('a', 'SIEM'); + cy.get(TIMELINE_TITLE).should('exist'); +}; diff --git a/x-pack/plugins/siem/cypress/tasks/create_new_case.ts b/x-pack/plugins/siem/cypress/tasks/create_new_case.ts new file mode 100644 index 00000000000000..b7078a1033de89 --- /dev/null +++ b/x-pack/plugins/siem/cypress/tasks/create_new_case.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { TestCase } from '../objects/case'; + +import { + BACK_TO_CASES_BTN, + DESCRIPTION_INPUT, + SUBMIT_BTN, + INSERT_TIMELINE_BTN, + LOADING_SPINNER, + TAGS_INPUT, + TIMELINE, + TIMELINE_SEARCHBOX, + TITLE_INPUT, +} from '../screens/create_new_case'; + +export const backToCases = () => { + cy.get(BACK_TO_CASES_BTN).click({ force: true }); +}; + +export const createNewCase = (newCase: TestCase) => { + cy.get(TITLE_INPUT).type(newCase.name, { force: true }); + newCase.tags.forEach(tag => { + cy.get(TAGS_INPUT).type(`${tag}{enter}`, { force: true }); + }); + cy.get(DESCRIPTION_INPUT).type(`${newCase.description} `, { force: true }); + + cy.get(INSERT_TIMELINE_BTN).click({ force: true }); + cy.get(TIMELINE_SEARCHBOX).type(`${newCase.timeline.title}{enter}`); + cy.get(TIMELINE).should('be.visible'); + cy.get(TIMELINE) + .eq(1) + .click({ force: true }); + + cy.get(SUBMIT_BTN).click({ force: true }); + cy.get(LOADING_SPINNER).should('exist'); + cy.get(LOADING_SPINNER).should('not.exist'); +}; diff --git a/x-pack/plugins/siem/cypress/urls/navigation.ts b/x-pack/plugins/siem/cypress/urls/navigation.ts index 5e65e5aa34c186..263469a4dbaedc 100644 --- a/x-pack/plugins/siem/cypress/urls/navigation.ts +++ b/x-pack/plugins/siem/cypress/urls/navigation.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +export const CASES = '/app/siem#/case'; export const DETECTIONS = 'app/siem#/detections'; export const HOSTS_PAGE = '/app/siem#/hosts/allHosts'; export const HOSTS_PAGE_TAB_URLS = { diff --git a/x-pack/test/siem_cypress/es_archives/timeline/data.json.gz b/x-pack/test/siem_cypress/es_archives/timeline/data.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..c7acb36992af3d928d5b8aaf904c3d79eb9a2c20 GIT binary patch literal 1775 zcmV#})`l2yXXtb+RoB(NFuLyGSt^1z^Z^s6x~i)q)f}ngD^2xG*HbOUHnsP|%@Tu@ zju?z!3>jH@^~XWcS*K957hsH_NyZ?31IYzQYp2CM1(!KRdWN%vHO>WvrEr0IT8GBq zrVENhys8!8x{4vgn7)Mp!{ilM@tf4evHn6N@UFO7`{Eu+i<1tPg^%8F3qz97cZkiO zL;MWEDBQ?UA)Gtu3NsLO9a6{`N@ld_9XiMVa;LpTGy@U3%~Mcr4URYk5rv&{F%-iy zkcuP_c80K~D(={RKR6$EhV1^EQ)4^i=72PfP>@@}&nTEdpAnEy5C{l}JR62n*D}@7 z*qMYQO@ma)7Jb?$`w8kPEhlZ{x3LCg5R9w&nTM6Qhp&^%fIuihOjj(^ za*X>wW;IJ^@dT3B(=*O`A^f514Ifhm;e&o7H|^wsg<36=SS_V=p)580O`;QV?rT!<-jyEr&ChuzH%UX3hYR5OLKJ zTQyU0#Wd~eQg&2zs9+aGeh16Db1iHXnpRaS{F(PVz286C_EfKz8HJ>fuB{LzXoi}B z{y$Z!+moWow(4mvwqG=SS<%sVvG zOBBFuEOrvBgy}&@@+*Xb11XD>3C=Ir>_7xdt>}Z*Dso2LYKI34l7i$wq__izXtXmu z^%bP^Cd~o$L9+5I#?D*MdL!K7hLS@=7AAV&uC&5S#Fm5-Y&zz>Ife4k0(KLj=ob1Y z@h2;mORB5Rz`RN4Jc#Lb&9oka1B2y4p=Go<>dZ*~Cp@8kmnFJcY`m4<{;nj??adO% znt>tDa0~PaEI}JcM-xC{3!dN*exfaKx?=M@H0xlJO;#PicvO(+9&Z3$49n~c<3(5K z#e$sK)BRgY-)`c1U+UXCkbNvPwjJI!aycu7dZY+-mk0 zC^unA>tx4dASx^p3v?K6&1mQZ|3mER7==X zL|{-21$oOS0v6@|ygdKyLgEtO?}*K6*Kf0Ec$TXe>X&R5 zIn!c=;RzW$oWjI!Nb#VuzTtXDx1!1&s8P#{k*)oCa;NU5XBvuSI7i%_bIZCDLqB-y zGi-N0$1&WuJ6BD2=NA&K=jyy++;6rzKY)`P0ltZCUu3HA>qfZ#)g$~~`9iPJ{Yu-r zz_%!hz!OVRrAHSa-~%J3^Pi-1J~&1a2S~3krN8+w=xe5LKbC&s9)<7Vr%Qr&5F#Pli@;`3%_GxJ)003)gW7q%y literal 0 HcmV?d00001 diff --git a/x-pack/test/siem_cypress/es_archives/timeline/mappings.json b/x-pack/test/siem_cypress/es_archives/timeline/mappings.json new file mode 100644 index 00000000000000..d3412f9d43b57f --- /dev/null +++ b/x-pack/test/siem_cypress/es_archives/timeline/mappings.json @@ -0,0 +1,2976 @@ +{ + "type": "index", + "value": { + "aliases": { + ".kibana": { + } + }, + "index": ".kibana_1", + "mappings": { + "_meta": { + "migrationMappingPropertyHashes": { + "action": "6e96ac5e648f57523879661ea72525b7", + "action_task_params": "a9d49f184ee89641044be0ca2950fa3a", + "agent_actions": "ed270b46812f0fa1439366c428a2cf17", + "agent_configs": "38abaf89513877745c359e7700c0c66a", + "agent_events": "3231653fafe4ef3196fe3b32ab774bf2", + "agents": "c3eeb7b9d97176f15f6d126370ab23c7", + "alert": "7b44fba6773e37c806ce290ea9b7024e", + "apm-indices": "9bb9b2bf1fa636ed8619cbab5ce6a1dd", + "apm-telemetry": "3525d7c22c42bc80f5e6e9cb3f2b26a2", + "application_usage_totals": "c897e4310c5f24b07caaff3db53ae2c1", + "application_usage_transactional": "965839e75f809fefe04f92dc4d99722a", + "canvas-element": "7390014e1091044523666d97247392fc", + "canvas-workpad": "b0a1706d356228dbdcb4a17e6b9eb231", + "cases": "08b8b110dbca273d37e8aef131ecab61", + "cases-comments": "c2061fb929f585df57425102fa928b4b", + "cases-configure": "42711cbb311976c0687853f4c1354572", + "cases-user-actions": "32277330ec6b721abe3b846cfd939a71", + "config": "ae24d22d5986d04124cc6568f771066f", + "dashboard": "d00f614b29a80360e1190193fd333bab", + "datasources": "d4bc0c252b2b5683ff21ea32d00acffc", + "enrollment_api_keys": "28b91e20b105b6f928e2012600085d8f", + "epm-package": "0be91c6758421dd5d0f1a58e9e5bc7c3", + "file-upload-telemetry": "0ed4d3e1983d1217a30982630897092e", + "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", + "index-pattern": "66eccb05066c5a89924f48a9e9736499", + "infrastructure-ui-source": "ddc0ecb18383f6b26101a2fadb2dab0c", + "inventory-view": "9ecce5b58867403613d82fe496470b34", + "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", + "lens": "21c3ea0763beb1ecb0162529706b88c5", + "lens-ui-telemetry": "509bfa5978586998e05f9e303c07a327", + "map": "23d7aa4a720d4938ccde3983f87bd58d", + "maps-telemetry": "268da3a48066123fc5baf35abaa55014", + "metrics-explorer-view": "53c5365793677328df0ccb6138bf3cdd", + "migrationVersion": "4a1746014a75ade3a714e1db5763276f", + "ml-telemetry": "257fd1d4b4fdbb9cb4b8a3b27da201e9", + "namespace": "2f4316de49999235636386fe51dc06c1", + "outputs": "aee9782e0d500b867859650a36280165", + "query": "11aaeb7f5f7fa5bb43f25e18ce26e7d9", + "references": "7997cf5a56cc02bdc9c93361bde732b0", + "sample-data-telemetry": "7d3cfeb915303c9641c59681967ffeb4", + "search": "181661168bbadd1eff5902361e2a0d5c", + "server": "ec97f1c5da1a19609a60874e5af1100c", + "siem-detection-engine-rule-actions": "90eee2e4635260f4be0a1da8f5bc0aa0", + "siem-detection-engine-rule-status": "ae783f41c6937db6b7a2ef5c93a9e9b0", + "siem-ui-timeline": "ac8020190f5950dd3250b6499144e7fb", + "siem-ui-timeline-note": "8874706eedc49059d4cf0f5094559084", + "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", + "space": "c5ca8acafa0beaa4d08d014a97b6bc6b", + "telemetry": "36a616f7026dfa617d6655df850fe16d", + "timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf", + "tsvb-validation-telemetry": "3a37ef6c8700ae6fc97d5c7da00e9215", + "type": "2f4316de49999235636386fe51dc06c1", + "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", + "updated_at": "00da57df13e94e9d98437d13ace4bfe0", + "upgrade-assistant-reindex-operation": "a53a20fe086b72c9a86da3cc12dad8a6", + "upgrade-assistant-telemetry": "56702cec857e0a9dacfb696655b4ff7b", + "uptime-dynamic-settings": "b6289473c8985c79b6c47eebc19a0ca5", + "url": "c7f66a0df8b1b52f17c28c4adb111105", + "visualization": "52d7a13ad68a150c4525b292d23e12cc" + } + }, + "dynamic": "strict", + "properties": { + "action": { + "properties": { + "actionTypeId": { + "type": "keyword" + }, + "config": { + "enabled": false, + "type": "object" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + }, + "secrets": { + "type": "binary" + } + } + }, + "action_task_params": { + "properties": { + "actionId": { + "type": "keyword" + }, + "apiKey": { + "type": "binary" + }, + "params": { + "enabled": false, + "type": "object" + } + } + }, + "agent_actions": { + "properties": { + "agent_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "data": { + "type": "flattened" + }, + "sent_at": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "agent_configs": { + "properties": { + "datasources": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "id": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "text" + }, + "namespace": { + "type": "keyword" + }, + "revision": { + "type": "integer" + }, + "status": { + "type": "keyword" + }, + "updated_by": { + "type": "keyword" + }, + "updated_on": { + "type": "keyword" + } + } + }, + "agent_events": { + "properties": { + "action_id": { + "type": "keyword" + }, + "agent_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "data": { + "type": "text" + }, + "message": { + "type": "text" + }, + "payload": { + "type": "text" + }, + "stream_id": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "agents": { + "properties": { + "access_api_key_id": { + "type": "keyword" + }, + "active": { + "type": "boolean" + }, + "config_id": { + "type": "keyword" + }, + "config_newest_revision": { + "type": "integer" + }, + "config_revision": { + "type": "integer" + }, + "current_error_events": { + "type": "text" + }, + "default_api_key": { + "type": "keyword" + }, + "enrolled_at": { + "type": "date" + }, + "last_checkin": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "local_metadata": { + "type": "text" + }, + "shared_id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "user_provided_metadata": { + "type": "text" + }, + "version": { + "type": "keyword" + } + } + }, + "alert": { + "properties": { + "actions": { + "properties": { + "actionRef": { + "type": "keyword" + }, + "actionTypeId": { + "type": "keyword" + }, + "group": { + "type": "keyword" + }, + "params": { + "enabled": false, + "type": "object" + } + }, + "type": "nested" + }, + "alertTypeId": { + "type": "keyword" + }, + "apiKey": { + "type": "binary" + }, + "apiKeyOwner": { + "type": "keyword" + }, + "consumer": { + "type": "keyword" + }, + "createdAt": { + "type": "date" + }, + "createdBy": { + "type": "keyword" + }, + "enabled": { + "type": "boolean" + }, + "muteAll": { + "type": "boolean" + }, + "mutedInstanceIds": { + "type": "keyword" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + }, + "params": { + "enabled": false, + "type": "object" + }, + "schedule": { + "properties": { + "interval": { + "type": "keyword" + } + } + }, + "scheduledTaskId": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "throttle": { + "type": "keyword" + }, + "updatedBy": { + "type": "keyword" + } + } + }, + "apm-indices": { + "properties": { + "apm_oss": { + "properties": { + "errorIndices": { + "type": "keyword" + }, + "metricsIndices": { + "type": "keyword" + }, + "onboardingIndices": { + "type": "keyword" + }, + "sourcemapIndices": { + "type": "keyword" + }, + "spanIndices": { + "type": "keyword" + }, + "transactionIndices": { + "type": "keyword" + } + } + } + } + }, + "apm-telemetry": { + "properties": { + "agents": { + "properties": { + "dotnet": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "go": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "java": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "js-base": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "nodejs": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "python": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "ruby": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "rum-js": { + "properties": { + "agent": { + "properties": { + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "service": { + "properties": { + "framework": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "language": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "runtime": { + "properties": { + "composite": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + } + } + }, + "cardinality": { + "properties": { + "transaction": { + "properties": { + "name": { + "properties": { + "all_agents": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "rum": { + "properties": { + "1d": { + "type": "long" + } + } + } + } + } + } + }, + "user_agent": { + "properties": { + "original": { + "properties": { + "all_agents": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "rum": { + "properties": { + "1d": { + "type": "long" + } + } + } + } + } + } + } + } + }, + "counts": { + "properties": { + "agent_configuration": { + "properties": { + "all": { + "type": "long" + } + } + }, + "error": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "max_error_groups_per_service": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "max_transaction_groups_per_service": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "metric": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "onboarding": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "services": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "sourcemap": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "span": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + }, + "traces": { + "properties": { + "1d": { + "type": "long" + } + } + }, + "transaction": { + "properties": { + "1d": { + "type": "long" + }, + "all": { + "type": "long" + } + } + } + } + }, + "has_any_services": { + "type": "boolean" + }, + "indices": { + "properties": { + "all": { + "properties": { + "total": { + "properties": { + "docs": { + "properties": { + "count": { + "type": "long" + } + } + }, + "store": { + "properties": { + "size_in_bytes": { + "type": "long" + } + } + } + } + } + } + }, + "shards": { + "properties": { + "total": { + "type": "long" + } + } + } + } + }, + "integrations": { + "properties": { + "ml": { + "properties": { + "all_jobs_count": { + "type": "long" + } + } + } + } + }, + "retainment": { + "properties": { + "error": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "metric": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "onboarding": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "span": { + "properties": { + "ms": { + "type": "long" + } + } + }, + "transaction": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "services_per_agent": { + "properties": { + "dotnet": { + "null_value": 0, + "type": "long" + }, + "go": { + "null_value": 0, + "type": "long" + }, + "java": { + "null_value": 0, + "type": "long" + }, + "js-base": { + "null_value": 0, + "type": "long" + }, + "nodejs": { + "null_value": 0, + "type": "long" + }, + "python": { + "null_value": 0, + "type": "long" + }, + "ruby": { + "null_value": 0, + "type": "long" + }, + "rum-js": { + "null_value": 0, + "type": "long" + } + } + }, + "tasks": { + "properties": { + "agent_configuration": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "agents": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "cardinality": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "groupings": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "indices_stats": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "integrations": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "processor_events": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "services": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + }, + "versions": { + "properties": { + "took": { + "properties": { + "ms": { + "type": "long" + } + } + } + } + } + } + }, + "version": { + "properties": { + "apm_server": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + }, + "patch": { + "type": "long" + } + } + } + } + } + } + }, + "application_usage_totals": { + "properties": { + "appId": { + "type": "keyword" + }, + "minutesOnScreen": { + "type": "float" + }, + "numberOfClicks": { + "type": "long" + } + } + }, + "application_usage_transactional": { + "properties": { + "appId": { + "type": "keyword" + }, + "minutesOnScreen": { + "type": "float" + }, + "numberOfClicks": { + "type": "long" + }, + "timestamp": { + "type": "date" + } + } + }, + "canvas-element": { + "dynamic": "false", + "properties": { + "@created": { + "type": "date" + }, + "@timestamp": { + "type": "date" + }, + "content": { + "type": "text" + }, + "help": { + "type": "text" + }, + "image": { + "type": "text" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "canvas-workpad": { + "dynamic": "false", + "properties": { + "@created": { + "type": "date" + }, + "@timestamp": { + "type": "date" + }, + "name": { + "fields": { + "keyword": { + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "cases": { + "properties": { + "closed_at": { + "type": "date" + }, + "closed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "description": { + "type": "text" + }, + "external_service": { + "properties": { + "connector_id": { + "type": "keyword" + }, + "connector_name": { + "type": "keyword" + }, + "external_id": { + "type": "keyword" + }, + "external_title": { + "type": "text" + }, + "external_url": { + "type": "text" + }, + "pushed_at": { + "type": "date" + }, + "pushed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "status": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-comments": { + "properties": { + "comment": { + "type": "text" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "pushed_at": { + "type": "date" + }, + "pushed_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-configure": { + "properties": { + "closure_type": { + "type": "keyword" + }, + "connector_id": { + "type": "keyword" + }, + "connector_name": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + } + } + }, + "cases-user-actions": { + "properties": { + "action": { + "type": "keyword" + }, + "action_at": { + "type": "date" + }, + "action_by": { + "properties": { + "email": { + "type": "keyword" + }, + "full_name": { + "type": "keyword" + }, + "username": { + "type": "keyword" + } + } + }, + "action_field": { + "type": "keyword" + }, + "new_value": { + "type": "text" + }, + "old_value": { + "type": "text" + } + } + }, + "config": { + "dynamic": "true", + "properties": { + "buildNum": { + "type": "keyword" + }, + "dateFormat:tz": { + "fields": { + "keyword": { + "ignore_above": 256, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "dashboard": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "optionsJSON": { + "type": "text" + }, + "panelsJSON": { + "type": "text" + }, + "refreshInterval": { + "properties": { + "display": { + "type": "keyword" + }, + "pause": { + "type": "boolean" + }, + "section": { + "type": "integer" + }, + "value": { + "type": "integer" + } + } + }, + "timeFrom": { + "type": "keyword" + }, + "timeRestore": { + "type": "boolean" + }, + "timeTo": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "datasources": { + "properties": { + "config_id": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "enabled": { + "type": "boolean" + }, + "inputs": { + "properties": { + "config": { + "type": "flattened" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "keyword" + }, + "streams": { + "properties": { + "config": { + "type": "flattened" + }, + "dataset": { + "type": "keyword" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "processors": { + "type": "keyword" + } + }, + "type": "nested" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "name": { + "type": "keyword" + }, + "namespace": { + "type": "keyword" + }, + "output_id": { + "type": "keyword" + }, + "package": { + "properties": { + "name": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "revision": { + "type": "integer" + } + } + }, + "enrollment_api_keys": { + "properties": { + "active": { + "type": "boolean" + }, + "api_key": { + "type": "binary" + }, + "api_key_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "expire_at": { + "type": "date" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + } + } + }, + "epm-package": { + "properties": { + "installed": { + "properties": { + "id": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "internal": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "file-upload-telemetry": { + "properties": { + "filesUploadedTotalCount": { + "type": "long" + } + } + }, + "graph-workspace": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "numLinks": { + "type": "integer" + }, + "numVertices": { + "type": "integer" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "wsState": { + "type": "text" + } + } + }, + "index-pattern": { + "properties": { + "fieldFormatMap": { + "type": "text" + }, + "fields": { + "type": "text" + }, + "intervalName": { + "type": "keyword" + }, + "notExpandable": { + "type": "boolean" + }, + "sourceFilters": { + "type": "text" + }, + "timeFieldName": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "type": { + "type": "keyword" + }, + "typeMeta": { + "type": "keyword" + } + } + }, + "infrastructure-ui-source": { + "properties": { + "description": { + "type": "text" + }, + "fields": { + "properties": { + "container": { + "type": "keyword" + }, + "host": { + "type": "keyword" + }, + "pod": { + "type": "keyword" + }, + "tiebreaker": { + "type": "keyword" + }, + "timestamp": { + "type": "keyword" + } + } + }, + "logAlias": { + "type": "keyword" + }, + "logColumns": { + "properties": { + "fieldColumn": { + "properties": { + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + } + } + }, + "messageColumn": { + "properties": { + "id": { + "type": "keyword" + } + } + }, + "timestampColumn": { + "properties": { + "id": { + "type": "keyword" + } + } + } + }, + "type": "nested" + }, + "metricAlias": { + "type": "keyword" + }, + "name": { + "type": "text" + } + } + }, + "inventory-view": { + "properties": { + "autoBounds": { + "type": "boolean" + }, + "autoReload": { + "type": "boolean" + }, + "boundsOverride": { + "properties": { + "max": { + "type": "integer" + }, + "min": { + "type": "integer" + } + } + }, + "customMetrics": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "label": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "customOptions": { + "properties": { + "field": { + "type": "keyword" + }, + "text": { + "type": "keyword" + } + }, + "type": "nested" + }, + "filterQuery": { + "properties": { + "expression": { + "type": "keyword" + }, + "kind": { + "type": "keyword" + } + } + }, + "groupBy": { + "properties": { + "field": { + "type": "keyword" + }, + "label": { + "type": "keyword" + } + }, + "type": "nested" + }, + "metric": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "label": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "name": { + "type": "keyword" + }, + "nodeType": { + "type": "keyword" + }, + "time": { + "type": "integer" + }, + "view": { + "type": "keyword" + } + } + }, + "kql-telemetry": { + "properties": { + "optInCount": { + "type": "long" + }, + "optOutCount": { + "type": "long" + } + } + }, + "lens": { + "properties": { + "expression": { + "index": false, + "type": "keyword" + }, + "state": { + "type": "flattened" + }, + "title": { + "type": "text" + }, + "visualizationType": { + "type": "keyword" + } + } + }, + "lens-ui-telemetry": { + "properties": { + "count": { + "type": "integer" + }, + "date": { + "type": "date" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "map": { + "properties": { + "bounds": { + "type": "geo_shape" + }, + "description": { + "type": "text" + }, + "layerListJSON": { + "type": "text" + }, + "mapStateJSON": { + "type": "text" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "maps-telemetry": { + "properties": { + "attributesPerMap": { + "properties": { + "dataSourcesCount": { + "properties": { + "avg": { + "type": "long" + }, + "max": { + "type": "long" + }, + "min": { + "type": "long" + } + } + }, + "emsVectorLayersCount": { + "dynamic": "true", + "type": "object" + }, + "layerTypesCount": { + "dynamic": "true", + "type": "object" + }, + "layersCount": { + "properties": { + "avg": { + "type": "long" + }, + "max": { + "type": "long" + }, + "min": { + "type": "long" + } + } + } + } + }, + "indexPatternsWithGeoFieldCount": { + "type": "long" + }, + "mapsTotalCount": { + "type": "long" + }, + "settings": { + "properties": { + "showMapVisualizationTypes": { + "type": "boolean" + } + } + }, + "timeCaptured": { + "type": "date" + } + } + }, + "metrics-explorer-view": { + "properties": { + "chartOptions": { + "properties": { + "stack": { + "type": "boolean" + }, + "type": { + "type": "keyword" + }, + "yAxisMode": { + "type": "keyword" + } + } + }, + "currentTimerange": { + "properties": { + "from": { + "type": "keyword" + }, + "interval": { + "type": "keyword" + }, + "to": { + "type": "keyword" + } + } + }, + "name": { + "type": "keyword" + }, + "options": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "filterQuery": { + "type": "keyword" + }, + "groupBy": { + "type": "keyword" + }, + "limit": { + "type": "integer" + }, + "metrics": { + "properties": { + "aggregation": { + "type": "keyword" + }, + "color": { + "type": "keyword" + }, + "field": { + "type": "keyword" + }, + "label": { + "type": "keyword" + } + }, + "type": "nested" + } + } + } + } + }, + "migrationVersion": { + "dynamic": "true", + "properties": { + "space": { + "fields": { + "keyword": { + "ignore_above": 256, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "ml-telemetry": { + "properties": { + "file_data_visualizer": { + "properties": { + "index_creation_count": { + "type": "long" + } + } + } + } + }, + "namespace": { + "type": "keyword" + }, + "outputs": { + "properties": { + "api_key": { + "type": "keyword" + }, + "ca_sha256": { + "type": "keyword" + }, + "config": { + "type": "flattened" + }, + "fleet_enroll_password": { + "type": "binary" + }, + "fleet_enroll_username": { + "type": "binary" + }, + "hosts": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "query": { + "properties": { + "description": { + "type": "text" + }, + "filters": { + "enabled": false, + "type": "object" + }, + "query": { + "properties": { + "language": { + "type": "keyword" + }, + "query": { + "index": false, + "type": "keyword" + } + } + }, + "timefilter": { + "enabled": false, + "type": "object" + }, + "title": { + "type": "text" + } + } + }, + "references": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + }, + "type": "nested" + }, + "sample-data-telemetry": { + "properties": { + "installCount": { + "type": "long" + }, + "unInstallCount": { + "type": "long" + } + } + }, + "search": { + "properties": { + "columns": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "sort": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "server": { + "properties": { + "uuid": { + "type": "keyword" + } + } + }, + "siem-detection-engine-rule-actions": { + "properties": { + "actions": { + "properties": { + "action_type_id": { + "type": "keyword" + }, + "group": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "params": { + "dynamic": "true", + "type": "object" + } + } + }, + "alertThrottle": { + "type": "keyword" + }, + "ruleAlertId": { + "type": "keyword" + }, + "ruleThrottle": { + "type": "keyword" + } + } + }, + "siem-detection-engine-rule-status": { + "properties": { + "alertId": { + "type": "keyword" + }, + "bulkCreateTimeDurations": { + "type": "float" + }, + "gap": { + "type": "text" + }, + "lastFailureAt": { + "type": "date" + }, + "lastFailureMessage": { + "type": "text" + }, + "lastLookBackDate": { + "type": "date" + }, + "lastSuccessAt": { + "type": "date" + }, + "lastSuccessMessage": { + "type": "text" + }, + "searchAfterTimeDurations": { + "type": "float" + }, + "status": { + "type": "keyword" + }, + "statusDate": { + "type": "date" + } + } + }, + "siem-ui-timeline": { + "properties": { + "columns": { + "properties": { + "aggregatable": { + "type": "boolean" + }, + "category": { + "type": "keyword" + }, + "columnHeaderType": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "example": { + "type": "text" + }, + "id": { + "type": "keyword" + }, + "indexes": { + "type": "keyword" + }, + "name": { + "type": "text" + }, + "placeholder": { + "type": "text" + }, + "searchable": { + "type": "boolean" + }, + "type": { + "type": "keyword" + } + } + }, + "created": { + "type": "date" + }, + "createdBy": { + "type": "text" + }, + "dataProviders": { + "properties": { + "and": { + "properties": { + "enabled": { + "type": "boolean" + }, + "excluded": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "kqlQuery": { + "type": "text" + }, + "name": { + "type": "text" + }, + "queryMatch": { + "properties": { + "displayField": { + "type": "text" + }, + "displayValue": { + "type": "text" + }, + "field": { + "type": "text" + }, + "operator": { + "type": "text" + }, + "value": { + "type": "text" + } + } + } + } + }, + "enabled": { + "type": "boolean" + }, + "excluded": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "kqlQuery": { + "type": "text" + }, + "name": { + "type": "text" + }, + "queryMatch": { + "properties": { + "displayField": { + "type": "text" + }, + "displayValue": { + "type": "text" + }, + "field": { + "type": "text" + }, + "operator": { + "type": "text" + }, + "value": { + "type": "text" + } + } + } + } + }, + "dateRange": { + "properties": { + "end": { + "type": "date" + }, + "start": { + "type": "date" + } + } + }, + "description": { + "type": "text" + }, + "eventType": { + "type": "keyword" + }, + "favorite": { + "properties": { + "favoriteDate": { + "type": "date" + }, + "fullName": { + "type": "text" + }, + "keySearch": { + "type": "text" + }, + "userName": { + "type": "text" + } + } + }, + "filters": { + "properties": { + "exists": { + "type": "text" + }, + "match_all": { + "type": "text" + }, + "meta": { + "properties": { + "alias": { + "type": "text" + }, + "controlledBy": { + "type": "text" + }, + "disabled": { + "type": "boolean" + }, + "field": { + "type": "text" + }, + "formattedValue": { + "type": "text" + }, + "index": { + "type": "keyword" + }, + "key": { + "type": "keyword" + }, + "negate": { + "type": "boolean" + }, + "params": { + "type": "text" + }, + "type": { + "type": "keyword" + }, + "value": { + "type": "text" + } + } + }, + "missing": { + "type": "text" + }, + "query": { + "type": "text" + }, + "range": { + "type": "text" + }, + "script": { + "type": "text" + } + } + }, + "kqlMode": { + "type": "keyword" + }, + "kqlQuery": { + "properties": { + "filterQuery": { + "properties": { + "kuery": { + "properties": { + "expression": { + "type": "text" + }, + "kind": { + "type": "keyword" + } + } + }, + "serializedQuery": { + "type": "text" + } + } + } + } + }, + "savedQueryId": { + "type": "keyword" + }, + "sort": { + "properties": { + "columnId": { + "type": "keyword" + }, + "sortDirection": { + "type": "keyword" + } + } + }, + "title": { + "type": "text" + }, + "updated": { + "type": "date" + }, + "updatedBy": { + "type": "text" + } + } + }, + "siem-ui-timeline-note": { + "properties": { + "created": { + "type": "date" + }, + "createdBy": { + "type": "text" + }, + "eventId": { + "type": "keyword" + }, + "note": { + "type": "text" + }, + "timelineId": { + "type": "keyword" + }, + "updated": { + "type": "date" + }, + "updatedBy": { + "type": "text" + } + } + }, + "siem-ui-timeline-pinned-event": { + "properties": { + "created": { + "type": "date" + }, + "createdBy": { + "type": "text" + }, + "eventId": { + "type": "keyword" + }, + "timelineId": { + "type": "keyword" + }, + "updated": { + "type": "date" + }, + "updatedBy": { + "type": "text" + } + } + }, + "space": { + "properties": { + "_reserved": { + "type": "boolean" + }, + "color": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "disabledFeatures": { + "type": "keyword" + }, + "imageUrl": { + "index": false, + "type": "text" + }, + "initials": { + "type": "keyword" + }, + "name": { + "fields": { + "keyword": { + "ignore_above": 2048, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "spaceId": { + "type": "keyword" + }, + "telemetry": { + "properties": { + "allowChangingOptInStatus": { + "type": "boolean" + }, + "enabled": { + "type": "boolean" + }, + "lastReported": { + "type": "date" + }, + "lastVersionChecked": { + "type": "keyword" + }, + "reportFailureCount": { + "type": "integer" + }, + "reportFailureVersion": { + "type": "keyword" + }, + "sendUsageFrom": { + "type": "keyword" + }, + "userHasSeenNotice": { + "type": "boolean" + } + } + }, + "timelion-sheet": { + "properties": { + "description": { + "type": "text" + }, + "hits": { + "type": "integer" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "timelion_chart_height": { + "type": "integer" + }, + "timelion_columns": { + "type": "integer" + }, + "timelion_interval": { + "type": "keyword" + }, + "timelion_other_interval": { + "type": "keyword" + }, + "timelion_rows": { + "type": "integer" + }, + "timelion_sheet": { + "type": "text" + }, + "title": { + "type": "text" + }, + "version": { + "type": "integer" + } + } + }, + "tsvb-validation-telemetry": { + "properties": { + "failedRequests": { + "type": "long" + } + } + }, + "type": { + "type": "keyword" + }, + "ui-metric": { + "properties": { + "count": { + "type": "integer" + } + } + }, + "updated_at": { + "type": "date" + }, + "upgrade-assistant-reindex-operation": { + "dynamic": "true", + "properties": { + "indexName": { + "type": "keyword" + }, + "status": { + "type": "integer" + } + } + }, + "upgrade-assistant-telemetry": { + "properties": { + "features": { + "properties": { + "deprecation_logging": { + "properties": { + "enabled": { + "null_value": true, + "type": "boolean" + } + } + } + } + }, + "ui_open": { + "properties": { + "cluster": { + "null_value": 0, + "type": "long" + }, + "indices": { + "null_value": 0, + "type": "long" + }, + "overview": { + "null_value": 0, + "type": "long" + } + } + }, + "ui_reindex": { + "properties": { + "close": { + "null_value": 0, + "type": "long" + }, + "open": { + "null_value": 0, + "type": "long" + }, + "start": { + "null_value": 0, + "type": "long" + }, + "stop": { + "null_value": 0, + "type": "long" + } + } + } + } + }, + "uptime-dynamic-settings": { + "properties": { + "heartbeatIndices": { + "type": "keyword" + } + } + }, + "url": { + "properties": { + "accessCount": { + "type": "long" + }, + "accessDate": { + "type": "date" + }, + "createDate": { + "type": "date" + }, + "url": { + "fields": { + "keyword": { + "ignore_above": 2048, + "type": "keyword" + } + }, + "type": "text" + } + } + }, + "visualization": { + "properties": { + "description": { + "type": "text" + }, + "kibanaSavedObjectMeta": { + "properties": { + "searchSourceJSON": { + "type": "text" + } + } + }, + "savedSearchRefName": { + "type": "keyword" + }, + "title": { + "type": "text" + }, + "uiStateJSON": { + "type": "text" + }, + "version": { + "type": "integer" + }, + "visState": { + "type": "text" + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file From 989245793ed677df3e52ea62309e5d820fcfe87b Mon Sep 17 00:00:00 2001 From: Chris Roberson Date: Wed, 22 Apr 2020 09:06:40 -0400 Subject: [PATCH 25/34] [Monitoring] Fix monitoring 7.7 deprecations (#63738) * Fix monitoring 7.7 deprecations * Switch order * Add comment Co-authored-by: Elastic Machine --- .../config/deprecation/core_deprecations.ts | 50 ------------------- .../plugins/monitoring/server/deprecations.ts | 27 +++++++++- 2 files changed, 26 insertions(+), 51 deletions(-) diff --git a/src/core/server/config/deprecation/core_deprecations.ts b/src/core/server/config/deprecation/core_deprecations.ts index f0b21adf62ff7c..9e098c06ba155d 100644 --- a/src/core/server/config/deprecation/core_deprecations.ts +++ b/src/core/server/config/deprecation/core_deprecations.ts @@ -128,56 +128,6 @@ export const coreDeprecationProvider: ConfigDeprecationProvider = ({ renameFromRoot('optimize.lazyHost', 'optimize.watchHost'), renameFromRoot('optimize.lazyPrebuild', 'optimize.watchPrebuild'), renameFromRoot('optimize.lazyProxyTimeout', 'optimize.watchProxyTimeout'), - // Monitoring renames - // TODO: Remove these from here once the monitoring plugin is migrated to NP - renameFromRoot('xpack.monitoring.enabled', 'monitoring.enabled'), - renameFromRoot('xpack.monitoring.ui.enabled', 'monitoring.ui.enabled'), - renameFromRoot( - 'xpack.monitoring.kibana.collection.enabled', - 'monitoring.kibana.collection.enabled' - ), - renameFromRoot('xpack.monitoring.max_bucket_size', 'monitoring.ui.max_bucket_size'), - renameFromRoot('xpack.monitoring.min_interval_seconds', 'monitoring.ui.min_interval_seconds'), - renameFromRoot( - 'xpack.monitoring.show_license_expiration', - 'monitoring.ui.show_license_expiration' - ), - renameFromRoot( - 'xpack.monitoring.ui.container.elasticsearch.enabled', - 'monitoring.ui.container.elasticsearch.enabled' - ), - renameFromRoot( - 'xpack.monitoring.ui.container.logstash.enabled', - 'monitoring.ui.container.logstash.enabled' - ), - renameFromRoot( - 'xpack.monitoring.tests.cloud_detector.enabled', - 'monitoring.tests.cloud_detector.enabled' - ), - renameFromRoot( - 'xpack.monitoring.kibana.collection.interval', - 'monitoring.kibana.collection.interval' - ), - renameFromRoot('xpack.monitoring.elasticsearch.hosts', 'monitoring.ui.elasticsearch.hosts'), - renameFromRoot('xpack.monitoring.elasticsearch.username', 'monitoring.ui.elasticsearch.username'), - renameFromRoot('xpack.monitoring.elasticsearch.password', 'monitoring.ui.elasticsearch.password'), - renameFromRoot( - 'xpack.monitoring.xpack_api_polling_frequency_millis', - 'monitoring.xpack_api_polling_frequency_millis' - ), - renameFromRoot( - 'xpack.monitoring.cluster_alerts.email_notifications.enabled', - 'monitoring.cluster_alerts.email_notifications.enabled' - ), - renameFromRoot( - 'xpack.monitoring.cluster_alerts.email_notifications.email_address', - 'monitoring.cluster_alerts.email_notifications.email_address' - ), - renameFromRoot('xpack.monitoring.ccs.enabled', 'monitoring.ui.ccs.enabled'), - renameFromRoot( - 'xpack.monitoring.elasticsearch.logFetchCount', - 'monitoring.ui.elasticsearch.logFetchCount' - ), configPathDeprecation, dataPathDeprecation, rewriteBasePathDeprecation, diff --git a/x-pack/plugins/monitoring/server/deprecations.ts b/x-pack/plugins/monitoring/server/deprecations.ts index dfe8ab31f972cb..3a3ec6ac799d20 100644 --- a/x-pack/plugins/monitoring/server/deprecations.ts +++ b/x-pack/plugins/monitoring/server/deprecations.ts @@ -16,8 +16,33 @@ import { CLUSTER_ALERTS_ADDRESS_CONFIG_KEY } from '../common/constants'; * major version! * @return {Array} array of rename operations and callback function for rename logging */ -export const deprecations = ({ rename }: ConfigDeprecationFactory): ConfigDeprecation[] => { +export const deprecations = ({ + rename, + renameFromRoot, +}: ConfigDeprecationFactory): ConfigDeprecation[] => { return [ + // This order matters. The "blanket rename" needs to happen at the end + renameFromRoot('xpack.monitoring.max_bucket_size', 'monitoring.ui.max_bucket_size'), + renameFromRoot('xpack.monitoring.min_interval_seconds', 'monitoring.ui.min_interval_seconds'), + renameFromRoot( + 'xpack.monitoring.show_license_expiration', + 'monitoring.ui.show_license_expiration' + ), + renameFromRoot( + 'xpack.monitoring.ui.container.elasticsearch.enabled', + 'monitoring.ui.container.elasticsearch.enabled' + ), + renameFromRoot( + 'xpack.monitoring.ui.container.logstash.enabled', + 'monitoring.ui.container.logstash.enabled' + ), + renameFromRoot('xpack.monitoring.elasticsearch', 'monitoring.ui.elasticsearch'), + renameFromRoot('xpack.monitoring.ccs.enabled', 'monitoring.ui.ccs.enabled'), + renameFromRoot( + 'xpack.monitoring.elasticsearch.logFetchCount', + 'monitoring.ui.elasticsearch.logFetchCount' + ), + renameFromRoot('xpack.monitoring', 'monitoring'), (config, fromPath, logger) => { const clusterAlertsEnabled = get(config, 'cluster_alerts.enabled'); const emailNotificationsEnabled = From ed3c94bc76ff2df9725243bfe77d75e048a0fd50 Mon Sep 17 00:00:00 2001 From: Joe Reuter Date: Wed, 22 Apr 2020 15:07:12 +0200 Subject: [PATCH 26/34] fix leftover timelion paths (#64041) --- .../tasks/nodejs_modules/clean_client_modules_on_dll_task.js | 4 ++-- src/dev/precommit_hook/casing_check_config.js | 5 ----- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js b/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js index 52928d6e47fc46..8e8d69a4dfefa8 100644 --- a/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js +++ b/src/dev/build/tasks/nodejs_modules/clean_client_modules_on_dll_task.js @@ -48,12 +48,12 @@ export const CleanClientModulesOnDLLTask = { ]; const discoveredLegacyCorePluginEntries = await globby([ `${baseDir}/src/legacy/core_plugins/*/index.js`, - // Small exception to load dynamically discovered functions for timelion plugin - `${baseDir}/src/legacy/core_plugins/timelion/server/*_functions/**/*.js`, `!${baseDir}/src/legacy/core_plugins/**/public`, ]); const discoveredPluginEntries = await globby([ `${baseDir}/src/plugins/*/server/index.js`, + // Small exception to load dynamically discovered functions for timelion plugin + `${baseDir}/src/plugins/vis_type_timelion/server/*_functions/**/*.js`, `!${baseDir}/src/plugins/**/public`, ]); const discoveredNewPlatformXpackPlugins = await globby([ diff --git a/src/dev/precommit_hook/casing_check_config.js b/src/dev/precommit_hook/casing_check_config.js index 1b5110a61cbc4d..a75a6997a8cb27 100644 --- a/src/dev/precommit_hook/casing_check_config.js +++ b/src/dev/precommit_hook/casing_check_config.js @@ -116,11 +116,6 @@ export const TEMPORARILY_IGNORED_PATHS = [ 'src/legacy/core_plugins/tile_map/public/__tests__/scaledCircleMarkers.png', 'src/legacy/core_plugins/tile_map/public/__tests__/shadedCircleMarkers.png', 'src/legacy/core_plugins/tile_map/public/__tests__/shadedGeohashGrid.png', - 'src/legacy/core_plugins/timelion/server/lib/asSorted.js', - 'src/legacy/core_plugins/timelion/server/lib/unzipPairs.js', - 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/bucketList.js', - 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/seriesList.js', - 'src/legacy/core_plugins/timelion/server/series_functions/__tests__/fixtures/tlConfig.js', 'src/fixtures/config_upgrade_from_4.0.0_to_4.0.1-snapshot.json', 'src/legacy/core_plugins/vis_type_vislib/public/vislib/__tests__/lib/fixtures/mock_data/terms/_seriesMultiple.js', 'src/core/server/core_app/assets/favicons/android-chrome-192x192.png', From db642f0b967ca3165fb2d815b2710df56b63240c Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Wed, 22 Apr 2020 09:08:50 -0400 Subject: [PATCH 27/34] [EPM] handle unremovable packages (#64096) * remove endpoint handles unremovable packages * adjust UI to disallow removing of unremovable packages --- .../ingest_manager/common/types/models/epm.ts | 1 + .../sections/epm/screens/detail/content.tsx | 12 +++++-- .../epm/screens/detail/settings_panel.tsx | 36 ++++++++++++++----- .../ingest_manager/server/saved_objects.ts | 1 + .../server/services/epm/packages/install.ts | 6 +++- .../server/services/epm/packages/remove.ts | 5 ++- 6 files changed, 48 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/ingest_manager/common/types/models/epm.ts b/x-pack/plugins/ingest_manager/common/types/models/epm.ts index a13e1655d56665..c750aa99204fa9 100644 --- a/x-pack/plugins/ingest_manager/common/types/models/epm.ts +++ b/x-pack/plugins/ingest_manager/common/types/models/epm.ts @@ -57,6 +57,7 @@ export interface RegistryPackage { icons?: RegistryImage[]; assets?: string[]; internal?: boolean; + removable?: boolean; format_version: string; datasets?: Dataset[]; datasources?: RegistryDatasource[]; diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx index 0d4b3958953225..a3d24e7806f343 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/content.tsx @@ -50,10 +50,18 @@ export function Content(props: ContentProps) { type ContentPanelProps = PackageInfo & Pick; export function ContentPanel(props: ContentPanelProps) { - const { panel, name, version, assets, title } = props; + const { panel, name, version, assets, title, removable } = props; switch (panel) { case 'settings': - return ; + return ( + + ); case 'data-sources': return ; case 'overview': diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx index ff7ecf97714b6b..f947466caf4b09 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/screens/detail/settings_panel.tsx @@ -13,8 +13,14 @@ import { InstallStatus, PackageInfo } from '../../../../types'; import { InstallationButton } from './installation_button'; import { useGetDatasources } from '../../../../hooks'; +const NoteLabel = () => ( + +); export const SettingsPanel = ( - props: Pick + props: Pick ) => { const getPackageInstallStatus = useGetPackageInstallStatus(); const { data: datasourcesData } = useGetDatasources({ @@ -22,10 +28,9 @@ export const SettingsPanel = ( page: 1, kuery: `datasources.package.name:${props.name}`, }); - const { name, title } = props; + const { name, title, removable } = props; const packageInstallStatus = getPackageInstallStatus(name); const packageHasDatasources = !!datasourcesData?.total; - return ( @@ -89,12 +94,12 @@ export const SettingsPanel = (

- {packageHasDatasources && ( + {packageHasDatasources && removable === true && (

- + + + ), + }} + /> +

+ )} + {removable === false && ( +

+ + ), }} diff --git a/x-pack/plugins/ingest_manager/server/saved_objects.ts b/x-pack/plugins/ingest_manager/server/saved_objects.ts index dc0b4695603e41..0a7229b1f28072 100644 --- a/x-pack/plugins/ingest_manager/server/saved_objects.ts +++ b/x-pack/plugins/ingest_manager/server/saved_objects.ts @@ -150,6 +150,7 @@ export const savedObjectMappings = { name: { type: 'keyword' }, version: { type: 'keyword' }, internal: { type: 'boolean' }, + removable: { type: 'boolean' }, es_index_patterns: { dynamic: false, type: 'object', diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts index f3bd49eab6038b..06f3decdbbe6f2 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/install.ts @@ -98,7 +98,7 @@ export async function installPackage(options: { const reinstall = pkgVersion === installedPkg?.attributes.version; const registryPackageInfo = await Registry.fetchInfo(pkgName, pkgVersion); - const { internal = false } = registryPackageInfo; + const { internal = false, removable = true } = registryPackageInfo; // delete the previous version's installation's SO kibana assets before installing new ones // in case some assets were removed in the new version @@ -170,6 +170,7 @@ export async function installPackage(options: { pkgName, pkgVersion, internal, + removable, toSaveAssetRefs, toSaveESIndexPatterns, }); @@ -200,6 +201,7 @@ export async function saveInstallationReferences(options: { pkgName: string; pkgVersion: string; internal: boolean; + removable: boolean; toSaveAssetRefs: AssetReference[]; toSaveESIndexPatterns: Record; }) { @@ -208,6 +210,7 @@ export async function saveInstallationReferences(options: { pkgName, pkgVersion, internal, + removable, toSaveAssetRefs, toSaveESIndexPatterns, } = options; @@ -220,6 +223,7 @@ export async function saveInstallationReferences(options: { name: pkgName, version: pkgVersion, internal, + removable, }, { id: pkgName, overwrite: true } ); diff --git a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts index ed7b7f33013277..498796438c6c8e 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/packages/remove.ts @@ -20,7 +20,10 @@ export async function removeInstallation(options: { // TODO: the epm api should change to /name/version so we don't need to do this const [pkgName] = pkgkey.split('-'); const installation = await getInstallation({ savedObjectsClient, pkgName }); - const installedObjects = installation?.installed || []; + if (!installation) throw new Error('integration does not exist'); + if (installation.removable === false) + throw new Error(`The ${pkgName} integration is installed by default and cannot be removed`); + const installedObjects = installation.installed || []; // Delete the manager saved object with references to the asset objects // could also update with [] or some other state From 5e2dbdaa6962a0c79a4bc18a620e9e757768d73d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 22 Apr 2020 14:11:17 +0100 Subject: [PATCH 28/34] refact(NA): remove set loop from upgrade assistant usage collector (#63977) * refact(NA): use default telemetry obj in the set loop * chore(NA): fix typecheck * fix(NA): test run with lodash has * chore(NA): fix older lodash has * chore(NA): remove lodash has usage --- .../lib/telemetry/usage_collector.test.ts | 1 + .../server/lib/telemetry/usage_collector.ts | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts index 2af1a9ac38e44f..24347b7799871f 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.test.ts @@ -51,6 +51,7 @@ describe('Upgrade Assistant Usage Collector', () => { 'ui_reindex.open': 4, 'ui_reindex.start': 2, 'ui_reindex.stop': 1, + 'ui_reindex.not_defined': 1, }, }; }, diff --git a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts index 9c2946db7f0842..0c2e3a1e43f4aa 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/telemetry/usage_collector.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { set } from 'lodash'; +import { get } from 'lodash'; import { APICaller, ElasticsearchServiceStart, @@ -84,16 +84,19 @@ export async function fetchUpgradeAssistantMetrics( return defaultTelemetrySavedObject; } - const upgradeAssistantTelemetrySOAttrsKeys = Object.keys( - upgradeAssistantTelemetrySavedObjectAttrs - ); - const telemetryObj = defaultTelemetrySavedObject; - - upgradeAssistantTelemetrySOAttrsKeys.forEach((key: string) => { - set(telemetryObj, key, upgradeAssistantTelemetrySavedObjectAttrs[key]); - }); - - return telemetryObj as UpgradeAssistantTelemetrySavedObject; + return { + ui_open: { + overview: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_open.overview', 0), + cluster: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_open.cluster', 0), + indices: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_open.indices', 0), + }, + ui_reindex: { + close: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.close', 0), + open: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.open', 0), + start: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.start', 0), + stop: get(upgradeAssistantTelemetrySavedObjectAttrs, 'ui_reindex.stop', 0), + }, + } as UpgradeAssistantTelemetrySavedObject; }; return { From 939bf2a6ec45154d33e982550075417d91fe9eeb Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Wed, 22 Apr 2020 09:19:18 -0400 Subject: [PATCH 29/34] [Maps] Convert AbstractSource and AbstractLayer to TS (#63533) --- x-pack/plugins/maps/common/constants.ts | 1 + .../descriptor_types/descriptor_types.d.ts | 28 +- .../style_property_descriptor_types.d.ts | 6 +- .../public/angular/get_initial_layers.test.js | 4 +- .../public/layers/blended_vector_layer.ts | 26 +- x-pack/plugins/maps/public/layers/layer.d.ts | 51 -- x-pack/plugins/maps/public/layers/layer.js | 373 ------------- x-pack/plugins/maps/public/layers/layer.tsx | 490 ++++++++++++++++++ .../client_file_source/geojson_file_source.js | 4 +- .../es_geo_grid_source.d.ts | 9 +- .../layers/sources/es_source/es_source.d.ts | 16 + .../es_term_source/es_term_source.d.ts | 1 + .../mvt_single_layer_vector_source.ts | 11 +- .../maps/public/layers/sources/source.d.ts | 56 -- .../maps/public/layers/sources/source.js | 159 ------ .../maps/public/layers/sources/source.ts | 195 +++++++ .../sources/xyz_tms_source/xyz_tms_source.ts | 3 +- .../public/layers/styles/abstract_style.js | 29 -- .../layers/styles/heatmap/heatmap_style.js | 2 +- .../maps/public/layers/styles/style.ts | 59 +++ .../public/layers/styles/tile/tile_style.ts | 16 + .../layers/styles/vector/vector_style.d.ts | 7 +- .../layers/styles/vector/vector_style.js | 3 +- .../maps/public/layers/tile_layer.d.ts | 4 +- .../plugins/maps/public/layers/tile_layer.js | 8 +- .../maps/public/layers/tile_layer.test.ts | 10 +- .../maps/public/layers/tiled_vector_layer.tsx | 2 +- .../maps/public/layers/vector_layer.d.ts | 6 +- .../maps/public/layers/vector_layer.js | 2 + .../maps/public/layers/vector_tile_layer.js | 3 +- 30 files changed, 861 insertions(+), 723 deletions(-) delete mode 100644 x-pack/plugins/maps/public/layers/layer.d.ts delete mode 100644 x-pack/plugins/maps/public/layers/layer.js create mode 100644 x-pack/plugins/maps/public/layers/layer.tsx delete mode 100644 x-pack/plugins/maps/public/layers/sources/source.d.ts delete mode 100644 x-pack/plugins/maps/public/layers/sources/source.js create mode 100644 x-pack/plugins/maps/public/layers/sources/source.ts delete mode 100644 x-pack/plugins/maps/public/layers/styles/abstract_style.js create mode 100644 x-pack/plugins/maps/public/layers/styles/style.ts create mode 100644 x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts diff --git a/x-pack/plugins/maps/common/constants.ts b/x-pack/plugins/maps/common/constants.ts index a4006732224ce3..6f9c0985f5f4af 100644 --- a/x-pack/plugins/maps/common/constants.ts +++ b/x-pack/plugins/maps/common/constants.ts @@ -166,6 +166,7 @@ export enum STYLE_TYPE { export enum LAYER_STYLE_TYPE { VECTOR = 'VECTOR', HEATMAP = 'HEATMAP', + TILE = 'TILE', } export const COLOR_MAP_TYPE = { diff --git a/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts b/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts index f8175b0ed3f109..6980f14d0788ac 100644 --- a/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts +++ b/x-pack/plugins/maps/common/descriptor_types/descriptor_types.d.ts @@ -5,8 +5,9 @@ */ /* eslint-disable @typescript-eslint/consistent-type-definitions */ +import { Query } from 'src/plugins/data/public'; import { AGG_TYPE, GRID_RESOLUTION, RENDER_AS, SORT_ORDER, SCALING_TYPES } from '../constants'; -import { VectorStyleDescriptor } from './style_property_descriptor_types'; +import { StyleDescriptor, VectorStyleDescriptor } from './style_property_descriptor_types'; import { DataRequestDescriptor } from './data_request_descriptor_types'; export type AttributionDescriptor = { @@ -17,6 +18,7 @@ export type AttributionDescriptor = { export type AbstractSourceDescriptor = { id?: string; type: string; + applyGlobalQuery?: boolean; }; export type EMSTMSSourceDescriptor = AbstractSourceDescriptor & { @@ -71,17 +73,15 @@ export type ESTermSourceDescriptor = AbstractESAggSourceDescriptor & { term: string; // term field name }; -export type KibanaRegionmapSourceDescriptor = { - type: string; +export type KibanaRegionmapSourceDescriptor = AbstractSourceDescriptor & { name: string; }; -export type KibanaTilemapSourceDescriptor = { - type: string; -}; +// This is for symmetry with other sources only. +// It takes no additional configuration since all params are in the .yml. +export type KibanaTilemapSourceDescriptor = AbstractSourceDescriptor; -export type WMSSourceDescriptor = { - type: string; +export type WMSSourceDescriptor = AbstractSourceDescriptor & { serviceUrl: string; layers: string; styles: string; @@ -111,6 +111,8 @@ export type JoinDescriptor = { right: ESTermSourceDescriptor; }; +// todo : this union type is incompatible with dynamic extensibility of sources. +// Reconsider using SourceDescriptor in type signatures for top-level classes export type SourceDescriptor = | XYZTMSSourceDescriptor | WMSSourceDescriptor @@ -121,7 +123,9 @@ export type SourceDescriptor = | ESGeoGridSourceDescriptor | EMSFileSourceDescriptor | ESPewPewSourceDescriptor - | TiledSingleLayerVectorSourceDescriptor; + | TiledSingleLayerVectorSourceDescriptor + | EMSTMSSourceDescriptor + | EMSFileSourceDescriptor; export type LayerDescriptor = { __dataRequests?: DataRequestDescriptor[]; @@ -129,12 +133,14 @@ export type LayerDescriptor = { __errorMessage?: string; alpha?: number; id: string; - label?: string; + label?: string | null; minZoom?: number; maxZoom?: number; - sourceDescriptor: SourceDescriptor; + sourceDescriptor: SourceDescriptor | null; type?: string; visible?: boolean; + style?: StyleDescriptor | null; + query?: Query; }; export type VectorLayerDescriptor = LayerDescriptor & { diff --git a/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts b/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts index 47e56ff96d6236..381bc5bba01c0f 100644 --- a/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts +++ b/x-pack/plugins/maps/common/descriptor_types/style_property_descriptor_types.d.ts @@ -182,7 +182,11 @@ export type VectorStylePropertiesDescriptor = { [VECTOR_STYLES.LABEL_BORDER_SIZE]?: LabelBorderSizeStylePropertyDescriptor; }; -export type VectorStyleDescriptor = { +export type StyleDescriptor = { + type: string; +}; + +export type VectorStyleDescriptor = StyleDescriptor & { type: LAYER_STYLE_TYPE.VECTOR; properties: VectorStylePropertiesDescriptor; }; diff --git a/x-pack/plugins/maps/public/angular/get_initial_layers.test.js b/x-pack/plugins/maps/public/angular/get_initial_layers.test.js index f41ed26b2a05d3..4b5cad8d19260e 100644 --- a/x-pack/plugins/maps/public/angular/get_initial_layers.test.js +++ b/x-pack/plugins/maps/public/angular/get_initial_layers.test.js @@ -52,7 +52,7 @@ describe('kibana.yml configured with map.tilemap.url', () => { sourceDescriptor: { type: 'KIBANA_TILEMAP', }, - style: {}, + style: { type: 'TILE' }, type: 'TILE', visible: true, }, @@ -96,7 +96,7 @@ describe('EMS is enabled', () => { isAutoSelect: true, type: 'EMS_TMS', }, - style: {}, + style: { type: 'TILE' }, type: 'VECTOR_TILE', visible: true, }, diff --git a/x-pack/plugins/maps/public/layers/blended_vector_layer.ts b/x-pack/plugins/maps/public/layers/blended_vector_layer.ts index 9a9ea2968ceebd..1fc3ad203706f0 100644 --- a/x-pack/plugins/maps/public/layers/blended_vector_layer.ts +++ b/x-pack/plugins/maps/public/layers/blended_vector_layer.ts @@ -24,7 +24,7 @@ import { } from '../../common/constants'; import { ESGeoGridSource } from './sources/es_geo_grid_source/es_geo_grid_source'; import { canSkipSourceUpdate } from './util/can_skip_fetch'; -import { IVectorLayer, VectorLayerArguments } from './vector_layer'; +import { IVectorLayer } from './vector_layer'; import { IESSource } from './sources/es_source'; import { IESAggSource } from './sources/es_agg_source'; import { ISource } from './sources/source'; @@ -36,6 +36,8 @@ import { DynamicStylePropertyOptions, VectorLayerDescriptor, } from '../../common/descriptor_types'; +import { IStyle } from './styles/style'; +import { IVectorSource } from './sources/vector_source'; const ACTIVE_COUNT_DATA_ID = 'ACTIVE_COUNT_DATA_ID'; @@ -145,6 +147,11 @@ function getClusterStyleDescriptor( return clusterStyleDescriptor; } +export interface BlendedVectorLayerArguments { + source: IVectorSource; + layerDescriptor: VectorLayerDescriptor; +} + export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { static type = LAYER_TYPE.BLENDED_VECTOR; @@ -163,11 +170,14 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { private readonly _documentSource: IESSource; private readonly _documentStyle: IVectorStyle; - constructor(options: VectorLayerArguments) { - super(options); + constructor(options: BlendedVectorLayerArguments) { + super({ + ...options, + joins: [], + }); this._documentSource = this._source as IESSource; // VectorLayer constructor sets _source as document source - this._documentStyle = this._style; // VectorLayer constructor sets _style as document source + this._documentStyle = this._style as IVectorStyle; // VectorLayer constructor sets _style as document source this._clusterSource = getClusterSource(this._documentSource, this._documentStyle); const clusterStyleDescriptor = getClusterStyleDescriptor( @@ -229,11 +239,11 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { return this._documentSource; } - getCurrentStyle() { + getCurrentStyle(): IStyle { return this._isClustered ? this._clusterStyle : this._documentStyle; } - getStyleForEditing() { + getStyleForEditing(): IStyle { return this._documentStyle; } @@ -242,8 +252,8 @@ export class BlendedVectorLayer extends VectorLayer implements IVectorLayer { const requestToken = Symbol(`layer-active-count:${this.getId()}`); const searchFilters = this._getSearchFilters( syncContext.dataFilters, - this.getSource(), - this.getCurrentStyle() + this.getSource() as IVectorSource, + this.getCurrentStyle() as IVectorStyle ); const canSkipFetch = await canSkipSourceUpdate({ source: this.getSource(), diff --git a/x-pack/plugins/maps/public/layers/layer.d.ts b/x-pack/plugins/maps/public/layers/layer.d.ts deleted file mode 100644 index e8fc5d473626cb..00000000000000 --- a/x-pack/plugins/maps/public/layers/layer.d.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { LayerDescriptor, MapExtent, MapFilters, MapQuery } from '../../common/descriptor_types'; -import { ISource } from './sources/source'; -import { DataRequest } from './util/data_request'; -import { SyncContext } from '../actions/map_actions'; - -export interface ILayer { - getBounds(mapFilters: MapFilters): Promise; - getDataRequest(id: string): DataRequest | undefined; - getDisplayName(source?: ISource): Promise; - getId(): string; - getSourceDataRequest(): DataRequest | undefined; - getSource(): ISource; - getSourceForEditing(): ISource; - syncData(syncContext: SyncContext): Promise; - isVisible(): boolean; - showAtZoomLevel(zoomLevel: number): boolean; - getMinZoom(): number; - getMaxZoom(): number; - getMinSourceZoom(): number; -} - -export interface ILayerArguments { - layerDescriptor: LayerDescriptor; - source: ISource; -} - -export class AbstractLayer implements ILayer { - static createDescriptor(options: Partial, mapColors?: string[]): LayerDescriptor; - constructor(layerArguments: ILayerArguments); - getBounds(mapFilters: MapFilters): Promise; - getDataRequest(id: string): DataRequest | undefined; - getDisplayName(source?: ISource): Promise; - getId(): string; - getSourceDataRequest(): DataRequest | undefined; - getSource(): ISource; - getSourceForEditing(): ISource; - syncData(syncContext: SyncContext): Promise; - isVisible(): boolean; - showAtZoomLevel(zoomLevel: number): boolean; - getMinZoom(): number; - getMaxZoom(): number; - getMinSourceZoom(): number; - getQuery(): MapQuery; - _removeStaleMbSourcesAndLayers(mbMap: unknown): void; - _requiresPrevSourceCleanup(mbMap: unknown): boolean; -} diff --git a/x-pack/plugins/maps/public/layers/layer.js b/x-pack/plugins/maps/public/layers/layer.js deleted file mode 100644 index 9362ce2c028e6e..00000000000000 --- a/x-pack/plugins/maps/public/layers/layer.js +++ /dev/null @@ -1,373 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import _ from 'lodash'; -import React from 'react'; -import { EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; -import { DataRequest } from './util/data_request'; -import { - MAX_ZOOM, - MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER, - MIN_ZOOM, - SOURCE_DATA_ID_ORIGIN, -} from '../../common/constants'; -import uuid from 'uuid/v4'; - -import { copyPersistentState } from '../reducers/util.js'; -import { i18n } from '@kbn/i18n'; - -export class AbstractLayer { - constructor({ layerDescriptor, source }) { - this._descriptor = AbstractLayer.createDescriptor(layerDescriptor); - this._source = source; - if (this._descriptor.__dataRequests) { - this._dataRequests = this._descriptor.__dataRequests.map( - dataRequest => new DataRequest(dataRequest) - ); - } else { - this._dataRequests = []; - } - } - - static getBoundDataForSource(mbMap, sourceId) { - const mbStyle = mbMap.getStyle(); - return mbStyle.sources[sourceId].data; - } - - static createDescriptor(options = {}) { - const layerDescriptor = { ...options }; - - layerDescriptor.__dataRequests = _.get(options, '__dataRequests', []); - layerDescriptor.id = _.get(options, 'id', uuid()); - layerDescriptor.label = options.label && options.label.length > 0 ? options.label : null; - layerDescriptor.minZoom = _.get(options, 'minZoom', MIN_ZOOM); - layerDescriptor.maxZoom = _.get(options, 'maxZoom', MAX_ZOOM); - layerDescriptor.alpha = _.get(options, 'alpha', 0.75); - layerDescriptor.visible = _.get(options, 'visible', true); - layerDescriptor.style = _.get(options, 'style', {}); - - return layerDescriptor; - } - - destroy() { - if (this._source) { - this._source.destroy(); - } - } - - async cloneDescriptor() { - const clonedDescriptor = copyPersistentState(this._descriptor); - // layer id is uuid used to track styles/layers in mapbox - clonedDescriptor.id = uuid(); - const displayName = await this.getDisplayName(); - clonedDescriptor.label = `Clone of ${displayName}`; - clonedDescriptor.sourceDescriptor = this.getSource().cloneDescriptor(); - if (clonedDescriptor.joins) { - clonedDescriptor.joins.forEach(joinDescriptor => { - // right.id is uuid used to track requests in inspector - joinDescriptor.right.id = uuid(); - }); - } - return clonedDescriptor; - } - - makeMbLayerId(layerNameSuffix) { - return `${this.getId()}${MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER}${layerNameSuffix}`; - } - - isJoinable() { - return this.getSource().isJoinable(); - } - - supportsElasticsearchFilters() { - return this.getSource().isESSource(); - } - - async supportsFitToBounds() { - return await this.getSource().supportsFitToBounds(); - } - - async getDisplayName(source) { - if (this._descriptor.label) { - return this._descriptor.label; - } - - const sourceDisplayName = source - ? await source.getDisplayName() - : await this.getSource().getDisplayName(); - return sourceDisplayName || `Layer ${this._descriptor.id}`; - } - - async getAttributions() { - if (!this.hasErrors()) { - return await this.getSource().getAttributions(); - } - return []; - } - - getLabel() { - return this._descriptor.label ? this._descriptor.label : ''; - } - - getCustomIconAndTooltipContent() { - return { - icon: , - }; - } - - getIconAndTooltipContent(zoomLevel, isUsingSearch) { - let icon; - let tooltipContent = null; - const footnotes = []; - if (this.hasErrors()) { - icon = ( - - ); - tooltipContent = this.getErrors(); - } else if (this.isLayerLoading()) { - icon = ; - } else if (!this.isVisible()) { - icon = ; - tooltipContent = i18n.translate('xpack.maps.layer.layerHiddenTooltip', { - defaultMessage: `Layer is hidden.`, - }); - } else if (!this.showAtZoomLevel(zoomLevel)) { - const minZoom = this.getMinZoom(); - const maxZoom = this.getMaxZoom(); - icon = ; - tooltipContent = i18n.translate('xpack.maps.layer.zoomFeedbackTooltip', { - defaultMessage: `Layer is visible between zoom levels {minZoom} and {maxZoom}.`, - values: { minZoom, maxZoom }, - }); - } else { - const customIconAndTooltipContent = this.getCustomIconAndTooltipContent(); - if (customIconAndTooltipContent) { - icon = customIconAndTooltipContent.icon; - if (!customIconAndTooltipContent.areResultsTrimmed) { - tooltipContent = customIconAndTooltipContent.tooltipContent; - } else { - footnotes.push({ - icon: , - message: customIconAndTooltipContent.tooltipContent, - }); - } - } - - if (isUsingSearch && this.getQueryableIndexPatternIds().length) { - footnotes.push({ - icon: , - message: i18n.translate('xpack.maps.layer.isUsingSearchMsg', { - defaultMessage: 'Results narrowed by search bar', - }), - }); - } - } - - return { - icon, - tooltipContent, - footnotes, - }; - } - - async hasLegendDetails() { - return false; - } - - renderLegendDetails() { - return null; - } - - getId() { - return this._descriptor.id; - } - - getSource() { - return this._source; - } - - getSourceForEditing() { - return this._source; - } - - isVisible() { - return this._descriptor.visible; - } - - showAtZoomLevel(zoom) { - return zoom >= this.getMinZoom() && zoom <= this.getMaxZoom(); - } - - getMinZoom() { - return this._descriptor.minZoom; - } - - getMaxZoom() { - return this._descriptor.maxZoom; - } - - getMinSourceZoom() { - return this._source.getMinZoom(); - } - - _requiresPrevSourceCleanup() { - return false; - } - - _removeStaleMbSourcesAndLayers(mbMap) { - if (this._requiresPrevSourceCleanup(mbMap)) { - const mbStyle = mbMap.getStyle(); - mbStyle.layers.forEach(mbLayer => { - if (this.ownsMbLayerId(mbLayer.id)) { - mbMap.removeLayer(mbLayer.id); - } - }); - Object.keys(mbStyle.sources).some(mbSourceId => { - if (this.ownsMbSourceId(mbSourceId)) { - mbMap.removeSource(mbSourceId); - } - }); - } - } - - getAlpha() { - return this._descriptor.alpha; - } - - getQuery() { - return this._descriptor.query; - } - - getCurrentStyle() { - return this._style; - } - - getStyleForEditing() { - return this._style; - } - - async getImmutableSourceProperties() { - return this.getSource().getImmutableProperties(); - } - - renderSourceSettingsEditor = ({ onChange }) => { - return this.getSourceForEditing().renderSourceSettingsEditor({ onChange }); - }; - - getPrevRequestToken(dataId) { - const prevDataRequest = this.getDataRequest(dataId); - if (!prevDataRequest) { - return; - } - - return prevDataRequest.getRequestToken(); - } - - getInFlightRequestTokens() { - if (!this._dataRequests) { - return []; - } - - const requestTokens = this._dataRequests.map(dataRequest => dataRequest.getRequestToken()); - return _.compact(requestTokens); - } - - getSourceDataRequest() { - return this.getDataRequest(SOURCE_DATA_ID_ORIGIN); - } - - getDataRequest(id) { - return this._dataRequests.find(dataRequest => dataRequest.getDataId() === id); - } - - isLayerLoading() { - return this._dataRequests.some(dataRequest => dataRequest.isLoading()); - } - - hasErrors() { - return _.get(this._descriptor, '__isInErrorState', false); - } - - getErrors() { - return this.hasErrors() ? this._descriptor.__errorMessage : ''; - } - - toLayerDescriptor() { - return this._descriptor; - } - - async syncData() { - //no-op by default - } - - getMbLayerIds() { - throw new Error('Should implement AbstractLayer#getMbLayerIds'); - } - - ownsMbLayerId() { - throw new Error('Should implement AbstractLayer#ownsMbLayerId'); - } - - ownsMbSourceId() { - throw new Error('Should implement AbstractLayer#ownsMbSourceId'); - } - - canShowTooltip() { - return false; - } - - syncLayerWithMB() { - throw new Error('Should implement AbstractLayer#syncLayerWithMB'); - } - - getLayerTypeIconName() { - throw new Error('should implement Layer#getLayerTypeIconName'); - } - - isDataLoaded() { - const sourceDataRequest = this.getSourceDataRequest(); - return sourceDataRequest && sourceDataRequest.hasData(); - } - - async getBounds(/* mapFilters: MapFilters */) { - return { - minLon: -180, - maxLon: 180, - minLat: -89, - maxLat: 89, - }; - } - - renderStyleEditor({ onStyleDescriptorChange }) { - const style = this.getStyleForEditing(); - if (!style) { - return null; - } - return style.renderEditor({ layer: this, onStyleDescriptorChange }); - } - - getIndexPatternIds() { - return []; - } - - getQueryableIndexPatternIds() { - return []; - } - - syncVisibilityWithMb(mbMap, mbLayerId) { - mbMap.setLayoutProperty(mbLayerId, 'visibility', this.isVisible() ? 'visible' : 'none'); - } - - getType() { - return this._descriptor.type; - } -} diff --git a/x-pack/plugins/maps/public/layers/layer.tsx b/x-pack/plugins/maps/public/layers/layer.tsx new file mode 100644 index 00000000000000..ce48793e1481bd --- /dev/null +++ b/x-pack/plugins/maps/public/layers/layer.tsx @@ -0,0 +1,490 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +/* eslint-disable @typescript-eslint/consistent-type-definitions */ + +import { Query } from 'src/plugins/data/public'; +import _ from 'lodash'; +import React, { ReactElement } from 'react'; +import { EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; +import uuid from 'uuid/v4'; +import { i18n } from '@kbn/i18n'; +import { FeatureCollection } from 'geojson'; +import { DataRequest } from './util/data_request'; +import { + MAX_ZOOM, + MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER, + MIN_ZOOM, + SOURCE_DATA_ID_ORIGIN, +} from '../../common/constants'; +// @ts-ignore +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { copyPersistentState } from '../reducers/util.js'; +import { + LayerDescriptor, + MapExtent, + MapFilters, + StyleDescriptor, +} from '../../common/descriptor_types'; +import { Attribution, ImmutableSourceProperty, ISource } from './sources/source'; +import { SyncContext } from '../actions/map_actions'; +import { IStyle } from './styles/style'; + +export interface ILayer { + getBounds(mapFilters: MapFilters): Promise; + getDataRequest(id: string): DataRequest | undefined; + getDisplayName(source?: ISource): Promise; + getId(): string; + getSourceDataRequest(): DataRequest | undefined; + getSource(): ISource; + getSourceForEditing(): ISource; + syncData(syncContext: SyncContext): void; + supportsElasticsearchFilters(): boolean; + supportsFitToBounds(): Promise; + getAttributions(): Promise; + getLabel(): string; + getCustomIconAndTooltipContent(): IconAndTooltipContent; + getIconAndTooltipContent(zoomLevel: number, isUsingSearch: boolean): IconAndTooltipContent; + renderLegendDetails(): ReactElement | null; + showAtZoomLevel(zoom: number): boolean; + getMinZoom(): number; + getMaxZoom(): number; + getMinSourceZoom(): number; + getAlpha(): number; + getQuery(): Query | null; + getStyle(): IStyle; + getStyleForEditing(): IStyle; + getCurrentStyle(): IStyle; + getImmutableSourceProperties(): Promise; + renderSourceSettingsEditor({ onChange }: { onChange: () => void }): ReactElement | null; + isLayerLoading(): boolean; + hasErrors(): boolean; + getErrors(): string; + toLayerDescriptor(): LayerDescriptor; + getMbLayerIds(): string[]; + ownsMbLayerId(mbLayerId: string): boolean; + ownsMbSourceId(mbSourceId: string): boolean; + canShowTooltip(): boolean; + syncLayerWithMB(mbMap: unknown): void; + getLayerTypeIconName(): string; + isDataLoaded(): boolean; + getIndexPatternIds(): string[]; + getQueryableIndexPatternIds(): string[]; + getType(): string | undefined; + isVisible(): boolean; + cloneDescriptor(): Promise; + renderStyleEditor({ + onStyleDescriptorChange, + }: { + onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; + }): ReactElement | null; +} +export type Footnote = { + icon: ReactElement; + message?: string | null; +}; +export type IconAndTooltipContent = { + icon?: ReactElement | null; + tooltipContent?: string | null; + footnotes?: Footnote[] | null; + areResultsTrimmed?: boolean; +}; + +export interface ILayerArguments { + layerDescriptor: LayerDescriptor; + source: ISource; + style: IStyle; +} + +export class AbstractLayer implements ILayer { + protected readonly _descriptor: LayerDescriptor; + protected readonly _source: ISource; + protected readonly _style: IStyle; + protected readonly _dataRequests: DataRequest[]; + + static createDescriptor(options: Partial): LayerDescriptor { + return { + ...options, + sourceDescriptor: options.sourceDescriptor ? options.sourceDescriptor : null, + __dataRequests: _.get(options, '__dataRequests', []), + id: _.get(options, 'id', uuid()), + label: options.label && options.label.length > 0 ? options.label : null, + minZoom: _.get(options, 'minZoom', MIN_ZOOM), + maxZoom: _.get(options, 'maxZoom', MAX_ZOOM), + alpha: _.get(options, 'alpha', 0.75), + visible: _.get(options, 'visible', true), + style: _.get(options, 'style', null), + }; + } + + destroy() { + if (this._source) { + this._source.destroy(); + } + } + + constructor({ layerDescriptor, source, style }: ILayerArguments) { + this._descriptor = AbstractLayer.createDescriptor(layerDescriptor); + this._source = source; + this._style = style; + if (this._descriptor.__dataRequests) { + this._dataRequests = this._descriptor.__dataRequests.map( + dataRequest => new DataRequest(dataRequest) + ); + } else { + this._dataRequests = []; + } + } + + static getBoundDataForSource(mbMap: unknown, sourceId: string): FeatureCollection { + // @ts-ignore + const mbStyle = mbMap.getStyle(); + return mbStyle.sources[sourceId].data; + } + + async cloneDescriptor(): Promise { + // @ts-ignore + const clonedDescriptor = copyPersistentState(this._descriptor); + // layer id is uuid used to track styles/layers in mapbox + clonedDescriptor.id = uuid(); + const displayName = await this.getDisplayName(); + clonedDescriptor.label = `Clone of ${displayName}`; + clonedDescriptor.sourceDescriptor = this.getSource().cloneDescriptor(); + + // todo: remove this + // This should not be in AbstractLayer. It relies on knowledge of VectorLayerDescriptor + // @ts-ignore + if (clonedDescriptor.joins) { + // @ts-ignore + clonedDescriptor.joins.forEach(joinDescriptor => { + // right.id is uuid used to track requests in inspector + // @ts-ignore + joinDescriptor.right.id = uuid(); + }); + } + return clonedDescriptor; + } + + makeMbLayerId(layerNameSuffix: string): string { + return `${this.getId()}${MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER}${layerNameSuffix}`; + } + + isJoinable(): boolean { + return this.getSource().isJoinable(); + } + + supportsElasticsearchFilters(): boolean { + return this.getSource().isESSource(); + } + + async supportsFitToBounds(): Promise { + return await this.getSource().supportsFitToBounds(); + } + + async getDisplayName(source?: ISource): Promise { + if (this._descriptor.label) { + return this._descriptor.label; + } + + const sourceDisplayName = source + ? await source.getDisplayName() + : await this.getSource().getDisplayName(); + return sourceDisplayName || `Layer ${this._descriptor.id}`; + } + + async getAttributions(): Promise { + if (!this.hasErrors()) { + return await this.getSource().getAttributions(); + } + return []; + } + + getStyleForEditing(): IStyle { + return this._style; + } + + getStyle() { + return this._style; + } + + getLabel(): string { + return this._descriptor.label ? this._descriptor.label : ''; + } + + getCustomIconAndTooltipContent(): IconAndTooltipContent { + return { + icon: , + }; + } + + getIconAndTooltipContent(zoomLevel: number, isUsingSearch: boolean): IconAndTooltipContent { + let icon; + let tooltipContent = null; + const footnotes = []; + if (this.hasErrors()) { + icon = ( + + ); + tooltipContent = this.getErrors(); + } else if (this.isLayerLoading()) { + icon = ; + } else if (!this.isVisible()) { + icon = ; + tooltipContent = i18n.translate('xpack.maps.layer.layerHiddenTooltip', { + defaultMessage: `Layer is hidden.`, + }); + } else if (!this.showAtZoomLevel(zoomLevel)) { + const minZoom = this.getMinZoom(); + const maxZoom = this.getMaxZoom(); + icon = ; + tooltipContent = i18n.translate('xpack.maps.layer.zoomFeedbackTooltip', { + defaultMessage: `Layer is visible between zoom levels {minZoom} and {maxZoom}.`, + values: { minZoom, maxZoom }, + }); + } else { + const customIconAndTooltipContent = this.getCustomIconAndTooltipContent(); + if (customIconAndTooltipContent) { + icon = customIconAndTooltipContent.icon; + if (!customIconAndTooltipContent.areResultsTrimmed) { + tooltipContent = customIconAndTooltipContent.tooltipContent; + } else { + footnotes.push({ + icon: , + message: customIconAndTooltipContent.tooltipContent, + }); + } + } + + if (isUsingSearch && this.getQueryableIndexPatternIds().length) { + footnotes.push({ + icon: , + message: i18n.translate('xpack.maps.layer.isUsingSearchMsg', { + defaultMessage: 'Results narrowed by search bar', + }), + }); + } + } + + return { + icon, + tooltipContent, + footnotes, + }; + } + + async hasLegendDetails(): Promise { + return false; + } + + renderLegendDetails(): ReactElement | null { + return null; + } + + getId(): string { + return this._descriptor.id; + } + + getSource(): ISource { + return this._source; + } + + getSourceForEditing(): ISource { + return this._source; + } + + isVisible(): boolean { + return !!this._descriptor.visible; + } + + showAtZoomLevel(zoom: number): boolean { + return zoom >= this.getMinZoom() && zoom <= this.getMaxZoom(); + } + + getMinZoom(): number { + return typeof this._descriptor.minZoom === 'number' ? this._descriptor.minZoom : MIN_ZOOM; + } + + getMaxZoom(): number { + return typeof this._descriptor.maxZoom === 'number' ? this._descriptor.maxZoom : MAX_ZOOM; + } + + getMinSourceZoom(): number { + return this._source.getMinZoom(); + } + + _requiresPrevSourceCleanup(mbMap: unknown) { + return false; + } + + _removeStaleMbSourcesAndLayers(mbMap: unknown) { + if (this._requiresPrevSourceCleanup(mbMap)) { + // @ts-ignore + const mbStyle = mbMap.getStyle(); + // @ts-ignore + mbStyle.layers.forEach(mbLayer => { + // @ts-ignore + if (this.ownsMbLayerId(mbLayer.id)) { + // @ts-ignore + mbMap.removeLayer(mbLayer.id); + } + }); + // @ts-ignore + Object.keys(mbStyle.sources).some(mbSourceId => { + // @ts-ignore + if (this.ownsMbSourceId(mbSourceId)) { + // @ts-ignore + mbMap.removeSource(mbSourceId); + } + }); + } + } + + getAlpha(): number { + return typeof this._descriptor.alpha === 'number' ? this._descriptor.alpha : 1; + } + + getQuery(): Query | null { + return this._descriptor.query ? this._descriptor.query : null; + } + + getCurrentStyle(): IStyle { + return this._style; + } + + async getImmutableSourceProperties() { + const source = this.getSource(); + return await source.getImmutableProperties(); + } + + renderSourceSettingsEditor({ onChange }: { onChange: () => void }) { + const source = this.getSourceForEditing(); + return source.renderSourceSettingsEditor({ onChange }); + } + + getPrevRequestToken(dataId: string): symbol | undefined { + const prevDataRequest = this.getDataRequest(dataId); + if (!prevDataRequest) { + return; + } + + return prevDataRequest.getRequestToken(); + } + + getInFlightRequestTokens(): symbol[] { + if (!this._dataRequests) { + return []; + } + + const requestTokens = this._dataRequests.map(dataRequest => dataRequest.getRequestToken()); + + // Compact removes all the undefineds + // @ts-ignore + return _.compact(requestTokens); + } + + getSourceDataRequest(): DataRequest | undefined { + return this.getDataRequest(SOURCE_DATA_ID_ORIGIN); + } + + getDataRequest(id: string): DataRequest | undefined { + return this._dataRequests.find(dataRequest => dataRequest.getDataId() === id); + } + + isLayerLoading(): boolean { + return this._dataRequests.some(dataRequest => dataRequest.isLoading()); + } + + hasErrors(): boolean { + return _.get(this._descriptor, '__isInErrorState', false); + } + + getErrors(): string { + return this.hasErrors() && this._descriptor.__errorMessage + ? this._descriptor.__errorMessage + : ''; + } + + toLayerDescriptor(): LayerDescriptor { + return this._descriptor; + } + + async syncData(syncContext: SyncContext) { + // no-op by default + } + + getMbLayerIds(): string[] { + throw new Error('Should implement AbstractLayer#getMbLayerIds'); + } + + ownsMbLayerId(layerId: string): boolean { + throw new Error('Should implement AbstractLayer#ownsMbLayerId'); + } + + ownsMbSourceId(sourceId: string): boolean { + throw new Error('Should implement AbstractLayer#ownsMbSourceId'); + } + + canShowTooltip() { + return false; + } + + syncLayerWithMB(mbMap: unknown) { + throw new Error('Should implement AbstractLayer#syncLayerWithMB'); + } + + getLayerTypeIconName(): string { + throw new Error('should implement Layer#getLayerTypeIconName'); + } + + isDataLoaded(): boolean { + const sourceDataRequest = this.getSourceDataRequest(); + return sourceDataRequest ? sourceDataRequest.hasData() : false; + } + + async getBounds(mapFilters: MapFilters): Promise { + return { + minLon: -180, + maxLon: 180, + minLat: -89, + maxLat: 89, + }; + } + + renderStyleEditor({ + onStyleDescriptorChange, + }: { + onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; + }): ReactElement | null { + const style = this.getStyleForEditing(); + if (!style) { + return null; + } + return style.renderEditor({ layer: this, onStyleDescriptorChange }); + } + + getIndexPatternIds(): string[] { + return []; + } + + getQueryableIndexPatternIds(): string[] { + return []; + } + + syncVisibilityWithMb(mbMap: unknown, mbLayerId: string) { + // @ts-ignore + mbMap.setLayoutProperty(mbLayerId, 'visibility', this.isVisible() ? 'visible' : 'none'); + } + + getType(): string | undefined { + return this._descriptor.type; + } +} diff --git a/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js b/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js index 137513ad7c6127..36f898f7237574 100644 --- a/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js +++ b/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js @@ -21,8 +21,6 @@ import { registerSource } from '../source_registry'; export class GeojsonFileSource extends AbstractVectorSource { static type = SOURCE_TYPES.GEOJSON_FILE; - static isIndexingSource = true; - static createDescriptor(geoJson, name) { // Wrap feature as feature collection if needed let featureCollection; @@ -70,7 +68,7 @@ export class GeojsonFileSource extends AbstractVectorSource { } shouldBeIndexed() { - return GeojsonFileSource.isIndexingSource; + return true; } } diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts b/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts index 96347c444dd5b2..51ee15e7ea5af0 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts +++ b/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts @@ -6,7 +6,7 @@ import { AbstractESAggSource } from '../es_agg_source'; import { ESGeoGridSourceDescriptor } from '../../../../common/descriptor_types'; -import { GRID_RESOLUTION, RENDER_AS } from '../../../../common/constants'; +import { GRID_RESOLUTION } from '../../../../common/constants'; export class ESGeoGridSource extends AbstractESAggSource { static createDescriptor({ @@ -14,12 +14,7 @@ export class ESGeoGridSource extends AbstractESAggSource { geoField, requestType, resolution, - }: { - indexPatternId: string; - geoField: string; - requestType: RENDER_AS; - resolution?: GRID_RESOLUTION; - }): ESGeoGridSourceDescriptor; + }: Partial): ESGeoGridSourceDescriptor; constructor(sourceDescriptor: ESGeoGridSourceDescriptor, inspectorAdapters: unknown); diff --git a/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts b/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts index 092dc3bf0d5a87..3b41ae6bfd86b2 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts +++ b/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts @@ -8,6 +8,8 @@ import { AbstractVectorSource } from '../vector_source'; import { IVectorSource } from '../vector_source'; import { IndexPattern, SearchSource } from '../../../../../../../src/plugins/data/public'; import { VectorSourceRequestMeta } from '../../../../common/descriptor_types'; +import { VectorStyle } from '../../styles/vector/vector_style'; +import { IDynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property'; export interface IESSource extends IVectorSource { getId(): string; @@ -20,6 +22,13 @@ export interface IESSource extends IVectorSource { limit: number, initialSearchContext?: object ): Promise; + loadStylePropsMeta( + layerName: string, + style: VectorStyle, + dynamicStyleProps: IDynamicStyleProperty[], + registerCancelCallback: (requestToken: symbol, callback: () => void) => void, + searchFilters: VectorSourceRequestMeta + ): Promise; } export class AbstractESSource extends AbstractVectorSource implements IESSource { @@ -33,4 +42,11 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource limit: number, initialSearchContext?: object ): Promise; + loadStylePropsMeta( + layerName: string, + style: VectorStyle, + dynamicStyleProps: IDynamicStyleProperty[], + registerCancelCallback: (requestToken: symbol, callback: () => void) => void, + searchFilters: VectorSourceRequestMeta + ): Promise; } diff --git a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts b/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts index 701bd5e2c8b5e6..248ca2b9212b4d 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts +++ b/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts @@ -9,4 +9,5 @@ import { IESAggSource } from '../es_agg_source'; export interface IESTermSource extends IESAggSource { getTermField(): IField; + hasCompleteConfig(): boolean; } diff --git a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts b/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts index 0bfda6be722034..a73cfbdc0d0435 100644 --- a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts +++ b/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts @@ -15,9 +15,9 @@ import { IField } from '../../fields/field'; import { registerSource } from '../source_registry'; import { getDataSourceLabel, getUrlLabel } from '../../../../common/i18n_getters'; import { - LayerDescriptor, MapExtent, TiledSingleLayerVectorSourceDescriptor, + VectorLayerDescriptor, VectorSourceRequestMeta, VectorSourceSyncMeta, } from '../../../../common/descriptor_types'; @@ -66,12 +66,15 @@ export class MVTSingleLayerVectorSource extends AbstractSource return []; } - createDefaultLayer(options: LayerDescriptor): TiledVectorLayer { - const layerDescriptor = { + createDefaultLayer(options?: Partial): TiledVectorLayer { + const layerDescriptor: Partial = { sourceDescriptor: this._descriptor, ...options, }; - const normalizedLayerDescriptor = TiledVectorLayer.createDescriptor(layerDescriptor, []); + const normalizedLayerDescriptor: VectorLayerDescriptor = TiledVectorLayer.createDescriptor( + layerDescriptor, + [] + ); const vectorLayerArguments: VectorLayerArguments = { layerDescriptor: normalizedLayerDescriptor, source: this, diff --git a/x-pack/plugins/maps/public/layers/sources/source.d.ts b/x-pack/plugins/maps/public/layers/sources/source.d.ts deleted file mode 100644 index 5a01da02adaae4..00000000000000 --- a/x-pack/plugins/maps/public/layers/sources/source.d.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -/* eslint-disable @typescript-eslint/consistent-type-definitions */ - -import { AbstractSourceDescriptor, LayerDescriptor } from '../../../common/descriptor_types'; -import { ILayer } from '../layer'; - -export type ImmutableSourceProperty = { - label: string; - value: string; -}; - -export type Attribution = { - url: string; - label: string; -}; - -export interface ISource { - createDefaultLayer(options?: LayerDescriptor): ILayer; - destroy(): void; - getDisplayName(): Promise; - getInspectorAdapters(): object; - isFieldAware(): boolean; - isFilterByMapBounds(): boolean; - isGeoGridPrecisionAware(): boolean; - isQueryAware(): boolean; - isRefreshTimerAware(): Promise; - isTimeAware(): Promise; - getImmutableProperties(): Promise; - getAttributions(): Promise; - getMinZoom(): number; - getMaxZoom(): number; -} - -export class AbstractSource implements ISource { - readonly _descriptor: AbstractSourceDescriptor; - constructor(sourceDescriptor: AbstractSourceDescriptor, inspectorAdapters?: object); - - destroy(): void; - createDefaultLayer(options?: LayerDescriptor, mapColors?: string[]): ILayer; - getDisplayName(): Promise; - getInspectorAdapters(): object; - isFieldAware(): boolean; - isFilterByMapBounds(): boolean; - isGeoGridPrecisionAware(): boolean; - isQueryAware(): boolean; - isRefreshTimerAware(): Promise; - isTimeAware(): Promise; - getImmutableProperties(): Promise; - getAttributions(): Promise; - getMinZoom(): number; - getMaxZoom(): number; -} diff --git a/x-pack/plugins/maps/public/layers/sources/source.js b/x-pack/plugins/maps/public/layers/sources/source.js deleted file mode 100644 index fd93daf249b265..00000000000000 --- a/x-pack/plugins/maps/public/layers/sources/source.js +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { copyPersistentState } from '../../reducers/util'; -import { MIN_ZOOM, MAX_ZOOM } from '../../../common/constants'; - -export class AbstractSource { - static isIndexingSource = false; - - static renderEditor() { - throw new Error('Must implement Source.renderEditor'); - } - - static createDescriptor() { - throw new Error('Must implement Source.createDescriptor'); - } - - constructor(descriptor, inspectorAdapters) { - this._descriptor = descriptor; - this._inspectorAdapters = inspectorAdapters; - } - - destroy() {} - - cloneDescriptor() { - return copyPersistentState(this._descriptor); - } - - async supportsFitToBounds() { - return true; - } - - /** - * return list of immutable source properties. - * Immutable source properties are properties that can not be edited by the user. - */ - async getImmutableProperties() { - return []; - } - - getInspectorAdapters() { - return this._inspectorAdapters; - } - - _createDefaultLayerDescriptor() { - throw new Error(`Source#createDefaultLayerDescriptor not implemented`); - } - - createDefaultLayer() { - throw new Error(`Source#createDefaultLayer not implemented`); - } - - async getDisplayName() { - console.warn('Source should implement Source#getDisplayName'); - return ''; - } - - /** - * return attribution for this layer as array of objects with url and label property. - * e.g. [{ url: 'example.com', label: 'foobar' }] - * @return {Promise} - */ - async getAttributions() { - return []; - } - - isFieldAware() { - return false; - } - - isRefreshTimerAware() { - return false; - } - - isGeoGridPrecisionAware() { - return false; - } - - async isTimeAware() { - return false; - } - - getFieldNames() { - return []; - } - - hasCompleteConfig() { - throw new Error(`Source#hasCompleteConfig not implemented`); - } - - renderSourceSettingsEditor() { - return null; - } - - getApplyGlobalQuery() { - return !!this._descriptor.applyGlobalQuery; - } - - getIndexPatternIds() { - return []; - } - - getQueryableIndexPatternIds() { - return []; - } - - isFilterByMapBounds() { - return false; - } - - isQueryAware() { - return false; - } - - getGeoGridPrecision() { - return 0; - } - - isJoinable() { - return false; - } - - shouldBeIndexed() { - return AbstractSource.isIndexingSource; - } - - isESSource() { - return false; - } - - // Returns geo_shape indexed_shape context for spatial quering by pre-indexed shapes - async getPreIndexedShape(/* properties */) { - return null; - } - - // Returns function used to format value - async createFieldFormatter(/* field */) { - return null; - } - - async loadStylePropsMeta() { - throw new Error(`Source#loadStylePropsMeta not implemented`); - } - - async getValueSuggestions(/* field, query */) { - return []; - } - - getMinZoom() { - return MIN_ZOOM; - } - - getMaxZoom() { - return MAX_ZOOM; - } -} diff --git a/x-pack/plugins/maps/public/layers/sources/source.ts b/x-pack/plugins/maps/public/layers/sources/source.ts new file mode 100644 index 00000000000000..1cd84010159abf --- /dev/null +++ b/x-pack/plugins/maps/public/layers/sources/source.ts @@ -0,0 +1,195 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +/* eslint-disable @typescript-eslint/consistent-type-definitions */ + +import { ReactElement } from 'react'; + +import { Adapters } from 'src/plugins/inspector/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +// @ts-ignore +import { copyPersistentState } from '../../reducers/util'; + +import { LayerDescriptor, SourceDescriptor } from '../../../common/descriptor_types'; +import { ILayer } from '../layer'; +import { IField } from '../fields/field'; +import { MAX_ZOOM, MIN_ZOOM } from '../../../common/constants'; + +export type ImmutableSourceProperty = { + label: string; + value: string; +}; + +export type Attribution = { + url: string; + label: string; +}; + +export type PreIndexedShape = { + index: string; + id: string | number; + path: string; +}; + +export type FieldFormatter = (value: string | number | null | undefined | boolean) => string; + +export interface ISource { + createDefaultLayer(options?: Partial): ILayer; + destroy(): void; + getDisplayName(): Promise; + getInspectorAdapters(): Adapters | undefined; + isFieldAware(): boolean; + isFilterByMapBounds(): boolean; + isGeoGridPrecisionAware(): boolean; + isQueryAware(): boolean; + isRefreshTimerAware(): boolean; + isTimeAware(): Promise; + getImmutableProperties(): Promise; + getAttributions(): Promise; + isESSource(): boolean; + renderSourceSettingsEditor({ onChange }: { onChange: () => void }): ReactElement | null; + supportsFitToBounds(): Promise; + isJoinable(): boolean; + cloneDescriptor(): SourceDescriptor; + getFieldNames(): string[]; + getApplyGlobalQuery(): boolean; + getIndexPatternIds(): string[]; + getQueryableIndexPatternIds(): string[]; + getGeoGridPrecision(zoom: number): number; + shouldBeIndexed(): boolean; + getPreIndexedShape(): Promise; + createFieldFormatter(field: IField): Promise; + getValueSuggestions(field: IField, query: string): Promise; + getMinZoom(): number; + getMaxZoom(): number; +} + +export class AbstractSource implements ISource { + readonly _descriptor: SourceDescriptor; + readonly _inspectorAdapters?: Adapters | undefined; + + constructor(descriptor: SourceDescriptor, inspectorAdapters?: Adapters) { + this._descriptor = descriptor; + this._inspectorAdapters = inspectorAdapters; + } + + destroy(): void {} + + cloneDescriptor(): SourceDescriptor { + // @ts-ignore + return copyPersistentState(this._descriptor); + } + + async supportsFitToBounds(): Promise { + return true; + } + + /** + * return list of immutable source properties. + * Immutable source properties are properties that can not be edited by the user. + */ + async getImmutableProperties(): Promise { + return []; + } + + getInspectorAdapters(): Adapters | undefined { + return this._inspectorAdapters; + } + + createDefaultLayer(options?: Partial): ILayer { + throw new Error(`Source#createDefaultLayer not implemented`); + } + + async getDisplayName(): Promise { + return ''; + } + + async getAttributions(): Promise { + return []; + } + + isFieldAware(): boolean { + return false; + } + + isRefreshTimerAware(): boolean { + return false; + } + + isGeoGridPrecisionAware(): boolean { + return false; + } + + isQueryAware(): boolean { + return false; + } + + getFieldNames(): string[] { + return []; + } + + renderSourceSettingsEditor() { + return null; + } + + getApplyGlobalQuery(): boolean { + return !!this._descriptor.applyGlobalQuery; + } + + getIndexPatternIds(): string[] { + return []; + } + + getQueryableIndexPatternIds(): string[] { + return []; + } + + getGeoGridPrecision(zoom: number): number { + return 0; + } + + isJoinable(): boolean { + return false; + } + + shouldBeIndexed(): boolean { + return false; + } + + isESSource(): boolean { + return false; + } + + // Returns geo_shape indexed_shape context for spatial quering by pre-indexed shapes + async getPreIndexedShape(/* properties */): Promise { + return null; + } + + // Returns function used to format value + async createFieldFormatter(field: IField): Promise { + return null; + } + + async getValueSuggestions(field: IField, query: string): Promise { + return []; + } + + async isTimeAware(): Promise { + return false; + } + + isFilterByMapBounds(): boolean { + return false; + } + + getMinZoom() { + return MIN_ZOOM; + } + + getMaxZoom() { + return MAX_ZOOM; + } +} diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts b/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts index 8b64480f92961a..77f8d88a8c0ab3 100644 --- a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts +++ b/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts @@ -13,6 +13,7 @@ import { AbstractTMSSource } from '../tms_source'; import { LayerDescriptor, XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; import { Attribution, ImmutableSourceProperty } from '../source'; import { XYZTMSSourceConfig } from './xyz_tms_editor'; +import { ILayer } from '../../layer'; export const sourceTitle = i18n.translate('xpack.maps.source.ems_xyzTitle', { defaultMessage: 'Tile Map Service', @@ -48,7 +49,7 @@ export class XYZTMSSource extends AbstractTMSSource { ]; } - createDefaultLayer(options?: LayerDescriptor): TileLayer { + createDefaultLayer(options?: LayerDescriptor): ILayer { const layerDescriptor: LayerDescriptor = TileLayer.createDescriptor({ sourceDescriptor: this._descriptor, ...options, diff --git a/x-pack/plugins/maps/public/layers/styles/abstract_style.js b/x-pack/plugins/maps/public/layers/styles/abstract_style.js deleted file mode 100644 index 3e7a3dbf7ed206..00000000000000 --- a/x-pack/plugins/maps/public/layers/styles/abstract_style.js +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export class AbstractStyle { - getDescriptorWithMissingStylePropsRemoved(/* nextOrdinalFields */) { - return { - hasChanges: false, - }; - } - - async pluckStyleMetaFromSourceDataRequest(/* sourceDataRequest */) { - return {}; - } - - getDescriptor() { - return this._descriptor; - } - - renderEditor(/* { layer, onStyleDescriptorChange } */) { - return null; - } - - getSourceFieldNames() { - return []; - } -} diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js b/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js index d769fe0da9ec2b..1fa24943c5e516 100644 --- a/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js +++ b/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js @@ -5,7 +5,7 @@ */ import React from 'react'; -import { AbstractStyle } from '../abstract_style'; +import { AbstractStyle } from '../style'; import { HeatmapStyleEditor } from './components/heatmap_style_editor'; import { HeatmapLegend } from './components/legend/heatmap_legend'; import { DEFAULT_HEATMAP_COLOR_RAMP_NAME } from './components/heatmap_constants'; diff --git a/x-pack/plugins/maps/public/layers/styles/style.ts b/x-pack/plugins/maps/public/layers/styles/style.ts new file mode 100644 index 00000000000000..38fdc36904412a --- /dev/null +++ b/x-pack/plugins/maps/public/layers/styles/style.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ReactElement } from 'react'; +import { StyleDescriptor, StyleMetaDescriptor } from '../../../common/descriptor_types'; +import { ILayer } from '../layer'; +import { IField } from '../fields/field'; +import { DataRequest } from '../util/data_request'; + +export interface IStyle { + getDescriptor(): StyleDescriptor | null; + getDescriptorWithMissingStylePropsRemoved( + nextFields: IField[] + ): { hasChanges: boolean; nextStyleDescriptor?: StyleDescriptor }; + pluckStyleMetaFromSourceDataRequest(sourceDataRequest: DataRequest): StyleMetaDescriptor; + renderEditor({ + layer, + onStyleDescriptorChange, + }: { + layer: ILayer; + onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; + }): ReactElement | null; + getSourceFieldNames(): string[]; +} + +export class AbstractStyle implements IStyle { + readonly _descriptor: StyleDescriptor | null; + + constructor(descriptor: StyleDescriptor | null) { + this._descriptor = descriptor; + } + + getDescriptorWithMissingStylePropsRemoved( + nextFields: IField[] + ): { hasChanges: boolean; nextStyleDescriptor?: StyleDescriptor } { + return { + hasChanges: false, + }; + } + + pluckStyleMetaFromSourceDataRequest(sourceDataRequest: DataRequest): StyleMetaDescriptor { + return { fieldMeta: {} }; + } + + getDescriptor(): StyleDescriptor | null { + return this._descriptor; + } + + renderEditor(/* { layer, onStyleDescriptorChange } */) { + return null; + } + + getSourceFieldNames(): string[] { + return []; + } +} diff --git a/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts b/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts new file mode 100644 index 00000000000000..f658d0821edf2c --- /dev/null +++ b/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AbstractStyle } from '../style'; +import { LAYER_STYLE_TYPE } from '../../../../common/constants'; + +export class TileStyle extends AbstractStyle { + constructor() { + super({ + type: LAYER_STYLE_TYPE.TILE, + }); + } +} diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts index e010d5ac7d7a31..762322b8e09f9a 100644 --- a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts +++ b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts @@ -7,24 +7,23 @@ import { IStyleProperty } from './properties/style_property'; import { IDynamicStyleProperty } from './properties/dynamic_style_property'; import { IVectorLayer } from '../../vector_layer'; import { IVectorSource } from '../../sources/vector_source'; +import { AbstractStyle, IStyle } from '../style'; import { VectorStyleDescriptor, VectorStylePropertiesDescriptor, } from '../../../../common/descriptor_types'; -export interface IVectorStyle { +export interface IVectorStyle extends IStyle { getAllStyleProperties(): IStyleProperty[]; - getDescriptor(): VectorStyleDescriptor; getDynamicPropertiesArray(): IDynamicStyleProperty[]; getSourceFieldNames(): string[]; } -export class VectorStyle implements IVectorStyle { +export class VectorStyle extends AbstractStyle implements IVectorStyle { static createDescriptor(properties: VectorStylePropertiesDescriptor): VectorStyleDescriptor; static createDefaultStyleProperties(mapColors: string[]): VectorStylePropertiesDescriptor; constructor(descriptor: VectorStyleDescriptor, source: IVectorSource, layer: IVectorLayer); getSourceFieldNames(): string[]; getAllStyleProperties(): IStyleProperty[]; - getDescriptor(): VectorStyleDescriptor; getDynamicPropertiesArray(): IDynamicStyleProperty[]; } diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js index b044c98d44d417..5a4edd9c93a058 100644 --- a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js +++ b/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js @@ -8,7 +8,7 @@ import _ from 'lodash'; import React from 'react'; import { VectorStyleEditor } from './components/vector_style_editor'; import { getDefaultProperties, LINE_STYLES, POLYGON_STYLES } from './vector_style_defaults'; -import { AbstractStyle } from '../abstract_style'; +import { AbstractStyle } from '../style'; import { GEO_JSON_TYPE, FIELD_ORIGIN, @@ -60,6 +60,7 @@ export class VectorStyle extends AbstractStyle { constructor(descriptor = {}, source, layer) { super(); + descriptor = descriptor === null ? {} : descriptor; this._source = source; this._layer = layer; this._descriptor = { diff --git a/x-pack/plugins/maps/public/layers/tile_layer.d.ts b/x-pack/plugins/maps/public/layers/tile_layer.d.ts index 53e8c388ee4c2e..8a1ef0f172717d 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.d.ts +++ b/x-pack/plugins/maps/public/layers/tile_layer.d.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AbstractLayer, ILayerArguments } from './layer'; +import { AbstractLayer } from './layer'; import { ITMSSource } from './sources/tms_source'; import { LayerDescriptor } from '../../common/descriptor_types'; -interface ITileLayerArguments extends ILayerArguments { +interface ITileLayerArguments { source: ITMSSource; layerDescriptor: LayerDescriptor; } diff --git a/x-pack/plugins/maps/public/layers/tile_layer.js b/x-pack/plugins/maps/public/layers/tile_layer.js index 2ac60e12d137a7..baded3c287637c 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.js +++ b/x-pack/plugins/maps/public/layers/tile_layer.js @@ -6,7 +6,8 @@ import { AbstractLayer } from './layer'; import _ from 'lodash'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE } from '../../common/constants'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../common/constants'; +import { TileStyle } from './styles/tile/tile_style'; export class TileLayer extends AbstractLayer { static type = LAYER_TYPE.TILE; @@ -15,9 +16,14 @@ export class TileLayer extends AbstractLayer { const tileLayerDescriptor = super.createDescriptor(options, mapColors); tileLayerDescriptor.type = TileLayer.type; tileLayerDescriptor.alpha = _.get(options, 'alpha', 1); + tileLayerDescriptor.style = { type: LAYER_STYLE_TYPE.TILE }; return tileLayerDescriptor; } + constructor({ source, layerDescriptor }) { + super({ source, layerDescriptor, style: new TileStyle() }); + } + async syncData({ startLoading, stopLoading, onLoadError, dataFilters }) { if (!this.isVisible() || !this.showAtZoomLevel(dataFilters.zoom)) { return; diff --git a/x-pack/plugins/maps/public/layers/tile_layer.test.ts b/x-pack/plugins/maps/public/layers/tile_layer.test.ts index f8c2fd9db60fa5..a7e8be9fc4b460 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.test.ts +++ b/x-pack/plugins/maps/public/layers/tile_layer.test.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TileLayer } from './tile_layer'; +// eslint-disable-next-line max-classes-per-file +import { ITileLayerArguments, TileLayer } from './tile_layer'; import { SOURCE_TYPES } from '../../common/constants'; import { XYZTMSSourceDescriptor } from '../../common/descriptor_types'; import { ITMSSource, AbstractTMSSource } from './sources/tms_source'; @@ -38,10 +39,13 @@ class MockTileSource extends AbstractTMSSource implements ITMSSource { describe('TileLayer', () => { it('should use display-label from source', async () => { const source = new MockTileSource(sourceDescriptor); - const layer: ILayer = new TileLayer({ + + const args: ITileLayerArguments = { source, layerDescriptor: { id: 'layerid', sourceDescriptor }, - }); + }; + + const layer: ILayer = new TileLayer(args); expect(await source.getDisplayName()).toEqual(await layer.getDisplayName()); }); diff --git a/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx b/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx index c47cae5641e563..06c5ef579b2212 100644 --- a/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx +++ b/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx @@ -20,7 +20,7 @@ export class TiledVectorLayer extends VectorLayer { static type = LAYER_TYPE.TILED_VECTOR; static createDescriptor( - descriptor: VectorLayerDescriptor, + descriptor: Partial, mapColors: string[] ): VectorLayerDescriptor { const layerDescriptor = super.createDescriptor(descriptor, mapColors); diff --git a/x-pack/plugins/maps/public/layers/vector_layer.d.ts b/x-pack/plugins/maps/public/layers/vector_layer.d.ts index 3d5b8054ff3fd8..efc1f3011c687e 100644 --- a/x-pack/plugins/maps/public/layers/vector_layer.d.ts +++ b/x-pack/plugins/maps/public/layers/vector_layer.d.ts @@ -19,7 +19,7 @@ import { IVectorStyle } from './styles/vector/vector_style'; import { IField } from './fields/field'; import { SyncContext } from '../actions/map_actions'; -type VectorLayerArguments = { +export type VectorLayerArguments = { source: IVectorSource; joins?: IJoin[]; layerDescriptor: VectorLayerDescriptor; @@ -33,14 +33,12 @@ export interface IVectorLayer extends ILayer { } export class VectorLayer extends AbstractLayer implements IVectorLayer { + protected readonly _style: IVectorStyle; static createDescriptor( options: Partial, mapColors?: string[] ): VectorLayerDescriptor; - protected readonly _source: IVectorSource; - protected readonly _style: IVectorStyle; - constructor(options: VectorLayerArguments); getLayerTypeIconName(): string; getFields(): Promise; diff --git a/x-pack/plugins/maps/public/layers/vector_layer.js b/x-pack/plugins/maps/public/layers/vector_layer.js index c5947a63587ea8..17b7f8152d76da 100644 --- a/x-pack/plugins/maps/public/layers/vector_layer.js +++ b/x-pack/plugins/maps/public/layers/vector_layer.js @@ -484,6 +484,8 @@ export class VectorLayer extends AbstractLayer { try { startLoading(dataRequestId, requestToken, nextMeta); const layerName = await this.getDisplayName(source); + + //todo: cast source to ESSource when migrating to TS const styleMeta = await source.loadStylePropsMeta( layerName, style, diff --git a/x-pack/plugins/maps/public/layers/vector_tile_layer.js b/x-pack/plugins/maps/public/layers/vector_tile_layer.js index c620ec6c56dc3a..fc7812a2c86c70 100644 --- a/x-pack/plugins/maps/public/layers/vector_tile_layer.js +++ b/x-pack/plugins/maps/public/layers/vector_tile_layer.js @@ -6,7 +6,7 @@ import { TileLayer } from './tile_layer'; import _ from 'lodash'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE } from '../../common/constants'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../common/constants'; import { isRetina } from '../meta'; import { addSpriteSheetToMapFromImageData, @@ -28,6 +28,7 @@ export class VectorTileLayer extends TileLayer { const tileLayerDescriptor = super.createDescriptor(options); tileLayerDescriptor.type = VectorTileLayer.type; tileLayerDescriptor.alpha = _.get(options, 'alpha', 1); + tileLayerDescriptor.style = { type: LAYER_STYLE_TYPE.TILE }; return tileLayerDescriptor; } From 9a47926b90797999b75edca8733a78689b44de0e Mon Sep 17 00:00:00 2001 From: Kerry Gallagher Date: Wed, 22 Apr 2020 14:25:39 +0100 Subject: [PATCH 30/34] [Logs / Metrics UI] Switch to scopedHistory and enhance useLinkProps hook (#61667) --- .../plugins/infra/public/apps/start_app.tsx | 10 ++- .../source_configuration_settings.tsx | 13 ++-- .../public/hooks/use_link_props.test.tsx | 24 +++--- .../infra/public/hooks/use_link_props.tsx | 78 +++++++++---------- .../infra/public/utils/history_context.ts | 4 +- .../navigation_warning_prompt/context.tsx | 31 ++++++++ .../utils/navigation_warning_prompt/index.ts | 8 ++ .../navigation_warning_prompt/prompt.tsx | 25 ++++++ 8 files changed, 126 insertions(+), 67 deletions(-) create mode 100644 x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx create mode 100644 x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts create mode 100644 x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx diff --git a/x-pack/plugins/infra/public/apps/start_app.tsx b/x-pack/plugins/infra/public/apps/start_app.tsx index ebf9562c38d7a3..4c213700b62e6b 100644 --- a/x-pack/plugins/infra/public/apps/start_app.tsx +++ b/x-pack/plugins/infra/public/apps/start_app.tsx @@ -4,7 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { createBrowserHistory } from 'history'; import React from 'react'; import ReactDOM from 'react-dom'; import { ApolloProvider } from 'react-apollo'; @@ -25,6 +24,7 @@ import { AppRouter } from '../routers'; import { TriggersAndActionsUIPublicPluginSetup } from '../../../triggers_actions_ui/public'; import { TriggersActionsProvider } from '../utils/triggers_actions_context'; import '../index.scss'; +import { NavigationWarningPromptProvider } from '../utils/navigation_warning_prompt'; export const CONTAINER_CLASSNAME = 'infra-container-element'; @@ -36,8 +36,8 @@ export async function startApp( Router: AppRouter, triggersActionsUI: TriggersAndActionsUIPublicPluginSetup ) { - const { element, appBasePath } = params; - const history = createBrowserHistory({ basename: appBasePath }); + const { element, history } = params; + const InfraPluginRoot: React.FunctionComponent = () => { const [darkMode] = useUiSetting$('theme:darkMode'); @@ -49,7 +49,9 @@ export async function startApp( - + + + diff --git a/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx b/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx index 36645fa3f1f35a..7f248cd1030039 100644 --- a/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/components/source_configuration/source_configuration_settings.tsx @@ -17,7 +17,6 @@ import { import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useContext, useMemo } from 'react'; -import { Prompt } from 'react-router-dom'; import { Source } from '../../containers/source'; import { FieldsConfigurationPanel } from './fields_configuration_panel'; @@ -26,6 +25,7 @@ import { NameConfigurationPanel } from './name_configuration_panel'; import { LogColumnsConfigurationPanel } from './log_columns_configuration_panel'; import { useSourceConfigurationFormState } from './source_configuration_form_state'; import { SourceLoadingPage } from '../source_loading_page'; +import { Prompt } from '../../utils/navigation_warning_prompt'; interface SourceConfigurationSettingsProps { shouldAllowEdit: boolean; @@ -100,10 +100,13 @@ export const SourceConfigurationSettings = ({ data-test-subj="sourceConfigurationContent" > { const INTERNAL_APP = 'metrics'; -// Note: Memory history doesn't support basename, -// we'll work around this by re-assigning 'createHref' so that -// it includes a basename, this then acts as our browserHistory instance would. const history = createMemoryHistory(); -const originalCreateHref = history.createHref; -history.createHref = (location: LocationDescriptorObject): string => { - return `${PREFIX}${INTERNAL_APP}${originalCreateHref.call(history, location)}`; -}; +history.push(`${PREFIX}${INTERNAL_APP}`); +const scopedHistory = new ScopedHistory(history, `${PREFIX}${INTERNAL_APP}`); const ProviderWrapper: React.FC = ({ children }) => { return ( - + {children}; ); @@ -111,7 +107,7 @@ describe('useLinkProps hook', () => { pathname: '/', }); expect(result.current.href).toBe('/test-basepath/s/test-space/app/ml/'); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with pathname options', () => { @@ -127,7 +123,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/ml/explorer?type=host&id=some-id&count=12345' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with hash options', () => { @@ -143,7 +139,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/ml#/explorer?type=host&id=some-id&count=12345' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with more complex encoding', () => { @@ -161,7 +157,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/ml#/explorer?type=host%20%2B%20host&name=this%20name%20has%20spaces%20and%20**%20and%20%25&id=some-id&count=12345&animals=dog,cat,bear' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); it('Provides the correct props with a consumer using Rison encoding for search', () => { @@ -180,7 +176,7 @@ describe('useLinkProps hook', () => { expect(result.current.href).toBe( '/test-basepath/s/test-space/app/rison-app#rison-route?type=host%20%2B%20host&state=(refreshInterval:(pause:!t,value:0),time:(from:12345,to:54321))' ); - expect(result.current.onClick).not.toBeDefined(); + expect(result.current.onClick).toBeDefined(); }); }); }); diff --git a/x-pack/plugins/infra/public/hooks/use_link_props.tsx b/x-pack/plugins/infra/public/hooks/use_link_props.tsx index e60ab32046832c..8c522bb7fa764a 100644 --- a/x-pack/plugins/infra/public/hooks/use_link_props.tsx +++ b/x-pack/plugins/infra/public/hooks/use_link_props.tsx @@ -9,7 +9,8 @@ import { stringify } from 'query-string'; import url from 'url'; import { url as urlUtils } from '../../../../../src/plugins/kibana_utils/public'; import { usePrefixPathWithBasepath } from './use_prefix_path_with_basepath'; -import { useHistory } from '../utils/history_context'; +import { useKibana } from '../../../../../src/plugins/kibana_react/public'; +import { useNavigationWarningPrompt } from '../utils/navigation_warning_prompt'; type Search = Record; @@ -28,31 +29,26 @@ interface LinkProps { export const useLinkProps = ({ app, pathname, hash, search }: LinkDescriptor): LinkProps => { validateParams({ app, pathname, hash, search }); - const history = useHistory(); + const { prompt } = useNavigationWarningPrompt(); const prefixer = usePrefixPathWithBasepath(); + const navigateToApp = useKibana().services.application?.navigateToApp; const encodedSearch = useMemo(() => { return search ? encodeSearch(search) : undefined; }, [search]); - const internalLinkResult = useMemo(() => { - // When the logs / metrics apps are first mounted a history instance is setup with a 'basename' equal to the - // 'appBasePath' received from Core's 'AppMountParams', e.g. /BASE_PATH/s/SPACE_ID/app/APP_ID. With internal - // linking we are using 'createHref' and 'push' on top of this history instance. So a pathname of /inventory used within - // the metrics app will ultimatey end up as /BASE_PATH/s/SPACE_ID/app/metrics/inventory. React-router responds to this - // as it is instantiated with the same history instance. - return history?.createHref({ - pathname: pathname ? formatPathname(pathname) : undefined, - search: encodedSearch, - }); - }, [history, pathname, encodedSearch]); - - const externalLinkResult = useMemo(() => { + const mergedHash = useMemo(() => { // The URI spec defines that the query should appear before the fragment // https://tools.ietf.org/html/rfc3986#section-3 (e.g. url.format()). However, in Kibana, apps that use // hash based routing expect the query to be part of the hash. This will handle that. - const mergedHash = hash && encodedSearch ? `${hash}?${encodedSearch}` : hash; + return hash && encodedSearch ? `${hash}?${encodedSearch}` : hash; + }, [hash, encodedSearch]); + + const mergedPathname = useMemo(() => { + return pathname && encodedSearch ? `${pathname}?${encodedSearch}` : pathname; + }, [pathname, encodedSearch]); + const href = useMemo(() => { const link = url.format({ pathname, hash: mergedHash, @@ -60,28 +56,36 @@ export const useLinkProps = ({ app, pathname, hash, search }: LinkDescriptor): L }); return prefixer(app, link); - }, [hash, encodedSearch, pathname, prefixer, app]); + }, [mergedHash, hash, encodedSearch, pathname, prefixer, app]); const onClick = useMemo(() => { - // If these results are equal we know we're trying to navigate within the same application - // that the current history instance is representing - if (internalLinkResult && linksAreEquivalent(externalLinkResult, internalLinkResult)) { - return (e: React.MouseEvent | React.MouseEvent) => { - e.preventDefault(); - if (history) { - history.push({ - pathname: pathname ? formatPathname(pathname) : undefined, - search: encodedSearch, - }); + return (e: React.MouseEvent | React.MouseEvent) => { + e.preventDefault(); + + const navigate = () => { + if (navigateToApp) { + const navigationPath = mergedHash ? `#${mergedHash}` : mergedPathname; + navigateToApp(app, { path: navigationPath ? navigationPath : undefined }); } }; - } else { - return undefined; - } - }, [internalLinkResult, externalLinkResult, history, pathname, encodedSearch]); + + // A component somewhere within the app hierarchy is requesting that we + // prompt the user before navigating. + if (prompt) { + const wantsToNavigate = window.confirm(prompt); + if (wantsToNavigate) { + navigate(); + } else { + return; + } + } else { + navigate(); + } + }; + }, [navigateToApp, mergedHash, mergedPathname, app, prompt]); return { - href: externalLinkResult, + href, onClick, }; }; @@ -90,10 +94,6 @@ const encodeSearch = (search: Search) => { return stringify(urlUtils.encodeQuery(search), { sort: false, encode: false }); }; -const formatPathname = (pathname: string) => { - return pathname[0] === '/' ? pathname : `/${pathname}`; -}; - const validateParams = ({ app, pathname, hash, search }: LinkDescriptor) => { if (!app && hash) { throw new Error( @@ -101,9 +101,3 @@ const validateParams = ({ app, pathname, hash, search }: LinkDescriptor) => { ); } }; - -const linksAreEquivalent = (externalLink: string, internalLink: string): boolean => { - // Compares with trailing slashes removed. This handles the case where the pathname is '/' - // and 'createHref' will include the '/' but Kibana's 'getUrlForApp' will remove it. - return externalLink.replace(/\/$/, '') === internalLink.replace(/\/$/, ''); -}; diff --git a/x-pack/plugins/infra/public/utils/history_context.ts b/x-pack/plugins/infra/public/utils/history_context.ts index fe036e3179ec1b..844d5b5e8e76f0 100644 --- a/x-pack/plugins/infra/public/utils/history_context.ts +++ b/x-pack/plugins/infra/public/utils/history_context.ts @@ -5,9 +5,9 @@ */ import { createContext, useContext } from 'react'; -import { History } from 'history'; +import { ScopedHistory } from 'src/core/public'; -export const HistoryContext = createContext(undefined); +export const HistoryContext = createContext(undefined); export const useHistory = () => { return useContext(HistoryContext); diff --git a/x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx new file mode 100644 index 00000000000000..10f8fb9e71f436 --- /dev/null +++ b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/context.tsx @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useState } from 'react'; +import { createContext, useContext } from 'react'; + +interface ContextValues { + prompt?: string; + setPrompt: (prompt: string | undefined) => void; +} + +export const NavigationWarningPromptContext = createContext({ + setPrompt: (prompt: string | undefined) => {}, +}); + +export const useNavigationWarningPrompt = () => { + return useContext(NavigationWarningPromptContext); +}; + +export const NavigationWarningPromptProvider: React.FC = ({ children }) => { + const [prompt, setPrompt] = useState(undefined); + + return ( + + {children} + + ); +}; diff --git a/x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts new file mode 100644 index 00000000000000..dcdbf8e912a835 --- /dev/null +++ b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export * from './context'; +export * from './prompt'; diff --git a/x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx new file mode 100644 index 00000000000000..65ec4729c036d6 --- /dev/null +++ b/x-pack/plugins/infra/public/utils/navigation_warning_prompt/prompt.tsx @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React, { useEffect } from 'react'; +import { useNavigationWarningPrompt } from './context'; + +interface Props { + prompt?: string; +} + +export const Prompt: React.FC = ({ prompt }) => { + const { setPrompt } = useNavigationWarningPrompt(); + + useEffect(() => { + setPrompt(prompt); + return () => { + setPrompt(undefined); + }; + }, [prompt, setPrompt]); + + return null; +}; From aa560353f8074c368f9e5b601164a5df8f7017cb Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Wed, 22 Apr 2020 08:38:53 -0500 Subject: [PATCH 31/34] [DOCS] Adds dashboard controls options (#64079) --- docs/visualize/for-dashboard.asciidoc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/docs/visualize/for-dashboard.asciidoc b/docs/visualize/for-dashboard.asciidoc index d6e39d35b7b23f..400179e9ceae73 100644 --- a/docs/visualize/for-dashboard.asciidoc +++ b/docs/visualize/for-dashboard.asciidoc @@ -13,13 +13,29 @@ on a dashboard. You can add two types of interactive inputs: -* *Options list* - Filters content based on one or more specified options. The dropdown menu is dynamically populated with the results of a terms aggregation. For example, use the options list on the sample flight dashboard when you want to filter the data by origin city and destination city. +* *Options list* — Filters content based on one or more specified options. The dropdown menu is dynamically populated with the results of a terms aggregation. For example, use the options list on the sample flight dashboard when you want to filter the data by origin city and destination city. -* *Range slider* - Filters data within a specified range of numbers. The minimum and maximum values are dynamically populated with the results of a min and max aggregation. For example, use the range slider when you want to filter the sample flight dashboard by a specific average ticket price. +* *Range slider* — Filters data within a specified range of numbers. The minimum and maximum values are dynamically populated with the results of a min and max aggregation. For example, use the range slider when you want to filter the sample flight dashboard by a specific average ticket price. [role="screenshot"] image::images/dashboard-controls.png[] +[float] +[[controls-options]] +==== Controls options + +Configure the settings that apply to the interactive inputs on a dashboard. + +. Click *Options*, then configure the following: + +* *Update {kib} filters on each change* — When selected, all interactive inputs create filters that refresh the dashboard. When unselected, {kib} filters are created only when you click *Apply changes*. + +* *Use time filter* — When selected, the aggregations that generate the options list and time range are connected to the <>. + +* *Pin filters to global state* — When selected, all filters created by interacting with the inputs are automatically pinned. + +. Click *Update*. + [float] [[markdown-widget]] === Markdown From 91f7911d15ccb172319dd6b47290e4589c72db6d Mon Sep 17 00:00:00 2001 From: CJ Cenizal Date: Wed, 22 Apr 2020 07:15:25 -0700 Subject: [PATCH 32/34] Move CCR out of legacy (#62890) * Convert common/services and server/lib to TypeScript. Update Jest tests. - Remove deserializeAutoFollowPattern behavior that returned an empty object if the pattern was undefined. * Localize mocks with the component integration tests. * Update API unit tests to use NP mocks. - Break up test files. - Use inline mocked ES response instead of fixture files. - Move remaining fixture files into client integration tests directory. * Make API route validation more strict. * Publish isUiDisabled as part of Remote Clusters contract. * Default trackUiMetric service to be a no-op. * Remove security dependency. - Fix license check so that CCR won't render if the license is invalid. - Fix server security check to be more precise by checking if ES has security disabled. * Render timestamp for autofollow errors. --- .eslintrc.js | 2 +- .sass-lint.yml | 1 + x-pack/.i18nrc.json | 2 +- x-pack/index.js | 2 - .../common/constants/base_path.ts | 11 - .../common/constants/index.ts | 10 - .../common/constants/settings.ts | 18 - .../follower_index_serialization.test.js.snap | 128 ------- .../auto_follow_pattern_serialization.js | 41 -- .../follower_index_serialization.test.js | 175 --------- .../fixtures/auto_follow_pattern.js | 49 --- .../fixtures/es_errors.js | 45 --- .../fixtures/follower_index.js | 216 ----------- .../fixtures/index.js | 16 - .../cross_cluster_replication/index.js | 57 --- .../public/index.scss | 13 - .../public/main.html | 3 - .../public/np_ready/app/_app.scss | 14 - .../public/np_ready/app/index.js | 25 -- .../app/services/documentation_links.ts | 22 -- .../np_ready/app/services/notifications.ts | 20 - .../np_ready/app/services/track_ui_metric.js | 27 -- .../np_ready/extend_index_management.ts | 28 -- .../public/np_ready/plugin.ts | 44 --- .../public/register_routes.js | 94 ----- .../cross_cluster_replication_data.ts | 36 -- .../server/np_ready/index.ts | 11 - .../call_with_request_factory.js | 20 - .../lib/call_with_request_factory/index.js | 7 - .../lib/check_license/check_license.js | 70 ---- .../__tests__/wrap_es_error.test.js | 33 -- .../__tests__/is_es_error_factory.js | 44 --- .../is_es_error_factory.ts | 18 - .../license_pre_routing_factory.test.ts | 64 ---- .../license_pre_routing_factory.ts | 32 -- .../lib/register_license_checker/index.js | 7 - .../register_license_checker.js | 21 -- .../server/np_ready/plugin.ts | 38 -- .../api/__jest__/auto_follow_pattern.test.js | 330 ---------------- .../api/__jest__/follower_index.test.js | 312 --------------- .../np_ready/routes/api/__jest__/helpers.ts | 37 -- .../routes/api/auto_follow_pattern.ts | 301 --------------- .../server/np_ready/routes/api/ccr.ts | 112 ------ .../np_ready/routes/api/follower_index.ts | 357 ------------------ .../routes/map_to_kibana_http_error.ts | 26 -- .../server/np_ready/routes/types.ts | 13 - .../common/constants/index.ts | 44 +++ .../follower_index_serialization.test.ts.snap | 128 +++++++ ...auto_follow_pattern_serialization.test.ts} | 16 +- .../auto_follow_pattern_serialization.ts | 38 ++ .../follower_index_serialization.test.ts | 224 +++++++++++ .../services/follower_index_serialization.ts} | 27 +- .../common/services/utils.test.ts} | 0 .../common/services/utils.ts} | 11 +- .../cross_cluster_replication/common/types.ts | 186 +++++++++ .../cross_cluster_replication/kibana.json | 17 + .../auto_follow_pattern_add.test.js | 7 +- .../auto_follow_pattern_edit.test.js | 6 +- .../auto_follow_pattern_list.test.js | 15 +- .../fixtures/auto_follow_pattern.ts | 28 ++ .../fixtures/follower_index.ts | 70 ++++ .../follower_index_add.test.js | 9 +- .../follower_index_edit.test.js | 8 +- .../follower_indices_list.test.js | 6 +- .../auto_follow_pattern_add.helpers.js | 6 +- .../auto_follow_pattern_edit.helpers.js | 6 +- .../auto_follow_pattern_list.helpers.js | 6 +- .../client_integration/helpers/constants.js | 0 .../helpers/follower_index_add.helpers.js | 6 +- .../helpers/follower_index_edit.helpers.js | 6 +- .../helpers/follower_index_list.helpers.js | 6 +- .../helpers/home.helpers.js | 8 +- .../helpers/http_requests.js | 0 .../client_integration/helpers/index.js | 0 .../helpers/setup_environment.js | 2 +- .../__jest__/client_integration/home.test.js | 6 +- .../mocks}/breadcrumbs.mock.ts | 4 +- .../client_integration/mocks}/index.ts | 3 +- .../mocks/track_ui_metric.mock.ts | 13 + .../public/app/app.tsx} | 42 +-- .../auto_follow_pattern_form.test.js.snap | 0 ...to_follow_pattern_action_menu.container.ts | 0 .../auto_follow_pattern_action_menu.tsx | 2 +- .../auto_follow_pattern_action_menu/index.ts | 0 .../auto_follow_pattern_delete_provider.d.ts | 0 .../auto_follow_pattern_delete_provider.js | 2 +- .../components/auto_follow_pattern_form.js | 12 +- .../auto_follow_pattern_form.test.js | 0 .../auto_follow_pattern_indices_preview.js | 0 .../auto_follow_pattern_page_title.js | 0 .../auto_follow_pattern_request_flyout.js | 2 +- .../follower_index_form.test.js.snap | 0 .../advanced_settings_fields.js | 0 .../follower_index_form.js | 4 +- .../follower_index_form.test.js | 0 .../follower_index_request_flyout.js | 2 +- .../components/follower_index_form/index.js | 0 .../components/follower_index_page_title.js | 0 .../follower_index_pause_provider.js | 2 +- .../follower_index_resume_provider.js | 4 +- .../follower_index_unfollow_provider.js | 2 +- .../public}/app/components/form_entry_row.js | 0 .../public/app/components/index.d.ts} | 2 +- .../public}/app/components/index.js | 0 .../components/remote_clusters_form_field.js | 4 +- .../components/remote_clusters_provider.js | 0 .../public}/app/components/section_error.js | 0 .../public}/app/components/section_loading.js | 0 .../app/components/section_unauthorized.js | 0 .../public/app/constants/api.ts} | 0 .../public/app/constants/index.ts} | 0 .../public/app/constants/sections.ts} | 0 .../public/app/constants/ui_metric.ts} | 0 .../public/app/index.tsx | 52 +++ .../auto_follow_pattern_add.container.js | 0 .../auto_follow_pattern_add.js | 0 .../sections/auto_follow_pattern_add/index.js | 0 .../auto_follow_pattern_edit.container.js | 19 +- .../auto_follow_pattern_edit.js | 2 +- .../auto_follow_pattern_edit/index.js | 0 .../follower_index_add.container.js | 0 .../follower_index_add/follower_index_add.js | 0 .../app/sections/follower_index_add/index.js | 0 .../follower_index_edit.container.js | 0 .../follower_index_edit.js | 2 +- .../app/sections/follower_index_edit/index.js | 0 .../auto_follow_pattern_list.container.js | 0 .../auto_follow_pattern_list.js | 2 +- .../auto_follow_pattern_table.container.js | 0 .../auto_follow_pattern_table.js | 6 +- .../auto_follow_pattern_table/index.js | 0 .../detail_panel/detail_panel.container.js | 0 .../components/detail_panel/detail_panel.js | 5 +- .../components/detail_panel/index.js | 0 .../components/index.js | 0 .../home/auto_follow_pattern_list/index.js | 0 .../components/context_menu/context_menu.js | 2 +- .../components/context_menu/index.js | 0 .../detail_panel/detail_panel.container.js | 0 .../components/detail_panel/detail_panel.js | 3 +- .../components/detail_panel/index.js | 0 .../follower_indices_table.container.js | 0 .../follower_indices_table.js | 6 +- .../follower_indices_table/index.js | 0 .../follower_indices_list/components/index.js | 0 .../follower_indices_list.container.js | 0 .../follower_indices_list.js | 2 +- .../home/follower_indices_list/index.js | 0 .../app/sections/home/home.container.js | 0 .../public}/app/sections/home/home.js | 4 +- .../public}/app/sections/home/index.js | 0 .../public/app/sections/index.d.ts} | 9 +- .../public}/app/sections/index.js | 0 ...uto_follow_pattern_validators.test.js.snap | 0 .../public}/app/services/api.js | 4 +- .../app/services/auto_follow_errors.js | 3 +- .../app/services/auto_follow_errors.test.js | 0 .../app/services/auto_follow_pattern.js | 0 .../app/services/auto_follow_pattern.test.js | 0 .../auto_follow_pattern_validators.js | 4 +- .../auto_follow_pattern_validators.test.js | 0 .../public}/app/services/breadcrumbs.ts | 22 +- .../app/services/documentation_links.ts | 16 + .../follower_index_default_settings.js | 2 +- .../app/services/get_remote_cluster_name.js | 0 .../public}/app/services/input_validation.js | 2 +- .../public/app/services/notifications.ts | 18 + .../public}/app/services/query_params.js | 0 .../public/app/services/routing.d.ts} | 2 +- .../public}/app/services/routing.js | 13 +- .../public/app/services/track_ui_metric.ts | 37 ++ .../public}/app/services/utils.js | 0 .../public}/app/services/utils.test.js | 0 .../public}/app/store/action_types.js | 0 .../public}/app/store/actions/api.js | 0 .../app/store/actions/auto_follow_pattern.js | 18 +- .../public}/app/store/actions/ccr.js | 0 .../app/store/actions/follower_index.js | 21 +- .../public}/app/store/actions/index.js | 0 .../public/app/store/index.d.ts} | 2 +- .../public}/app/store/index.js | 0 .../public}/app/store/reducers/api.js | 0 .../public}/app/store/reducers/api.test.js | 0 .../app/store/reducers/auto_follow_pattern.js | 0 .../app/store/reducers/follower_index.js | 0 .../public}/app/store/reducers/index.js | 0 .../public}/app/store/reducers/stats.js | 0 .../public}/app/store/selectors/index.js | 0 .../public}/app/store/store.js | 0 .../public}/index.ts | 5 +- .../public/plugin.ts | 102 +++++ .../cross_cluster_replication/public/types.ts | 25 ++ .../server/client/elasticsearch_ccr.ts} | 2 +- .../server/config.ts | 16 + .../cross_cluster_replication/server/index.ts | 19 + .../ccr_stats_serialization.test.ts.snap} | 2 + .../lib/ccr_stats_serialization.test.ts} | 2 + .../server/lib/ccr_stats_serialization.ts} | 19 +- .../server/lib/format_es_error.ts} | 13 + .../server}/lib/is_es_error.ts | 0 .../server/plugin.ts | 139 +++++++ .../routes/api/auto_follow_pattern/index.ts | 24 ++ .../register_create_route.test.ts | 74 ++++ .../register_create_route.ts | 77 ++++ .../register_delete_route.test.ts | 87 +++++ .../register_delete_route.ts | 67 ++++ .../register_fetch_route.test.ts | 69 ++++ .../register_fetch_route.ts | 43 +++ .../register_get_route.test.ts | 67 ++++ .../auto_follow_pattern/register_get_route.ts | 54 +++ .../register_pause_route.test.ts | 86 +++++ .../register_pause_route.ts | 66 ++++ .../register_resume_route.test.ts | 86 +++++ .../register_resume_route.ts | 66 ++++ .../register_update_route.test.ts | 64 ++++ .../register_update_route.ts | 60 +++ .../api/cross_cluster_replication/index.ts | 14 + .../register_permissions_route.ts | 70 ++++ .../register_stats_route.ts | 42 +++ .../server/routes/api/follower_index/index.ts | 24 ++ .../register_create_route.test.ts | 54 +++ .../follower_index/register_create_route.ts | 65 ++++ .../register_fetch_route.test.ts | 160 ++++++++ .../follower_index/register_fetch_route.ts | 62 +++ .../follower_index/register_get_route.test.ts | 159 ++++++++ .../api/follower_index/register_get_route.ts | 78 ++++ .../register_pause_route.test.ts | 86 +++++ .../follower_index/register_pause_route.ts | 64 ++++ .../register_resume_route.test.ts | 86 +++++ .../follower_index/register_resume_route.ts | 64 ++++ .../register_unfollow_route.test.ts | 109 ++++++ .../follower_index/register_unfollow_route.ts | 95 +++++ .../follower_index/register_update_route.ts | 93 +++++ .../server/routes/api/test_lib.ts | 23 ++ .../server/routes/index.ts} | 13 +- .../server/services/add_base_path.ts} | 6 +- .../server/services}/index.ts | 3 +- .../server/services/license.ts | 93 +++++ .../cross_cluster_replication/server/types.ts | 28 ++ .../application/services/notification.ts | 8 +- .../plugins/remote_clusters/public/index.ts | 3 + .../plugins/remote_clusters/public/plugin.ts | 11 +- .../plugins/remote_clusters/server/index.ts | 1 + .../plugins/remote_clusters/server/plugin.ts | 18 +- .../translations/translations/ja-JP.json | 9 +- .../translations/translations/zh-CN.json | 9 +- .../auto_follow_pattern.helpers.js | 20 +- .../auto_follow_pattern.js | 57 +-- .../cross_cluster_replication/fixtures.js | 7 - .../follower_indices.js | 8 +- .../management/index_management/indices.js | 8 +- 251 files changed, 3972 insertions(+), 3234 deletions(-) delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/index.scss delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/main.html delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts delete mode 100644 x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts create mode 100644 x-pack/plugins/cross_cluster_replication/common/constants/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js => plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts} (85%) create mode 100644 x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts create mode 100644 x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js => plugins/cross_cluster_replication/common/services/follower_index_serialization.ts} (87%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/utils.test.js => plugins/cross_cluster_replication/common/services/utils.test.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/services/utils.js => plugins/cross_cluster_replication/common/services/utils.ts} (62%) create mode 100644 x-pack/plugins/cross_cluster_replication/common/types.ts create mode 100644 x-pack/plugins/cross_cluster_replication/kibana.json rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/auto_follow_pattern_add.test.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/auto_follow_pattern_edit.test.js (95%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/auto_follow_pattern_list.test.js (97%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts create mode 100644 x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/follower_index_add.test.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/follower_index_edit.test.js (95%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/follower_indices_list.test.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js (76%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js (82%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js (92%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/constants.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/follower_index_add.helpers.js (79%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/follower_index_edit.helpers.js (84%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/follower_index_list.helpers.js (90%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/home.helpers.js (68%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/http_requests.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/helpers/setup_environment.js (91%) rename x-pack/{legacy/plugins/cross_cluster_replication => plugins/cross_cluster_replication/public}/__jest__/client_integration/home.test.js (93%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/services => plugins/cross_cluster_replication/public/__jest__/client_integration/mocks}/breadcrumbs.mock.ts (70%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory => plugins/cross_cluster_replication/public/__jest__/client_integration/mocks}/index.ts (79%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js => plugins/cross_cluster_replication/public/app/app.tsx} (89%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/__snapshots__/auto_follow_pattern_form.test.js.snap (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_action_menu/auto_follow_pattern_action_menu.container.ts (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_action_menu/auto_follow_pattern_action_menu.tsx (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_action_menu/index.ts (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_delete_provider.d.ts (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_delete_provider.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_form.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_form.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_indices_preview.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_page_title.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/auto_follow_pattern_request_flyout.js (96%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/__snapshots__/follower_index_form.test.js.snap (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/advanced_settings_fields.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/follower_index_form.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/follower_index_form.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/follower_index_request_flyout.js (96%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_form/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_page_title.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_pause_provider.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_resume_provider.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/follower_index_unfollow_provider.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/form_entry_row.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/index.ts => plugins/cross_cluster_replication/public/app/components/index.d.ts} (83%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/remote_clusters_form_field.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/remote_clusters_provider.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/section_error.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/section_loading.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/components/section_unauthorized.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/api.js => plugins/cross_cluster_replication/public/app/constants/api.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/index.js => plugins/cross_cluster_replication/public/app/constants/index.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/sections.js => plugins/cross_cluster_replication/public/app/constants/sections.ts} (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/ui_metric.js => plugins/cross_cluster_replication/public/app/constants/ui_metric.ts} (100%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/index.tsx rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_add/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js (80%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/auto_follow_pattern_edit/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_add/follower_index_add.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_add/follower_index_add.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_add/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_edit/follower_index_edit.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_edit/follower_index_edit.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/follower_index_edit/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/detail_panel/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/components/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/auto_follow_pattern_list/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/context_menu/context_menu.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/context_menu/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/detail_panel/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/follower_indices_table/follower_indices_table.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/follower_indices_table/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/components/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/follower_indices_list.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/follower_indices_list.js (99%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/follower_indices_list/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/home.container.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/home.js (96%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/home/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/constants/app.ts => plugins/cross_cluster_replication/public/app/sections/index.d.ts} (50%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/sections/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/__snapshots__/auto_follow_pattern_validators.test.js.snap (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/api.js (98%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_errors.js (92%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_errors.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern_validators.js (97%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/auto_follow_pattern_validators.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/breadcrumbs.ts (62%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/services/documentation_links.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/follower_index_default_settings.js (89%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/get_remote_cluster_name.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/input_validation.js (97%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/services/notifications.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/query_params.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/index.js => plugins/cross_cluster_replication/public/app/services/routing.d.ts} (87%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/routing.js (93%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/app/services/track_ui_metric.ts rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/utils.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/services/utils.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/action_types.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/api.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/auto_follow_pattern.js (95%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/ccr.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/follower_index.js (94%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/actions/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/index.js => plugins/cross_cluster_replication/public/app/store/index.d.ts} (83%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/api.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/api.test.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/auto_follow_pattern.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/follower_index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/reducers/stats.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/selectors/index.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/app/store/store.js (100%) rename x-pack/{legacy/plugins/cross_cluster_replication/public/np_ready => plugins/cross_cluster_replication/public}/index.ts (61%) create mode 100644 x-pack/plugins/cross_cluster_replication/public/plugin.ts create mode 100644 x-pack/plugins/cross_cluster_replication/public/types.ts rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/client/elasticsearch_ccr.js => plugins/cross_cluster_replication/server/client/elasticsearch_ccr.ts} (97%) create mode 100644 x-pack/plugins/cross_cluster_replication/server/config.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/index.ts rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/__snapshots__/ccr_stats_serialization.test.js.snap => plugins/cross_cluster_replication/server/lib/__snapshots__/ccr_stats_serialization.test.ts.snap} (93%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.test.js => plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.test.ts} (95%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.js => plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts} (77%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/wrap_es_error.ts => plugins/cross_cluster_replication/server/lib/format_es_error.ts} (90%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready => plugins/cross_cluster_replication/server}/lib/is_es_error.ts (100%) create mode 100644 x-pack/plugins/cross_cluster_replication/server/plugin.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_permissions_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_stats_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/index.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.test.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_update_route.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/routes/register_routes.ts => plugins/cross_cluster_replication/server/routes/index.ts} (52%) rename x-pack/{legacy/plugins/cross_cluster_replication/common/constants/plugin.ts => plugins/cross_cluster_replication/server/services/add_base_path.ts} (64%) rename x-pack/{legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory => plugins/cross_cluster_replication/server/services}/index.ts (74%) create mode 100644 x-pack/plugins/cross_cluster_replication/server/services/license.ts create mode 100644 x-pack/plugins/cross_cluster_replication/server/types.ts diff --git a/.eslintrc.js b/.eslintrc.js index a2b8ae7622d0b0..b3a1274d1cbeba 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -96,7 +96,7 @@ module.exports = { }, }, { - files: ['x-pack/legacy/plugins/cross_cluster_replication/**/*.{js,ts,tsx}'], + files: ['x-pack/plugins/cross_cluster_replication/**/*.{js,ts,tsx}'], rules: { 'jsx-a11y/click-events-have-key-events': 'off', }, diff --git a/.sass-lint.yml b/.sass-lint.yml index 5c2c88a1dad5dc..89735342a2d6f7 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml @@ -9,6 +9,7 @@ files: - 'x-pack/legacy/plugins/canvas/**/*.s+(a|c)ss' - 'x-pack/plugins/triggers_actions_ui/**/*.s+(a|c)ss' - 'x-pack/plugins/lens/**/*.s+(a|c)ss' + - 'x-pack/plugins/cross_cluster_replication/**/*.s+(a|c)ss' - 'x-pack/legacy/plugins/maps/**/*.s+(a|c)ss' - 'x-pack/plugins/maps/**/*.s+(a|c)ss' ignore: diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index c8715ac3447bd8..8e5563e4ff674e 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -8,7 +8,7 @@ "xpack.apm": ["legacy/plugins/apm", "plugins/apm"], "xpack.beatsManagement": "legacy/plugins/beats_management", "xpack.canvas": "legacy/plugins/canvas", - "xpack.crossClusterReplication": "legacy/plugins/cross_cluster_replication", + "xpack.crossClusterReplication": "plugins/cross_cluster_replication", "xpack.dashboardMode": "legacy/plugins/dashboard_mode", "xpack.data": "plugins/data_enhanced", "xpack.drilldowns": "plugins/drilldowns", diff --git a/x-pack/index.js b/x-pack/index.js index 1a78c24b1221bc..43ae5c3e5c5dd6 100644 --- a/x-pack/index.js +++ b/x-pack/index.js @@ -21,7 +21,6 @@ import { taskManager } from './legacy/plugins/task_manager'; import { rollup } from './legacy/plugins/rollup'; import { siem } from './legacy/plugins/siem'; import { remoteClusters } from './legacy/plugins/remote_clusters'; -import { crossClusterReplication } from './legacy/plugins/cross_cluster_replication'; import { upgradeAssistant } from './legacy/plugins/upgrade_assistant'; import { uptime } from './legacy/plugins/uptime'; import { encryptedSavedObjects } from './legacy/plugins/encrypted_saved_objects'; @@ -49,7 +48,6 @@ module.exports = function(kibana) { rollup(kibana), siem(kibana), remoteClusters(kibana), - crossClusterReplication(kibana), upgradeAssistant(kibana), uptime(kibana), encryptedSavedObjects(kibana), diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts b/x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts deleted file mode 100644 index 0a948793e07dbc..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/base_path.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const BASE_PATH = '/management/elasticsearch/cross_cluster_replication'; -export const BASE_PATH_REMOTE_CLUSTERS = '/management/elasticsearch/remote_clusters'; -export const API_BASE_PATH = '/api/cross_cluster_replication'; -export const API_REMOTE_CLUSTERS_BASE_PATH = '/api/remote_clusters'; -export const API_INDEX_MANAGEMENT_BASE_PATH = '/api/index_management'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts b/x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts deleted file mode 100644 index 300afb4e2d2fff..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export * from './plugin'; -export * from './base_path'; -export * from './app'; -export * from './settings'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts b/x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts deleted file mode 100644 index 0993a74c8f1fd1..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/settings.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const FOLLOWER_INDEX_ADVANCED_SETTINGS = { - maxReadRequestOperationCount: 5120, - maxOutstandingReadRequests: 12, - maxReadRequestSize: '32mb', - maxWriteRequestOperationCount: 5120, - maxWriteRequestSize: '9223372036854775807b', - maxOutstandingWriteRequests: 9, - maxWriteBufferCount: 2147483647, - maxWriteBufferSize: '512mb', - maxRetryDelay: '500ms', - readPollTimeout: '1m', -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap b/x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap deleted file mode 100644 index d001459e8234d5..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.js.snap +++ /dev/null @@ -1,128 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`[CCR] follower index serialization deserializeFollowerIndex() deserializes Elasticsearch follower index object 1`] = ` -Object { - "leaderIndex": undefined, - "maxOutstandingReadRequests": undefined, - "maxOutstandingWriteRequests": undefined, - "maxReadRequestOperationCount": undefined, - "maxReadRequestSize": undefined, - "maxRetryDelay": undefined, - "maxWriteBufferCount": undefined, - "maxWriteBufferSize": undefined, - "maxWriteRequestOperationCount": undefined, - "maxWriteRequestSize": undefined, - "name": undefined, - "readPollTimeout": undefined, - "remoteCluster": undefined, - "shards": Array [ - Object { - "bytesReadCount": undefined, - "failedReadRequestsCount": undefined, - "failedWriteRequestsCount": undefined, - "followerGlobalCheckpoint": undefined, - "followerMappingVersion": undefined, - "followerMaxSequenceNum": undefined, - "followerSettingsVersion": undefined, - "id": "shard 1", - "lastRequestedSequenceNum": undefined, - "leaderGlobalCheckpoint": undefined, - "leaderIndex": undefined, - "leaderMaxSequenceNum": undefined, - "operationsReadCount": undefined, - "operationsWrittenCount": undefined, - "outstandingReadRequestsCount": undefined, - "outstandingWriteRequestsCount": undefined, - "readExceptions": undefined, - "remoteCluster": undefined, - "successfulReadRequestCount": undefined, - "successfulWriteRequestsCount": undefined, - "timeSinceLastReadMs": undefined, - "totalReadRemoteExecTimeMs": undefined, - "totalReadTimeMs": undefined, - "totalWriteTimeMs": undefined, - "writeBufferOperationsCount": undefined, - "writeBufferSizeBytes": undefined, - }, - Object { - "bytesReadCount": undefined, - "failedReadRequestsCount": undefined, - "failedWriteRequestsCount": undefined, - "followerGlobalCheckpoint": undefined, - "followerMappingVersion": undefined, - "followerMaxSequenceNum": undefined, - "followerSettingsVersion": undefined, - "id": "shard 2", - "lastRequestedSequenceNum": undefined, - "leaderGlobalCheckpoint": undefined, - "leaderIndex": undefined, - "leaderMaxSequenceNum": undefined, - "operationsReadCount": undefined, - "operationsWrittenCount": undefined, - "outstandingReadRequestsCount": undefined, - "outstandingWriteRequestsCount": undefined, - "readExceptions": undefined, - "remoteCluster": undefined, - "successfulReadRequestCount": undefined, - "successfulWriteRequestsCount": undefined, - "timeSinceLastReadMs": undefined, - "totalReadRemoteExecTimeMs": undefined, - "totalReadTimeMs": undefined, - "totalWriteTimeMs": undefined, - "writeBufferOperationsCount": undefined, - "writeBufferSizeBytes": undefined, - }, - ], - "status": "active", -} -`; - -exports[`[CCR] follower index serialization deserializeShard() deserializes shard 1`] = ` -Object { - "bytesReadCount": "bytes read", - "failedReadRequestsCount": "failed read requests", - "failedWriteRequestsCount": "failed write requests", - "followerGlobalCheckpoint": "follower global checkpoint", - "followerMappingVersion": "follower mapping version", - "followerMaxSequenceNum": "follower max seq no", - "followerSettingsVersion": "follower settings version", - "id": "shard id", - "lastRequestedSequenceNum": "last requested seq no", - "leaderGlobalCheckpoint": "leader global checkpoint", - "leaderIndex": "leader index", - "leaderMaxSequenceNum": "leader max seq no", - "operationsReadCount": "operations read", - "operationsWrittenCount": "operations written", - "outstandingReadRequestsCount": "outstanding read requests", - "outstandingWriteRequestsCount": "outstanding write requests", - "readExceptions": Array [ - "read exception", - ], - "remoteCluster": "remote cluster", - "successfulReadRequestCount": "successful read requests", - "successfulWriteRequestsCount": "successful write requests", - "timeSinceLastReadMs": "time since last read millis", - "totalReadRemoteExecTimeMs": "total read remote exec time millis", - "totalReadTimeMs": "total read time millis", - "totalWriteTimeMs": "total write time millis", - "writeBufferOperationsCount": "write buffer operation count", - "writeBufferSizeBytes": "write buffer size in bytes", -} -`; - -exports[`[CCR] follower index serialization serializeFollowerIndex() serializes object to Elasticsearch follower index object 1`] = ` -Object { - "leader_index": "leader index", - "max_outstanding_read_requests": "foo", - "max_outstanding_write_requests": "foo", - "max_read_request_operation_count": "foo", - "max_read_request_size": "foo", - "max_retry_delay": "foo", - "max_write_buffer_count": "foo", - "max_write_buffer_size": "foo", - "max_write_request_operation_count": "foo", - "max_write_request_size": "foo", - "read_poll_timeout": "foo", - "remote_cluster": "remote cluster", -} -`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js b/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js deleted file mode 100644 index ae13c625a7d801..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.js +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export const deserializeAutoFollowPattern = ( - { - name, - pattern: { - active, - // eslint-disable-next-line camelcase - remote_cluster, - // eslint-disable-next-line camelcase - leader_index_patterns, - // eslint-disable-next-line camelcase - follow_index_pattern, - }, - } = { - pattern: {}, - } -) => ({ - name, - active, - remoteCluster: remote_cluster, - leaderIndexPatterns: leader_index_patterns, - followIndexPattern: follow_index_pattern, -}); - -export const deserializeListAutoFollowPatterns = autoFollowPatterns => - autoFollowPatterns.map(deserializeAutoFollowPattern); - -export const serializeAutoFollowPattern = ({ - remoteCluster, - leaderIndexPatterns, - followIndexPattern, -}) => ({ - remote_cluster: remoteCluster, - leader_index_patterns: leaderIndexPatterns, - follow_index_pattern: followIndexPattern, -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js b/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js deleted file mode 100644 index e1df917d899ad8..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.js +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - deserializeShard, - deserializeFollowerIndex, - deserializeListFollowerIndices, - serializeFollowerIndex, -} from './follower_index_serialization'; - -describe('[CCR] follower index serialization', () => { - describe('deserializeShard()', () => { - it('deserializes shard', () => { - const serializedShard = { - remote_cluster: 'remote cluster', - leader_index: 'leader index', - shard_id: 'shard id', - leader_global_checkpoint: 'leader global checkpoint', - leader_max_seq_no: 'leader max seq no', - follower_global_checkpoint: 'follower global checkpoint', - follower_max_seq_no: 'follower max seq no', - last_requested_seq_no: 'last requested seq no', - outstanding_read_requests: 'outstanding read requests', - outstanding_write_requests: 'outstanding write requests', - write_buffer_operation_count: 'write buffer operation count', - write_buffer_size_in_bytes: 'write buffer size in bytes', - follower_mapping_version: 'follower mapping version', - follower_settings_version: 'follower settings version', - total_read_time_millis: 'total read time millis', - total_read_remote_exec_time_millis: 'total read remote exec time millis', - successful_read_requests: 'successful read requests', - failed_read_requests: 'failed read requests', - operations_read: 'operations read', - bytes_read: 'bytes read', - total_write_time_millis: 'total write time millis', - successful_write_requests: 'successful write requests', - failed_write_requests: 'failed write requests', - operations_written: 'operations written', - read_exceptions: ['read exception'], - time_since_last_read_millis: 'time since last read millis', - }; - - expect(deserializeShard(serializedShard)).toMatchSnapshot(); - }); - }); - - describe('deserializeFollowerIndex()', () => { - it('deserializes Elasticsearch follower index object', () => { - const serializedFollowerIndex = { - index: 'follower index name', - status: 'active', - shards: [ - { - shard_id: 'shard 1', - }, - { - shard_id: 'shard 2', - }, - ], - }; - - expect(deserializeFollowerIndex(serializedFollowerIndex)).toMatchSnapshot(); - }); - }); - - describe('deserializeListFollowerIndices()', () => { - it('deserializes list of Elasticsearch follower index objects', () => { - const serializedFollowerIndexList = [ - { - follower_index: 'follower index 1', - remote_cluster: 'cluster 1', - leader_index: 'leader 1', - status: 'active', - parameters: { - max_read_request_operation_count: 1, - max_outstanding_read_requests: 1, - max_read_request_size: 1, - max_write_request_operation_count: 1, - max_write_request_size: 1, - max_outstanding_write_requests: 1, - max_write_buffer_count: 1, - max_write_buffer_size: 1, - max_retry_delay: 1, - read_poll_timeout: 1, - }, - shards: [], - }, - { - follower_index: 'follower index 2', - remote_cluster: 'cluster 2', - leader_index: 'leader 2', - status: 'paused', - parameters: { - max_read_request_operation_count: 2, - max_outstanding_read_requests: 2, - max_read_request_size: 2, - max_write_request_operation_count: 2, - max_write_request_size: 2, - max_outstanding_write_requests: 2, - max_write_buffer_count: 2, - max_write_buffer_size: 2, - max_retry_delay: 2, - read_poll_timeout: 2, - }, - shards: [], - }, - ]; - - const deserializedFollowerIndexList = [ - { - name: 'follower index 1', - remoteCluster: 'cluster 1', - leaderIndex: 'leader 1', - status: 'active', - maxReadRequestOperationCount: 1, - maxOutstandingReadRequests: 1, - maxReadRequestSize: 1, - maxWriteRequestOperationCount: 1, - maxWriteRequestSize: 1, - maxOutstandingWriteRequests: 1, - maxWriteBufferCount: 1, - maxWriteBufferSize: 1, - maxRetryDelay: 1, - readPollTimeout: 1, - shards: [], - }, - { - name: 'follower index 2', - remoteCluster: 'cluster 2', - leaderIndex: 'leader 2', - status: 'paused', - maxReadRequestOperationCount: 2, - maxOutstandingReadRequests: 2, - maxReadRequestSize: 2, - maxWriteRequestOperationCount: 2, - maxWriteRequestSize: 2, - maxOutstandingWriteRequests: 2, - maxWriteBufferCount: 2, - maxWriteBufferSize: 2, - maxRetryDelay: 2, - readPollTimeout: 2, - shards: [], - }, - ]; - - expect(deserializeListFollowerIndices(serializedFollowerIndexList)).toEqual( - deserializedFollowerIndexList - ); - }); - }); - - describe('serializeFollowerIndex()', () => { - it('serializes object to Elasticsearch follower index object', () => { - const deserializedFollowerIndex = { - remoteCluster: 'remote cluster', - leaderIndex: 'leader index', - maxReadRequestOperationCount: 'foo', - maxOutstandingReadRequests: 'foo', - maxReadRequestSize: 'foo', - maxWriteRequestOperationCount: 'foo', - maxWriteRequestSize: 'foo', - maxOutstandingWriteRequests: 'foo', - maxWriteBufferCount: 'foo', - maxWriteBufferSize: 'foo', - maxRetryDelay: 'foo', - readPollTimeout: 'foo', - }; - - expect(serializeFollowerIndex(deserializedFollowerIndex)).toMatchSnapshot(); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js deleted file mode 100644 index 804fe80cd27b40..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/auto_follow_pattern.js +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { getRandomString } from '../../../../test_utils'; - -export const getAutoFollowPatternMock = ( - name = getRandomString(), - remoteCluster = getRandomString(), - leaderIndexPatterns = [getRandomString()], - followIndexPattern = getRandomString() -) => ({ - name, - pattern: { - remote_cluster: remoteCluster, - leader_index_patterns: leaderIndexPatterns, - follow_index_pattern: followIndexPattern, - }, -}); - -export const getAutoFollowPatternListMock = (total = 3) => { - const list = { - patterns: [], - }; - - let i = total; - while (i--) { - list.patterns.push(getAutoFollowPatternMock()); - } - - return list; -}; - -// ----------------- -// Client test mock -// ----------------- -export const getAutoFollowPatternClientMock = ({ - name = getRandomString(), - remoteCluster = getRandomString(), - leaderIndexPatterns = [`${getRandomString()}-*`], - followIndexPattern = getRandomString(), -}) => ({ - name, - remoteCluster, - leaderIndexPatterns, - followIndexPattern, -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js deleted file mode 100644 index a042375e827151..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/es_errors.js +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -/** - * Errors mocks to throw during development to help visualizing - * the different flows in the UI - * - * TODO: Consult the ES team and make sure the error shapes are correct - * for each statusCode. - */ - -const error400 = new Error('Something went wrong'); -error400.statusCode = 400; -error400.response = ` - { - "error": { - "root_cause": [ - { - "type": "x_content_parse_exception", - "reason": "[2:3] [put_auto_follow_pattern_request] unknown field [remote_clusterxxxxx], parser not found" - } - ], - "type": "x_content_parse_exception", - "reason": "[2:3] [put_auto_follow_pattern_request] unknown field [remote_clusterxxxxx], parser not found" - }, - "status": 400 -}`; - -const error403 = new Error('Unauthorized'); -error403.statusCode = 403; -error403.response = ` - { - "acknowledged": true, - "trial_was_started": false, - "error_message": "Operation failed: Trial was already activated." - } -`; - -export const esErrors = { - 400: error400, - 403: error403, -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js deleted file mode 100644 index 6c535a665978c1..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/follower_index.js +++ /dev/null @@ -1,216 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -const Chance = require('chance'); // eslint-disable-line import/no-extraneous-dependencies -const chance = new Chance(); -import { getRandomString } from '../../../../test_utils'; - -const serializeShard = ({ - id, - remoteCluster, - leaderIndex, - leaderGlobalCheckpoint, - leaderMaxSequenceNum, - followerGlobalCheckpoint, - followerMaxSequenceNum, - lastRequestedSequenceNum, - outstandingReadRequestsCount, - outstandingWriteRequestsCount, - writeBufferOperationsCount, - writeBufferSizeBytes, - followerMappingVersion, - followerSettingsVersion, - totalReadTimeMs, - totalReadRemoteExecTimeMs, - successfulReadRequestCount, - failedReadRequestsCount, - operationsReadCount, - bytesReadCount, - totalWriteTimeMs, - successfulWriteRequestsCount, - failedWriteRequestsCount, - operationsWrittenCount, - readExceptions, - timeSinceLastReadMs, -}) => ({ - shard_id: id, - remote_cluster: remoteCluster, - leader_index: leaderIndex, - leader_global_checkpoint: leaderGlobalCheckpoint, - leader_max_seq_no: leaderMaxSequenceNum, - follower_global_checkpoint: followerGlobalCheckpoint, - follower_max_seq_no: followerMaxSequenceNum, - last_requested_seq_no: lastRequestedSequenceNum, - outstanding_read_requests: outstandingReadRequestsCount, - outstanding_write_requests: outstandingWriteRequestsCount, - write_buffer_operation_count: writeBufferOperationsCount, - write_buffer_size_in_bytes: writeBufferSizeBytes, - follower_mapping_version: followerMappingVersion, - follower_settings_version: followerSettingsVersion, - total_read_time_millis: totalReadTimeMs, - total_read_remote_exec_time_millis: totalReadRemoteExecTimeMs, - successful_read_requests: successfulReadRequestCount, - failed_read_requests: failedReadRequestsCount, - operations_read: operationsReadCount, - bytes_read: bytesReadCount, - total_write_time_millis: totalWriteTimeMs, - successful_write_requests: successfulWriteRequestsCount, - failed_write_requests: failedWriteRequestsCount, - operations_written: operationsWrittenCount, - read_exceptions: readExceptions, - time_since_last_read_millis: timeSinceLastReadMs, -}); - -export const getFollowerIndexStatsMock = ( - name = chance.string(), - shards = [ - { - id: chance.string(), - remoteCluster: chance.string(), - leaderIndex: chance.string(), - leaderGlobalCheckpoint: chance.integer(), - leaderMaxSequenceNum: chance.integer(), - followerGlobalCheckpoint: chance.integer(), - followerMaxSequenceNum: chance.integer(), - lastRequestedSequenceNum: chance.integer(), - outstandingReadRequestsCount: chance.integer(), - outstandingWriteRequestsCount: chance.integer(), - writeBufferOperationsCount: chance.integer(), - writeBufferSizeBytes: chance.integer(), - followerMappingVersion: chance.integer(), - followerSettingsVersion: chance.integer(), - totalReadTimeMs: chance.integer(), - totalReadRemoteExecTimeMs: chance.integer(), - successfulReadRequestCount: chance.integer(), - failedReadRequestsCount: chance.integer(), - operationsReadCount: chance.integer(), - bytesReadCount: chance.integer(), - totalWriteTimeMs: chance.integer(), - successfulWriteRequestsCount: chance.integer(), - failedWriteRequestsCount: chance.integer(), - operationsWrittenCount: chance.integer(), - readExceptions: [chance.string()], - timeSinceLastReadMs: chance.integer(), - }, - ] -) => ({ - index: name, - shards: shards.map(serializeShard), -}); - -export const getFollowerIndexListStatsMock = (total = 3, names) => { - const list = { - follow_stats: { - indices: [], - }, - }; - - for (let i = 0; i < total; i++) { - list.follow_stats.indices.push(getFollowerIndexStatsMock(names[i])); - } - - return list; -}; - -export const getFollowerIndexInfoMock = ( - name = chance.string(), - status = chance.string(), - parameters = { - maxReadRequestOperationCount: chance.string(), - maxOutstandingReadRequests: chance.string(), - maxReadRequestSize: chance.string(), - maxWriteRequestOperationCount: chance.string(), - maxWriteRequestSize: chance.string(), - maxOutstandingWriteRequests: chance.string(), - maxWriteBufferCount: chance.string(), - maxWriteBufferSize: chance.string(), - maxRetryDelay: chance.string(), - readPollTimeout: chance.string(), - } -) => { - return { - follower_index: name, - status, - max_read_request_operation_count: parameters.maxReadRequestOperationCount, - max_outstanding_read_requests: parameters.maxOutstandingReadRequests, - max_read_request_size: parameters.maxReadRequestSize, - max_write_request_operation_count: parameters.maxWriteRequestOperationCount, - max_write_request_size: parameters.maxWriteRequestSize, - max_outstanding_write_requests: parameters.maxOutstandingWriteRequests, - max_write_buffer_count: parameters.maxWriteBufferCount, - max_write_buffer_size: parameters.maxWriteBufferSize, - max_retry_delay: parameters.maxRetryDelay, - read_poll_timeout: parameters.readPollTimeout, - }; -}; - -export const getFollowerIndexListInfoMock = (total = 3) => { - const list = { - follower_indices: [], - }; - - for (let i = 0; i < total; i++) { - list.follower_indices.push(getFollowerIndexInfoMock()); - } - - return list; -}; - -// ----------------- -// Client test mock -// ----------------- - -export const getFollowerIndexMock = ({ - name = getRandomString(), - remoteCluster = getRandomString(), - leaderIndex = getRandomString(), - status = 'Active', -} = {}) => ({ - name, - remoteCluster, - leaderIndex, - status, - maxReadRequestOperationCount: chance.integer(), - maxOutstandingReadRequests: chance.integer(), - maxReadRequestSize: getRandomString({ length: 5 }), - maxWriteRequestOperationCount: chance.integer(), - maxWriteRequestSize: '9223372036854775807b', - maxOutstandingWriteRequests: chance.integer(), - maxWriteBufferCount: chance.integer(), - maxWriteBufferSize: getRandomString({ length: 5 }), - maxRetryDelay: getRandomString({ length: 5 }), - readPollTimeout: getRandomString({ length: 5 }), - shards: [ - { - id: 0, - remoteCluster: remoteCluster, - leaderIndex: leaderIndex, - leaderGlobalCheckpoint: chance.integer(), - leaderMaxSequenceNum: chance.integer(), - followerGlobalCheckpoint: chance.integer(), - followerMaxSequenceNum: chance.integer(), - lastRequestedSequenceNum: chance.integer(), - outstandingReadRequestsCount: chance.integer(), - outstandingWriteRequestsCount: chance.integer(), - writeBufferOperationsCount: chance.integer(), - writeBufferSizeBytes: chance.integer(), - followerMappingVersion: chance.integer(), - followerSettingsVersion: chance.integer(), - totalReadTimeMs: chance.integer(), - totalReadRemoteExecTimeMs: chance.integer(), - successfulReadRequestCount: chance.integer(), - failedReadRequestsCount: chance.integer(), - operationsReadCount: chance.integer(), - bytesReadCount: chance.integer(), - totalWriteTimeMs: chance.integer(), - successfulWriteRequestsCount: chance.integer(), - failedWriteRequestsCount: chance.integer(), - operationsWrittenCount: chance.integer(), - readExceptions: [], - timeSinceLastReadMs: chance.integer(), - }, - ], -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js b/x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js deleted file mode 100644 index ccfdf8b19f3ee8..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/fixtures/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { getAutoFollowPatternMock, getAutoFollowPatternListMock } from './auto_follow_pattern'; - -export { esErrors } from './es_errors'; - -export { - getFollowerIndexStatsMock, - getFollowerIndexListStatsMock, - getFollowerIndexInfoMock, - getFollowerIndexListInfoMock, -} from './follower_index'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/index.js b/x-pack/legacy/plugins/cross_cluster_replication/index.js deleted file mode 100644 index aff4cc5b56738e..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/index.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { resolve } from 'path'; -import { PLUGIN } from './common/constants'; -import { plugin } from './server/np_ready'; - -export function crossClusterReplication(kibana) { - return new kibana.Plugin({ - id: PLUGIN.ID, - configPrefix: 'xpack.ccr', - publicDir: resolve(__dirname, 'public'), - require: ['kibana', 'elasticsearch', 'xpack_main', 'remoteClusters', 'index_management'], - uiExports: { - styleSheetPaths: resolve(__dirname, 'public/index.scss'), - managementSections: ['plugins/cross_cluster_replication'], - injectDefaultVars(server) { - const config = server.config(); - return { - ccrUiEnabled: - config.get('xpack.ccr.ui.enabled') && config.get('xpack.remote_clusters.ui.enabled'), - }; - }, - }, - - config(Joi) { - return Joi.object({ - // display menu item - ui: Joi.object({ - enabled: Joi.boolean().default(true), - }).default(), - - // enable plugin - enabled: Joi.boolean().default(true), - }).default(); - }, - isEnabled(config) { - return ( - config.get('xpack.ccr.enabled') && - config.get('xpack.index_management.enabled') && - config.get('xpack.remote_clusters.enabled') - ); - }, - init: function initCcrPlugin(server) { - plugin({}).setup(server.newPlatform.setup.core, { - indexManagement: server.newPlatform.setup.plugins.indexManagement, - __LEGACY: { - server, - ccrUIEnabled: server.config().get('xpack.ccr.ui.enabled'), - }, - }); - }, - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/index.scss b/x-pack/legacy/plugins/cross_cluster_replication/public/index.scss deleted file mode 100644 index 31317e16e3e9f9..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/index.scss +++ /dev/null @@ -1,13 +0,0 @@ -// Import the EUI global scope so we can use EUI constants -@import 'src/legacy/ui/public/styles/_styling_constants'; - -// Cross-Cluster Replication plugin styles - -// Prefix all styles with "ccr" to avoid conflicts. -// Examples -// ccrChart -// ccrChart__legend -// ccrChart__legend--small -// ccrChart__legend-isLoading - -@import 'np_ready/app/app'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/main.html b/x-pack/legacy/plugins/cross_cluster_replication/public/main.html deleted file mode 100644 index 2129f26267827b..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/main.html +++ /dev/null @@ -1,3 +0,0 @@ - -

- diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss deleted file mode 100644 index 5ee862b1d9e443..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/_app.scss +++ /dev/null @@ -1,14 +0,0 @@ -.ccrFollowerIndicesFormRow { - padding-bottom: 0; -} - -.ccrFollowerIndicesHelpText { - transform: translateY(-3px); -} - -/** - * 1. Prevent context menu popover appearing above confirmation modal - */ -.ccrFollowerIndicesDetailPanel { - z-index: $euiZMask - 1; /* 1 */ -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js deleted file mode 100644 index cc81fce4eebe71..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/index.js +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import React from 'react'; -import { render } from 'react-dom'; -import { Provider } from 'react-redux'; -import { HashRouter } from 'react-router-dom'; - -import { App } from './app'; -import { ccrStore } from './store'; - -export const renderReact = async (elem, I18nContext) => { - render( - - - - - - - , - elem - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts deleted file mode 100644 index f17926d2bee103..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/documentation_links.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -let esBase: string; - -export const setDocLinks = ({ - DOC_LINK_VERSION, - ELASTIC_WEBSITE_URL, -}: { - ELASTIC_WEBSITE_URL: string; - DOC_LINK_VERSION: string; -}) => { - esBase = `${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}`; -}; - -export const getAutoFollowPatternUrl = () => `${esBase}/ccr-put-auto-follow-pattern.html`; -export const getFollowerIndexUrl = () => `${esBase}/ccr-put-follow.html`; -export const getByteUnitsUrl = () => `${esBase}/common-options.html#byte-units`; -export const getTimeUnitsUrl = () => `${esBase}/common-options.html#time-units`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts deleted file mode 100644 index 5e1c3e9e99437a..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/notifications.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { NotificationsSetup, IToasts, FatalErrorsSetup } from 'src/core/public'; - -let _notifications: IToasts; -let _fatalErrors: FatalErrorsSetup; - -export const setNotifications = ( - notifications: NotificationsSetup, - fatalErrorsSetup: FatalErrorsSetup -) => { - _notifications = notifications.toasts; - _fatalErrors = fatalErrorsSetup; -}; - -export const getNotifications = () => _notifications; -export const getFatalErrors = () => _fatalErrors; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js deleted file mode 100644 index 36b9c185b487d8..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/track_ui_metric.js +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { - createUiStatsReporter, - METRIC_TYPE, -} from '../../../../../../../../src/legacy/core_plugins/ui_metric/public'; -import { UIM_APP_NAME } from '../constants'; - -export const trackUiMetric = createUiStatsReporter(UIM_APP_NAME); -export { METRIC_TYPE }; -/** - * Transparently return provided request Promise, while allowing us to track - * a successful completion of the request. - */ -export function trackUserRequest(request, actionType) { - // Only track successful actions. - return request.then(response => { - trackUiMetric(METRIC_TYPE.LOADED, actionType); - // We return the response immediately without waiting for the tracking request to resolve, - // to avoid adding additional latency. - return response; - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts deleted file mode 100644 index 4ffe0db4e3c4eb..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/extend_index_management.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; -import { get } from 'lodash'; -import { IndexManagementPluginSetup } from '../../../../../plugins/index_management/public'; - -const propertyPath = 'isFollowerIndex'; - -const followerBadgeExtension = { - matchIndex: (index: any) => { - return get(index, propertyPath); - }, - label: i18n.translate('xpack.crossClusterReplication.indexMgmtBadge.followerLabel', { - defaultMessage: 'Follower', - }), - color: 'default', - filterExpression: 'isFollowerIndex:true', -}; - -export const extendIndexManagement = (indexManagement?: IndexManagementPluginSetup) => { - if (indexManagement) { - indexManagement.extensionsService.addBadge(followerBadgeExtension); - } -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts b/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts deleted file mode 100644 index 46259c698b2829..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/plugin.ts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { - ChromeBreadcrumb, - CoreSetup, - Plugin, - PluginInitializerContext, - DocLinksStart, -} from 'src/core/public'; - -import { IndexManagementPluginSetup } from '../../../../../plugins/index_management/public'; - -// @ts-ignore; -import { setHttpClient } from './app/services/api'; -import { setBreadcrumbSetter } from './app/services/breadcrumbs'; -import { setDocLinks } from './app/services/documentation_links'; -import { setNotifications } from './app/services/notifications'; -import { extendIndexManagement } from './extend_index_management'; - -interface PluginDependencies { - indexManagement: IndexManagementPluginSetup; - __LEGACY: { - chrome: any; - MANAGEMENT_BREADCRUMB: ChromeBreadcrumb; - docLinks: DocLinksStart; - }; -} - -export class CrossClusterReplicationUIPlugin implements Plugin { - // @ts-ignore - constructor(private readonly ctx: PluginInitializerContext) {} - setup({ http, notifications, fatalErrors }: CoreSetup, deps: PluginDependencies) { - setHttpClient(http); - setBreadcrumbSetter(deps); - setDocLinks(deps.__LEGACY.docLinks); - setNotifications(notifications, fatalErrors); - extendIndexManagement(deps.indexManagement); - } - - start() {} -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js b/x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js deleted file mode 100644 index 838939f46e5233..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/register_routes.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { unmountComponentAtNode } from 'react-dom'; -import chrome from 'ui/chrome'; -import { management, MANAGEMENT_BREADCRUMB } from 'ui/management'; -import { npSetup, npStart } from 'ui/new_platform'; -import routes from 'ui/routes'; -import { xpackInfo } from 'plugins/xpack_main/services/xpack_info'; -import { i18n } from '@kbn/i18n'; - -import template from './main.html'; -import { BASE_PATH } from '../common/constants'; - -import { plugin } from './np_ready'; - -/** - * TODO: When this file is deleted, use the management section for rendering - */ -import { renderReact } from './np_ready/app'; - -const isAvailable = xpackInfo.get('features.crossClusterReplication.isAvailable'); -const isActive = xpackInfo.get('features.crossClusterReplication.isActive'); -const isLicenseOK = isAvailable && isActive; -const isCcrUiEnabled = chrome.getInjected('ccrUiEnabled'); - -if (isLicenseOK && isCcrUiEnabled) { - const esSection = management.getSection('elasticsearch'); - - esSection.register('ccr', { - visible: true, - display: i18n.translate('xpack.crossClusterReplication.appTitle', { - defaultMessage: 'Cross-Cluster Replication', - }), - order: 4, - url: `#${BASE_PATH}`, - }); - - let elem; - - const CCR_REACT_ROOT = 'ccrReactRoot'; - - plugin({}).setup(npSetup.core, { - ...npSetup.plugins, - __LEGACY: { - chrome, - docLinks: npStart.core.docLinks, - MANAGEMENT_BREADCRUMB, - }, - }); - - const unmountReactApp = () => elem && unmountComponentAtNode(elem); - - routes.when(`${BASE_PATH}/:section?/:subsection?/:view?/:id?`, { - template, - controllerAs: 'ccr', - controller: class CrossClusterReplicationController { - constructor($scope, $route) { - // React-router's does not play well with the angular router. It will cause this controller - // to re-execute without the $destroy handler being called. This means that the app will be mounted twice - // creating a memory leak when leaving (only 1 app will be unmounted). - // To avoid this, we unmount the React app each time we enter the controller. - unmountReactApp(); - - $scope.$$postDigest(() => { - elem = document.getElementById(CCR_REACT_ROOT); - renderReact(elem, npStart.core.i18n.Context); - - // Angular Lifecycle - const appRoute = $route.current; - const stopListeningForLocationChange = $scope.$on('$locationChangeSuccess', () => { - const currentRoute = $route.current; - const isNavigationInApp = currentRoute.$$route.template === appRoute.$$route.template; - - // When we navigate within CCR, prevent Angular from re-matching the route and rebuild the app - if (isNavigationInApp) { - $route.current = appRoute; - } else { - // Any clean up when User leaves the CCR - } - - $scope.$on('$destroy', () => { - stopListeningForLocationChange && stopListeningForLocationChange(); - unmountReactApp(); - }); - }); - }); - } - }, - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts deleted file mode 100644 index ae15073b979e1e..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/cross_cluster_replication_data.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { APICaller } from 'src/core/server'; -import { Index } from '../../../../../plugins/index_management/server'; - -export const ccrDataEnricher = async (indicesList: Index[], callWithRequest: APICaller) => { - if (!indicesList?.length) { - return indicesList; - } - const params = { - path: '/_all/_ccr/info', - method: 'GET', - }; - try { - const { follower_indices: followerIndices } = await callWithRequest( - 'transport.request', - params - ); - return indicesList.map(index => { - const isFollowerIndex = !!followerIndices.find( - (followerIndex: { follower_index: string }) => { - return followerIndex.follower_index === index.name; - } - ); - return { - ...index, - isFollowerIndex, - }; - }); - } catch (e) { - return indicesList; - } -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts deleted file mode 100644 index 7a38d024d99a2a..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { PluginInitializerContext } from 'src/core/server'; -import { CrossClusterReplicationServerPlugin } from './plugin'; - -export const plugin = (ctx: PluginInitializerContext) => - new CrossClusterReplicationServerPlugin(ctx); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js deleted file mode 100644 index 99d72ce1a0e6ec..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/call_with_request_factory.js +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { once } from 'lodash'; -import { elasticsearchJsPlugin } from '../../client/elasticsearch_ccr'; - -const callWithRequest = once(server => { - const config = { plugins: [elasticsearchJsPlugin] }; - const cluster = server.plugins.elasticsearch.createCluster('ccr', config); - return cluster.callWithRequest; -}); - -export const callWithRequestFactory = (server, request) => { - return (...args) => { - return callWithRequest(server)(request, ...args); - }; -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js deleted file mode 100644 index 787814d87dff94..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/call_with_request_factory/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { callWithRequestFactory } from './call_with_request_factory'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js deleted file mode 100644 index 6cf12896fa472d..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/check_license.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { i18n } from '@kbn/i18n'; - -export function checkLicense(xpackLicenseInfo) { - const pluginName = 'Cross-Cluster Replication'; - - // If, for some reason, we cannot get the license information - // from Elasticsearch, assume worst case and disable - if (!xpackLicenseInfo || !xpackLicenseInfo.isAvailable()) { - return { - isAvailable: false, - showLinks: true, - enableLinks: false, - message: i18n.translate( - 'xpack.crossClusterReplication.checkLicense.errorUnavailableMessage', - { - defaultMessage: - 'You cannot use {pluginName} because license information is not available at this time.', - values: { pluginName }, - } - ), - }; - } - - const VALID_LICENSE_MODES = ['trial', 'platinum', 'enterprise']; - - const isLicenseModeValid = xpackLicenseInfo.license.isOneOf(VALID_LICENSE_MODES); - const isLicenseActive = xpackLicenseInfo.license.isActive(); - const licenseType = xpackLicenseInfo.license.getType(); - - // License is not valid - if (!isLicenseModeValid) { - return { - isAvailable: false, - isActive: false, - message: i18n.translate( - 'xpack.crossClusterReplication.checkLicense.errorUnsupportedMessage', - { - defaultMessage: - 'Your {licenseType} license does not support {pluginName}. Please upgrade your license.', - values: { licenseType, pluginName }, - } - ), - }; - } - - // License is valid but not active - if (!isLicenseActive) { - return { - isAvailable: true, - isActive: false, - message: i18n.translate('xpack.crossClusterReplication.checkLicense.errorExpiredMessage', { - defaultMessage: - 'You cannot use {pluginName} because your {licenseType} license has expired', - values: { licenseType, pluginName }, - }), - }; - } - - // License is valid and active - return { - isAvailable: true, - isActive: true, - }; -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js deleted file mode 100644 index 11a6fd4e1d816a..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/__tests__/wrap_es_error.test.js +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { wrapEsError } from '../wrap_es_error'; - -describe('wrap_es_error', () => { - describe('#wrapEsError', () => { - let originalError; - beforeEach(() => { - originalError = new Error('I am an error'); - originalError.statusCode = 404; - originalError.response = '{}'; - }); - - it('should return the correct object', () => { - const wrappedError = wrapEsError(originalError); - - expect(wrappedError.statusCode).to.be(originalError.statusCode); - expect(wrappedError.message).to.be(originalError.message); - }); - - it('should return the correct object with custom message', () => { - const wrappedError = wrapEsError(originalError, { 404: 'No encontrado!' }); - - expect(wrappedError.statusCode).to.be(originalError.statusCode); - expect(wrappedError.message).to.be('No encontrado!'); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js deleted file mode 100644 index 5f2141cce93954..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/__tests__/is_es_error_factory.js +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import expect from '@kbn/expect'; -import { isEsErrorFactory } from '../is_es_error_factory'; -import { set } from 'lodash'; - -class MockAbstractEsError {} - -describe('is_es_error_factory', () => { - let mockServer; - let isEsError; - - beforeEach(() => { - const mockEsErrors = { - _Abstract: MockAbstractEsError, - }; - mockServer = {}; - set(mockServer, 'plugins.elasticsearch.getCluster', () => ({ errors: mockEsErrors })); - - isEsError = isEsErrorFactory(mockServer); - }); - - describe('#isEsErrorFactory', () => { - it('should return a function', () => { - expect(isEsError).to.be.a(Function); - }); - - describe('returned function', () => { - it('should return true if passed-in err is a known esError', () => { - const knownEsError = new MockAbstractEsError(); - expect(isEsError(knownEsError)).to.be(true); - }); - - it('should return false if passed-in err is not a known esError', () => { - const unknownEsError = {}; - expect(isEsError(unknownEsError)).to.be(false); - }); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts deleted file mode 100644 index fc6405b8e75133..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/is_es_error_factory.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { memoize } from 'lodash'; - -const esErrorsFactory = memoize((server: any) => { - return server.plugins.elasticsearch.getCluster('admin').errors; -}); - -export function isEsErrorFactory(server: any) { - const esErrors = esErrorsFactory(server); - return function isEsError(err: any) { - return err instanceof esErrors._Abstract; - }; -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts deleted file mode 100644 index d22505f0e315ad..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/__jest__/license_pre_routing_factory.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { kibanaResponseFactory } from '../../../../../../../../../src/core/server'; -import { licensePreRoutingFactory } from '../license_pre_routing_factory'; - -describe('license_pre_routing_factory', () => { - describe('#reportingFeaturePreRoutingFactory', () => { - let mockDeps: any; - let mockLicenseCheckResults: any; - - const anyContext: any = {}; - const anyRequest: any = {}; - - beforeEach(() => { - mockDeps = { - __LEGACY: { - server: { - plugins: { - xpack_main: { - info: { - feature: () => ({ - getLicenseCheckResults: () => mockLicenseCheckResults, - }), - }, - }, - }, - }, - }, - requestHandler: jest.fn(), - }; - }); - - describe('isAvailable is false', () => { - beforeEach(() => { - mockLicenseCheckResults = { - isAvailable: false, - }; - }); - - it('replies with 403', async () => { - const licensePreRouting = licensePreRoutingFactory(mockDeps); - const response = await licensePreRouting(anyContext, anyRequest, kibanaResponseFactory); - expect(response.status).toBe(403); - }); - }); - - describe('isAvailable is true', () => { - beforeEach(() => { - mockLicenseCheckResults = { - isAvailable: true, - }; - }); - - it('it calls the wrapped handler', async () => { - const licensePreRouting = licensePreRoutingFactory(mockDeps); - await licensePreRouting(anyContext, anyRequest, kibanaResponseFactory); - expect(mockDeps.requestHandler).toHaveBeenCalledTimes(1); - }); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts deleted file mode 100644 index c47faa940a6503..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/license_pre_routing_factory.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { RequestHandler } from 'src/core/server'; -import { PLUGIN } from '../../../../common/constants'; - -export const licensePreRoutingFactory = ({ - __LEGACY, - requestHandler, -}: { - __LEGACY: { server: any }; - requestHandler: RequestHandler; -}) => { - const xpackMainPlugin = __LEGACY.server.plugins.xpack_main; - - // License checking and enable/disable logic - const licensePreRouting: RequestHandler = (ctx, request, response) => { - const licenseCheckResults = xpackMainPlugin.info.feature(PLUGIN.ID).getLicenseCheckResults(); - if (!licenseCheckResults.isAvailable) { - return response.forbidden({ - body: licenseCheckResults.message, - }); - } else { - return requestHandler(ctx, request, response); - } - }; - - return licensePreRouting; -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js deleted file mode 100644 index 7b0f97c38d1292..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/index.js +++ /dev/null @@ -1,7 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { registerLicenseChecker } from './register_license_checker'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js deleted file mode 100644 index b9bb34a80ce796..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/register_license_checker/register_license_checker.js +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { mirrorPluginStatus } from '../../../../../../server/lib/mirror_plugin_status'; -import { PLUGIN } from '../../../../common/constants'; -import { checkLicense } from '../check_license'; - -export function registerLicenseChecker(__LEGACY) { - const xpackMainPlugin = __LEGACY.server.plugins.xpack_main; - const ccrPluggin = __LEGACY.server.plugins[PLUGIN.ID]; - - mirrorPluginStatus(xpackMainPlugin, ccrPluggin); - xpackMainPlugin.status.once('green', () => { - // Register a function that is called whenever the xpack info changes, - // to re-compute the license check results for this plugin - xpackMainPlugin.info.feature(PLUGIN.ID).registerLicenseCheckResultsGenerator(checkLicense); - }); -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts deleted file mode 100644 index 829de10ad01778..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/plugin.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { Plugin, PluginInitializerContext, CoreSetup } from 'src/core/server'; - -import { IndexManagementPluginSetup } from '../../../../../plugins/index_management/server'; - -// @ts-ignore -import { registerLicenseChecker } from './lib/register_license_checker'; -// @ts-ignore -import { registerRoutes } from './routes/register_routes'; -import { ccrDataEnricher } from './cross_cluster_replication_data'; - -interface PluginDependencies { - indexManagement: IndexManagementPluginSetup; - __LEGACY: { - server: any; - ccrUIEnabled: boolean; - }; -} - -export class CrossClusterReplicationServerPlugin implements Plugin { - // @ts-ignore - constructor(private readonly ctx: PluginInitializerContext) {} - setup({ http }: CoreSetup, { indexManagement, __LEGACY }: PluginDependencies) { - registerLicenseChecker(__LEGACY); - - const router = http.createRouter(); - registerRoutes({ router, __LEGACY }); - if (__LEGACY.ccrUIEnabled && indexManagement && indexManagement.indexDataEnricher) { - indexManagement.indexDataEnricher.add(ccrDataEnricher); - } - } - start() {} -} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js deleted file mode 100644 index f3024515c7213d..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/auto_follow_pattern.test.js +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { deserializeAutoFollowPattern } from '../../../../../common/services/auto_follow_pattern_serialization'; -import { callWithRequestFactory } from '../../../lib/call_with_request_factory'; -import { isEsErrorFactory } from '../../../lib/is_es_error_factory'; -import { getAutoFollowPatternMock, getAutoFollowPatternListMock } from '../../../../../fixtures'; -import { registerAutoFollowPatternRoutes } from '../auto_follow_pattern'; - -import { createRouter, callRoute } from './helpers'; - -jest.mock('../../../lib/call_with_request_factory'); -jest.mock('../../../lib/is_es_error_factory'); -jest.mock('../../../lib/license_pre_routing_factory', () => ({ - licensePreRoutingFactory: ({ requestHandler }) => requestHandler, -})); - -const DESERIALIZED_KEYS = Object.keys(deserializeAutoFollowPattern(getAutoFollowPatternMock())); - -let routeRegistry; - -/** - * Helper to extract all the different server route handler so we can easily call them in our tests. - * - * Important: This method registers the handlers in the order that they appear in the file, so - * if a "server.route()" call is moved or deleted, then the HANDLER_INDEX_TO_ACTION must be updated here. - */ -const registerHandlers = () => { - const HANDLER_INDEX_TO_ACTION = { - 0: 'list', - 1: 'create', - 2: 'update', - 3: 'get', - 4: 'delete', - 5: 'pause', - 6: 'resume', - }; - - routeRegistry = createRouter(HANDLER_INDEX_TO_ACTION); - - registerAutoFollowPatternRoutes({ - __LEGACY: {}, - router: routeRegistry.router, - }); -}; - -/** - * Queue to save request response and errors - * It allows us to fake multiple responses from the - * callWithRequestFactory() when the request handler call it - * multiple times. - */ -let requestResponseQueue = []; - -/** - * Helper to mock the response from the call to Elasticsearch - * - * @param {*} err The mock error to throw - * @param {*} response The response to return - */ -const setHttpRequestResponse = (error, response) => { - requestResponseQueue.push({ error, response }); -}; - -const resetHttpRequestResponses = () => (requestResponseQueue = []); - -const getNextResponseFromQueue = () => { - if (!requestResponseQueue.length) { - return null; - } - - const next = requestResponseQueue.shift(); - if (next.error) { - return Promise.reject(next.error); - } - return Promise.resolve(next.response); -}; - -describe('[CCR API Routes] Auto Follow Pattern', () => { - let routeHandler; - - beforeAll(() => { - isEsErrorFactory.mockReturnValue(() => false); - callWithRequestFactory.mockReturnValue(getNextResponseFromQueue); - registerHandlers(); - }); - - describe('list()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().list; - }); - - it('should deserialize the response from Elasticsearch', async () => { - const totalResult = 2; - setHttpRequestResponse(null, getAutoFollowPatternListMock(totalResult)); - - const { - options: { body: response }, - } = await callRoute(routeHandler); - const autoFollowPattern = response.patterns[0]; - - expect(response.patterns.length).toEqual(totalResult); - expect(Object.keys(autoFollowPattern)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('create()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().create; - }); - - it('should throw a 409 conflict error if id already exists', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute( - routeHandler, - {}, - { - body: { - id: 'some-id', - foo: 'bar', - }, - } - ); - - expect(response.status).toEqual(409); - }); - - it('should return 200 status when the id does not exist', async () => { - const error = new Error('Resource not found.'); - error.statusCode = 404; - setHttpRequestResponse(error); - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute( - routeHandler, - {}, - { - body: { - id: 'some-id', - foo: 'bar', - }, - } - ); - - expect(response).toEqual({ acknowledge: true }); - }); - }); - - describe('update()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().update; - }); - - it('should serialize the payload before sending it to Elasticsearch', async () => { - callWithRequestFactory.mockReturnValueOnce((_, payload) => payload); - - const request = { - params: { id: 'foo' }, - body: { - remoteCluster: 'bar1', - leaderIndexPatterns: ['bar2'], - followIndexPattern: 'bar3', - }, - }; - - const response = await callRoute(routeHandler, {}, request); - - expect(response.options.body).toEqual({ - id: 'foo', - body: { - remote_cluster: 'bar1', - leader_index_patterns: ['bar2'], - follow_index_pattern: 'bar3', - }, - }); - }); - }); - - describe('get()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().get; - }); - - it('should return a single resource even though ES return an array with 1 item', async () => { - const autoFollowPattern = getAutoFollowPatternMock(); - const esResponse = { patterns: [autoFollowPattern] }; - - setHttpRequestResponse(null, esResponse); - - const response = await callRoute(routeHandler, {}, { params: { id: 1 } }); - expect(Object.keys(response.options.body)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('delete()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().delete; - }); - - it('should delete a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a' } }); - - expect(response.itemsDeleted).toEqual(['a']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to delete', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: 'a,b,c' } }); - - expect(response.options.body.itemsDeleted).toEqual(['a', 'b', 'c']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a,b' } }); - - expect(response.itemsDeleted).toEqual(['a']); - expect(response.errors[0].id).toEqual('b'); - }); - }); - - describe('pause()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().pause; - }); - - it('accept a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a' } }); - - expect(response.itemsPaused).toEqual(['a']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of items to pause', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: 'a,b,c' } }); - - expect(response.options.body.itemsPaused).toEqual(['a', 'b', 'c']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a,b' } }); - - expect(response.itemsPaused).toEqual(['a']); - expect(response.errors[0].id).toEqual('b'); - }); - }); - - describe('resume()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().resume; - }); - - it('accept a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a' } }); - - expect(response.itemsResumed).toEqual(['a']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of items to pause', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: 'a,b,c' } }); - - expect(response.options.body.itemsResumed).toEqual(['a', 'b', 'c']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: 'a,b' } }); - - expect(response.itemsResumed).toEqual(['a']); - expect(response.errors[0].id).toEqual('b'); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js deleted file mode 100644 index f0139e5bd70115..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/follower_index.test.js +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { deserializeFollowerIndex } from '../../../../../common/services/follower_index_serialization'; -import { - getFollowerIndexStatsMock, - getFollowerIndexListStatsMock, - getFollowerIndexInfoMock, - getFollowerIndexListInfoMock, -} from '../../../../../fixtures'; -import { callWithRequestFactory } from '../../../lib/call_with_request_factory'; -import { isEsErrorFactory } from '../../../lib/is_es_error_factory'; -import { registerFollowerIndexRoutes } from '../follower_index'; -import { createRouter, callRoute } from './helpers'; - -jest.mock('../../../lib/call_with_request_factory'); -jest.mock('../../../lib/is_es_error_factory'); -jest.mock('../../../lib/license_pre_routing_factory', () => ({ - licensePreRoutingFactory: ({ requestHandler }) => requestHandler, -})); - -const DESERIALIZED_KEYS = Object.keys( - deserializeFollowerIndex({ - ...getFollowerIndexInfoMock(), - ...getFollowerIndexStatsMock(), - }) -); - -let routeRegistry; - -/** - * Helper to extract all the different server route handler so we can easily call them in our tests. - * - * Important: This method registers the handlers in the order that they appear in the file, so - * if a 'server.route()' call is moved or deleted, then the HANDLER_INDEX_TO_ACTION must be updated here. - */ -const registerHandlers = () => { - const HANDLER_INDEX_TO_ACTION = { - 0: 'list', - 1: 'get', - 2: 'create', - 3: 'edit', - 4: 'pause', - 5: 'resume', - 6: 'unfollow', - }; - - routeRegistry = createRouter(HANDLER_INDEX_TO_ACTION); - registerFollowerIndexRoutes({ - __LEGACY: {}, - router: routeRegistry.router, - }); -}; - -/** - * Queue to save request response and errors - * It allows us to fake multiple responses from the - * callWithRequestFactory() when the request handler call it - * multiple times. - */ -let requestResponseQueue = []; - -/** - * Helper to mock the response from the call to Elasticsearch - * - * @param {*} err The mock error to throw - * @param {*} response The response to return - */ -const setHttpRequestResponse = (error, response) => { - requestResponseQueue.push({ error, response }); -}; - -const resetHttpRequestResponses = () => (requestResponseQueue = []); - -const getNextResponseFromQueue = () => { - if (!requestResponseQueue.length) { - return null; - } - - const next = requestResponseQueue.shift(); - if (next.error) { - return Promise.reject(next.error); - } - return Promise.resolve(next.response); -}; - -describe('[CCR API Routes] Follower Index', () => { - let routeHandler; - - beforeAll(() => { - isEsErrorFactory.mockReturnValue(() => false); - callWithRequestFactory.mockReturnValue(getNextResponseFromQueue); - registerHandlers(); - }); - - describe('list()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().list; - }); - - it('deserializes the response from Elasticsearch', async () => { - const totalResult = 2; - const infoResult = getFollowerIndexListInfoMock(totalResult); - const statsResult = getFollowerIndexListStatsMock( - totalResult, - infoResult.follower_indices.map(index => index.follower_index) - ); - setHttpRequestResponse(null, infoResult); - setHttpRequestResponse(null, statsResult); - - const { - options: { body: response }, - } = await callRoute(routeHandler); - const followerIndex = response.indices[0]; - - expect(response.indices.length).toEqual(totalResult); - expect(Object.keys(followerIndex)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('get()', () => { - beforeEach(() => { - routeHandler = routeRegistry.getRoutes().get; - }); - - it('should return a single resource even though ES return an array with 1 item', async () => { - const mockId = 'test1'; - const followerIndexInfo = getFollowerIndexInfoMock(mockId); - const followerIndexStats = getFollowerIndexStatsMock(mockId); - - setHttpRequestResponse(null, { follower_indices: [followerIndexInfo] }); - setHttpRequestResponse(null, { indices: [followerIndexStats] }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: mockId } }); - expect(Object.keys(response)).toEqual(DESERIALIZED_KEYS); - }); - }); - - describe('create()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().create; - }); - - it('should return 200 status when follower index is created', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute( - routeHandler, - {}, - { - body: { - name: 'follower_index', - remoteCluster: 'remote_cluster', - leaderIndex: 'leader_index', - }, - } - ); - - expect(response.options.body).toEqual({ acknowledge: true }); - }); - }); - - describe('pause()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().pause; - }); - - it('should pause a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1' } }); - - expect(response.itemsPaused).toEqual(['1']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to pause', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: '1,2,3' } }); - - expect(response.options.body.itemsPaused).toEqual(['1', '2', '3']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1,2' } }); - - expect(response.itemsPaused).toEqual(['1']); - expect(response.errors[0].id).toEqual('2'); - }); - }); - - describe('resume()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().resume; - }); - - it('should resume a single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1' } }); - - expect(response.itemsResumed).toEqual(['1']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to resume', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: '1,2,3' } }); - - expect(response.options.body.itemsResumed).toEqual(['1', '2', '3']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1,2' } }); - - expect(response.itemsResumed).toEqual(['1']); - expect(response.errors[0].id).toEqual('2'); - }); - }); - - describe('unfollow()', () => { - beforeEach(() => { - resetHttpRequestResponses(); - routeHandler = routeRegistry.getRoutes().unfollow; - }); - - it('should unfollow await single item', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1' } }); - - expect(response.itemsUnfollowed).toEqual(['1']); - expect(response.errors).toEqual([]); - }); - - it('should accept a list of ids to unfollow', async () => { - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - - const response = await callRoute(routeHandler, {}, { params: { id: '1,2,3' } }); - - expect(response.options.body.itemsUnfollowed).toEqual(['1', '2', '3']); - }); - - it('should catch error and return them in array', async () => { - const error = new Error('something went wrong'); - error.response = '{ "error": {} }'; - - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(null, { acknowledge: true }); - setHttpRequestResponse(error); - - const { - options: { body: response }, - } = await callRoute(routeHandler, {}, { params: { id: '1,2' } }); - - expect(response.itemsUnfollowed).toEqual(['1']); - expect(response.errors[0].id).toEqual('2'); - }); - }); -}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts deleted file mode 100644 index 555fc0937c0ad6..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/__jest__/helpers.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { RequestHandler } from 'src/core/server'; -import { kibanaResponseFactory } from '../../../../../../../../../src/core/server'; - -export const callRoute = ( - route: RequestHandler, - ctx = {}, - request = {}, - response = kibanaResponseFactory -) => { - return route(ctx as any, request as any, response); -}; - -export const createRouter = (indexToActionMap: Record) => { - let index = 0; - const routeHandlers: Record> = {}; - const addHandler = (ignoreCtxForNow: any, handler: RequestHandler) => { - // Save handler and increment index - routeHandlers[indexToActionMap[index]] = handler; - index++; - }; - - return { - getRoutes: () => routeHandlers, - router: { - get: addHandler, - post: addHandler, - put: addHandler, - delete: addHandler, - }, - }; -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts deleted file mode 100644 index d458f1ccb354b6..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/auto_follow_pattern.ts +++ /dev/null @@ -1,301 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { schema } from '@kbn/config-schema'; -// @ts-ignore -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { isEsError } from '../../lib/is_es_error'; -// @ts-ignore -import { - deserializeAutoFollowPattern, - deserializeListAutoFollowPatterns, - serializeAutoFollowPattern, - // @ts-ignore -} from '../../../../common/services/auto_follow_pattern_serialization'; - -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; -import { API_BASE_PATH } from '../../../../common/constants'; - -import { RouteDependencies } from '../types'; -import { mapErrorToKibanaHttpResponse } from '../map_to_kibana_http_error'; - -export const registerAutoFollowPatternRoutes = ({ router, __LEGACY }: RouteDependencies) => { - /** - * Returns a list of all auto-follow patterns - */ - router.get( - { - path: `${API_BASE_PATH}/auto_follow_patterns`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const result = await callWithRequest('ccr.autoFollowPatterns'); - return response.ok({ - body: { - patterns: deserializeListAutoFollowPatterns(result.patterns), - }, - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Create an auto-follow pattern - */ - router.post( - { - path: `${API_BASE_PATH}/auto_follow_patterns`, - validate: { - body: schema.object( - { - id: schema.string(), - }, - { unknowns: 'allow' } - ), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id, ...rest } = request.body; - const body = serializeAutoFollowPattern(rest); - - /** - * First let's make sur that an auto-follow pattern with - * the same id does not exist. - */ - try { - await callWithRequest('ccr.autoFollowPattern', { id }); - // If we get here it means that an auto-follow pattern with the same id exists - return response.conflict({ - body: `An auto-follow pattern with the name "${id}" already exists.`, - }); - } catch (err) { - if (err.statusCode !== 404) { - return mapErrorToKibanaHttpResponse(err); - } - } - - try { - return response.ok({ - body: await callWithRequest('ccr.saveAutoFollowPattern', { id, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Update an auto-follow pattern - */ - router.put( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - body: schema.object({}, { unknowns: 'allow' }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const body = serializeAutoFollowPattern(request.body); - - try { - return response.ok({ - body: await callWithRequest('ccr.saveAutoFollowPattern', { id, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Returns a single auto-follow pattern - */ - router.get( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - - try { - const result = await callWithRequest('ccr.autoFollowPattern', { id }); - const autoFollowPattern = result.patterns[0]; - - return response.ok({ - body: deserializeAutoFollowPattern(autoFollowPattern), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Delete an auto-follow pattern - */ - router.delete( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsDeleted: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.deleteAutoFollowPattern', { id: _id }) - .then(() => itemsDeleted.push(_id)) - .catch((err: Error) => { - if (isEsError(err)) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } else { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ) - ); - - return response.ok({ - body: { - itemsDeleted, - errors, - }, - }); - }, - }) - ); - - /** - * Pause auto-follow pattern(s) - */ - router.post( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}/pause`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsPaused: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.pauseAutoFollowPattern', { id: _id }) - .then(() => itemsPaused.push(_id)) - .catch((err: Error) => { - if (isEsError(err)) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } else { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ) - ); - - return response.ok({ - body: { - itemsPaused, - errors, - }, - }); - }, - }) - ); - - /** - * Resume auto-follow pattern(s) - */ - router.post( - { - path: `${API_BASE_PATH}/auto_follow_patterns/{id}/resume`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsResumed: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.resumeAutoFollowPattern', { id: _id }) - .then(() => itemsResumed.push(_id)) - .catch((err: Error) => { - if (isEsError(err)) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } else { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ) - ); - - return response.ok({ - body: { - itemsResumed, - errors, - }, - }); - }, - }) - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts deleted file mode 100644 index b08b056ad2c8ae..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/ccr.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { API_BASE_PATH } from '../../../../common/constants'; -// @ts-ignore -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -// @ts-ignore -import { deserializeAutoFollowStats } from '../../lib/ccr_stats_serialization'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; - -import { mapErrorToKibanaHttpResponse } from '../map_to_kibana_http_error'; -import { RouteDependencies } from '../types'; - -export const registerCcrRoutes = ({ router, __LEGACY }: RouteDependencies) => { - /** - * Returns Auto-follow stats - */ - router.get( - { - path: `${API_BASE_PATH}/stats/auto_follow`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const { auto_follow_stats: autoFollowStats } = await callWithRequest('ccr.stats'); - - return response.ok({ - body: deserializeAutoFollowStats(autoFollowStats), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Returns whether the user has CCR permissions - */ - router.get( - { - path: `${API_BASE_PATH}/permissions`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const xpackMainPlugin = __LEGACY.server.plugins.xpack_main; - const xpackInfo = xpackMainPlugin && xpackMainPlugin.info; - - if (!xpackInfo) { - // xpackInfo is updated via poll, so it may not be available until polling has begun. - // In this rare situation, tell the client the service is temporarily unavailable. - return response.customError({ - statusCode: 503, - body: 'Security info unavailable', - }); - } - - const securityInfo = xpackInfo && xpackInfo.isAvailable() && xpackInfo.feature('security'); - if (!securityInfo || !securityInfo.isAvailable() || !securityInfo.isEnabled()) { - // If security isn't enabled or available (in the case where security is enabled but license reverted to Basic) let the user use CCR. - return response.ok({ - body: { - hasPermission: true, - missingClusterPrivileges: [], - }, - }); - } - - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const { has_all_requested: hasPermission, cluster } = await callWithRequest( - 'ccr.permissions', - { - body: { - cluster: ['manage', 'manage_ccr'], - }, - } - ); - - const missingClusterPrivileges = Object.keys(cluster).reduce( - (permissions: any, permissionName: any) => { - if (!cluster[permissionName]) { - permissions.push(permissionName); - return permissions; - } - }, - [] as any[] - ); - - return response.ok({ - body: { - hasPermission, - missingClusterPrivileges, - }, - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts deleted file mode 100644 index 1d7dacf4a86887..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/api/follower_index.ts +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { schema } from '@kbn/config-schema'; -import { - deserializeFollowerIndex, - deserializeListFollowerIndices, - serializeFollowerIndex, - serializeAdvancedSettings, - // @ts-ignore -} from '../../../../common/services/follower_index_serialization'; -import { API_BASE_PATH } from '../../../../common/constants'; -// @ts-ignore -import { removeEmptyFields } from '../../../../common/services/utils'; -// @ts-ignore -import { callWithRequestFactory } from '../../lib/call_with_request_factory'; -import { licensePreRoutingFactory } from '../../lib/license_pre_routing_factory'; - -import { RouteDependencies } from '../types'; -import { mapErrorToKibanaHttpResponse } from '../map_to_kibana_http_error'; - -export const registerFollowerIndexRoutes = ({ router, __LEGACY }: RouteDependencies) => { - /** - * Returns a list of all follower indices - */ - router.get( - { - path: `${API_BASE_PATH}/follower_indices`, - validate: false, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - - try { - const { follower_indices: followerIndices } = await callWithRequest('ccr.info', { - id: '_all', - }); - - const { - follow_stats: { indices: followerIndicesStats }, - } = await callWithRequest('ccr.stats'); - - const followerIndicesStatsMap = followerIndicesStats.reduce((map: any, stats: any) => { - map[stats.index] = stats; - return map; - }, {}); - - const collatedFollowerIndices = followerIndices.map((followerIndex: any) => { - return { - ...followerIndex, - ...followerIndicesStatsMap[followerIndex.follower_index], - }; - }); - - return response.ok({ - body: { - indices: deserializeListFollowerIndices(collatedFollowerIndices), - }, - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Returns a single follower index pattern - */ - router.get( - { - path: `${API_BASE_PATH}/follower_indices/{id}`, - validate: { - params: schema.object({ - id: schema.string(), - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - - try { - const { follower_indices: followerIndices } = await callWithRequest('ccr.info', { id }); - - const followerIndexInfo = followerIndices && followerIndices[0]; - - if (!followerIndexInfo) { - return response.notFound({ - body: `The follower index "${id}" does not exist.`, - }); - } - - // If this follower is paused, skip call to ES stats api since it will return 404 - if (followerIndexInfo.status === 'paused') { - return response.ok({ - body: deserializeFollowerIndex({ - ...followerIndexInfo, - }), - }); - } else { - const { - indices: followerIndicesStats, - } = await callWithRequest('ccr.followerIndexStats', { id }); - - return response.ok({ - body: deserializeFollowerIndex({ - ...followerIndexInfo, - ...(followerIndicesStats ? followerIndicesStats[0] : {}), - }), - }); - } - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Create a follower index - */ - router.post( - { - path: `${API_BASE_PATH}/follower_indices`, - validate: { - body: schema.object( - { - name: schema.string(), - }, - { unknowns: 'allow' } - ), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { name, ...rest } = request.body; - const body = removeEmptyFields(serializeFollowerIndex(rest)); - - try { - return response.ok({ - body: await callWithRequest('ccr.saveFollowerIndex', { name, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Edit a follower index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}`, - validate: { - params: schema.object({ id: schema.string() }), - body: schema.object({ - maxReadRequestOperationCount: schema.maybe(schema.number()), - maxOutstandingReadRequests: schema.maybe(schema.number()), - maxReadRequestSize: schema.maybe(schema.string()), // byte value - maxWriteRequestOperationCount: schema.maybe(schema.number()), - maxWriteRequestSize: schema.maybe(schema.string()), // byte value - maxOutstandingWriteRequests: schema.maybe(schema.number()), - maxWriteBufferCount: schema.maybe(schema.number()), - maxWriteBufferSize: schema.maybe(schema.string()), // byte value - maxRetryDelay: schema.maybe(schema.string()), // time value - readPollTimeout: schema.maybe(schema.string()), // time value - }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - - // We need to first pause the follower and then resume it passing the advanced settings - try { - const { follower_indices: followerIndices } = await callWithRequest('ccr.info', { id }); - const followerIndexInfo = followerIndices && followerIndices[0]; - if (!followerIndexInfo) { - return response.notFound({ body: `The follower index "${id}" does not exist.` }); - } - - // Retrieve paused state instead of pulling it from the payload to ensure it's not stale. - const isPaused = followerIndexInfo.status === 'paused'; - // Pause follower if not already paused - if (!isPaused) { - await callWithRequest('ccr.pauseFollowerIndex', { id }); - } - - // Resume follower - const body = removeEmptyFields(serializeAdvancedSettings(request.body)); - return response.ok({ - body: await callWithRequest('ccr.resumeFollowerIndex', { id, body }), - }); - } catch (err) { - return mapErrorToKibanaHttpResponse(err); - } - }, - }) - ); - - /** - * Pauses a follower index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}/pause`, - validate: { - params: schema.object({ id: schema.string() }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsPaused: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.pauseFollowerIndex', { id: _id }) - .then(() => itemsPaused.push(_id)) - .catch((err: Error) => { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - }) - ) - ); - - return response.ok({ - body: { - itemsPaused, - errors, - }, - }); - }, - }) - ); - - /** - * Resumes a follower index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}/resume`, - validate: { - params: schema.object({ id: schema.string() }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsResumed: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(_id => - callWithRequest('ccr.resumeFollowerIndex', { id: _id }) - .then(() => itemsResumed.push(_id)) - .catch((err: Error) => { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - }) - ) - ); - - return response.ok({ - body: { - itemsResumed, - errors, - }, - }); - }, - }) - ); - - /** - * Unfollow follower index's leader index - */ - router.put( - { - path: `${API_BASE_PATH}/follower_indices/{id}/unfollow`, - validate: { - params: schema.object({ id: schema.string() }), - }, - }, - licensePreRoutingFactory({ - __LEGACY, - requestHandler: async (ctx, request, response) => { - const callWithRequest = callWithRequestFactory(__LEGACY.server, request); - const { id } = request.params; - const ids = id.split(','); - - const itemsUnfollowed: string[] = []; - const itemsNotOpen: string[] = []; - const errors: Array<{ id: string; error: any }> = []; - - await Promise.all( - ids.map(async _id => { - try { - // Try to pause follower, let it fail silently since it may already be paused - try { - await callWithRequest('ccr.pauseFollowerIndex', { id: _id }); - } catch (e) { - // Swallow errors - } - - // Close index - await callWithRequest('indices.close', { index: _id }); - - // Unfollow leader - await callWithRequest('ccr.unfollowLeaderIndex', { id: _id }); - - // Try to re-open the index, store failures in a separate array to surface warnings in the UI - // This will allow users to query their index normally after unfollowing - try { - await callWithRequest('indices.open', { index: _id }); - } catch (e) { - itemsNotOpen.push(_id); - } - - // Push success - itemsUnfollowed.push(_id); - } catch (err) { - errors.push({ id: _id, error: mapErrorToKibanaHttpResponse(err) }); - } - }) - ); - - return response.ok({ - body: { - itemsUnfollowed, - itemsNotOpen, - errors, - }, - }); - }, - }) - ); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts deleted file mode 100644 index 6a81bd26dc47df..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/map_to_kibana_http_error.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { kibanaResponseFactory } from '../../../../../../../src/core/server'; -// @ts-ignore -import { wrapEsError } from '../lib/error_wrappers'; -import { isEsError } from '../lib/is_es_error'; - -export const mapErrorToKibanaHttpResponse = (err: any) => { - if (isEsError(err)) { - const { statusCode, message, body } = wrapEsError(err); - return kibanaResponseFactory.customError({ - statusCode, - body: { - message, - attributes: { - cause: body?.cause, - }, - }, - }); - } - return kibanaResponseFactory.internalError(err); -}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts b/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts deleted file mode 100644 index 7f57c20c536e03..00000000000000 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/types.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ -import { IRouter } from 'src/core/server'; - -export interface RouteDependencies { - router: IRouter; - __LEGACY: { - server: any; - }; -} diff --git a/x-pack/plugins/cross_cluster_replication/common/constants/index.ts b/x-pack/plugins/cross_cluster_replication/common/constants/index.ts new file mode 100644 index 00000000000000..797141b0996af4 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/constants/index.ts @@ -0,0 +1,44 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +import { LicenseType } from '../../../licensing/common/types'; + +const platinumLicense: LicenseType = 'platinum'; + +export const PLUGIN = { + ID: 'crossClusterReplication', + TITLE: i18n.translate('xpack.crossClusterReplication.appTitle', { + defaultMessage: 'Cross-Cluster Replication', + }), + minimumLicenseType: platinumLicense, +}; + +export const APPS = { + CCR_APP: 'ccr', + REMOTE_CLUSTER_APP: 'remote_cluster', +}; + +export const MANAGEMENT_ID = 'cross_cluster_replication'; +export const BASE_PATH = `/management/elasticsearch/${MANAGEMENT_ID}`; +export const BASE_PATH_REMOTE_CLUSTERS = '/management/elasticsearch/remote_clusters'; +export const API_BASE_PATH = '/api/cross_cluster_replication'; +export const API_REMOTE_CLUSTERS_BASE_PATH = '/api/remote_clusters'; +export const API_INDEX_MANAGEMENT_BASE_PATH = '/api/index_management'; + +export const FOLLOWER_INDEX_ADVANCED_SETTINGS = { + maxReadRequestOperationCount: 5120, + maxOutstandingReadRequests: 12, + maxReadRequestSize: '32mb', + maxWriteRequestOperationCount: 5120, + maxWriteRequestSize: '9223372036854775807b', + maxOutstandingWriteRequests: 9, + maxWriteBufferCount: 2147483647, + maxWriteBufferSize: '512mb', + maxRetryDelay: '500ms', + readPollTimeout: '1m', +}; diff --git a/x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap b/x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap new file mode 100644 index 00000000000000..c20556fe1434d0 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/services/__snapshots__/follower_index_serialization.test.ts.snap @@ -0,0 +1,128 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`[CCR] follower index serialization deserializeFollowerIndex() deserializes Elasticsearch follower index object 1`] = ` +Object { + "leaderIndex": "leader 1", + "maxOutstandingReadRequests": 1, + "maxOutstandingWriteRequests": 1, + "maxReadRequestOperationCount": 1, + "maxReadRequestSize": "1b", + "maxRetryDelay": "1s", + "maxWriteBufferCount": 1, + "maxWriteBufferSize": "1b", + "maxWriteRequestOperationCount": 1, + "maxWriteRequestSize": "1b", + "name": "follower index 1", + "readPollTimeout": "1s", + "remoteCluster": "cluster 1", + "shards": Array [ + Object { + "bytesReadCount": 1, + "failedReadRequestsCount": 1, + "failedWriteRequestsCount": 1, + "followerGlobalCheckpoint": 1, + "followerMappingVersion": 1, + "followerMaxSequenceNum": 1, + "followerSettingsVersion": 1, + "id": 1, + "lastRequestedSequenceNum": 1, + "leaderGlobalCheckpoint": 1, + "leaderIndex": "leader 1", + "leaderMaxSequenceNum": 1, + "operationsReadCount": 1, + "operationsWrittenCount": 1, + "outstandingReadRequestsCount": 1, + "outstandingWriteRequestsCount": 1, + "readExceptions": Array [], + "remoteCluster": "cluster 1", + "successfulReadRequestCount": 1, + "successfulWriteRequestsCount": 1, + "timeSinceLastReadMs": 1, + "totalReadRemoteExecTimeMs": 1, + "totalReadTimeMs": 1, + "totalWriteTimeMs": 1, + "writeBufferOperationsCount": 1, + "writeBufferSizeBytes": 1, + }, + Object { + "bytesReadCount": undefined, + "failedReadRequestsCount": undefined, + "failedWriteRequestsCount": undefined, + "followerGlobalCheckpoint": undefined, + "followerMappingVersion": undefined, + "followerMaxSequenceNum": undefined, + "followerSettingsVersion": undefined, + "id": "shard 2", + "lastRequestedSequenceNum": undefined, + "leaderGlobalCheckpoint": undefined, + "leaderIndex": "leader_index 2", + "leaderMaxSequenceNum": undefined, + "operationsReadCount": undefined, + "operationsWrittenCount": undefined, + "outstandingReadRequestsCount": undefined, + "outstandingWriteRequestsCount": undefined, + "readExceptions": undefined, + "remoteCluster": "remote_cluster 2", + "successfulReadRequestCount": undefined, + "successfulWriteRequestsCount": undefined, + "timeSinceLastReadMs": undefined, + "totalReadRemoteExecTimeMs": undefined, + "totalReadTimeMs": undefined, + "totalWriteTimeMs": undefined, + "writeBufferOperationsCount": undefined, + "writeBufferSizeBytes": undefined, + }, + ], + "status": "active", +} +`; + +exports[`[CCR] follower index serialization deserializeShard() deserializes shard 1`] = ` +Object { + "bytesReadCount": 1, + "failedReadRequestsCount": 1, + "failedWriteRequestsCount": 1, + "followerGlobalCheckpoint": 1, + "followerMappingVersion": 1, + "followerMaxSequenceNum": 1, + "followerSettingsVersion": 1, + "id": 1, + "lastRequestedSequenceNum": 1, + "leaderGlobalCheckpoint": 1, + "leaderIndex": "leader index", + "leaderMaxSequenceNum": 1, + "operationsReadCount": 1, + "operationsWrittenCount": 1, + "outstandingReadRequestsCount": 1, + "outstandingWriteRequestsCount": 1, + "readExceptions": Array [ + "read exception", + ], + "remoteCluster": "remote cluster", + "successfulReadRequestCount": 1, + "successfulWriteRequestsCount": 1, + "timeSinceLastReadMs": 1, + "totalReadRemoteExecTimeMs": 1, + "totalReadTimeMs": 1, + "totalWriteTimeMs": 1, + "writeBufferOperationsCount": 1, + "writeBufferSizeBytes": 1, +} +`; + +exports[`[CCR] follower index serialization serializeFollowerIndex() serializes object to Elasticsearch follower index object 1`] = ` +Object { + "leader_index": "leader index", + "max_outstanding_read_requests": 1, + "max_outstanding_write_requests": 1, + "max_read_request_operation_count": 1, + "max_read_request_size": "1b", + "max_retry_delay": "1s", + "max_write_buffer_count": 1, + "max_write_buffer_size": "1b", + "max_write_request_operation_count": 1, + "max_write_request_size": "1b", + "read_poll_timeout": "1s", + "remote_cluster": "remote cluster", +} +`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts similarity index 85% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js rename to x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts index eef87a6cc4c89e..fe3e59f21ee238 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.js +++ b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.test.ts @@ -4,6 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AutoFollowPattern, AutoFollowPatternFromEs } from '../types'; + import { deserializeAutoFollowPattern, deserializeListAutoFollowPatterns, @@ -12,13 +14,10 @@ import { describe('[CCR] auto-follow_serialization', () => { describe('deserializeAutoFollowPattern()', () => { - it('should return empty object if name or esObject are not provided', () => { - expect(deserializeAutoFollowPattern()).toEqual({}); - }); - it('should deserialize Elasticsearch object', () => { const expected = { name: 'some-name', + active: true, remoteCluster: 'foo', leaderIndexPatterns: ['foo-*'], followIndexPattern: 'bar', @@ -27,13 +26,14 @@ describe('[CCR] auto-follow_serialization', () => { const esObject = { name: 'some-name', pattern: { + active: true, remote_cluster: expected.remoteCluster, leader_index_patterns: expected.leaderIndexPatterns, follow_index_pattern: expected.followIndexPattern, }, }; - expect(deserializeAutoFollowPattern(esObject)).toEqual(expected); + expect(deserializeAutoFollowPattern(esObject as AutoFollowPatternFromEs)).toEqual(expected); }); }); @@ -78,7 +78,9 @@ describe('[CCR] auto-follow_serialization', () => { ], }; - expect(deserializeListAutoFollowPatterns(esObjects.patterns)).toEqual(expected); + expect( + deserializeListAutoFollowPatterns(esObjects.patterns as AutoFollowPatternFromEs[]) + ).toEqual(expected); }); }); @@ -96,7 +98,7 @@ describe('[CCR] auto-follow_serialization', () => { followIndexPattern: expected.follow_index_pattern, }; - expect(serializeAutoFollowPattern(object)).toEqual(expected); + expect(serializeAutoFollowPattern(object as AutoFollowPattern)).toEqual(expected); }); }); }); diff --git a/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts new file mode 100644 index 00000000000000..265af0ede14625 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/services/auto_follow_pattern_serialization.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { AutoFollowPattern, AutoFollowPatternFromEs, AutoFollowPatternToEs } from '../types'; + +export const deserializeAutoFollowPattern = ( + autoFollowPattern: AutoFollowPatternFromEs +): AutoFollowPattern => { + const { + name, + pattern: { active, remote_cluster, leader_index_patterns, follow_index_pattern }, + } = autoFollowPattern; + + return { + name, + active, + remoteCluster: remote_cluster, + leaderIndexPatterns: leader_index_patterns, + followIndexPattern: follow_index_pattern, + }; +}; + +export const deserializeListAutoFollowPatterns = ( + autoFollowPatterns: AutoFollowPatternFromEs[] +): AutoFollowPattern[] => autoFollowPatterns.map(deserializeAutoFollowPattern); + +export const serializeAutoFollowPattern = ({ + remoteCluster, + leaderIndexPatterns, + followIndexPattern, +}: AutoFollowPattern): AutoFollowPatternToEs => ({ + remote_cluster: remoteCluster, + leader_index_patterns: leaderIndexPatterns, + follow_index_pattern: followIndexPattern, +}); diff --git a/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts new file mode 100644 index 00000000000000..bfe3e1b3443e68 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.test.ts @@ -0,0 +1,224 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ShardFromEs, FollowerIndexFromEs, FollowerIndex } from '../types'; + +import { + deserializeShard, + deserializeFollowerIndex, + deserializeListFollowerIndices, + serializeFollowerIndex, +} from './follower_index_serialization'; + +describe('[CCR] follower index serialization', () => { + describe('deserializeShard()', () => { + it('deserializes shard', () => { + const serializedShard = { + remote_cluster: 'remote cluster', + leader_index: 'leader index', + shard_id: 1, + leader_global_checkpoint: 1, + leader_max_seq_no: 1, + follower_global_checkpoint: 1, + follower_max_seq_no: 1, + last_requested_seq_no: 1, + outstanding_read_requests: 1, + outstanding_write_requests: 1, + write_buffer_operation_count: 1, + write_buffer_size_in_bytes: 1, + follower_mapping_version: 1, + follower_settings_version: 1, + total_read_time_millis: 1, + total_read_remote_exec_time_millis: 1, + successful_read_requests: 1, + failed_read_requests: 1, + operations_read: 1, + bytes_read: 1, + total_write_time_millis: 1, + successful_write_requests: 1, + failed_write_requests: 1, + operations_written: 1, + read_exceptions: ['read exception'], + time_since_last_read_millis: 1, + }; + + expect(deserializeShard(serializedShard as ShardFromEs)).toMatchSnapshot(); + }); + }); + + describe('deserializeFollowerIndex()', () => { + it('deserializes Elasticsearch follower index object', () => { + const serializedFollowerIndex = { + follower_index: 'follower index 1', + remote_cluster: 'cluster 1', + leader_index: 'leader 1', + status: 'active', + parameters: { + max_read_request_operation_count: 1, + max_outstanding_read_requests: 1, + max_read_request_size: '1b', + max_write_request_operation_count: 1, + max_write_request_size: '1b', + max_outstanding_write_requests: 1, + max_write_buffer_count: 1, + max_write_buffer_size: '1b', + max_retry_delay: '1s', + read_poll_timeout: '1s', + }, + shards: [ + { + remote_cluster: 'cluster 1', + leader_index: 'leader 1', + shard_id: 1, + leader_global_checkpoint: 1, + leader_max_seq_no: 1, + follower_global_checkpoint: 1, + follower_max_seq_no: 1, + last_requested_seq_no: 1, + outstanding_read_requests: 1, + outstanding_write_requests: 1, + write_buffer_operation_count: 1, + write_buffer_size_in_bytes: 1, + follower_mapping_version: 1, + follower_settings_version: 1, + total_read_time_millis: 1, + total_read_remote_exec_time_millis: 1, + successful_read_requests: 1, + failed_read_requests: 1, + operations_read: 1, + bytes_read: 1, + total_write_time_millis: 1, + successful_write_requests: 1, + failed_write_requests: 1, + operations_written: 1, + // This is an array of exception objects + read_exceptions: [], + time_since_last_read_millis: 1, + }, + { + remote_cluster: 'remote_cluster 2', + leader_index: 'leader_index 2', + shard_id: 'shard 2', + }, + ], + }; + + expect( + deserializeFollowerIndex(serializedFollowerIndex as FollowerIndexFromEs) + ).toMatchSnapshot(); + }); + }); + + describe('deserializeListFollowerIndices()', () => { + it('deserializes list of Elasticsearch follower index objects', () => { + const serializedFollowerIndexList = [ + { + follower_index: 'follower index 1', + remote_cluster: 'cluster 1', + leader_index: 'leader 1', + status: 'active', + parameters: { + max_read_request_operation_count: 1, + max_outstanding_read_requests: 1, + max_read_request_size: '1b', + max_write_request_operation_count: 1, + max_write_request_size: '1b', + max_outstanding_write_requests: 1, + max_write_buffer_count: 1, + max_write_buffer_size: '1b', + max_retry_delay: '1s', + read_poll_timeout: '1s', + }, + shards: [], + }, + { + follower_index: 'follower index 2', + remote_cluster: 'cluster 2', + leader_index: 'leader 2', + status: 'paused', + parameters: { + max_read_request_operation_count: 2, + max_outstanding_read_requests: 2, + max_read_request_size: '2b', + max_write_request_operation_count: 2, + max_write_request_size: '2b', + max_outstanding_write_requests: 2, + max_write_buffer_count: 2, + max_write_buffer_size: '2b', + max_retry_delay: '2s', + read_poll_timeout: '2s', + }, + shards: [], + }, + ]; + + const deserializedFollowerIndexList = [ + { + name: 'follower index 1', + remoteCluster: 'cluster 1', + leaderIndex: 'leader 1', + status: 'active', + maxReadRequestOperationCount: 1, + maxOutstandingReadRequests: 1, + maxReadRequestSize: '1b', + maxWriteRequestOperationCount: 1, + maxWriteRequestSize: '1b', + maxOutstandingWriteRequests: 1, + maxWriteBufferCount: 1, + maxWriteBufferSize: '1b', + maxRetryDelay: '1s', + readPollTimeout: '1s', + shards: [], + }, + { + name: 'follower index 2', + remoteCluster: 'cluster 2', + leaderIndex: 'leader 2', + status: 'paused', + maxReadRequestOperationCount: 2, + maxOutstandingReadRequests: 2, + maxReadRequestSize: '2b', + maxWriteRequestOperationCount: 2, + maxWriteRequestSize: '2b', + maxOutstandingWriteRequests: 2, + maxWriteBufferCount: 2, + maxWriteBufferSize: '2b', + maxRetryDelay: '2s', + readPollTimeout: '2s', + shards: [], + }, + ]; + + expect(deserializeListFollowerIndices(serializedFollowerIndexList)).toEqual( + deserializedFollowerIndexList + ); + }); + }); + + describe('serializeFollowerIndex()', () => { + it('serializes object to Elasticsearch follower index object', () => { + const deserializedFollowerIndex = { + name: 'test', + status: 'active', + shards: [], + remoteCluster: 'remote cluster', + leaderIndex: 'leader index', + maxReadRequestOperationCount: 1, + maxOutstandingReadRequests: 1, + maxReadRequestSize: '1b', + maxWriteRequestOperationCount: 1, + maxWriteRequestSize: '1b', + maxOutstandingWriteRequests: 1, + maxWriteBufferCount: 1, + maxWriteBufferSize: '1b', + maxRetryDelay: '1s', + readPollTimeout: '1s', + }; + + expect(serializeFollowerIndex(deserializedFollowerIndex as FollowerIndex)).toMatchSnapshot(); + }); + }); +}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts similarity index 87% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js rename to x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts index c41fde8f7818dc..df476a0b2db89a 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/follower_index_serialization.js +++ b/x-pack/plugins/cross_cluster_replication/common/services/follower_index_serialization.ts @@ -4,7 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable camelcase */ +import { + ShardFromEs, + Shard, + FollowerIndexFromEs, + FollowerIndex, + FollowerIndexToEs, + FollowerIndexAdvancedSettings, + FollowerIndexAdvancedSettingsToEs, +} from '../types'; + export const deserializeShard = ({ remote_cluster, leader_index, @@ -32,7 +41,7 @@ export const deserializeShard = ({ operations_written, read_exceptions, time_since_last_read_millis, -}) => ({ +}: ShardFromEs): Shard => ({ id: shard_id, remoteCluster: remote_cluster, leaderIndex: leader_index, @@ -61,9 +70,7 @@ export const deserializeShard = ({ readExceptions: read_exceptions, timeSinceLastReadMs: time_since_last_read_millis, }); -/* eslint-enable camelcase */ -/* eslint-disable camelcase */ export const deserializeFollowerIndex = ({ follower_index, remote_cluster, @@ -82,7 +89,7 @@ export const deserializeFollowerIndex = ({ read_poll_timeout, } = {}, shards, -}) => ({ +}: FollowerIndexFromEs): FollowerIndex => ({ name: follower_index, remoteCluster: remote_cluster, leaderIndex: leader_index, @@ -99,10 +106,10 @@ export const deserializeFollowerIndex = ({ readPollTimeout: read_poll_timeout, shards: shards && shards.map(deserializeShard), }); -/* eslint-enable camelcase */ -export const deserializeListFollowerIndices = followerIndices => - followerIndices.map(deserializeFollowerIndex); +export const deserializeListFollowerIndices = ( + followerIndices: FollowerIndexFromEs[] +): FollowerIndex[] => followerIndices.map(deserializeFollowerIndex); export const serializeAdvancedSettings = ({ maxReadRequestOperationCount, @@ -115,7 +122,7 @@ export const serializeAdvancedSettings = ({ maxWriteBufferSize, maxRetryDelay, readPollTimeout, -}) => ({ +}: FollowerIndexAdvancedSettings): FollowerIndexAdvancedSettingsToEs => ({ max_read_request_operation_count: maxReadRequestOperationCount, max_outstanding_read_requests: maxOutstandingReadRequests, max_read_request_size: maxReadRequestSize, @@ -128,7 +135,7 @@ export const serializeAdvancedSettings = ({ read_poll_timeout: readPollTimeout, }); -export const serializeFollowerIndex = followerIndex => ({ +export const serializeFollowerIndex = (followerIndex: FollowerIndex): FollowerIndexToEs => ({ remote_cluster: followerIndex.remoteCluster, leader_index: followerIndex.leaderIndex, ...serializeAdvancedSettings(followerIndex), diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.test.js b/x-pack/plugins/cross_cluster_replication/common/services/utils.test.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.test.js rename to x-pack/plugins/cross_cluster_replication/common/services/utils.test.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.js b/x-pack/plugins/cross_cluster_replication/common/services/utils.ts similarity index 62% rename from x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.js rename to x-pack/plugins/cross_cluster_replication/common/services/utils.ts index 3d8c97f45327c6..dda6732254cc36 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/services/utils.js +++ b/x-pack/plugins/cross_cluster_replication/common/services/utils.ts @@ -3,14 +3,14 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -export const arrify = val => (Array.isArray(val) ? val : [val]); +export const arrify = (val: any): any[] => (Array.isArray(val) ? val : [val]); /** * Utilty to add some latency in a Promise chain * * @param {number} time Time in millisecond to wait */ -export const wait = (time = 1000) => data => { +export const wait = (time = 1000) => (data: any): Promise => { return new Promise(resolve => { setTimeout(() => resolve(data), time); }); @@ -19,8 +19,11 @@ export const wait = (time = 1000) => data => { /** * Utility to remove empty fields ("") from a request body */ -export const removeEmptyFields = body => - Object.entries(body).reduce((acc, [key, value]) => { +export const removeEmptyFields = (body: Record): Record => + Object.entries(body).reduce((acc: Record, [key, value]: [string, any]): Record< + string, + any + > => { if (value !== '') { acc[key] = value; } diff --git a/x-pack/plugins/cross_cluster_replication/common/types.ts b/x-pack/plugins/cross_cluster_replication/common/types.ts new file mode 100644 index 00000000000000..4932d6c5702973 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/common/types.ts @@ -0,0 +1,186 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export interface AutoFollowPattern { + name: string; + active: boolean; + remoteCluster: string; + leaderIndexPatterns: string[]; + followIndexPattern: string; +} + +export interface AutoFollowPatternFromEs { + name: string; + pattern: { + active: boolean; + remote_cluster: string; + leader_index_patterns: string[]; + follow_index_pattern: string; + }; +} + +export interface AutoFollowPatternToEs { + remote_cluster: string; + leader_index_patterns: string[]; + follow_index_pattern: string; +} + +export interface ShardFromEs { + remote_cluster: string; + leader_index: string; + shard_id: number; + leader_global_checkpoint: number; + leader_max_seq_no: number; + follower_global_checkpoint: number; + follower_max_seq_no: number; + last_requested_seq_no: number; + outstanding_read_requests: number; + outstanding_write_requests: number; + write_buffer_operation_count: number; + write_buffer_size_in_bytes: number; + follower_mapping_version: number; + follower_settings_version: number; + total_read_time_millis: number; + total_read_remote_exec_time_millis: number; + successful_read_requests: number; + failed_read_requests: number; + operations_read: number; + bytes_read: number; + total_write_time_millis: number; + successful_write_requests: number; + failed_write_requests: number; + operations_written: number; + // This is an array of exception objects + read_exceptions: any[]; + time_since_last_read_millis: number; +} + +export interface Shard { + remoteCluster: string; + leaderIndex: string; + id: number; + leaderGlobalCheckpoint: number; + leaderMaxSequenceNum: number; + followerGlobalCheckpoint: number; + followerMaxSequenceNum: number; + lastRequestedSequenceNum: number; + outstandingReadRequestsCount: number; + outstandingWriteRequestsCount: number; + writeBufferOperationsCount: number; + writeBufferSizeBytes: number; + followerMappingVersion: number; + followerSettingsVersion: number; + totalReadTimeMs: number; + totalReadRemoteExecTimeMs: number; + successfulReadRequestCount: number; + failedReadRequestsCount: number; + operationsReadCount: number; + bytesReadCount: number; + totalWriteTimeMs: number; + successfulWriteRequestsCount: number; + failedWriteRequestsCount: number; + operationsWrittenCount: number; + // This is an array of exception objects + readExceptions: any[]; + timeSinceLastReadMs: number; +} + +export interface FollowerIndexFromEs { + follower_index: string; + remote_cluster: string; + leader_index: string; + status: string; + // Once https://github.com/elastic/elasticsearch/issues/54996 is resolved so that paused follower + // indices contain this information, we can removed this optional typing as well as the optional + // typing in FollowerIndexAdvancedSettings and FollowerIndexAdvancedSettingsToEs. + parameters?: FollowerIndexAdvancedSettingsToEs; + shards: ShardFromEs[]; +} + +export interface FollowerIndex extends FollowerIndexAdvancedSettings { + name: string; + remoteCluster: string; + leaderIndex: string; + status: string; + shards: Shard[]; +} + +export interface FollowerIndexToEs extends FollowerIndexAdvancedSettingsToEs { + remote_cluster: string; + leader_index: string; +} + +export interface FollowerIndexAdvancedSettings { + maxReadRequestOperationCount?: number; + maxOutstandingReadRequests?: number; + maxReadRequestSize?: string; // byte value + maxWriteRequestOperationCount?: number; + maxWriteRequestSize?: string; // byte value + maxOutstandingWriteRequests?: number; + maxWriteBufferCount?: number; + maxWriteBufferSize?: string; // byte value + maxRetryDelay?: string; // time value + readPollTimeout?: string; // time value +} + +export interface FollowerIndexAdvancedSettingsToEs { + max_read_request_operation_count?: number; + max_outstanding_read_requests?: number; + max_read_request_size?: string; // byte value + max_write_request_operation_count?: number; + max_write_request_size?: string; // byte value + max_outstanding_write_requests?: number; + max_write_buffer_count?: number; + max_write_buffer_size?: string; // byte value + max_retry_delay?: string; // time value + read_poll_timeout?: string; // time value +} + +export interface RecentAutoFollowError { + timestamp: number; + leaderIndex: string; + autoFollowException: { + type: string; + reason: string; + }; +} + +export interface RecentAutoFollowErrorFromEs { + timestamp: number; + leader_index: string; + auto_follow_exception: { + type: string; + reason: string; + }; +} + +export interface AutoFollowedCluster { + clusterName: string; + timeSinceLastCheckMillis: number; + lastSeenMetadataVersion: number; +} + +export interface AutoFollowedClusterFromEs { + cluster_name: string; + time_since_last_check_millis: number; + last_seen_metadata_version: number; +} + +export interface AutoFollowStats { + numberOfFailedFollowIndices: number; + numberOfFailedRemoteClusterStateRequests: number; + numberOfSuccessfulFollowIndices: number; + recentAutoFollowErrors: RecentAutoFollowError[]; + autoFollowedClusters: AutoFollowedCluster[]; +} + +export interface AutoFollowStatsFromEs { + number_of_failed_follow_indices: number; + number_of_failed_remote_cluster_state_requests: number; + number_of_successful_follow_indices: number; + recent_auto_follow_errors: RecentAutoFollowErrorFromEs[]; + auto_followed_clusters: AutoFollowedClusterFromEs[]; +} diff --git a/x-pack/plugins/cross_cluster_replication/kibana.json b/x-pack/plugins/cross_cluster_replication/kibana.json new file mode 100644 index 00000000000000..ccf98f41def476 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/kibana.json @@ -0,0 +1,17 @@ +{ + "id": "crossClusterReplication", + "version": "kibana", + "server": true, + "ui": true, + "requiredPlugins": [ + "home", + "licensing", + "management", + "remoteClusters", + "indexManagement" + ], + "optionalPlugins": [ + "usageCollection" + ], + "configPath": ["xpack", "ccr"] +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_add.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_add.test.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_add.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_add.test.js index 2be00e70f6f848..db1430d157183d 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_add.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_add.test.js @@ -3,11 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; -import { indexPatterns } from '../../../../../../src/plugins/data/public'; -jest.mock('ui/new_platform'); +import { indexPatterns } from '../../../../../../src/plugins/data/public'; +import './mocks'; +import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; const { setup } = pageHelpers.autoFollowPatternAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_edit.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_edit.test.js similarity index 95% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_edit.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_edit.test.js index abc3e5dc9def26..170bce7b820859 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_edit.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_edit.test.js @@ -4,13 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { AutoFollowPatternForm } from '../../public/np_ready/app/components/auto_follow_pattern_form'; +import { AutoFollowPatternForm } from '../../app/components/auto_follow_pattern_form'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick } from './helpers'; import { AUTO_FOLLOW_PATTERN_EDIT } from './helpers/constants'; -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.autoFollowPatternEdit; const { setup: setupAutoFollowPatternAdd } = pageHelpers.autoFollowPatternAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_list.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js index 20e982856dc19b..190400e988634a 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/auto_follow_pattern_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/auto_follow_pattern_list.test.js @@ -4,13 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; +import { getAutoFollowPatternMock } from './fixtures/auto_follow_pattern'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; -import { getAutoFollowPatternClientMock } from '../../fixtures/auto_follow_pattern'; - -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.autoFollowPatternList; describe('', () => { @@ -79,11 +76,11 @@ describe('', () => { const testPrefix = 'prefix_'; const testSuffix = '_suffix'; - const autoFollowPattern1 = getAutoFollowPatternClientMock({ + const autoFollowPattern1 = getAutoFollowPatternMock({ name: `a${getRandomString()}`, followIndexPattern: `${testPrefix}{{leader_index}}${testSuffix}`, }); - const autoFollowPattern2 = getAutoFollowPatternClientMock({ + const autoFollowPattern2 = getAutoFollowPatternMock({ name: `b${getRandomString()}`, followIndexPattern: '{{leader_index}}', // no prefix nor suffix }); @@ -305,10 +302,12 @@ describe('', () => { const message = 'bar'; const recentAutoFollowErrors = [ { + timestamp: 1587081600021, leaderIndex: `${autoFollowPattern1.name}:my-leader-test`, autoFollowException: { type: 'exception', reason: message }, }, { + timestamp: 1587081600021, leaderIndex: `${autoFollowPattern2.name}:my-leader-test`, autoFollowException: { type: 'exception', reason: message }, }, @@ -327,7 +326,7 @@ describe('', () => { expect(exists('autoFollowPatternDetail.errors')).toBe(true); expect(exists('autoFollowPatternDetail.titleErrors')).toBe(true); expect(find('autoFollowPatternDetail.recentError').map(error => error.text())).toEqual([ - message, + 'April 16th, 2020 8:00:00 PM: bar', ]); }); }); diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts new file mode 100644 index 00000000000000..e6444c37e85903 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/auto_follow_pattern.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getRandomString } from '../../../../../../test_utils'; +import { AutoFollowPattern } from '../../../../common/types'; + +export const getAutoFollowPatternMock = ({ + name = getRandomString(), + active = false, + remoteCluster = getRandomString(), + leaderIndexPatterns = [`${getRandomString()}-*`], + followIndexPattern = getRandomString(), +}: { + name: string; + active: boolean; + remoteCluster: string; + leaderIndexPatterns: string[]; + followIndexPattern: string; +}): AutoFollowPattern => ({ + name, + active, + remoteCluster, + leaderIndexPatterns, + followIndexPattern, +}); diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts new file mode 100644 index 00000000000000..ff051d470531bc --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/fixtures/follower_index.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getRandomString } from '../../../../../../test_utils'; +import { FollowerIndex } from '../../../../common/types'; + +const Chance = require('chance'); // eslint-disable-line import/no-extraneous-dependencies, @typescript-eslint/no-var-requires +const chance = new Chance(); + +interface FollowerIndexMock { + name: string; + remoteCluster: string; + leaderIndex: string; + status: string; +} + +export const getFollowerIndexMock = ({ + name = getRandomString(), + remoteCluster = getRandomString(), + leaderIndex = getRandomString(), + status = 'Active', +}: FollowerIndexMock): FollowerIndex => ({ + name, + remoteCluster, + leaderIndex, + status, + maxReadRequestOperationCount: chance.integer(), + maxOutstandingReadRequests: chance.integer(), + maxReadRequestSize: getRandomString({ length: 5 }), + maxWriteRequestOperationCount: chance.integer(), + maxWriteRequestSize: '9223372036854775807b', + maxOutstandingWriteRequests: chance.integer(), + maxWriteBufferCount: chance.integer(), + maxWriteBufferSize: getRandomString({ length: 5 }), + maxRetryDelay: getRandomString({ length: 5 }), + readPollTimeout: getRandomString({ length: 5 }), + shards: [ + { + id: 0, + remoteCluster, + leaderIndex, + leaderGlobalCheckpoint: chance.integer(), + leaderMaxSequenceNum: chance.integer(), + followerGlobalCheckpoint: chance.integer(), + followerMaxSequenceNum: chance.integer(), + lastRequestedSequenceNum: chance.integer(), + outstandingReadRequestsCount: chance.integer(), + outstandingWriteRequestsCount: chance.integer(), + writeBufferOperationsCount: chance.integer(), + writeBufferSizeBytes: chance.integer(), + followerMappingVersion: chance.integer(), + followerSettingsVersion: chance.integer(), + totalReadTimeMs: chance.integer(), + totalReadRemoteExecTimeMs: chance.integer(), + successfulReadRequestCount: chance.integer(), + failedReadRequestsCount: chance.integer(), + operationsReadCount: chance.integer(), + bytesReadCount: chance.integer(), + totalWriteTimeMs: chance.integer(), + successfulWriteRequestsCount: chance.integer(), + failedWriteRequestsCount: chance.integer(), + operationsWrittenCount: chance.integer(), + readExceptions: [], + timeSinceLastReadMs: chance.integer(), + }, + ], +}); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_add.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_add.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js index 7680be9d858a46..4c99339e169525 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_add.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js @@ -4,13 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { setupEnvironment, pageHelpers, nextTick } from './helpers'; -import { RemoteClustersFormField } from '../../public/np_ready/app/components'; - import { indexPatterns } from '../../../../../../src/plugins/data/public'; - -jest.mock('ui/new_platform'); +import './mocks'; +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { RemoteClustersFormField } from '../../app/components'; const { setup } = pageHelpers.followerIndexAdd; const { setup: setupAutoFollowPatternAdd } = pageHelpers.autoFollowPatternAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_edit.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_edit.test.js similarity index 95% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_edit.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_edit.test.js index cfa37ff2e0358d..f4bda2af653aac 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_index_edit.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_edit.test.js @@ -4,12 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; -import { setupEnvironment, pageHelpers, nextTick } from './helpers'; -import { FollowerIndexForm } from '../../public/np_ready/app/components/follower_index_form/follower_index_form'; +import { FollowerIndexForm } from '../../app/components/follower_index_form/follower_index_form'; +import './mocks'; import { FOLLOWER_INDEX_EDIT } from './helpers/constants'; - -jest.mock('ui/new_platform'); +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; const { setup } = pageHelpers.followerIndexEdit; const { setup: setupFollowerIndexAdd } = pageHelpers.followerIndexAdd; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_indices_list.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_indices_list.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js index dde31d1d166f99..f98a1dafbbcbf0 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/follower_indices_list.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_indices_list.test.js @@ -4,12 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ +import { getFollowerIndexMock } from './fixtures/follower_index'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick, getRandomString } from './helpers'; -import { getFollowerIndexMock } from '../../fixtures/follower_index'; - -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.followerIndexList; describe('', () => { diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js similarity index 76% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js index 1f64e589bc4c10..1cb4e7c7725df9 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_add.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { AutoFollowPatternAdd } from '../../../public/np_ready/app/sections/auto_follow_pattern_add'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { AutoFollowPatternAdd } from '../../../app/sections/auto_follow_pattern_add'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js similarity index 82% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js index 2b110c6552072e..9cad61893c4099 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_edit.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { AutoFollowPatternEdit } from '../../../public/np_ready/app/sections/auto_follow_pattern_edit'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { AutoFollowPatternEdit } from '../../../app/sections/auto_follow_pattern_edit'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; import { AUTO_FOLLOW_PATTERN_EDIT_NAME } from './constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js similarity index 92% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js index 1d3e8ad6dff83b..450feed49f9f2e 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/auto_follow_pattern_list.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed, findTestSubject } from '../../../../../../test_utils'; -import { AutoFollowPatternList } from '../../../public/np_ready/app/sections/home/auto_follow_pattern_list'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { AutoFollowPatternList } from '../../../app/sections/home/auto_follow_pattern_list'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/constants.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/constants.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/constants.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/constants.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_add.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_add.helpers.js similarity index 79% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_add.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_add.helpers.js index f74baa1b2ad0a4..856b09f3f3cbaa 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_add.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_add.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { FollowerIndexAdd } from '../../../public/np_ready/app/sections/follower_index_add'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { FollowerIndexAdd } from '../../../app/sections/follower_index_add'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_edit.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_edit.helpers.js similarity index 84% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_edit.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_edit.helpers.js index 47f8539bb593b6..893d01f151bc28 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_edit.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_edit.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { FollowerIndexEdit } from '../../../public/np_ready/app/sections/follower_index_edit'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { FollowerIndexEdit } from '../../../app/sections/follower_index_edit'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; import { FOLLOWER_INDEX_EDIT_NAME } from './constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_list.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_list.helpers.js similarity index 90% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_list.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_list.helpers.js index 2154e11e17b1f7..52f4267594cc11 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/follower_index_list.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/follower_index_list.helpers.js @@ -5,9 +5,9 @@ */ import { registerTestBed, findTestSubject } from '../../../../../../test_utils'; -import { FollowerIndicesList } from '../../../public/np_ready/app/sections/home/follower_indices_list'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; +import { FollowerIndicesList } from '../../../app/sections/home/follower_indices_list'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/home.helpers.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/home.helpers.js similarity index 68% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/home.helpers.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/home.helpers.js index 664ad909ba8e76..56dfa765bfa4f1 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/home.helpers.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/home.helpers.js @@ -5,10 +5,10 @@ */ import { registerTestBed } from '../../../../../../test_utils'; -import { CrossClusterReplicationHome } from '../../../public/np_ready/app/sections/home/home'; -import { ccrStore } from '../../../public/np_ready/app/store'; -import routing from '../../../public/np_ready/app/services/routing'; -import { BASE_PATH } from '../../../common/constants'; +import { BASE_PATH } from '../../../../common/constants'; +import { CrossClusterReplicationHome } from '../../../app/sections/home/home'; +import { ccrStore } from '../../../app/store'; +import { routing } from '../../../app/services/routing'; const testBedConfig = { store: ccrStore, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/http_requests.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/http_requests.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/http_requests.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/http_requests.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/index.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/index.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/setup_environment.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/setup_environment.js similarity index 91% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/setup_environment.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/setup_environment.js index 3562ad0df5b514..6dedbbfa79b19b 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/helpers/setup_environment.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/helpers/setup_environment.js @@ -7,7 +7,7 @@ import axios from 'axios'; import axiosXhrAdapter from 'axios/lib/adapters/xhr'; -import { setHttpClient } from '../../../public/np_ready/app/services/api'; +import { setHttpClient } from '../../../app/services/api'; import { init as initHttpRequests } from './http_requests'; export const setupEnvironment = () => { diff --git a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/home.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/home.test.js similarity index 93% rename from x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/home.test.js rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/home.test.js index 2c536d069ef532..18d8b4eb9dbe04 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/__jest__/client_integration/home.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/home.test.js @@ -4,11 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import '../../public/np_ready/app/services/breadcrumbs.mock'; +import './mocks'; import { setupEnvironment, pageHelpers, nextTick } from './helpers'; -jest.mock('ui/new_platform'); - const { setup } = pageHelpers.home; describe('', () => { @@ -36,7 +34,7 @@ describe('', () => { ({ exists, find, component } = setup()); }); - test('should set the correct an app title', () => { + test('should set the correct app title', () => { expect(exists('appTitle')).toBe(true); expect(find('appTitle').text()).toEqual('Cross-Cluster Replication'); }); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.mock.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/breadcrumbs.mock.ts similarity index 70% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.mock.ts rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/breadcrumbs.mock.ts index b7c75108d4ef08..60a196254d408d 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.mock.ts +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/breadcrumbs.mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('./breadcrumbs', () => ({ - ...jest.requireActual('./breadcrumbs'), +jest.mock('../../../app/services/breadcrumbs', () => ({ + ...jest.requireActual('../../../app/services/breadcrumbs'), setBreadcrumbs: jest.fn(), })); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/index.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/index.ts similarity index 79% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/index.ts rename to x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/index.ts index 441648a8701e08..cff9c003f3e80f 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error_factory/index.ts +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { isEsErrorFactory } from './is_es_error_factory'; +import './breadcrumbs.mock'; +import './track_ui_metric.mock'; diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts new file mode 100644 index 00000000000000..016e2593432850 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/mocks/track_ui_metric.mock.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +jest.mock('../../../app/services/track_ui_metric', () => ({ + ...jest.requireActual('../../../app/services/track_ui_metric'), + trackUiMetric: jest.fn(), + trackUserRequest: (request: Promise) => { + return request.then(response => response); + }, +})); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js b/x-pack/plugins/cross_cluster_replication/public/app/app.tsx similarity index 89% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js rename to x-pack/plugins/cross_cluster_replication/public/app/app.tsx index 968646a4bd1b0d..ec349ccd6f2c71 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/app.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/app.tsx @@ -5,8 +5,8 @@ */ import React, { Component, Fragment } from 'react'; -import PropTypes from 'prop-types'; -import { Route, Switch, Redirect, withRouter } from 'react-router-dom'; +import { Route, Switch, Redirect, withRouter, RouteComponentProps } from 'react-router-dom'; +import { History } from 'history'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -20,12 +20,14 @@ import { EuiTitle, } from '@elastic/eui'; -import { BASE_PATH } from '../../../common/constants'; +import { BASE_PATH } from '../../common/constants'; import { getFatalErrors } from './services/notifications'; import { SectionError } from './components'; -import routing from './services/routing'; +import { routing } from './services/routing'; +// @ts-ignore import { loadPermissions } from './services/api'; +// @ts-ignore import { CrossClusterReplicationHome, AutoFollowPatternAdd, @@ -34,16 +36,21 @@ import { FollowerIndexEdit, } from './sections'; -class AppComponent extends Component { - static propTypes = { - history: PropTypes.shape({ - push: PropTypes.func.isRequired, - createHref: PropTypes.func.isRequired, - }).isRequired, - }; +interface AppProps { + history: History; + location: any; +} + +interface AppState { + isFetchingPermissions: boolean; + fetchPermissionError: any; + hasPermission: boolean; + missingClusterPrivileges: any[]; +} - constructor(...args) { - super(...args); +class AppComponent extends Component { + constructor(props: any) { + super(props); this.registerRouter(); this.state = { @@ -54,18 +61,10 @@ class AppComponent extends Component { }; } - UNSAFE_componentWillMount() { - routing.userHasLeftApp = false; - } - componentDidMount() { this.checkPermissions(); } - componentWillUnmount() { - routing.userHasLeftApp = true; - } - async checkPermissions() { this.setState({ isFetchingPermissions: true, @@ -163,7 +162,6 @@ class AppComponent extends Component { - + ( diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/remote_clusters_provider.js b/x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_provider.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/remote_clusters_provider.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_provider.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_error.js b/x-pack/plugins/cross_cluster_replication/public/app/components/section_error.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_error.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/section_error.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_loading.js b/x-pack/plugins/cross_cluster_replication/public/app/components/section_loading.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_loading.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/section_loading.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_unauthorized.js b/x-pack/plugins/cross_cluster_replication/public/app/components/section_unauthorized.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/components/section_unauthorized.js rename to x-pack/plugins/cross_cluster_replication/public/app/components/section_unauthorized.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/api.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/api.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/api.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/api.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/index.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/index.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/index.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/sections.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/sections.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/sections.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/sections.ts diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/ui_metric.js b/x-pack/plugins/cross_cluster_replication/public/app/constants/ui_metric.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/constants/ui_metric.js rename to x-pack/plugins/cross_cluster_replication/public/app/constants/ui_metric.ts diff --git a/x-pack/plugins/cross_cluster_replication/public/app/index.tsx b/x-pack/plugins/cross_cluster_replication/public/app/index.tsx new file mode 100644 index 00000000000000..79569b587f97f9 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/app/index.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { render, unmountComponentAtNode } from 'react-dom'; +import { Provider } from 'react-redux'; +import { HashRouter } from 'react-router-dom'; +import { I18nStart } from 'kibana/public'; +import { UnmountCallback } from 'src/core/public'; + +import { init as initBreadcrumbs, SetBreadcrumbs } from './services/breadcrumbs'; +import { init as initDocumentation } from './services/documentation_links'; +import { App } from './app'; +import { ccrStore } from './store'; + +const renderApp = (element: Element, I18nContext: I18nStart['Context']): UnmountCallback => { + render( + + + + + + + , + element + ); + + return () => unmountComponentAtNode(element); +}; + +export async function mountApp({ + element, + setBreadcrumbs, + I18nContext, + ELASTIC_WEBSITE_URL, + DOC_LINK_VERSION, +}: { + element: Element; + setBreadcrumbs: SetBreadcrumbs; + I18nContext: I18nStart['Context']; + ELASTIC_WEBSITE_URL: string; + DOC_LINK_VERSION: string; +}): Promise { + // Import and initialize additional services here instead of in plugin.ts to reduce the size of the + // initial bundle as much as possible. + initBreadcrumbs(setBreadcrumbs); + initDocumentation(`${ELASTIC_WEBSITE_URL}guide/en/elasticsearch/reference/${DOC_LINK_VERSION}/`); + + return renderApp(element, I18nContext); +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/auto_follow_pattern_add.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_add/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_add/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js similarity index 80% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js index 2c90456076f854..be470edc07537a 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.container.js @@ -39,8 +39,23 @@ const mapStateToProps = state => ({ const mapDispatchToProps = dispatch => ({ getAutoFollowPattern: id => dispatch(getAutoFollowPattern(id)), selectAutoFollowPattern: id => dispatch(selectEditAutoFollowPattern(id)), - saveAutoFollowPattern: (id, autoFollowPattern) => - dispatch(saveAutoFollowPattern(id, autoFollowPattern, true)), + saveAutoFollowPattern: (id, autoFollowPattern) => { + // Strip out errors. + const { active, remoteCluster, leaderIndexPatterns, followIndexPattern } = autoFollowPattern; + + dispatch( + saveAutoFollowPattern( + id, + { + active, + remoteCluster, + leaderIndexPatterns, + followIndexPattern, + }, + true + ) + ); + }, clearApiError: () => { dispatch(clearApiError(`${scope}-get`)); dispatch(clearApiError(`${scope}-save`)); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js index 4cd3617abd9899..387d7817a0357d 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/auto_follow_pattern_edit.js @@ -12,7 +12,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiPageContent, EuiSpacer } from '@elastic/eui'; import { listBreadcrumb, editBreadcrumb, setBreadcrumbs } from '../../services/breadcrumbs'; -import routing from '../../services/routing'; +import { routing } from '../../services/routing'; import { AutoFollowPatternForm, AutoFollowPatternPageTitle, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/auto_follow_pattern_edit/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/auto_follow_pattern_edit/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/follower_index_add.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/follower_index_add.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_add/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_add/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.js index 21493602c12a7c..22f9a7338384b5 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/follower_index_edit.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/follower_index_edit.js @@ -20,7 +20,7 @@ import { } from '@elastic/eui'; import { setBreadcrumbs, listBreadcrumb, editBreadcrumb } from '../../services/breadcrumbs'; -import routing from '../../services/routing'; +import { routing } from '../../services/routing'; import { FollowerIndexForm, FollowerIndexPageTitle, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/follower_index_edit/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/follower_index_edit/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js index e9e14f57e814ff..c8cf94842aa683 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js @@ -17,7 +17,7 @@ import { EuiSpacer, } from '@elastic/eui'; -import routing from '../../../services/routing'; +import { routing } from '../../../services/routing'; import { extractQueryParams } from '../../../services/query_params'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_AUTO_FOLLOW_PATTERN_LIST_LOAD } from '../../../constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js index 956a9f10d810bf..eb90e59e99fee6 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/auto_follow_pattern_table.js @@ -20,8 +20,8 @@ import { AutoFollowPatternDeleteProvider, AutoFollowPatternActionMenu, } from '../../../../../components'; -import routing from '../../../../../services/routing'; -import { trackUiMetric, METRIC_TYPE } from '../../../../../services/track_ui_metric'; +import { routing } from '../../../../../services/routing'; +import { trackUiMetric } from '../../../../../services/track_ui_metric'; export class AutoFollowPatternTable extends PureComponent { static propTypes = { @@ -86,7 +86,7 @@ export class AutoFollowPatternTable extends PureComponent { return ( { - trackUiMetric(METRIC_TYPE.CLICK, UIM_AUTO_FOLLOW_PATTERN_SHOW_DETAILS_CLICK); + trackUiMetric('click', UIM_AUTO_FOLLOW_PATTERN_SHOW_DETAILS_CLICK); selectAutoFollowPattern(name); }} data-test-subj="autoFollowPatternLink" diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/auto_follow_pattern_table/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js index 1a6d5e6efe35a0..3f2ed82420ff19 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js @@ -7,7 +7,9 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import { FormattedMessage } from '@kbn/i18n/react'; -import { getIndexListUri } from '../../../../../../../../../../../plugins/index_management/public'; +import moment from 'moment'; + +import { getIndexListUri } from '../../../../../../../../../plugins/index_management/public'; import { EuiButtonEmpty, @@ -247,6 +249,7 @@ export class DetailPanel extends Component {
    {autoFollowPattern.errors.map((error, i) => (
  • + {moment(error.timestamp).format('MMMM Do, YYYY h:mm:ss A')}:{' '} {error.autoFollowException.reason}
  • ))} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/detail_panel/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/components/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/auto_follow_pattern_list/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/context_menu/context_menu.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/context_menu/context_menu.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/context_menu/context_menu.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/context_menu/context_menu.js index 0f6ef75522ff71..4a66f7b717bac4 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/context_menu/context_menu.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/context_menu/context_menu.js @@ -15,7 +15,7 @@ import { EuiPopoverTitle, } from '@elastic/eui'; -import routing from '../../../../../services/routing'; +import { routing } from '../../../../../services/routing'; import { FollowerIndexPauseProvider, FollowerIndexResumeProvider, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/context_menu/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/context_menu/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/context_menu/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/context_menu/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js index 3e8cf6d3e2f78e..4436d76643e6c1 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/detail_panel/detail_panel.js @@ -31,7 +31,7 @@ import { } from '@elastic/eui'; import 'brace/theme/textmate'; -import { getIndexListUri } from '../../../../../../../../../../../plugins/index_management/public'; +import { getIndexListUri } from '../../../../../../../../../plugins/index_management/public'; import { API_STATUS } from '../../../../../constants'; import { ContextMenu } from '../context_menu'; @@ -489,7 +489,6 @@ export class DetailPanel extends Component { return ( { - trackUiMetric(METRIC_TYPE.CLICK, UIM_FOLLOWER_INDEX_SHOW_DETAILS_CLICK); + trackUiMetric('click', UIM_FOLLOWER_INDEX_SHOW_DETAILS_CLICK); selectFollowerIndex(name); }} data-test-subj="followerIndexLink" diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/follower_indices_table/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/follower_indices_table/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/follower_indices_table/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/follower_indices_table/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/components/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/components/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/follower_indices_list.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/follower_indices_list.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/follower_indices_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js similarity index 99% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/follower_indices_list.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js index b7e04721f4748c..7b843d08cefd3e 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/follower_indices_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/follower_indices_list.js @@ -17,7 +17,7 @@ import { EuiSpacer, } from '@elastic/eui'; -import routing from '../../../services/routing'; +import { routing } from '../../../services/routing'; import { extractQueryParams } from '../../../services/query_params'; import { trackUiMetric, METRIC_TYPE } from '../../../services/track_ui_metric'; import { API_STATUS, UIM_FOLLOWER_INDEX_LIST_LOAD } from '../../../constants'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/follower_indices_list/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/follower_indices_list/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/home.container.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/home.container.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/home.container.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/home.container.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/home.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/home.js similarity index 96% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/home.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/home.js index 88db9096122453..bcd9dad114862d 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/home.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/home.js @@ -10,9 +10,9 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { EuiPageBody, EuiPageContent, EuiSpacer, EuiTab, EuiTabs, EuiTitle } from '@elastic/eui'; -import { BASE_PATH } from '../../../../../common/constants'; +import { BASE_PATH } from '../../../../common/constants'; import { setBreadcrumbs, listBreadcrumb } from '../../services/breadcrumbs'; -import routing from '../../services/routing'; +import { routing } from '../../services/routing'; import { AutoFollowPatternList } from './auto_follow_pattern_list'; import { FollowerIndicesList } from './follower_indices_list'; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/home/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/home/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/app.ts b/x-pack/plugins/cross_cluster_replication/public/app/sections/index.d.ts similarity index 50% rename from x-pack/legacy/plugins/cross_cluster_replication/common/constants/app.ts rename to x-pack/plugins/cross_cluster_replication/public/app/sections/index.d.ts index 4ce0a2f5644f3f..b7c1f495604bef 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/app.ts +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/index.d.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -export const APPS = { - CCR_APP: 'ccr', - REMOTE_CLUSTER_APP: 'remote_cluster', -}; +export declare const CrossClusterReplicationHome: any; +export declare const AutoFollowPatternAdd: any; +export declare const AutoFollowPatternEdit: any; +export declare const FollowerIndexAdd: any; +export declare const FollowerIndexEdit: any; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/index.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/sections/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/sections/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/__snapshots__/auto_follow_pattern_validators.test.js.snap b/x-pack/plugins/cross_cluster_replication/public/app/services/__snapshots__/auto_follow_pattern_validators.test.js.snap similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/__snapshots__/auto_follow_pattern_validators.test.js.snap rename to x-pack/plugins/cross_cluster_replication/public/app/services/__snapshots__/auto_follow_pattern_validators.test.js.snap diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/api.js b/x-pack/plugins/cross_cluster_replication/public/app/services/api.js similarity index 98% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/api.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/api.js index 24bc7e17356e25..adff40ef29be68 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/api.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/api.js @@ -7,8 +7,8 @@ import { API_BASE_PATH, API_REMOTE_CLUSTERS_BASE_PATH, API_INDEX_MANAGEMENT_BASE_PATH, -} from '../../../../common/constants'; -import { arrify } from '../../../../common/services/utils'; +} from '../../../common/constants'; +import { arrify } from '../../../common/services/utils'; import { UIM_FOLLOWER_INDEX_CREATE, UIM_FOLLOWER_INDEX_UPDATE, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_errors.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_errors.js similarity index 92% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_errors.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_errors.js index 95aa3f0ebc3e4d..70311d5ba1e4d1 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_errors.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_errors.js @@ -9,11 +9,12 @@ export const parseAutoFollowError = error => { return null; } - const { leaderIndex, autoFollowException } = error; + const { leaderIndex, autoFollowException, timestamp } = error; const id = leaderIndex.substring(0, leaderIndex.lastIndexOf(':')); return { id, + timestamp, leaderIndex, autoFollowException, }; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_errors.test.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_errors.test.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_errors.test.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_errors.test.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern.test.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern.test.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern.test.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern.test.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern_validators.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern_validators.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js index 1b5a39658ee463..cf394d4b3c7d8e 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern_validators.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js @@ -8,8 +8,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; -import { indices } from '../../../../../../../../src/plugins/es_ui_shared/public'; -import { indexPatterns } from '../../../../../../../../src/plugins/data/public'; +import { indices } from '../../../../../../src/plugins/es_ui_shared/public'; +import { indexPatterns } from '../../../../../../src/plugins/data/public'; const { indexNameBeginsWithPeriod, diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern_validators.test.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.test.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/auto_follow_pattern_validators.test.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.test.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.ts b/x-pack/plugins/cross_cluster_replication/public/app/services/breadcrumbs.ts similarity index 62% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.ts rename to x-pack/plugins/cross_cluster_replication/public/app/services/breadcrumbs.ts index dc64cdee07f7db..84ac9356462ade 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/breadcrumbs.ts +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/breadcrumbs.ts @@ -3,26 +3,20 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { i18n } from '@kbn/i18n'; import { ChromeBreadcrumb } from 'src/core/public'; -import { ManagementAppMountParams } from '../../../../../../../../src/plugins/management/public'; +import { ManagementAppMountParams } from '../../../../../../src/plugins/management/public'; + +import { BASE_PATH } from '../../../common/constants'; -import { BASE_PATH } from '../../../../common/constants'; +export type SetBreadcrumbs = ManagementAppMountParams['setBreadcrumbs']; -let setBreadcrumbs: ManagementAppMountParams['setBreadcrumbs']; +let setBreadcrumbs: (crumbs: ChromeBreadcrumb[]) => void; -export const setBreadcrumbSetter = ({ - __LEGACY, -}: { - __LEGACY: { - chrome: any; - MANAGEMENT_BREADCRUMB: ChromeBreadcrumb; - }; -}): void => { - setBreadcrumbs = (crumbs: ChromeBreadcrumb[]) => { - __LEGACY.chrome.breadcrumbs.set([__LEGACY.MANAGEMENT_BREADCRUMB, ...crumbs]); - }; +export const init = (_setBreadcrumbs: SetBreadcrumbs): void => { + setBreadcrumbs = _setBreadcrumbs; }; export const listBreadcrumb = { diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/documentation_links.ts b/x-pack/plugins/cross_cluster_replication/public/app/services/documentation_links.ts new file mode 100644 index 00000000000000..c8b00f6e246b5c --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/documentation_links.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +let _esBase: string; + +export const init = (esBase: string) => { + _esBase = esBase; +}; + +export const getAutoFollowPatternUrl = (): string => `${_esBase}/ccr-put-auto-follow-pattern.html`; +export const getFollowerIndexUrl = (): string => `${_esBase}/ccr-put-follow.html`; +export const getByteUnitsUrl = (): string => `${_esBase}/common-options.html#byte-units`; +export const getTimeUnitsUrl = (): string => `${_esBase}/common-options.html#time-units`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/follower_index_default_settings.js b/x-pack/plugins/cross_cluster_replication/public/app/services/follower_index_default_settings.js similarity index 89% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/follower_index_default_settings.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/follower_index_default_settings.js index d20fa76ef54518..118a54887d4049 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/follower_index_default_settings.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/follower_index_default_settings.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { FOLLOWER_INDEX_ADVANCED_SETTINGS } from '../../../../common/constants'; +import { FOLLOWER_INDEX_ADVANCED_SETTINGS } from '../../../common/constants'; export const getSettingDefault = name => { if (!FOLLOWER_INDEX_ADVANCED_SETTINGS[name]) { diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/get_remote_cluster_name.js b/x-pack/plugins/cross_cluster_replication/public/app/services/get_remote_cluster_name.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/get_remote_cluster_name.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/get_remote_cluster_name.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/input_validation.js b/x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/input_validation.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js index 64c3e8412437e4..7e2b45b625c1f0 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/input_validation.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/input_validation.js @@ -6,7 +6,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { indices } from '../../../../../../../../src/plugins/es_ui_shared/public'; +import { indices } from '../../../../../../src/plugins/es_ui_shared/public'; const isEmpty = value => { return !value || !value.trim().length; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/notifications.ts b/x-pack/plugins/cross_cluster_replication/public/app/services/notifications.ts new file mode 100644 index 00000000000000..66fc9de00995c0 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/notifications.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IToasts, FatalErrorsSetup } from 'src/core/public'; + +let _toasts: IToasts; +let _fatalErrors: FatalErrorsSetup; + +export const init = (toasts: IToasts, fatalErrors: FatalErrorsSetup) => { + _toasts = toasts; + _fatalErrors = fatalErrors; +}; + +export const getToasts = () => _toasts; +export const getFatalErrors = () => _fatalErrors; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/query_params.js b/x-pack/plugins/cross_cluster_replication/public/app/services/query_params.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/query_params.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/query_params.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/index.js b/x-pack/plugins/cross_cluster_replication/public/app/services/routing.d.ts similarity index 87% rename from x-pack/legacy/plugins/cross_cluster_replication/public/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/routing.d.ts index e92c44da34474c..9e96ea12856f61 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/index.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/routing.d.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -import './register_routes'; +export declare const routing: any; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/routing.js b/x-pack/plugins/cross_cluster_replication/public/app/services/routing.js similarity index 93% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/routing.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/routing.js index 965aeaaad22ad9..124c61e1ba19e4 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/routing.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/routing.js @@ -10,7 +10,7 @@ import { createLocation } from 'history'; import { stringify } from 'query-string'; -import { APPS, BASE_PATH, BASE_PATH_REMOTE_CLUSTERS } from '../../../../common/constants'; +import { APPS, BASE_PATH, BASE_PATH_REMOTE_CLUSTERS } from '../../../common/constants'; const isModifiedEvent = event => !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); @@ -32,7 +32,6 @@ const appToBasePathMap = { }; class Routing { - _userHasLeftApp = false; _reactRouter = null; /** @@ -97,14 +96,6 @@ class Routing { set reactRouter(router) { this._reactRouter = router; } - - get userHasLeftApp() { - return this._userHasLeftApp; - } - - set userHasLeftApp(hasLeft) { - this._userHasLeftApp = hasLeft; - } } -export default new Routing(); +export const routing = new Routing(); diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/track_ui_metric.ts b/x-pack/plugins/cross_cluster_replication/public/app/services/track_ui_metric.ts new file mode 100644 index 00000000000000..aecc4eb83893fc --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/track_ui_metric.ts @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UsageCollectionSetup } from 'src/plugins/usage_collection/public'; +import { UiStatsMetricType, METRIC_TYPE } from '@kbn/analytics'; + +import { UIM_APP_NAME } from '../constants'; + +export { METRIC_TYPE }; + +// usageCollection is an optional dependency, so we default to a no-op. +export let trackUiMetric = (metricType: UiStatsMetricType, eventName: string) => {}; + +export function init(usageCollection: UsageCollectionSetup): void { + trackUiMetric = usageCollection.reportUiStats.bind(usageCollection, UIM_APP_NAME); +} + +/** + * Transparently return provided request Promise, while allowing us to track + * a successful completion of the request. + */ +export function trackUserRequest(request: Promise, actionType: string) { + // Only track successful actions. + return request.then(response => { + // It looks like we're using the wrong type here, added via + // https://github.com/elastic/kibana/pull/41113/files#diff-e65a0a6696a9d723969afd871cbd60cdR19 + // but we'll keep it for now to avoid discontinuity in our telemetry data. + trackUiMetric(METRIC_TYPE.LOADED, actionType); + + // We return the response immediately without waiting for the tracking request to resolve, + // to avoid adding additional latency. + return response; + }); +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/utils.js b/x-pack/plugins/cross_cluster_replication/public/app/services/utils.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/utils.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/utils.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/utils.test.js b/x-pack/plugins/cross_cluster_replication/public/app/services/utils.test.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/services/utils.test.js rename to x-pack/plugins/cross_cluster_replication/public/app/services/utils.test.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/action_types.js b/x-pack/plugins/cross_cluster_replication/public/app/store/action_types.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/action_types.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/action_types.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/api.js b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/api.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/api.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/actions/api.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/auto_follow_pattern.js b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/auto_follow_pattern.js similarity index 95% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/auto_follow_pattern.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/actions/auto_follow_pattern.js index b81cd30f3977a7..52a22cb17d0a90 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/auto_follow_pattern.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/auto_follow_pattern.js @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { i18n } from '@kbn/i18n'; -import { getNotifications } from '../../services/notifications'; +import { getToasts } from '../../services/notifications'; import { SECTIONS, API_STATUS } from '../../constants'; import { loadAutoFollowPatterns as loadAutoFollowPatternsRequest, @@ -15,7 +15,7 @@ import { pauseAutoFollowPattern as pauseAutoFollowPatternRequest, resumeAutoFollowPattern as resumeAutoFollowPatternRequest, } from '../../services/api'; -import routing from '../../services/routing'; +import { routing } from '../../services/routing'; import * as t from '../action_types'; import { sendApiRequest } from './api'; import { getSelectedAutoFollowPatternId } from '../selectors'; @@ -75,7 +75,7 @@ export const saveAutoFollowPattern = (id, autoFollowPattern, isUpdating = false) } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); routing.navigate(`/auto_follow_patterns`, undefined, { pattern: encodeURIComponent(id), }); @@ -111,7 +111,7 @@ export const deleteAutoFollowPattern = id => } ); - getNotifications().addDanger(errorMessage); + getToasts().addDanger(errorMessage); } if (response.itemsDeleted.length) { @@ -133,7 +133,7 @@ export const deleteAutoFollowPattern = id => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); // If we've just deleted a pattern we were looking at, we need to close the panel. const autoFollowPatternId = getSelectedAutoFollowPatternId('detail')(getState()); @@ -173,7 +173,7 @@ export const pauseAutoFollowPattern = id => } ); - getNotifications().addDanger(errorMessage); + getToasts().addDanger(errorMessage); } if (response.itemsPaused.length) { @@ -195,7 +195,7 @@ export const pauseAutoFollowPattern = id => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); } }, }); @@ -229,7 +229,7 @@ export const resumeAutoFollowPattern = id => } ); - getNotifications().addDanger(errorMessage); + getToasts().addDanger(errorMessage); } if (response.itemsResumed.length) { @@ -251,7 +251,7 @@ export const resumeAutoFollowPattern = id => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); } }, }); diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/ccr.js b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/ccr.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/ccr.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/actions/ccr.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/follower_index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/follower_index.js similarity index 94% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/follower_index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/actions/follower_index.js index ebdee067ced75f..d081e0444eb588 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/follower_index.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/follower_index.js @@ -5,8 +5,8 @@ */ import { i18n } from '@kbn/i18n'; -import routing from '../../services/routing'; -import { getNotifications } from '../../services/notifications'; +import { routing } from '../../services/routing'; +import { getToasts } from '../../services/notifications'; import { SECTIONS, API_STATUS } from '../../constants'; import { loadFollowerIndices as loadFollowerIndicesRequest, @@ -76,7 +76,7 @@ export const saveFollowerIndex = (name, followerIndex, isUpdating = false) => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); routing.navigate(`/follower_indices`, undefined, { name: encodeURIComponent(name), }); @@ -112,7 +112,7 @@ export const pauseFollowerIndex = id => } ); - getNotifications().addDanger(errorMessage); + getToasts().addDanger(errorMessage); } if (response.itemsPaused.length) { @@ -134,7 +134,7 @@ export const pauseFollowerIndex = id => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); // Refresh list dispatch(loadFollowerIndices(true)); @@ -149,6 +149,7 @@ export const resumeFollowerIndex = id => scope, handler: async () => resumeFollowerIndexRequest(id), onSuccess(response, dispatch) { + console.log('response', response); /** * We can have 1 or more follower index resume operation * that can fail or succeed. We will show 1 toast notification for each. @@ -171,7 +172,7 @@ export const resumeFollowerIndex = id => } ); - getNotifications().addDanger(errorMessage); + getToasts().addDanger(errorMessage); } if (response.itemsResumed.length) { @@ -193,7 +194,7 @@ export const resumeFollowerIndex = id => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); } // Refresh list @@ -230,7 +231,7 @@ export const unfollowLeaderIndex = id => } ); - getNotifications().addDanger(errorMessage); + getToasts().addDanger(errorMessage); } if (response.itemsUnfollowed.length) { @@ -252,7 +253,7 @@ export const unfollowLeaderIndex = id => } ); - getNotifications().addSuccess(successMessage); + getToasts().addSuccess(successMessage); } if (response.itemsNotOpen.length) { @@ -274,7 +275,7 @@ export const unfollowLeaderIndex = id => } ); - getNotifications().addWarning(warningMessage); + getToasts().addWarning(warningMessage); } // If we've just unfollowed a follower index we were looking at, we need to close the panel. diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/actions/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/actions/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/index.d.ts similarity index 83% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/index.d.ts index f2c070fd44b6e6..6d35dfeddfd466 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/check_license/index.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/store/index.d.ts @@ -4,4 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export { checkLicense } from './check_license'; +export declare const ccrStore: any; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/api.js b/x-pack/plugins/cross_cluster_replication/public/app/store/reducers/api.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/api.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/reducers/api.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/api.test.js b/x-pack/plugins/cross_cluster_replication/public/app/store/reducers/api.test.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/api.test.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/reducers/api.test.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/auto_follow_pattern.js b/x-pack/plugins/cross_cluster_replication/public/app/store/reducers/auto_follow_pattern.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/auto_follow_pattern.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/reducers/auto_follow_pattern.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/follower_index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/reducers/follower_index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/follower_index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/reducers/follower_index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/reducers/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/reducers/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/stats.js b/x-pack/plugins/cross_cluster_replication/public/app/store/reducers/stats.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/reducers/stats.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/reducers/stats.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/selectors/index.js b/x-pack/plugins/cross_cluster_replication/public/app/store/selectors/index.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/selectors/index.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/selectors/index.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/store.js b/x-pack/plugins/cross_cluster_replication/public/app/store/store.js similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/app/store/store.js rename to x-pack/plugins/cross_cluster_replication/public/app/store/store.js diff --git a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/index.ts b/x-pack/plugins/cross_cluster_replication/public/index.ts similarity index 61% rename from x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/index.ts rename to x-pack/plugins/cross_cluster_replication/public/index.ts index 11aea6b7b5de43..e3e2d860e526d5 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/public/np_ready/index.ts +++ b/x-pack/plugins/cross_cluster_replication/public/index.ts @@ -6,6 +6,7 @@ import { PluginInitializerContext } from 'src/core/public'; -import { CrossClusterReplicationUIPlugin } from './plugin'; +import { CrossClusterReplicationPlugin } from './plugin'; -export const plugin = (ctx: PluginInitializerContext) => new CrossClusterReplicationUIPlugin(ctx); +export const plugin = (initializerContext: PluginInitializerContext) => + new CrossClusterReplicationPlugin(initializerContext); diff --git a/x-pack/plugins/cross_cluster_replication/public/plugin.ts b/x-pack/plugins/cross_cluster_replication/public/plugin.ts new file mode 100644 index 00000000000000..bdaa04e9d53ee3 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/plugin.ts @@ -0,0 +1,102 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; +import { get } from 'lodash'; +import { first } from 'rxjs/operators'; +import { CoreSetup, Plugin, PluginInitializerContext } from 'src/core/public'; + +import { PLUGIN, MANAGEMENT_ID } from '../common/constants'; +import { init as initUiMetric } from './app/services/track_ui_metric'; +import { init as initNotification } from './app/services/notifications'; +import { PluginDependencies, ClientConfigType } from './types'; + +// @ts-ignore; +import { setHttpClient } from './app/services/api'; + +export class CrossClusterReplicationPlugin implements Plugin { + constructor(private readonly initializerContext: PluginInitializerContext) {} + + public setup(coreSetup: CoreSetup, plugins: PluginDependencies) { + const { licensing, remoteClusters, usageCollection, management, indexManagement } = plugins; + const esSection = management.sections.getSection('elasticsearch'); + + const { + http, + notifications: { toasts }, + fatalErrors, + getStartServices, + } = coreSetup; + + // Initialize services even if the app isn't mounted, because they're used by index management extensions. + setHttpClient(http); + initUiMetric(usageCollection); + initNotification(toasts, fatalErrors); + + const ccrApp = esSection!.registerApp({ + id: MANAGEMENT_ID, + title: PLUGIN.TITLE, + order: 4, + mount: async ({ element, setBreadcrumbs }) => { + const { mountApp } = await import('./app'); + + const [coreStart] = await getStartServices(); + const { + i18n: { Context: I18nContext }, + docLinks: { ELASTIC_WEBSITE_URL, DOC_LINK_VERSION }, + } = coreStart; + + return mountApp({ + element, + setBreadcrumbs, + I18nContext, + ELASTIC_WEBSITE_URL, + DOC_LINK_VERSION, + }); + }, + }); + + ccrApp.disable(); + + licensing.license$ + .pipe(first()) + .toPromise() + .then(license => { + const licenseStatus = license.check(PLUGIN.ID, PLUGIN.minimumLicenseType); + const isLicenseOk = licenseStatus.state === 'valid'; + const config = this.initializerContext.config.get(); + + // remoteClusters.isUiEnabled is driven by the xpack.remote_clusters.ui.enabled setting. + // The CCR UI depends upon the Remote Clusters UI (e.g. by cross-linking to it), so if + // the Remote Clusters UI is disabled we can't show the CCR UI. + const isCcrUiEnabled = config.ui.enabled && remoteClusters.isUiEnabled; + + if (isLicenseOk && isCcrUiEnabled) { + ccrApp.enable(); + + if (indexManagement) { + const propertyPath = 'isFollowerIndex'; + + const followerBadgeExtension = { + matchIndex: (index: any) => { + return get(index, propertyPath); + }, + label: i18n.translate('xpack.crossClusterReplication.indexMgmtBadge.followerLabel', { + defaultMessage: 'Follower', + }), + color: 'default', + filterExpression: 'isFollowerIndex:true', + }; + + indexManagement.extensionsService.addBadge(followerBadgeExtension); + } + } + }); + } + + public start() {} + public stop() {} +} diff --git a/x-pack/plugins/cross_cluster_replication/public/types.ts b/x-pack/plugins/cross_cluster_replication/public/types.ts new file mode 100644 index 00000000000000..aac174b7524d3c --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/public/types.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { UsageCollectionSetup } from '../../../../src/plugins/usage_collection/public'; +import { ManagementSetup } from '../../../../src/plugins/management/public'; +import { IndexManagementPluginSetup } from '../../index_management/public'; +import { RemoteClustersPluginSetup } from '../../remote_clusters/public'; +import { LicensingPluginSetup } from '../../licensing/public'; + +export interface PluginDependencies { + usageCollection: UsageCollectionSetup; + management: ManagementSetup; + indexManagement: IndexManagementPluginSetup; + remoteClusters: RemoteClustersPluginSetup; + licensing: LicensingPluginSetup; +} + +export interface ClientConfigType { + ui: { + enabled: boolean; + }; +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/client/elasticsearch_ccr.js b/x-pack/plugins/cross_cluster_replication/server/client/elasticsearch_ccr.ts similarity index 97% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/client/elasticsearch_ccr.js rename to x-pack/plugins/cross_cluster_replication/server/client/elasticsearch_ccr.ts index 91527b8eb7cc57..d4de54391286b8 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/client/elasticsearch_ccr.js +++ b/x-pack/plugins/cross_cluster_replication/server/client/elasticsearch_ccr.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export const elasticsearchJsPlugin = (Client, config, components) => { +export const elasticsearchJsPlugin = (Client: any, config: any, components: any) => { const ca = components.clientAction.factory; Client.prototype.ccr = components.clientAction.namespaceFactory(); diff --git a/x-pack/plugins/cross_cluster_replication/server/config.ts b/x-pack/plugins/cross_cluster_replication/server/config.ts new file mode 100644 index 00000000000000..17999d37c76b7c --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/config.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), + ui: schema.object({ + enabled: schema.boolean({ defaultValue: true }), + }), +}); + +export type CrossClusterReplicationConfig = TypeOf; diff --git a/x-pack/plugins/cross_cluster_replication/server/index.ts b/x-pack/plugins/cross_cluster_replication/server/index.ts new file mode 100644 index 00000000000000..597c039ad202e8 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { PluginInitializerContext, PluginConfigDescriptor } from 'src/core/server'; +import { CrossClusterReplicationServerPlugin } from './plugin'; +import { configSchema, CrossClusterReplicationConfig } from './config'; + +export const plugin = (pluginInitializerContext: PluginInitializerContext) => + new CrossClusterReplicationServerPlugin(pluginInitializerContext); + +export const config: PluginConfigDescriptor = { + schema: configSchema, + exposeToBrowser: { + ui: true, + }, +}; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/__snapshots__/ccr_stats_serialization.test.js.snap b/x-pack/plugins/cross_cluster_replication/server/lib/__snapshots__/ccr_stats_serialization.test.ts.snap similarity index 93% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/__snapshots__/ccr_stats_serialization.test.js.snap rename to x-pack/plugins/cross_cluster_replication/server/lib/__snapshots__/ccr_stats_serialization.test.ts.snap index 92ac6070904b5c..3eced37112a359 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/__snapshots__/ccr_stats_serialization.test.js.snap +++ b/x-pack/plugins/cross_cluster_replication/server/lib/__snapshots__/ccr_stats_serialization.test.ts.snap @@ -19,6 +19,7 @@ Object { "type": "exception", }, "leaderIndex": "pattern-1:kibana_sample_1", + "timestamp": 1587081600021, }, Object { "autoFollowException": Object { @@ -26,6 +27,7 @@ Object { "type": "exception", }, "leaderIndex": "pattern-2:kibana_sample_1", + "timestamp": 1587081600021, }, ], } diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.test.js b/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.test.ts similarity index 95% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.test.js rename to x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.test.ts index 5120c56701e5bc..5141aa56c1d7e5 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.test.js +++ b/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.test.ts @@ -15,6 +15,7 @@ describe('[CCR] auto-follow stats serialization', () => { recent_auto_follow_errors: [ { leader_index: 'pattern-1:kibana_sample_1', + timestamp: 1587081600021, auto_follow_exception: { type: 'exception', reason: @@ -23,6 +24,7 @@ describe('[CCR] auto-follow stats serialization', () => { }, { leader_index: 'pattern-2:kibana_sample_1', + timestamp: 1587081600021, auto_follow_exception: { type: 'exception', reason: diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.js b/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts similarity index 77% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.js rename to x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts index e4d2f8d64d1bb9..7e2b0889198426 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/ccr_stats_serialization.js +++ b/x-pack/plugins/cross_cluster_replication/server/lib/ccr_stats_serialization.ts @@ -4,11 +4,21 @@ * you may not use this file except in compliance with the Elastic License. */ -/* eslint-disable camelcase */ +import { + RecentAutoFollowError, + RecentAutoFollowErrorFromEs, + AutoFollowedCluster, + AutoFollowedClusterFromEs, + AutoFollowStats, + AutoFollowStatsFromEs, +} from '../../common/types'; + export const deserializeRecentAutoFollowErrors = ({ + timestamp, leader_index, auto_follow_exception: { type, reason }, -}) => ({ +}: RecentAutoFollowErrorFromEs): RecentAutoFollowError => ({ + timestamp, leaderIndex: leader_index, autoFollowException: { type, @@ -20,7 +30,7 @@ export const deserializeAutoFollowedClusters = ({ cluster_name, time_since_last_check_millis, last_seen_metadata_version, -}) => ({ +}: AutoFollowedClusterFromEs): AutoFollowedCluster => ({ clusterName: cluster_name, timeSinceLastCheckMillis: time_since_last_check_millis, lastSeenMetadataVersion: last_seen_metadata_version, @@ -32,11 +42,10 @@ export const deserializeAutoFollowStats = ({ number_of_successful_follow_indices, recent_auto_follow_errors, auto_followed_clusters, -}) => ({ +}: AutoFollowStatsFromEs): AutoFollowStats => ({ numberOfFailedFollowIndices: number_of_failed_follow_indices, numberOfFailedRemoteClusterStateRequests: number_of_failed_remote_cluster_state_requests, numberOfSuccessfulFollowIndices: number_of_successful_follow_indices, recentAutoFollowErrors: recent_auto_follow_errors.map(deserializeRecentAutoFollowErrors), autoFollowedClusters: auto_followed_clusters.map(deserializeAutoFollowedClusters), }); -/* eslint-enable camelcase */ diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/wrap_es_error.ts b/x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts similarity index 90% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/wrap_es_error.ts rename to x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts index 8afd5f1a018ebd..9dde027cd69492 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/error_wrappers/wrap_es_error.ts +++ b/x-pack/plugins/cross_cluster_replication/server/lib/format_es_error.ts @@ -63,3 +63,16 @@ export function wrapEsError( const message = statusCodeToMessageMap[statusCode]; return { message, statusCode }; } + +export function formatEsError(err: any): any { + const { statusCode, message, body } = wrapEsError(err); + return { + statusCode, + body: { + message, + attributes: { + cause: body?.cause, + }, + }, + }; +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error.ts b/x-pack/plugins/cross_cluster_replication/server/lib/is_es_error.ts similarity index 100% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/is_es_error.ts rename to x-pack/plugins/cross_cluster_replication/server/lib/is_es_error.ts diff --git a/x-pack/plugins/cross_cluster_replication/server/plugin.ts b/x-pack/plugins/cross_cluster_replication/server/plugin.ts new file mode 100644 index 00000000000000..25c99803480f3c --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/plugin.ts @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +declare module 'src/core/server' { + interface RequestHandlerContext { + crossClusterReplication?: CrossClusterReplicationContext; + } +} + +import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; +import { i18n } from '@kbn/i18n'; +import { + CoreSetup, + Plugin, + Logger, + PluginInitializerContext, + APICaller, + IScopedClusterClient, +} from 'src/core/server'; + +import { Index } from '../../index_management/server'; +import { PLUGIN } from '../common/constants'; +import { Dependencies } from './types'; +import { registerApiRoutes } from './routes'; +import { License } from './services'; +import { elasticsearchJsPlugin } from './client/elasticsearch_ccr'; +import { CrossClusterReplicationConfig } from './config'; +import { isEsError } from './lib/is_es_error'; +import { formatEsError } from './lib/format_es_error'; + +interface CrossClusterReplicationContext { + client: IScopedClusterClient; +} + +const ccrDataEnricher = async (indicesList: Index[], callWithRequest: APICaller) => { + if (!indicesList?.length) { + return indicesList; + } + const params = { + path: '/_all/_ccr/info', + method: 'GET', + }; + try { + const { follower_indices: followerIndices } = await callWithRequest( + 'transport.request', + params + ); + return indicesList.map(index => { + const isFollowerIndex = !!followerIndices.find( + (followerIndex: { follower_index: string }) => { + return followerIndex.follower_index === index.name; + } + ); + return { + ...index, + isFollowerIndex, + }; + }); + } catch (e) { + return indicesList; + } +}; + +export class CrossClusterReplicationServerPlugin implements Plugin { + private readonly config$: Observable; + private readonly license: License; + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + this.config$ = initializerContext.config.create(); + this.license = new License(); + } + + setup( + { http, elasticsearch }: CoreSetup, + { licensing, indexManagement, remoteClusters }: Dependencies + ) { + this.config$ + .pipe(first()) + .toPromise() + .then(config => { + // remoteClusters.isUiEnabled is driven by the xpack.remote_clusters.ui.enabled setting. + // The CCR UI depends upon the Remote Clusters UI (e.g. by cross-linking to it), so if + // the Remote Clusters UI is disabled we can't show the CCR UI. + const isCcrUiEnabled = config.ui.enabled && remoteClusters.isUiEnabled; + + // If the UI isn't enabled, then we don't want to expose any CCR concepts in the UI, including + // "follower" badges for follower indices. + if (isCcrUiEnabled) { + if (indexManagement.indexDataEnricher) { + indexManagement.indexDataEnricher.add(ccrDataEnricher); + } + } + }); + + this.license.setup( + { + pluginId: PLUGIN.ID, + minimumLicenseType: PLUGIN.minimumLicenseType, + defaultErrorMessage: i18n.translate( + 'xpack.crossClusterReplication.licenseCheckErrorMessage', + { + defaultMessage: 'License check failed', + } + ), + }, + { + licensing, + logger: this.logger, + } + ); + + // Extend the elasticsearchJs client with additional endpoints. + const esClientConfig = { plugins: [elasticsearchJsPlugin] }; + const ccrEsClient = elasticsearch.createClient('crossClusterReplication', esClientConfig); + http.registerRouteHandlerContext('crossClusterReplication', (ctx, request) => { + return { + client: ccrEsClient.asScoped(request), + }; + }); + + registerApiRoutes({ + router: http.createRouter(), + license: this.license, + lib: { + isEsError, + formatEsError, + }, + }); + } + + start() {} + stop() {} +} diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/index.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/index.ts new file mode 100644 index 00000000000000..4cbdc7703a6947 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/index.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; +import { registerCreateRoute } from './register_create_route'; +import { registerDeleteRoute } from './register_delete_route'; +import { registerFetchRoute } from './register_fetch_route'; +import { registerGetRoute } from './register_get_route'; +import { registerPauseRoute } from './register_pause_route'; +import { registerResumeRoute } from './register_resume_route'; +import { registerUpdateRoute } from './register_update_route'; + +export function registerAutoFollowPatternRoutes(dependencies: RouteDependencies) { + registerCreateRoute(dependencies); + registerDeleteRoute(dependencies); + registerFetchRoute(dependencies); + registerGetRoute(dependencies); + registerPauseRoute(dependencies); + registerResumeRoute(dependencies); + registerUpdateRoute(dependencies); +} diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.test.ts new file mode 100644 index 00000000000000..b41b52e1764c83 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.test.ts @@ -0,0 +1,74 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerCreateRoute } from './register_create_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Create auto-follow pattern', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerCreateRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.post.mock.calls[0][1]; + }); + + it('should throw a 409 conflict error if id already exists', async () => { + const routeContextMock = mockRouteContext({ + // Fail the uniqueness check. + callAsCurrentUser: jest.fn().mockResolvedValueOnce(true), + }); + + const request = httpServerMock.createKibanaRequest({ + body: { + id: 'some-id', + foo: 'bar', + }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.status).toEqual(409); + }); + + it('should return 200 status when the id does not exist', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + // Pass the uniqueness check. + .mockRejectedValueOnce({ statusCode: 404 }) + .mockResolvedValueOnce(true), + }); + + const request = httpServerMock.createKibanaRequest({ + body: { + id: 'some-id', + foo: 'bar', + }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.status).toEqual(200); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.ts new file mode 100644 index 00000000000000..12503e3532a47f --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_create_route.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { serializeAutoFollowPattern } from '../../../../common/services/auto_follow_pattern_serialization'; +import { AutoFollowPattern } from '../../../../common/types'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Create an auto-follow pattern + */ +export const registerCreateRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const bodySchema = schema.object({ + id: schema.string(), + remoteCluster: schema.string(), + leaderIndexPatterns: schema.arrayOf(schema.string()), + followIndexPattern: schema.string(), + }); + + router.post( + { + path: addBasePath('/auto_follow_patterns'), + validate: { + body: bodySchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id, ...rest } = request.body; + const body = serializeAutoFollowPattern(rest as AutoFollowPattern); + + /** + * First let's make sure that an auto-follow pattern with + * the same id does not exist. + */ + try { + await context.crossClusterReplication!.client.callAsCurrentUser('ccr.autoFollowPattern', { + id, + }); + // If we get here it means that an auto-follow pattern with the same id exists + return response.conflict({ + body: `An auto-follow pattern with the name "${id}" already exists.`, + }); + } catch (err) { + if (err.statusCode !== 404) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + } + + try { + return response.ok({ + body: await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.saveAutoFollowPattern', + { id, body } + ), + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.test.ts new file mode 100644 index 00000000000000..e610d09b44275c --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.test.ts @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerDeleteRoute } from './register_delete_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Delete auto-follow pattern(s)', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerDeleteRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.delete.mock.calls[0][1]; + }); + + it('deletes a single item', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsDeleted).toEqual(['a']); + expect(response.payload.errors).toEqual([]); + }); + + it('deletes multiple items', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b,c' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsDeleted).toEqual(['a', 'b', 'c']); + expect(response.payload.errors).toEqual([]); + }); + + it('returns partial errors', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockRejectedValueOnce({ response: { error: {} } }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + + expect(response.payload.itemsDeleted).toEqual(['a']); + expect(response.payload.errors[0].id).toEqual('b'); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.ts new file mode 100644 index 00000000000000..ed2633a4a469eb --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_delete_route.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Delete an auto-follow pattern + */ +export const registerDeleteRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ + id: schema.string(), + }); + + router.delete( + { + path: addBasePath('/auto_follow_patterns/{id}'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const ids = id.split(','); + + const itemsDeleted: string[] = []; + const errors: Array<{ id: string; error: any }> = []; + + const formatError = (err: any) => { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + }; + + await Promise.all( + ids.map(_id => + context + .crossClusterReplication!.client.callAsCurrentUser('ccr.deleteAutoFollowPattern', { + id: _id, + }) + .then(() => itemsDeleted.push(_id)) + .catch((err: any) => { + errors.push({ id: _id, error: formatError(err) }); + }) + ) + ); + + return response.ok({ + body: { + itemsDeleted, + errors, + }, + }); + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.test.ts new file mode 100644 index 00000000000000..dd102c45665cbe --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.test.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerFetchRoute } from './register_fetch_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Fetch all auto-follow patterns', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerFetchRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.get.mock.calls[0][1]; + }); + + it('deserializes the response from Elasticsearch', async () => { + const ccrAutoFollowPatternResponseMock = { + patterns: [ + { + name: 'autoFollowPattern', + pattern: { + active: true, + remote_cluster: 'remoteCluster', + leader_index_patterns: ['leader*'], + follow_index_pattern: 'follow', + }, + }, + ], + }; + + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce(ccrAutoFollowPatternResponseMock), + }); + + const request = httpServerMock.createKibanaRequest(); + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.patterns).toEqual([ + { + active: true, + followIndexPattern: 'follow', + leaderIndexPatterns: ['leader*'], + name: 'autoFollowPattern', + remoteCluster: 'remoteCluster', + }, + ]); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.ts new file mode 100644 index 00000000000000..70d8ae4d51e3b7 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_fetch_route.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeListAutoFollowPatterns } from '../../../../common/services/auto_follow_pattern_serialization'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Get a list of all auto-follow patterns + */ +export const registerFetchRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/auto_follow_patterns'), + validate: false, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const result = await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.autoFollowPatterns' + ); + return response.ok({ + body: { + patterns: deserializeListAutoFollowPatterns(result.patterns), + }, + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.test.ts new file mode 100644 index 00000000000000..d5889074651f50 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.test.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerGetRoute } from './register_get_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Get one auto-follow pattern', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerGetRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.get.mock.calls[0][1]; + }); + + it('should return a single resource even though ES returns an array with 1 item', async () => { + const ccrAutoFollowPatternResponseMock = { + patterns: [ + { + name: 'autoFollowPattern', + pattern: { + active: true, + remote_cluster: 'remoteCluster', + leader_index_patterns: ['leader*'], + follow_index_pattern: 'follow', + }, + }, + ], + }; + + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce(ccrAutoFollowPatternResponseMock), + }); + + const request = httpServerMock.createKibanaRequest(); + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload).toEqual({ + active: true, + followIndexPattern: 'follow', + leaderIndexPatterns: ['leader*'], + name: 'autoFollowPattern', + remoteCluster: 'remoteCluster', + }); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.ts new file mode 100644 index 00000000000000..1edbf7e8806c70 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_get_route.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; + +import { deserializeAutoFollowPattern } from '../../../../common/services/auto_follow_pattern_serialization'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Get a single auto-follow pattern + */ +export const registerGetRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ + id: schema.string(), + }); + + router.get( + { + path: addBasePath('/auto_follow_patterns/{id}'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + + try { + const result = await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.autoFollowPattern', + { id } + ); + const autoFollowPattern = result.patterns[0]; + + return response.ok({ + body: deserializeAutoFollowPattern(autoFollowPattern), + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.test.ts new file mode 100644 index 00000000000000..1eaac02918b88d --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.test.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerPauseRoute } from './register_pause_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Pause auto-follow pattern(s)', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerPauseRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.post.mock.calls[0][1]; + }); + + it('pauses a single item', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsPaused).toEqual(['a']); + expect(response.payload.errors).toEqual([]); + }); + + it('pauses multiple items', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b,c' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsPaused).toEqual(['a', 'b', 'c']); + expect(response.payload.errors).toEqual([]); + }); + + it('returns partial errors', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockRejectedValueOnce({ response: { error: {} } }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsPaused).toEqual(['a']); + expect(response.payload.errors[0].id).toEqual('b'); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.ts new file mode 100644 index 00000000000000..325939709e7515 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_pause_route.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Pause auto-follow pattern(s) + */ +export const registerPauseRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ + id: schema.string(), + }); + + router.post( + { + path: addBasePath('/auto_follow_patterns/{id}/pause'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const ids = id.split(','); + + const itemsPaused: string[] = []; + const errors: Array<{ id: string; error: any }> = []; + + const formatError = (err: any) => { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + }; + + await Promise.all( + ids.map(_id => + context + .crossClusterReplication!.client.callAsCurrentUser('ccr.pauseAutoFollowPattern', { + id: _id, + }) + .then(() => itemsPaused.push(_id)) + .catch(err => { + errors.push({ id: _id, error: formatError(err) }); + }) + ) + ); + + return response.ok({ + body: { + itemsPaused, + errors, + }, + }); + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.test.ts new file mode 100644 index 00000000000000..9839761e701fc2 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.test.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerResumeRoute } from './register_resume_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Resume auto-follow pattern(s)', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerResumeRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.post.mock.calls[0][1]; + }); + + it('resumes a single item', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsResumed).toEqual(['a']); + expect(response.payload.errors).toEqual([]); + }); + + it('resumes multiple items', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b,c' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsResumed).toEqual(['a', 'b', 'c']); + expect(response.payload.errors).toEqual([]); + }); + + it('returns partial errors', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockRejectedValueOnce({ response: { error: {} } }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsResumed).toEqual(['a']); + expect(response.payload.errors[0].id).toEqual('b'); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.ts new file mode 100644 index 00000000000000..f5e917773704c8 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_resume_route.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Resume auto-follow pattern(s) + */ +export const registerResumeRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ + id: schema.string(), + }); + + router.post( + { + path: addBasePath('/auto_follow_patterns/{id}/resume'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const ids = id.split(','); + + const itemsResumed: string[] = []; + const errors: Array<{ id: string; error: any }> = []; + + const formatError = (err: any) => { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + }; + + await Promise.all( + ids.map((_id: string) => + context + .crossClusterReplication!.client.callAsCurrentUser('ccr.resumeAutoFollowPattern', { + id: _id, + }) + .then(() => itemsResumed.push(_id)) + .catch(err => { + errors.push({ id: _id, error: formatError(err) }); + }) + ) + ); + + return response.ok({ + body: { + itemsResumed, + errors, + }, + }); + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.test.ts new file mode 100644 index 00000000000000..85f2270ec3aee1 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.test.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerUpdateRoute } from './register_update_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Update auto-follow pattern', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerUpdateRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.put.mock.calls[0][1]; + }); + + it('should serialize the payload before sending it to Elasticsearch', async () => { + const routeContextMock = mockRouteContext({ + // Just echo back what we send so we can inspect it. + callAsCurrentUser: jest.fn().mockImplementation((endpoint, payload) => payload), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'foo' }, + body: { + remoteCluster: 'bar1', + leaderIndexPatterns: ['bar2'], + followIndexPattern: 'bar3', + }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + + expect(response.payload).toEqual({ + id: 'foo', + body: { + remote_cluster: 'bar1', + leader_index_patterns: ['bar2'], + follow_index_pattern: 'bar3', + }, + }); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.ts new file mode 100644 index 00000000000000..836e5f55c5a48b --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/auto_follow_pattern/register_update_route.ts @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { serializeAutoFollowPattern } from '../../../../common/services/auto_follow_pattern_serialization'; +import { AutoFollowPattern } from '../../../../common/types'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Update an auto-follow pattern + */ +export const registerUpdateRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ + id: schema.string(), + }); + + const bodySchema = schema.object({ + active: schema.boolean(), + remoteCluster: schema.string(), + leaderIndexPatterns: schema.arrayOf(schema.string()), + followIndexPattern: schema.string(), + }); + + router.put( + { + path: addBasePath('/auto_follow_patterns/{id}'), + validate: { + params: paramsSchema, + body: bodySchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const body = serializeAutoFollowPattern(request.body as AutoFollowPattern); + + try { + return response.ok({ + body: await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.saveAutoFollowPattern', + { id, body } + ), + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/index.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/index.ts new file mode 100644 index 00000000000000..45c5729535e586 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; +import { registerPermissionsRoute } from './register_permissions_route'; +import { registerStatsRoute } from './register_stats_route'; + +export function registerCrossClusterReplicationRoutes(dependencies: RouteDependencies) { + registerPermissionsRoute(dependencies); + registerStatsRoute(dependencies); +} diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_permissions_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_permissions_route.ts new file mode 100644 index 00000000000000..b8eb5ae14750e3 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_permissions_route.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Returns whether the user has CCR permissions + */ +export const registerPermissionsRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/permissions'), + validate: false, + }, + license.guardApiRoute(async (context, request, response) => { + if (!license.isEsSecurityEnabled) { + // If security has been disabled in elasticsearch.yml. we'll just let the user use CCR + // because permissions are irrelevant. + return response.ok({ + body: { + hasPermission: true, + missingClusterPrivileges: [], + }, + }); + } + + try { + const { + has_all_requested: hasPermission, + cluster, + } = await context.crossClusterReplication!.client.callAsCurrentUser('ccr.permissions', { + body: { + cluster: ['manage', 'manage_ccr'], + }, + }); + + const missingClusterPrivileges = Object.keys(cluster).reduce( + (permissions: any, permissionName: any) => { + if (!cluster[permissionName]) { + permissions.push(permissionName); + return permissions; + } + }, + [] as any[] + ); + + return response.ok({ + body: { + hasPermission, + missingClusterPrivileges, + }, + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_stats_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_stats_route.ts new file mode 100644 index 00000000000000..d4288cf7303e25 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/cross_cluster_replication/register_stats_route.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { addBasePath } from '../../../services'; +import { deserializeAutoFollowStats } from '../../../lib/ccr_stats_serialization'; +import { RouteDependencies } from '../../../types'; + +/** + * Returns Auto-follow stats + */ +export const registerStatsRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/stats/auto_follow'), + validate: false, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { + auto_follow_stats: autoFollowStats, + } = await context.crossClusterReplication!.client.callAsCurrentUser('ccr.stats'); + + return response.ok({ + body: deserializeAutoFollowStats(autoFollowStats), + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/index.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/index.ts new file mode 100644 index 00000000000000..f5d8c7a4f5bdab --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/index.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RouteDependencies } from '../../../types'; +import { registerCreateRoute } from './register_create_route'; +import { registerFetchRoute } from './register_fetch_route'; +import { registerGetRoute } from './register_get_route'; +import { registerPauseRoute } from './register_pause_route'; +import { registerResumeRoute } from './register_resume_route'; +import { registerUnfollowRoute } from './register_unfollow_route'; +import { registerUpdateRoute } from './register_update_route'; + +export function registerFollowerIndexRoutes(dependencies: RouteDependencies) { + registerCreateRoute(dependencies); + registerFetchRoute(dependencies); + registerGetRoute(dependencies); + registerPauseRoute(dependencies); + registerResumeRoute(dependencies); + registerUnfollowRoute(dependencies); + registerUpdateRoute(dependencies); +} diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.test.ts new file mode 100644 index 00000000000000..bba82b04ce9a0c --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.test.ts @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerCreateRoute } from './register_create_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Create follower index', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerCreateRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.post.mock.calls[0][1]; + }); + + it('should return 200 status when follower index is created', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + body: { + name: 'follower_index', + remoteCluster: 'remote_cluster', + leaderIndex: 'leader_index', + }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.status).toEqual(200); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.ts new file mode 100644 index 00000000000000..acaeedacfdb2aa --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_create_route.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { serializeFollowerIndex } from '../../../../common/services/follower_index_serialization'; +import { FollowerIndex } from '../../../../common/types'; +import { addBasePath } from '../../../services'; +import { removeEmptyFields } from '../../../../common/services/utils'; +import { RouteDependencies } from '../../../types'; + +/** + * Create a follower index + */ +export const registerCreateRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const bodySchema = schema.object({ + name: schema.string(), + remoteCluster: schema.string(), + leaderIndex: schema.string(), + maxReadRequestOperationCount: schema.maybe(schema.number()), + maxOutstandingReadRequests: schema.maybe(schema.number()), + maxReadRequestSize: schema.maybe(schema.string()), // byte value + maxWriteRequestOperationCount: schema.maybe(schema.number()), + maxWriteRequestSize: schema.maybe(schema.string()), // byte value + maxOutstandingWriteRequests: schema.maybe(schema.number()), + maxWriteBufferCount: schema.maybe(schema.number()), + maxWriteBufferSize: schema.maybe(schema.string()), // byte value + maxRetryDelay: schema.maybe(schema.string()), // time value + readPollTimeout: schema.maybe(schema.string()), // time value + }); + + router.post( + { + path: addBasePath('/follower_indices'), + validate: { + body: bodySchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { name, ...rest } = request.body; + const body = removeEmptyFields(serializeFollowerIndex(rest as FollowerIndex)); + + try { + return response.ok({ + body: await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.saveFollowerIndex', + { name, body } + ), + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.test.ts new file mode 100644 index 00000000000000..151ab84fabf4c4 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.test.ts @@ -0,0 +1,160 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerFetchRoute } from './register_fetch_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Fetch all follower indices', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerFetchRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.get.mock.calls[0][1]; + }); + + it('deserializes the response from Elasticsearch', async () => { + const ccrInfoMockResponse = { + follower_indices: [ + { + follower_index: 'followerIndexName', + remote_cluster: 'remoteCluster', + leader_index: 'leaderIndex', + status: 'active', + parameters: { + max_read_request_operation_count: 1, + max_outstanding_read_requests: 1, + max_read_request_size: '1b', + max_write_request_operation_count: 1, + max_write_request_size: '1b', + max_outstanding_write_requests: 1, + max_write_buffer_count: 1, + max_write_buffer_size: '1b', + max_retry_delay: '1s', + read_poll_timeout: '1s', + }, + }, + ], + }; + + // These stats correlate to the above follower indices. + const ccrStatsMockResponse = { + follow_stats: { + indices: [ + { + index: 'followerIndexName', + shards: [ + { + shard_id: 1, + leader_index: 'leaderIndex', + leader_global_checkpoint: 1, + leader_max_seq_no: 1, + follower_global_checkpoint: 1, + follower_max_seq_no: 1, + last_requested_seq_no: 1, + outstanding_read_requests: 1, + outstanding_write_requests: 1, + write_buffer_operation_count: 1, + write_buffer_size_in_bytes: 1, + follower_mapping_version: 1, + follower_settings_version: 1, + total_read_time_millis: 1, + total_read_remote_exec_time_millis: 1, + successful_read_requests: 1, + failed_read_requests: 1, + operations_read: 1, + bytes_read: 1, + total_write_time_millis: 1, + successful_write_requests: 1, + failed_write_requests: 1, + operations_written: 1, + read_exceptions: 1, + time_since_last_read_millis: 1, + }, + ], + }, + ], + }, + }; + + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce(ccrInfoMockResponse) + .mockResolvedValueOnce(ccrStatsMockResponse), + }); + + const request = httpServerMock.createKibanaRequest(); + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + + expect(response.payload.indices).toEqual([ + { + name: 'followerIndexName', + remoteCluster: 'remoteCluster', + leaderIndex: 'leaderIndex', + status: 'active', + maxReadRequestOperationCount: 1, + maxOutstandingReadRequests: 1, + maxReadRequestSize: '1b', + maxWriteRequestOperationCount: 1, + maxWriteRequestSize: '1b', + maxOutstandingWriteRequests: 1, + maxWriteBufferCount: 1, + maxWriteBufferSize: '1b', + maxRetryDelay: '1s', + readPollTimeout: '1s', + shards: [ + { + id: 1, + leaderIndex: 'leaderIndex', + leaderGlobalCheckpoint: 1, + leaderMaxSequenceNum: 1, + followerGlobalCheckpoint: 1, + followerMaxSequenceNum: 1, + lastRequestedSequenceNum: 1, + outstandingReadRequestsCount: 1, + outstandingWriteRequestsCount: 1, + writeBufferOperationsCount: 1, + writeBufferSizeBytes: 1, + followerMappingVersion: 1, + followerSettingsVersion: 1, + totalReadTimeMs: 1, + totalReadRemoteExecTimeMs: 1, + successfulReadRequestCount: 1, + failedReadRequestsCount: 1, + operationsReadCount: 1, + bytesReadCount: 1, + totalWriteTimeMs: 1, + successfulWriteRequestsCount: 1, + failedWriteRequestsCount: 1, + operationsWrittenCount: 1, + readExceptions: 1, + timeSinceLastReadMs: 1, + }, + ], + }, + ]); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.ts new file mode 100644 index 00000000000000..a78901ce174e42 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_fetch_route.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { deserializeListFollowerIndices } from '../../../../common/services/follower_index_serialization'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Returns a list of all follower indices + */ +export const registerFetchRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + router.get( + { + path: addBasePath('/follower_indices'), + validate: false, + }, + license.guardApiRoute(async (context, request, response) => { + try { + const { + follower_indices: followerIndices, + } = await context.crossClusterReplication!.client.callAsCurrentUser('ccr.info', { + id: '_all', + }); + + const { + follow_stats: { indices: followerIndicesStats }, + } = await context.crossClusterReplication!.client.callAsCurrentUser('ccr.stats'); + + const followerIndicesStatsMap = followerIndicesStats.reduce((map: any, stats: any) => { + map[stats.index] = stats; + return map; + }, {}); + + const collatedFollowerIndices = followerIndices.map((followerIndex: any) => { + return { + ...followerIndex, + ...followerIndicesStatsMap[followerIndex.follower_index], + }; + }); + + return response.ok({ + body: { + indices: deserializeListFollowerIndices(collatedFollowerIndices), + }, + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.test.ts new file mode 100644 index 00000000000000..42d04ca65b1cb2 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.test.ts @@ -0,0 +1,159 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerGetRoute } from './register_get_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Get one follower index', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerGetRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.get.mock.calls[0][1]; + }); + + it('should return a single resource even though ES returns an array with 1 item', async () => { + const ccrInfoMockResponse = { + follower_indices: [ + { + follower_index: 'followerIndexName', + remote_cluster: 'remoteCluster', + leader_index: 'leaderIndex', + status: 'active', + parameters: { + max_read_request_operation_count: 1, + max_outstanding_read_requests: 1, + max_read_request_size: '1b', + max_write_request_operation_count: 1, + max_write_request_size: '1b', + max_outstanding_write_requests: 1, + max_write_buffer_count: 1, + max_write_buffer_size: '1b', + max_retry_delay: '1s', + read_poll_timeout: '1s', + }, + }, + ], + }; + + // These stats correlate to the above follower indices. + const ccrFollowerIndexStatsMockResponse = { + indices: [ + { + index: 'followerIndexName', + shards: [ + { + shard_id: 1, + leader_index: 'leaderIndex', + leader_global_checkpoint: 1, + leader_max_seq_no: 1, + follower_global_checkpoint: 1, + follower_max_seq_no: 1, + last_requested_seq_no: 1, + outstanding_read_requests: 1, + outstanding_write_requests: 1, + write_buffer_operation_count: 1, + write_buffer_size_in_bytes: 1, + follower_mapping_version: 1, + follower_settings_version: 1, + total_read_time_millis: 1, + total_read_remote_exec_time_millis: 1, + successful_read_requests: 1, + failed_read_requests: 1, + operations_read: 1, + bytes_read: 1, + total_write_time_millis: 1, + successful_write_requests: 1, + failed_write_requests: 1, + operations_written: 1, + read_exceptions: 1, + time_since_last_read_millis: 1, + }, + ], + }, + ], + }; + + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce(ccrInfoMockResponse) + .mockResolvedValueOnce(ccrFollowerIndexStatsMockResponse), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'doesnt_matter' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + + expect(response.payload).toEqual({ + name: 'followerIndexName', + remoteCluster: 'remoteCluster', + leaderIndex: 'leaderIndex', + status: 'active', + maxReadRequestOperationCount: 1, + maxOutstandingReadRequests: 1, + maxReadRequestSize: '1b', + maxWriteRequestOperationCount: 1, + maxWriteRequestSize: '1b', + maxOutstandingWriteRequests: 1, + maxWriteBufferCount: 1, + maxWriteBufferSize: '1b', + maxRetryDelay: '1s', + readPollTimeout: '1s', + shards: [ + { + id: 1, + leaderIndex: 'leaderIndex', + leaderGlobalCheckpoint: 1, + leaderMaxSequenceNum: 1, + followerGlobalCheckpoint: 1, + followerMaxSequenceNum: 1, + lastRequestedSequenceNum: 1, + outstandingReadRequestsCount: 1, + outstandingWriteRequestsCount: 1, + writeBufferOperationsCount: 1, + writeBufferSizeBytes: 1, + followerMappingVersion: 1, + followerSettingsVersion: 1, + totalReadTimeMs: 1, + totalReadRemoteExecTimeMs: 1, + successfulReadRequestCount: 1, + failedReadRequestsCount: 1, + operationsReadCount: 1, + bytesReadCount: 1, + totalWriteTimeMs: 1, + successfulWriteRequestsCount: 1, + failedWriteRequestsCount: 1, + operationsWrittenCount: 1, + readExceptions: 1, + timeSinceLastReadMs: 1, + }, + ], + }); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.ts new file mode 100644 index 00000000000000..98a182fc15681f --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_get_route.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { deserializeFollowerIndex } from '../../../../common/services/follower_index_serialization'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Returns a single follower index pattern + */ +export const registerGetRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ + id: schema.string(), + }); + + router.get( + { + path: addBasePath('/follower_indices/{id}'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + + try { + const { + follower_indices: followerIndices, + } = await context.crossClusterReplication!.client.callAsCurrentUser('ccr.info', { id }); + + const followerIndexInfo = followerIndices && followerIndices[0]; + + if (!followerIndexInfo) { + return response.notFound({ + body: `The follower index "${id}" does not exist.`, + }); + } + + // If this follower is paused, skip call to ES stats api since it will return 404 + if (followerIndexInfo.status === 'paused') { + return response.ok({ + body: deserializeFollowerIndex({ + ...followerIndexInfo, + }), + }); + } else { + const { + indices: followerIndicesStats, + } = await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.followerIndexStats', + { id } + ); + + return response.ok({ + body: deserializeFollowerIndex({ + ...followerIndexInfo, + ...(followerIndicesStats ? followerIndicesStats[0] : {}), + }), + }); + } + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.test.ts new file mode 100644 index 00000000000000..82cb88cbacea7e --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.test.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerPauseRoute } from './register_pause_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Pause follower index/indices', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerPauseRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.put.mock.calls[0][1]; + }); + + it('pauses a single item', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsPaused).toEqual(['a']); + expect(response.payload.errors).toEqual([]); + }); + + it('pauses multiple items', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b,c' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsPaused).toEqual(['a', 'b', 'c']); + expect(response.payload.errors).toEqual([]); + }); + + it('returns partial errors', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockRejectedValueOnce({ response: { error: {} } }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsPaused).toEqual(['a']); + expect(response.payload.errors[0].id).toEqual('b'); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.ts new file mode 100644 index 00000000000000..7432ea7ca5c825 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_pause_route.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Pauses a follower index + */ +export const registerPauseRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ id: schema.string() }); + + router.put( + { + path: addBasePath('/follower_indices/{id}/pause'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const ids = id.split(','); + + const itemsPaused: string[] = []; + const errors: Array<{ id: string; error: any }> = []; + + const formatError = (err: any) => { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + }; + + await Promise.all( + ids.map((_id: string) => + context + .crossClusterReplication!.client.callAsCurrentUser('ccr.pauseFollowerIndex', { + id: _id, + }) + .then(() => itemsPaused.push(_id)) + .catch(err => { + errors.push({ id: _id, error: formatError(err) }); + }) + ) + ); + + return response.ok({ + body: { + itemsPaused, + errors, + }, + }); + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.test.ts new file mode 100644 index 00000000000000..04167c5db31628 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.test.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerResumeRoute } from './register_resume_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Resume follower index/indices', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerResumeRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.put.mock.calls[0][1]; + }); + + it('resumes a single item', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest.fn().mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsResumed).toEqual(['a']); + expect(response.payload.errors).toEqual([]); + }); + + it('resumes multiple items', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b,c' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsResumed).toEqual(['a', 'b', 'c']); + expect(response.payload.errors).toEqual([]); + }); + + it('returns partial errors', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockRejectedValueOnce({ response: { error: {} } }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsResumed).toEqual(['a']); + expect(response.payload.errors[0].id).toEqual('b'); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.ts new file mode 100644 index 00000000000000..ca8f3a9f5fe9d6 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_resume_route.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Resumes a follower index + */ +export const registerResumeRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ id: schema.string() }); + + router.put( + { + path: addBasePath('/follower_indices/{id}/resume'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const ids = id.split(','); + + const itemsResumed: string[] = []; + const errors: Array<{ id: string; error: any }> = []; + + const formatError = (err: any) => { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + }; + + await Promise.all( + ids.map((_id: string) => + context + .crossClusterReplication!.client.callAsCurrentUser('ccr.resumeFollowerIndex', { + id: _id, + }) + .then(() => itemsResumed.push(_id)) + .catch(err => { + errors.push({ id: _id, error: formatError(err) }); + }) + ) + ); + + return response.ok({ + body: { + itemsResumed, + errors, + }, + }); + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.test.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.test.ts new file mode 100644 index 00000000000000..6302d5868b0dbf --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.test.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { httpServiceMock, httpServerMock } from 'src/core/server/mocks'; +import { IRouter, kibanaResponseFactory, RequestHandler } from 'src/core/server'; + +import { isEsError } from '../../../lib/is_es_error'; +import { formatEsError } from '../../../lib/format_es_error'; +import { License } from '../../../services'; +import { mockRouteContext } from '../test_lib'; +import { registerUnfollowRoute } from './register_unfollow_route'; + +const httpService = httpServiceMock.createSetupContract(); + +describe('[CCR API] Unfollow follower index/indices', () => { + let routeHandler: RequestHandler; + + beforeEach(() => { + const router = httpService.createRouter('') as jest.Mocked; + + registerUnfollowRoute({ + router, + license: { + guardApiRoute: (route: any) => route, + } as License, + lib: { + isEsError, + formatEsError, + }, + }); + + routeHandler = router.put.mock.calls[0][1]; + }); + + it('unfollows a single item', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsUnfollowed).toEqual(['a']); + expect(response.payload.errors).toEqual([]); + }); + + it('unfollows multiple items', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + // a + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + // b + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + // c + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b,c' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsUnfollowed).toEqual(['a', 'b', 'c']); + expect(response.payload.errors).toEqual([]); + }); + + it('returns partial errors', async () => { + const routeContextMock = mockRouteContext({ + callAsCurrentUser: jest + .fn() + // a + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + .mockResolvedValueOnce({ acknowledge: true }) + // b + .mockResolvedValueOnce({ acknowledge: true }) + .mockRejectedValueOnce({ response: { error: {} } }), + }); + + const request = httpServerMock.createKibanaRequest({ + params: { id: 'a,b' }, + }); + + const response = await routeHandler(routeContextMock, request, kibanaResponseFactory); + expect(response.payload.itemsUnfollowed).toEqual(['a']); + expect(response.payload.errors[0].id).toEqual('b'); + }); +}); diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.ts new file mode 100644 index 00000000000000..282fead02bbe0a --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_unfollow_route.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Unfollow follower index's leader index + */ +export const registerUnfollowRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ id: schema.string() }); + + router.put( + { + path: addBasePath('/follower_indices/{id}/unfollow'), + validate: { + params: paramsSchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + const ids = id.split(','); + + const itemsUnfollowed: string[] = []; + const itemsNotOpen: string[] = []; + const errors: Array<{ id: string; error: any }> = []; + + const formatError = (err: any) => { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + }; + + await Promise.all( + ids.map(async (_id: string) => { + try { + // Try to pause follower, let it fail silently since it may already be paused + try { + await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.pauseFollowerIndex', + { id: _id } + ); + } catch (e) { + // Swallow errors + } + + // Close index + await context.crossClusterReplication!.client.callAsCurrentUser('indices.close', { + index: _id, + }); + + // Unfollow leader + await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.unfollowLeaderIndex', + { id: _id } + ); + + // Try to re-open the index, store failures in a separate array to surface warnings in the UI + // This will allow users to query their index normally after unfollowing + try { + await context.crossClusterReplication!.client.callAsCurrentUser('indices.open', { + index: _id, + }); + } catch (e) { + itemsNotOpen.push(_id); + } + + // Push success + itemsUnfollowed.push(_id); + } catch (err) { + errors.push({ id: _id, error: formatError(err) }); + } + }) + ); + + return response.ok({ + body: { + itemsUnfollowed, + itemsNotOpen, + errors, + }, + }); + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_update_route.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_update_route.ts new file mode 100644 index 00000000000000..521de771809749 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/follower_index/register_update_route.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { schema } from '@kbn/config-schema'; +import { serializeAdvancedSettings } from '../../../../common/services/follower_index_serialization'; +import { FollowerIndexAdvancedSettings } from '../../../../common/types'; +import { removeEmptyFields } from '../../../../common/services/utils'; +import { addBasePath } from '../../../services'; +import { RouteDependencies } from '../../../types'; + +/** + * Update a follower index + */ +export const registerUpdateRoute = ({ + router, + license, + lib: { isEsError, formatEsError }, +}: RouteDependencies) => { + const paramsSchema = schema.object({ id: schema.string() }); + + const bodySchema = schema.object({ + maxReadRequestOperationCount: schema.maybe(schema.number()), + maxOutstandingReadRequests: schema.maybe(schema.number()), + maxReadRequestSize: schema.maybe(schema.string()), // byte value + maxWriteRequestOperationCount: schema.maybe(schema.number()), + maxWriteRequestSize: schema.maybe(schema.string()), // byte value + maxOutstandingWriteRequests: schema.maybe(schema.number()), + maxWriteBufferCount: schema.maybe(schema.number()), + maxWriteBufferSize: schema.maybe(schema.string()), // byte value + maxRetryDelay: schema.maybe(schema.string()), // time value + readPollTimeout: schema.maybe(schema.string()), // time value + }); + + router.put( + { + path: addBasePath('/follower_indices/{id}'), + validate: { + params: paramsSchema, + body: bodySchema, + }, + }, + license.guardApiRoute(async (context, request, response) => { + const { id } = request.params; + + // We need to first pause the follower and then resume it by passing the advanced settings + try { + const { + follower_indices: followerIndices, + } = await context.crossClusterReplication!.client.callAsCurrentUser('ccr.info', { id }); + + const followerIndexInfo = followerIndices && followerIndices[0]; + + if (!followerIndexInfo) { + return response.notFound({ body: `The follower index "${id}" does not exist.` }); + } + + // Retrieve paused state instead of pulling it from the payload to ensure it's not stale. + const isPaused = followerIndexInfo.status === 'paused'; + + // Pause follower if not already paused + if (!isPaused) { + await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.pauseFollowerIndex', + { + id, + } + ); + } + + // Resume follower + const body = removeEmptyFields( + serializeAdvancedSettings(request.body as FollowerIndexAdvancedSettings) + ); + + return response.ok({ + body: await context.crossClusterReplication!.client.callAsCurrentUser( + 'ccr.resumeFollowerIndex', + { id, body } + ), + }); + } catch (err) { + if (isEsError(err)) { + return response.customError(formatEsError(err)); + } + // Case: default + return response.internalError({ body: err }); + } + }) + ); +}; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts new file mode 100644 index 00000000000000..9b4fb134ed2300 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { RequestHandlerContext } from 'src/core/server'; + +export function mockRouteContext({ + callAsCurrentUser, +}: { + callAsCurrentUser: any; +}): RequestHandlerContext { + const routeContextMock = ({ + crossClusterReplication: { + client: { + callAsCurrentUser, + }, + }, + } as unknown) as RequestHandlerContext; + + return routeContextMock; +} diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/register_routes.ts b/x-pack/plugins/cross_cluster_replication/server/routes/index.ts similarity index 52% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/register_routes.ts rename to x-pack/plugins/cross_cluster_replication/server/routes/index.ts index 7e594175506918..84abfb369e0021 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/routes/register_routes.ts +++ b/x-pack/plugins/cross_cluster_replication/server/routes/index.ts @@ -4,13 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ +import { RouteDependencies } from '../types'; + import { registerAutoFollowPatternRoutes } from './api/auto_follow_pattern'; import { registerFollowerIndexRoutes } from './api/follower_index'; -import { registerCcrRoutes } from './api/ccr'; -import { RouteDependencies } from './types'; +import { registerCrossClusterReplicationRoutes } from './api/cross_cluster_replication'; -export function registerRoutes(deps: RouteDependencies) { - registerAutoFollowPatternRoutes(deps); - registerFollowerIndexRoutes(deps); - registerCcrRoutes(deps); +export function registerApiRoutes(dependencies: RouteDependencies) { + registerAutoFollowPatternRoutes(dependencies); + registerFollowerIndexRoutes(dependencies); + registerCrossClusterReplicationRoutes(dependencies); } diff --git a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/plugin.ts b/x-pack/plugins/cross_cluster_replication/server/services/add_base_path.ts similarity index 64% rename from x-pack/legacy/plugins/cross_cluster_replication/common/constants/plugin.ts rename to x-pack/plugins/cross_cluster_replication/server/services/add_base_path.ts index bd5bb50514c010..3f3dd131df7c70 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/common/constants/plugin.ts +++ b/x-pack/plugins/cross_cluster_replication/server/services/add_base_path.ts @@ -4,6 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -export const PLUGIN = { - ID: 'cross_cluster_replication', -}; +import { API_BASE_PATH } from '../../common/constants'; + +export const addBasePath = (uri: string): string => `${API_BASE_PATH}${uri}`; diff --git a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/index.ts b/x-pack/plugins/cross_cluster_replication/server/services/index.ts similarity index 74% rename from x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/index.ts rename to x-pack/plugins/cross_cluster_replication/server/services/index.ts index 0743e443955f45..d7b544b290c396 100644 --- a/x-pack/legacy/plugins/cross_cluster_replication/server/np_ready/lib/license_pre_routing_factory/index.ts +++ b/x-pack/plugins/cross_cluster_replication/server/services/index.ts @@ -4,4 +4,5 @@ * you may not use this file except in compliance with the Elastic License. */ -export { licensePreRoutingFactory } from './license_pre_routing_factory'; +export { License } from './license'; +export { addBasePath } from './add_base_path'; diff --git a/x-pack/plugins/cross_cluster_replication/server/services/license.ts b/x-pack/plugins/cross_cluster_replication/server/services/license.ts new file mode 100644 index 00000000000000..bfd357867c3e21 --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/services/license.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { Logger } from 'src/core/server'; +import { + KibanaRequest, + KibanaResponseFactory, + RequestHandler, + RequestHandlerContext, +} from 'src/core/server'; + +import { LicensingPluginSetup } from '../../../licensing/server'; +import { LicenseType } from '../../../licensing/common/types'; + +export interface LicenseStatus { + isValid: boolean; + message?: string; +} + +interface SetupSettings { + pluginId: string; + minimumLicenseType: LicenseType; + defaultErrorMessage: string; +} + +export class License { + private licenseStatus: LicenseStatus = { + isValid: false, + message: 'Invalid License', + }; + + private _isEsSecurityEnabled: boolean = false; + + setup( + { pluginId, minimumLicenseType, defaultErrorMessage }: SetupSettings, + { licensing, logger }: { licensing: LicensingPluginSetup; logger: Logger } + ) { + licensing.license$.subscribe(license => { + const { state, message } = license.check(pluginId, minimumLicenseType); + const hasRequiredLicense = state === 'valid'; + + // Retrieving security checks the results of GET /_xpack as well as license state, + // so we're also checking whether the security is disabled in elasticsearch.yml. + this._isEsSecurityEnabled = license.getFeature('security').isEnabled; + + if (hasRequiredLicense) { + this.licenseStatus = { isValid: true }; + } else { + this.licenseStatus = { + isValid: false, + message: message || defaultErrorMessage, + }; + if (message) { + logger.info(message); + } + } + }); + } + + guardApiRoute(handler: RequestHandler) { + const license = this; + + return function licenseCheck( + ctx: RequestHandlerContext, + request: KibanaRequest, + response: KibanaResponseFactory + ) { + const licenseStatus = license.getStatus(); + + if (!licenseStatus.isValid) { + return response.customError({ + body: { + message: licenseStatus.message || '', + }, + statusCode: 403, + }); + } + + return handler(ctx, request, response); + }; + } + + getStatus() { + return this.licenseStatus; + } + + // eslint-disable-next-line @typescript-eslint/explicit-member-accessibility + get isEsSecurityEnabled() { + return this._isEsSecurityEnabled; + } +} diff --git a/x-pack/plugins/cross_cluster_replication/server/types.ts b/x-pack/plugins/cross_cluster_replication/server/types.ts new file mode 100644 index 00000000000000..049d440e3d85db --- /dev/null +++ b/x-pack/plugins/cross_cluster_replication/server/types.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { IRouter } from 'src/core/server'; +import { LicensingPluginSetup } from '../../licensing/server'; +import { IndexManagementPluginSetup } from '../../index_management/server'; +import { RemoteClustersPluginSetup } from '../../remote_clusters/server'; +import { License } from './services'; +import { isEsError } from './lib/is_es_error'; +import { formatEsError } from './lib/format_es_error'; + +export interface Dependencies { + licensing: LicensingPluginSetup; + indexManagement: IndexManagementPluginSetup; + remoteClusters: RemoteClustersPluginSetup; +} + +export interface RouteDependencies { + router: IRouter; + license: License; + lib: { + isEsError: typeof isEsError; + formatEsError: typeof formatEsError; + }; +} diff --git a/x-pack/plugins/index_lifecycle_management/public/application/services/notification.ts b/x-pack/plugins/index_lifecycle_management/public/application/services/notification.ts index 7d24bc31006b42..aa3ac9ea75c22c 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/services/notification.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/services/notification.ts @@ -4,10 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -export let toasts: any; -export let fatalErrors: any; +import { IToasts, FatalErrorsSetup } from 'src/core/public'; -export function init(_toasts: any, _fatalErrors: any): void { +export let toasts: IToasts; +export let fatalErrors: FatalErrorsSetup; + +export function init(_toasts: IToasts, _fatalErrors: FatalErrorsSetup): void { toasts = _toasts; fatalErrors = _fatalErrors; } diff --git a/x-pack/plugins/remote_clusters/public/index.ts b/x-pack/plugins/remote_clusters/public/index.ts index 6ba021b157c3e6..127ec2a6706452 100644 --- a/x-pack/plugins/remote_clusters/public/index.ts +++ b/x-pack/plugins/remote_clusters/public/index.ts @@ -3,8 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import { PluginInitializerContext } from 'kibana/public'; import { RemoteClustersUIPlugin } from './plugin'; +export { RemoteClustersPluginSetup } from './plugin'; + export const plugin = (initializerContext: PluginInitializerContext) => new RemoteClustersUIPlugin(initializerContext); diff --git a/x-pack/plugins/remote_clusters/public/plugin.ts b/x-pack/plugins/remote_clusters/public/plugin.ts index d110c461c1e3fa..22f98e94748d86 100644 --- a/x-pack/plugins/remote_clusters/public/plugin.ts +++ b/x-pack/plugins/remote_clusters/public/plugin.ts @@ -14,7 +14,12 @@ import { init as initNotification } from './application/services/notification'; import { init as initRedirect } from './application/services/redirect'; import { Dependencies, ClientConfigType } from './types'; -export class RemoteClustersUIPlugin implements Plugin { +export interface RemoteClustersPluginSetup { + isUiEnabled: boolean; +} + +export class RemoteClustersUIPlugin + implements Plugin { constructor(private readonly initializerContext: PluginInitializerContext) {} setup( @@ -55,6 +60,10 @@ export class RemoteClustersUIPlugin implements Plugin new RemoteClustersServerPlugin(ctx); diff --git a/x-pack/plugins/remote_clusters/server/plugin.ts b/x-pack/plugins/remote_clusters/server/plugin.ts index fca4a5dbc5f941..a7ca30a6bf96d0 100644 --- a/x-pack/plugins/remote_clusters/server/plugin.ts +++ b/x-pack/plugins/remote_clusters/server/plugin.ts @@ -7,6 +7,7 @@ import { i18n } from '@kbn/i18n'; import { CoreSetup, Logger, Plugin, PluginInitializerContext } from 'src/core/server'; import { Observable } from 'rxjs'; +import { first } from 'rxjs/operators'; import { PLUGIN } from '../common/constants'; import { Dependencies, LicenseStatus, RouteDependencies } from './types'; @@ -18,19 +19,26 @@ import { registerDeleteRoute, } from './routes/api'; -export class RemoteClustersServerPlugin implements Plugin { +export interface RemoteClustersPluginSetup { + isUiEnabled: boolean; +} + +export class RemoteClustersServerPlugin + implements Plugin { licenseStatus: LicenseStatus; log: Logger; - config: Observable; + config$: Observable; constructor({ logger, config }: PluginInitializerContext) { this.log = logger.get(); - this.config = config.create(); + this.config$ = config.create(); this.licenseStatus = { valid: false }; } async setup({ http }: CoreSetup, { licensing, cloud }: Dependencies) { const router = http.createRouter(); + const config = await this.config$.pipe(first()).toPromise(); + const routeDependencies: RouteDependencies = { router, getLicenseStatus: () => this.licenseStatus, @@ -64,6 +72,10 @@ export class RemoteClustersServerPlugin implements Plugin } } }); + + return { + isUiEnabled: config.ui.enabled, + }; } start() {} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 8a606e230dc36f..fbfc0cdeaa7cf6 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2295,6 +2295,8 @@ "kbn.management.landing.header": "Kibana {version} 管理", "kbn.management.landing.subhead": "インデックス、インデックスパターン、保存されたオブジェクト、Kibana の設定、その他を管理します。", "kbn.management.landing.text": "すべてのツールの一覧は、左のメニューにあります。", + "kbn.managementTitle": "管理", + "kbn.visualizeTitle": "可視化", "savedObjectsManagement.indexPattern.confirmOverwriteButton": "上書き", "savedObjectsManagement.indexPattern.confirmOverwriteLabel": "「{title}」に上書きしてよろしいですか?", "savedObjectsManagement.indexPattern.confirmOverwriteTitle": "{type} を上書きしますか?", @@ -2416,8 +2418,6 @@ "savedObjectsManagement.breadcrumb.index": "保存されたオブジェクト", "savedObjectsManagement.field.offLabel": "オフ", "savedObjectsManagement.field.onLabel": "オン", - "kbn.managementTitle": "管理", - "kbn.visualizeTitle": "可視化", "kibana_legacy.bigUrlWarningNotificationMessage": "{advancedSettingsLink}で{storeInSessionStorageParam}オプションを有効にするか、オンスクリーンビジュアルを簡素化してください。", "kibana_legacy.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高度な設定", "kibana_legacy.bigUrlWarningNotificationTitle": "URLが大きく、Kibanaの動作が停止する可能性があります", @@ -6098,9 +6098,6 @@ "xpack.crossClusterReplication.autoFollowPatternList.table.statusTextPaused": "一時停止中", "xpack.crossClusterReplication.autoFollowPatternList.table.statusTitle": "ステータス", "xpack.crossClusterReplication.autoFollowPatternList.table.suffixColumnTitle": "フォロワーインデックスの接尾辞", - "xpack.crossClusterReplication.checkLicense.errorExpiredMessage": "{licenseType} ライセンスが期限切れのため {pluginName} を使用できません", - "xpack.crossClusterReplication.checkLicense.errorUnavailableMessage": "現在ライセンス情報が利用できないため {pluginName} を使用できません。", - "xpack.crossClusterReplication.checkLicense.errorUnsupportedMessage": "ご使用の {licenseType} ライセンスは {pluginName} をサポートしていません。ライセンスをアップグレードしてください。", "xpack.crossClusterReplication.deleteAutoFollowPattern.confirmModal.cancelButtonText": "キャンセル", "xpack.crossClusterReplication.deleteAutoFollowPattern.confirmModal.confirmButtonText": "削除", "xpack.crossClusterReplication.deleteAutoFollowPattern.confirmModal.deleteMultipleTitle": "{count} 個の自動フォローパターンを削除しますか?", @@ -16738,4 +16735,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "フィールドを選択してください。", "xpack.watcher.watcherDescription": "アラートの作成、管理、監視によりデータへの変更を検知します。" } -} \ No newline at end of file +} diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index faee95b8172b72..f64b215e68e498 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2296,6 +2296,8 @@ "kbn.management.landing.header": "Kibana {version} 管理", "kbn.management.landing.subhead": "管理您的索引、索引模式、已保存对象、Kibana 设置等等。", "kbn.management.landing.text": "应用的完整列表位于左侧菜单中。", + "kbn.managementTitle": "管理", + "kbn.visualizeTitle": "可视化", "savedObjectsManagement.indexPattern.confirmOverwriteButton": "覆盖", "savedObjectsManagement.indexPattern.confirmOverwriteLabel": "确定要覆盖 “{title}”?", "savedObjectsManagement.indexPattern.confirmOverwriteTitle": "覆盖“{type}”?", @@ -2417,8 +2419,6 @@ "savedObjectsManagement.view.viewItemTitle": "查看“{title}”", "savedObjectsManagement.breadcrumb.edit": "编辑 {savedObjectType}", "savedObjectsManagement.breadcrumb.index": "已保存对象", - "kbn.managementTitle": "管理", - "kbn.visualizeTitle": "可视化", "kibana_legacy.bigUrlWarningNotificationMessage": "在{advancedSettingsLink}中启用“{storeInSessionStorageParam}”选项或简化屏幕视觉效果。", "kibana_legacy.bigUrlWarningNotificationMessage.advancedSettingsLinkText": "高级设置", "kibana_legacy.bigUrlWarningNotificationTitle": "URL 过长,Kibana 可能无法工作", @@ -6100,9 +6100,6 @@ "xpack.crossClusterReplication.autoFollowPatternList.table.statusTextPaused": "已暂停", "xpack.crossClusterReplication.autoFollowPatternList.table.statusTitle": "状态", "xpack.crossClusterReplication.autoFollowPatternList.table.suffixColumnTitle": "Follower 索引后缀", - "xpack.crossClusterReplication.checkLicense.errorExpiredMessage": "您不能使用 {pluginName},因为您的 {licenseType} 许可证已过期", - "xpack.crossClusterReplication.checkLicense.errorUnavailableMessage": "您不能使用 {pluginName},因为许可证信息当前不可用。", - "xpack.crossClusterReplication.checkLicense.errorUnsupportedMessage": "您的 {licenseType} 许可证不支持 {pluginName}。请升级您的许可。", "xpack.crossClusterReplication.deleteAutoFollowPattern.confirmModal.cancelButtonText": "取消", "xpack.crossClusterReplication.deleteAutoFollowPattern.confirmModal.confirmButtonText": "删除", "xpack.crossClusterReplication.deleteAutoFollowPattern.confirmModal.deleteMultipleTitle": "是否删除 {count} 个自动跟随模式?", @@ -16743,4 +16740,4 @@ "xpack.watcher.watchEdit.thresholdWatchExpression.aggType.fieldIsRequiredValidationMessage": "此字段必填。", "xpack.watcher.watcherDescription": "通过创建、管理和监测警报来检测数据中的更改。" } -} \ No newline at end of file +} diff --git a/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.helpers.js b/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.helpers.js index 22f0bde50b0735..b9a0bfd40a8d6d 100644 --- a/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.helpers.js +++ b/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.helpers.js @@ -5,33 +5,27 @@ */ import { API_BASE_PATH } from './constants'; -import { getRandomString } from './lib'; -import { getAutoFollowIndexPayload } from './fixtures'; export const registerHelpers = supertest => { let autoFollowPatternsCreated = []; const loadAutoFollowPatterns = () => supertest.get(`${API_BASE_PATH}/auto_follow_patterns`); - const getAutoFollowPattern = name => - supertest.get(`${API_BASE_PATH}/auto_follow_patterns/${name}`); + const getAutoFollowPattern = id => supertest.get(`${API_BASE_PATH}/auto_follow_patterns/${id}`); - const createAutoFollowPattern = ( - name = getRandomString(), - payload = getAutoFollowIndexPayload() - ) => { - autoFollowPatternsCreated.push(name); + const createAutoFollowPattern = payload => { + autoFollowPatternsCreated.push(payload.id); return supertest .post(`${API_BASE_PATH}/auto_follow_patterns`) .set('kbn-xsrf', 'xxx') - .send({ ...payload, id: name }); + .send(payload); }; - const deleteAutoFollowPattern = name => { - autoFollowPatternsCreated = autoFollowPatternsCreated.filter(c => c !== name); + const deleteAutoFollowPattern = id => { + autoFollowPatternsCreated = autoFollowPatternsCreated.filter(c => c !== id); - return supertest.delete(`${API_BASE_PATH}/auto_follow_patterns/${name}`).set('kbn-xsrf', 'xxx'); + return supertest.delete(`${API_BASE_PATH}/auto_follow_patterns/${id}`).set('kbn-xsrf', 'xxx'); }; const deleteAllAutoFollowPatterns = () => diff --git a/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.js b/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.js index 3efb4d6600f7fd..7a95ba7fcd9817 100644 --- a/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.js +++ b/x-pack/test/api_integration/apis/management/cross_cluster_replication/auto_follow_pattern.js @@ -6,8 +6,7 @@ import expect from '@kbn/expect'; -import { getRandomString } from './lib'; -import { getAutoFollowIndexPayload } from './fixtures'; +import { REMOTE_CLUSTER_NAME } from './constants'; import { registerHelpers as registerRemoteClustersHelpers } from './remote_clusters.helpers'; import { registerHelpers as registerAutoFollowPatternHelpers } from './auto_follow_pattern.helpers'; @@ -37,44 +36,60 @@ export default function({ getService }) { describe('when remote cluster does not exist', () => { it('should throw a 404 error when cluster is unknown', async () => { - const payload = getAutoFollowIndexPayload(); - payload.remoteCluster = 'unknown-cluster'; + const { body } = await createAutoFollowPattern({ + id: 'pattern0', + remoteCluster: 'unknown-cluster', + leaderIndexPatterns: ['leader-*'], + followIndexPattern: '{{leader_index}}_follower', + }); - const { body } = await createAutoFollowPattern(undefined, payload).expect(404); + expect(body.statusCode).to.be(404); expect(body.attributes.cause[0]).to.contain('no such remote cluster'); }); }); describe('when remote cluster exists', () => { - before(() => addCluster()); + before(async () => addCluster()); describe('create()', () => { it('should create an auto-follow pattern when cluster is known', async () => { - const name = getRandomString(); - const { body } = await createAutoFollowPattern(name).expect(200); - console.log(body); - + const { body, statusCode } = await createAutoFollowPattern({ + id: 'pattern1', + remoteCluster: REMOTE_CLUSTER_NAME, + leaderIndexPatterns: ['leader-*'], + followIndexPattern: '{{leader_index}}_follower', + }); + + expect(statusCode).to.be(200); expect(body.acknowledged).to.eql(true); }); }); describe('get()', () => { it('should return a 404 when the auto-follow pattern is not found', async () => { - const name = getRandomString(); - const { body } = await getAutoFollowPattern(name).expect(404); - + const { body } = await getAutoFollowPattern('missing-pattern'); + expect(body.statusCode).to.be(404); expect(body.attributes.cause).not.to.be(undefined); }); it('should return an auto-follow pattern that was created', async () => { - const name = getRandomString(); - const autoFollowPattern = getAutoFollowIndexPayload(); - - await createAutoFollowPattern(name, autoFollowPattern); - - const { body } = await getAutoFollowPattern(name).expect(200); - - expect(body).to.eql({ ...autoFollowPattern, name }); + await createAutoFollowPattern({ + id: 'pattern2', + remoteCluster: REMOTE_CLUSTER_NAME, + leaderIndexPatterns: ['leader-*'], + followIndexPattern: '{{leader_index}}_follower', + }); + + const { body, statusCode } = await getAutoFollowPattern('pattern2'); + + expect(statusCode).to.be(200); + expect(body).to.eql({ + name: 'pattern2', + remoteCluster: REMOTE_CLUSTER_NAME, + active: true, + leaderIndexPatterns: ['leader-*'], + followIndexPattern: '{{leader_index}}_follower', + }); }); }); }); diff --git a/x-pack/test/api_integration/apis/management/cross_cluster_replication/fixtures.js b/x-pack/test/api_integration/apis/management/cross_cluster_replication/fixtures.js index de47f5d9ea85e5..6e254b27356f2a 100644 --- a/x-pack/test/api_integration/apis/management/cross_cluster_replication/fixtures.js +++ b/x-pack/test/api_integration/apis/management/cross_cluster_replication/fixtures.js @@ -7,13 +7,6 @@ import { REMOTE_CLUSTER_NAME } from './constants'; import { getRandomString } from './lib'; -export const getAutoFollowIndexPayload = (remoteCluster = REMOTE_CLUSTER_NAME, active = true) => ({ - active, - remoteCluster, - leaderIndexPatterns: ['leader-*'], - followIndexPattern: '{{leader_index}}_follower', -}); - export const getFollowerIndexPayload = ( leaderIndexName = getRandomString(), remoteCluster = REMOTE_CLUSTER_NAME, diff --git a/x-pack/test/api_integration/apis/management/cross_cluster_replication/follower_indices.js b/x-pack/test/api_integration/apis/management/cross_cluster_replication/follower_indices.js index eabf474120f2b4..d03b1f83fb404f 100644 --- a/x-pack/test/api_integration/apis/management/cross_cluster_replication/follower_indices.js +++ b/x-pack/test/api_integration/apis/management/cross_cluster_replication/follower_indices.js @@ -6,7 +6,7 @@ import expect from '@kbn/expect'; -import { FOLLOWER_INDEX_ADVANCED_SETTINGS } from '../../../../../legacy/plugins/cross_cluster_replication/common/constants'; +import { FOLLOWER_INDEX_ADVANCED_SETTINGS } from '../../../../../plugins/cross_cluster_replication/common/constants'; import { getFollowerIndexPayload } from './fixtures'; import { registerHelpers as registerElasticSearchHelpers, getRandomString } from './lib'; import { registerHelpers as registerRemoteClustersHelpers } from './remote_clusters.helpers'; @@ -57,7 +57,8 @@ export default function({ getService }) { expect(body.attributes.cause[0]).to.contain('no such index'); }); - it('should create a follower index that follows an existing remote index', async () => { + // NOTE: If this test fails locally it's probably because you have another cluster running. + it('should create a follower index that follows an existing leader index', async () => { // First let's create an index to follow const leaderIndex = await createIndex(); @@ -65,7 +66,7 @@ export default function({ getService }) { const { body } = await createFollowerIndex(undefined, payload).expect(200); // There is a race condition in which Elasticsearch can respond without acknowledging, - // i.e. `body .follow_index_shards_acked` is sometimes true and sometimes false. + // i.e. `body.follow_index_shards_acked` is sometimes true and sometimes false. // By only asserting that `follow_index_created` is true, we eliminate this flakiness. expect(body.follow_index_created).to.eql(true); }); @@ -79,6 +80,7 @@ export default function({ getService }) { expect(body.attributes.cause[0]).to.contain('no such index'); }); + // NOTE: If this test fails locally it's probably because you have another cluster running. it('should return a follower index that was created', async () => { const leaderIndex = await createIndex(); diff --git a/x-pack/test/api_integration/apis/management/index_management/indices.js b/x-pack/test/api_integration/apis/management/index_management/indices.js index 7195b8680a286b..d2d07eca475e76 100644 --- a/x-pack/test/api_integration/apis/management/index_management/indices.js +++ b/x-pack/test/api_integration/apis/management/index_management/indices.js @@ -193,10 +193,10 @@ export default function({ getService }) { 'size', 'isFrozen', 'aliases', - 'ilm', // data enricher - 'isRollupIndex', // data enricher // Cloud disables CCR, so wouldn't expect follower indices. 'isFollowerIndex', // data enricher + 'ilm', // data enricher + 'isRollupIndex', // data enricher ]; expect(Object.keys(body[0])).to.eql(expectedKeys); }); @@ -219,10 +219,10 @@ export default function({ getService }) { 'size', 'isFrozen', 'aliases', - 'ilm', // data enricher - 'isRollupIndex', // data enricher // Cloud disables CCR, so wouldn't expect follower indices. 'isFollowerIndex', // data enricher + 'ilm', // data enricher + 'isRollupIndex', // data enricher ]; expect(Object.keys(body[0])).to.eql(expectedKeys); expect(body.length > 1).to.be(true); // to contrast it with the next test From 7969382081f9c62636bf51cb6a168e871dba05d4 Mon Sep 17 00:00:00 2001 From: Maryia Lapata Date: Wed, 22 Apr 2020 17:33:10 +0300 Subject: [PATCH 33/34] [NP] Migrate saved object mappings and migration scripts for Dashboard (#63864) * Migrate saved objects * Move common used types and fucntions to dashboard/common * Fix unit tests * Update server.api.md * Fix TS * Update i18n IDs * Update TS Co-authored-by: Elastic Machine --- src/core/server/index.ts | 1 + src/core/server/server.api.md | 5 +- src/legacy/core_plugins/kibana/index.js | 20 --- src/legacy/core_plugins/kibana/mappings.json | 54 -------- .../kibana/migrations/migrations.js | 106 ---------------- .../dashboard/{public => common}/bwc/types.ts | 17 +-- .../dashboard/common/embeddable/types.ts} | 9 +- src/plugins/dashboard/common/index.ts | 36 ++++++ .../common}/migrate_to_730_panels.test.ts | 15 +-- .../common}/migrate_to_730_panels.ts | 16 +-- src/plugins/dashboard/common/types.ts | 76 ++++++++++++ src/plugins/dashboard/kibana.json | 2 +- .../embeddable/grid/dashboard_grid.tsx | 3 +- .../panel/dashboard_panel_placement.ts | 3 +- .../public/application/embeddable/types.ts | 9 +- .../application/lib/migrate_app_state.ts | 8 +- src/plugins/dashboard/public/index.ts | 24 ---- src/plugins/dashboard/public/types.ts | 58 +-------- .../dashboard/server/index.ts} | 19 ++- .../dashboard/server/plugin.ts} | 47 ++++--- .../server/saved_objects/dashboard.ts | 67 ++++++++++ .../dashboard_migrations.test.ts} | 19 +-- .../saved_objects/dashboard_migrations.ts | 117 ++++++++++++++++++ .../bwc => server/saved_objects}/index.ts | 2 +- .../server/saved_objects}/is_dashboard_doc.ts | 17 ++- .../migrate_match_all_query.test.ts | 0 .../saved_objects}/migrate_match_all_query.ts | 2 +- .../saved_objects}/migrations_730.test.ts | 36 +++--- .../server/saved_objects}/migrations_730.ts | 27 ++-- .../move_filters_to_query.test.ts | 2 +- .../saved_objects}/move_filters_to_query.ts | 0 .../dashboard/server/types.ts} | 6 +- .../translations/translations/ja-JP.json | 4 +- .../translations/translations/zh-CN.json | 4 +- 34 files changed, 437 insertions(+), 394 deletions(-) delete mode 100644 src/legacy/core_plugins/kibana/migrations/migrations.js rename src/plugins/dashboard/{public => common}/bwc/types.ts (93%) rename src/{legacy/core_plugins/kibana/migrations/index.ts => plugins/dashboard/common/embeddable/types.ts} (89%) create mode 100644 src/plugins/dashboard/common/index.ts rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/common}/migrate_to_730_panels.test.ts (97%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/common}/migrate_to_730_panels.ts (97%) create mode 100644 src/plugins/dashboard/common/types.ts rename src/{legacy/core_plugins/kibana/migrations/is_doc.ts => plugins/dashboard/server/index.ts} (66%) rename src/{legacy/core_plugins/kibana/migrations/types.ts => plugins/dashboard/server/plugin.ts} (51%) create mode 100644 src/plugins/dashboard/server/saved_objects/dashboard.ts rename src/{legacy/core_plugins/kibana/migrations/migrations.test.js => plugins/dashboard/server/saved_objects/dashboard_migrations.test.ts} (95%) create mode 100644 src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts rename src/plugins/dashboard/{public/bwc => server/saved_objects}/index.ts (93%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/is_dashboard_doc.ts (70%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/migrate_match_all_query.test.ts (100%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/migrate_match_all_query.ts (95%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/migrations_730.test.ts (91%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/migrations_730.ts (79%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/move_filters_to_query.test.ts (96%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations => plugins/dashboard/server/saved_objects}/move_filters_to_query.ts (100%) rename src/{legacy/core_plugins/kibana/public/dashboard/migrations/index.ts => plugins/dashboard/server/types.ts} (78%) diff --git a/src/core/server/index.ts b/src/core/server/index.ts index ef57fae159d7ec..86192245bd2d1a 100644 --- a/src/core/server/index.ts +++ b/src/core/server/index.ts @@ -230,6 +230,7 @@ export { SavedObjectsMigrationLogger, SavedObjectsRawDoc, SavedObjectSanitizedDoc, + SavedObjectUnsanitizedDoc, SavedObjectsRepositoryFactory, SavedObjectsResolveImportErrorsOptions, SavedObjectsSchema, diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index 7ca5c75f19e8ff..6369720ada2c35 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1679,8 +1679,6 @@ export interface SavedObjectMigrationContext { log: SavedObjectsMigrationLogger; } -// Warning: (ae-forgotten-export) The symbol "SavedObjectUnsanitizedDoc" needs to be exported by the entry point index.d.ts -// // @public export type SavedObjectMigrationFn = (doc: SavedObjectUnsanitizedDoc, context: SavedObjectMigrationContext) => SavedObjectUnsanitizedDoc; @@ -2314,6 +2312,9 @@ export class SavedObjectTypeRegistry { registerType(type: SavedObjectsType): void; } +// @public +export type SavedObjectUnsanitizedDoc = SavedObjectDoc & Partial; + // @public export type ScopeableRequest = KibanaRequest | LegacyRequest | FakeRequest; diff --git a/src/legacy/core_plugins/kibana/index.js b/src/legacy/core_plugins/kibana/index.js index 989583742acd0a..6fc7c2f0a01abe 100644 --- a/src/legacy/core_plugins/kibana/index.js +++ b/src/legacy/core_plugins/kibana/index.js @@ -21,7 +21,6 @@ import Fs from 'fs'; import { resolve } from 'path'; import { promisify } from 'util'; -import { migrations } from './migrations'; import { importApi } from './server/routes/api/import'; import { exportApi } from './server/routes/api/export'; import mappings from './mappings.json'; @@ -120,23 +119,6 @@ export default function(kibana) { ], savedObjectsManagement: { - dashboard: { - icon: 'dashboardApp', - defaultSearchField: 'title', - isImportableAndExportable: true, - getTitle(obj) { - return obj.attributes.title; - }, - getEditUrl(obj) { - return `/management/kibana/objects/savedDashboards/${encodeURIComponent(obj.id)}`; - }, - getInAppUrl(obj) { - return { - path: `/app/kibana#/dashboard/${encodeURIComponent(obj.id)}`, - uiCapabilitiesPath: 'dashboard.show', - }; - }, - }, url: { defaultSearchField: 'url', isImportableAndExportable: true, @@ -177,8 +159,6 @@ export default function(kibana) { mappings, uiSettingDefaults: getUiSettingDefaults(), - - migrations, }, uiCapabilities: async function() { diff --git a/src/legacy/core_plugins/kibana/mappings.json b/src/legacy/core_plugins/kibana/mappings.json index af3f79588552b6..d61810f755d63f 100644 --- a/src/legacy/core_plugins/kibana/mappings.json +++ b/src/legacy/core_plugins/kibana/mappings.json @@ -1,58 +1,4 @@ { - "dashboard": { - "properties": { - "description": { - "type": "text" - }, - "hits": { - "type": "integer" - }, - "kibanaSavedObjectMeta": { - "properties": { - "searchSourceJSON": { - "type": "text" - } - } - }, - "optionsJSON": { - "type": "text" - }, - "panelsJSON": { - "type": "text" - }, - "refreshInterval": { - "properties": { - "display": { - "type": "keyword" - }, - "pause": { - "type": "boolean" - }, - "section": { - "type": "integer" - }, - "value": { - "type": "integer" - } - } - }, - "timeFrom": { - "type": "keyword" - }, - "timeRestore": { - "type": "boolean" - }, - "timeTo": { - "type": "keyword" - }, - "title": { - "type": "text" - }, - "version": { - "type": "integer" - } - } - }, "url": { "properties": { "accessCount": { diff --git a/src/legacy/core_plugins/kibana/migrations/migrations.js b/src/legacy/core_plugins/kibana/migrations/migrations.js deleted file mode 100644 index 029dbde555a4be..00000000000000 --- a/src/legacy/core_plugins/kibana/migrations/migrations.js +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you 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 { get } from 'lodash'; -import { - migrateMatchAllQuery, - migrations730 as dashboardMigrations730, -} from '../public/dashboard/migrations'; - -function migrateIndexPattern(doc) { - const searchSourceJSON = get(doc, 'attributes.kibanaSavedObjectMeta.searchSourceJSON'); - if (typeof searchSourceJSON !== 'string') { - return; - } - let searchSource; - try { - searchSource = JSON.parse(searchSourceJSON); - } catch (e) { - // Let it go, the data is invalid and we'll leave it as is - return; - } - if (searchSource.index) { - searchSource.indexRefName = 'kibanaSavedObjectMeta.searchSourceJSON.index'; - doc.references.push({ - name: searchSource.indexRefName, - type: 'index-pattern', - id: searchSource.index, - }); - delete searchSource.index; - } - if (searchSource.filter) { - searchSource.filter.forEach((filterRow, i) => { - if (!filterRow.meta || !filterRow.meta.index) { - return; - } - filterRow.meta.indexRefName = `kibanaSavedObjectMeta.searchSourceJSON.filter[${i}].meta.index`; - doc.references.push({ - name: filterRow.meta.indexRefName, - type: 'index-pattern', - id: filterRow.meta.index, - }); - delete filterRow.meta.index; - }); - } - doc.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource); -} - -export const migrations = { - dashboard: { - '6.7.2': migrateMatchAllQuery, - '7.0.0': doc => { - // Set new "references" attribute - doc.references = doc.references || []; - - // Migrate index pattern - migrateIndexPattern(doc); - // Migrate panels - const panelsJSON = get(doc, 'attributes.panelsJSON'); - if (typeof panelsJSON !== 'string') { - return doc; - } - let panels; - try { - panels = JSON.parse(panelsJSON); - } catch (e) { - // Let it go, the data is invalid and we'll leave it as is - return doc; - } - if (!Array.isArray(panels)) { - return doc; - } - panels.forEach((panel, i) => { - if (!panel.type || !panel.id) { - return; - } - panel.panelRefName = `panel_${i}`; - doc.references.push({ - name: `panel_${i}`, - type: panel.type, - id: panel.id, - }); - delete panel.type; - delete panel.id; - }); - doc.attributes.panelsJSON = JSON.stringify(panels); - return doc; - }, - '7.3.0': dashboardMigrations730, - }, -}; diff --git a/src/plugins/dashboard/public/bwc/types.ts b/src/plugins/dashboard/common/bwc/types.ts similarity index 93% rename from src/plugins/dashboard/public/bwc/types.ts rename to src/plugins/dashboard/common/bwc/types.ts index d5655e525e9bde..24277993454630 100644 --- a/src/plugins/dashboard/public/bwc/types.ts +++ b/src/plugins/dashboard/common/bwc/types.ts @@ -18,33 +18,28 @@ */ import { SavedObjectReference } from 'kibana/public'; -import { GridData } from '../application'; -export interface SavedObjectAttributes { +import { GridData } from '../'; + +interface SavedObjectAttributes { kibanaSavedObjectMeta: { searchSourceJSON: string; }; } -export interface Doc { +interface Doc { references: SavedObjectReference[]; attributes: Attributes; id: string; type: string; } -export interface DocPre700 { +interface DocPre700 { attributes: Attributes; id: string; type: string; } -export interface SavedObjectAttributes { - kibanaSavedObjectMeta: { - searchSourceJSON: string; - }; -} - interface DashboardAttributes extends SavedObjectAttributes { panelsJSON: string; description: string; @@ -55,8 +50,6 @@ interface DashboardAttributes extends SavedObjectAttributes { optionsJSON?: string; } -export type DashboardAttributes730ToLatest = DashboardAttributes; - interface DashboardAttributesTo720 extends SavedObjectAttributes { panelsJSON: string; description: string; diff --git a/src/legacy/core_plugins/kibana/migrations/index.ts b/src/plugins/dashboard/common/embeddable/types.ts similarity index 89% rename from src/legacy/core_plugins/kibana/migrations/index.ts rename to src/plugins/dashboard/common/embeddable/types.ts index 68c843d2343c83..eb76d73af7a581 100644 --- a/src/legacy/core_plugins/kibana/migrations/index.ts +++ b/src/plugins/dashboard/common/embeddable/types.ts @@ -17,5 +17,10 @@ * under the License. */ -// @ts-ignore -export { migrations } from './migrations'; +export interface GridData { + w: number; + h: number; + x: number; + y: number; + i: string; +} diff --git a/src/plugins/dashboard/common/index.ts b/src/plugins/dashboard/common/index.ts new file mode 100644 index 00000000000000..e3f3f629ae5d0b --- /dev/null +++ b/src/plugins/dashboard/common/index.ts @@ -0,0 +1,36 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { GridData } from './embeddable/types'; +export { + RawSavedDashboardPanel730ToLatest, + DashboardDoc730ToLatest, + DashboardDoc700To720, + DashboardDocPre700, +} from './bwc/types'; +export { + SavedDashboardPanelTo60, + SavedDashboardPanel610, + SavedDashboardPanel620, + SavedDashboardPanel630, + SavedDashboardPanel640To720, + SavedDashboardPanel730ToLatest, +} from './types'; + +export { migratePanelsTo730 } from './migrate_to_730_panels'; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels.test.ts b/src/plugins/dashboard/common/migrate_to_730_panels.test.ts similarity index 97% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels.test.ts rename to src/plugins/dashboard/common/migrate_to_730_panels.test.ts index 4dd71fd8ee5f4b..0867909225ddb0 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels.test.ts +++ b/src/plugins/dashboard/common/migrate_to_730_panels.test.ts @@ -19,15 +19,12 @@ import { migratePanelsTo730 } from './migrate_to_730_panels'; import { RawSavedDashboardPanelTo60, - RawSavedDashboardPanel610, - RawSavedDashboardPanel620, RawSavedDashboardPanel630, RawSavedDashboardPanel640To720, - DEFAULT_PANEL_WIDTH, - DEFAULT_PANEL_HEIGHT, - SavedDashboardPanelTo60, - SavedDashboardPanel730ToLatest, -} from '../../../../../../plugins/dashboard/public'; + RawSavedDashboardPanel610, + RawSavedDashboardPanel620, +} from './bwc/types'; +import { SavedDashboardPanelTo60, SavedDashboardPanel730ToLatest } from './types'; test('6.0 migrates uiState, sort, scales, and gridData', async () => { const uiState = { @@ -96,8 +93,8 @@ test('6.0 migration gives default width and height when missing', () => { }, ]; const newPanels = migratePanelsTo730(panels, '8.0.0', true); - expect(newPanels[0].gridData.w).toBe(DEFAULT_PANEL_WIDTH); - expect(newPanels[0].gridData.h).toBe(DEFAULT_PANEL_HEIGHT); + expect(newPanels[0].gridData.w).toBe(24); + expect(newPanels[0].gridData.h).toBe(15); expect(newPanels[0].version).toBe('8.0.0'); }); diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels.ts b/src/plugins/dashboard/common/migrate_to_730_panels.ts similarity index 97% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels.ts rename to src/plugins/dashboard/common/migrate_to_730_panels.ts index a19c861f092d51..b89345f0a872c9 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels.ts +++ b/src/plugins/dashboard/common/migrate_to_730_panels.ts @@ -21,17 +21,19 @@ import semver from 'semver'; import uuid from 'uuid'; import { GridData, + SavedDashboardPanelTo60, + SavedDashboardPanel620, + SavedDashboardPanel630, + SavedDashboardPanel610, +} from './'; +import { RawSavedDashboardPanelTo60, RawSavedDashboardPanel630, RawSavedDashboardPanel640To720, RawSavedDashboardPanel730ToLatest, RawSavedDashboardPanel610, RawSavedDashboardPanel620, - SavedDashboardPanelTo60, - SavedDashboardPanel620, - SavedDashboardPanel630, - SavedDashboardPanel610, -} from '../../../../../../plugins/dashboard/public'; +} from './bwc/types'; const PANEL_HEIGHT_SCALE_FACTOR = 5; const PANEL_HEIGHT_SCALE_FACTOR_WITH_MARGINS = 4; @@ -92,7 +94,7 @@ function migratePre61PanelToLatest( ): RawSavedDashboardPanel730ToLatest { if (panel.col === undefined || panel.row === undefined) { throw new Error( - i18n.translate('kbn.dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage', { + i18n.translate('dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage', { defaultMessage: 'Unable to migrate panel data for "6.1.0" backwards compatibility, panel does not contain expected col and/or row fields', }) @@ -151,7 +153,7 @@ function migrate610PanelToLatest( (['w', 'x', 'h', 'y'] as Array).forEach(key => { if (panel.gridData[key] === undefined) { throw new Error( - i18n.translate('kbn.dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage', { + i18n.translate('dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage', { defaultMessage: 'Unable to migrate panel data for "6.3.0" backwards compatibility, panel does not contain expected field: {key}', values: { key }, diff --git a/src/plugins/dashboard/common/types.ts b/src/plugins/dashboard/common/types.ts new file mode 100644 index 00000000000000..7cc82a91739767 --- /dev/null +++ b/src/plugins/dashboard/common/types.ts @@ -0,0 +1,76 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { + RawSavedDashboardPanelTo60, + RawSavedDashboardPanel610, + RawSavedDashboardPanel620, + RawSavedDashboardPanel630, + RawSavedDashboardPanel640To720, + RawSavedDashboardPanel730ToLatest, +} from './bwc/types'; + +export type SavedDashboardPanel640To720 = Pick< + RawSavedDashboardPanel640To720, + Exclude +> & { + readonly id: string; + readonly type: string; +}; + +export type SavedDashboardPanel630 = Pick< + RawSavedDashboardPanel630, + Exclude +> & { + readonly id: string; + readonly type: string; +}; + +export type SavedDashboardPanel620 = Pick< + RawSavedDashboardPanel620, + Exclude +> & { + readonly id: string; + readonly type: string; +}; + +export type SavedDashboardPanel610 = Pick< + RawSavedDashboardPanel610, + Exclude +> & { + readonly id: string; + readonly type: string; +}; + +export type SavedDashboardPanelTo60 = Pick< + RawSavedDashboardPanelTo60, + Exclude +> & { + readonly id: string; + readonly type: string; +}; + +// id becomes optional starting in 7.3.0 +export type SavedDashboardPanel730ToLatest = Pick< + RawSavedDashboardPanel730ToLatest, + Exclude +> & { + readonly id?: string; + readonly type: string; +}; diff --git a/src/plugins/dashboard/kibana.json b/src/plugins/dashboard/kibana.json index 9bcd999c2dcc0f..4cd8f3c7d981f6 100644 --- a/src/plugins/dashboard/kibana.json +++ b/src/plugins/dashboard/kibana.json @@ -11,6 +11,6 @@ "savedObjects" ], "optionalPlugins": ["home", "share", "usageCollection"], - "server": false, + "server": true, "ui": true } diff --git a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx index b15a813aff903b..fb33649093c8d9 100644 --- a/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx +++ b/src/plugins/dashboard/public/application/embeddable/grid/dashboard_grid.tsx @@ -29,9 +29,10 @@ import _ from 'lodash'; import React from 'react'; import { Subscription } from 'rxjs'; import ReactGridLayout, { Layout } from 'react-grid-layout'; +import { GridData } from '../../../../common'; import { ViewMode, EmbeddableChildPanel } from '../../../embeddable_plugin'; import { DASHBOARD_GRID_COLUMN_COUNT, DASHBOARD_GRID_HEIGHT } from '../dashboard_constants'; -import { DashboardPanelState, GridData } from '../types'; +import { DashboardPanelState } from '../types'; import { withKibana } from '../../../../../kibana_react/public'; import { DashboardContainerInput } from '../dashboard_container'; import { DashboardContainer, DashboardReactContextValue } from '../dashboard_container'; diff --git a/src/plugins/dashboard/public/application/embeddable/panel/dashboard_panel_placement.ts b/src/plugins/dashboard/public/application/embeddable/panel/dashboard_panel_placement.ts index 70a6c83418587d..b95b7f394a27d3 100644 --- a/src/plugins/dashboard/public/application/embeddable/panel/dashboard_panel_placement.ts +++ b/src/plugins/dashboard/public/application/embeddable/panel/dashboard_panel_placement.ts @@ -18,7 +18,8 @@ */ import { PanelNotFoundError } from '../../../embeddable_plugin'; -import { DashboardPanelState, GridData, DASHBOARD_GRID_COLUMN_COUNT } from '..'; +import { GridData } from '../../../../common'; +import { DashboardPanelState, DASHBOARD_GRID_COLUMN_COUNT } from '..'; export type PanelPlacementMethod = ( args: PlacementArgs diff --git a/src/plugins/dashboard/public/application/embeddable/types.ts b/src/plugins/dashboard/public/application/embeddable/types.ts index 6d0221cb10e8bf..66cdd22ed6bd43 100644 --- a/src/plugins/dashboard/public/application/embeddable/types.ts +++ b/src/plugins/dashboard/public/application/embeddable/types.ts @@ -17,18 +17,11 @@ * under the License. */ import { SavedObjectEmbeddableInput } from 'src/plugins/embeddable/public'; +import { GridData } from '../../../common'; import { PanelState, EmbeddableInput } from '../../embeddable_plugin'; export type PanelId = string; export type SavedObjectId = string; -export interface GridData { - w: number; - h: number; - x: number; - y: number; - i: string; -} - export interface DashboardPanelState< TEmbeddableInput extends EmbeddableInput | SavedObjectEmbeddableInput = SavedObjectEmbeddableInput > extends PanelState { diff --git a/src/plugins/dashboard/public/application/lib/migrate_app_state.ts b/src/plugins/dashboard/public/application/lib/migrate_app_state.ts index 8f8de3663518a6..f4d97578adebf9 100644 --- a/src/plugins/dashboard/public/application/lib/migrate_app_state.ts +++ b/src/plugins/dashboard/public/application/lib/migrate_app_state.ts @@ -22,18 +22,16 @@ import { i18n } from '@kbn/i18n'; import { METRIC_TYPE } from '@kbn/analytics'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/public'; +import { DashboardAppState, SavedDashboardPanel } from '../../types'; import { - DashboardAppState, + migratePanelsTo730, SavedDashboardPanelTo60, SavedDashboardPanel730ToLatest, SavedDashboardPanel610, SavedDashboardPanel630, SavedDashboardPanel640To720, SavedDashboardPanel620, - SavedDashboardPanel, -} from '../../types'; -// should be moved in src/plugins/dashboard/common right after https://github.com/elastic/kibana/pull/61895 is merged -import { migratePanelsTo730 } from '../../../../../legacy/core_plugins/kibana/public/dashboard/migrations/migrate_to_730_panels'; +} from '../../../common'; /** * Attempts to migrate the state stored in the URL into the latest version of it. diff --git a/src/plugins/dashboard/public/index.ts b/src/plugins/dashboard/public/index.ts index ca0ea0293b07c7..44733499cdcba4 100644 --- a/src/plugins/dashboard/public/index.ts +++ b/src/plugins/dashboard/public/index.ts @@ -20,29 +20,6 @@ import { PluginInitializerContext } from '../../../core/public'; import { DashboardPlugin } from './plugin'; -/** - * These types can probably be internal once all of dashboard app is migrated into this plugin. Right - * now, migrations are still in legacy land. - */ -export { - DashboardDoc730ToLatest, - DashboardDoc700To720, - RawSavedDashboardPanelTo60, - RawSavedDashboardPanel610, - RawSavedDashboardPanel620, - RawSavedDashboardPanel630, - RawSavedDashboardPanel640To720, - RawSavedDashboardPanel730ToLatest, - DashboardDocPre700, -} from './bwc'; -export { - SavedDashboardPanelTo60, - SavedDashboardPanel610, - SavedDashboardPanel620, - SavedDashboardPanel630, - SavedDashboardPanel730ToLatest, -} from './types'; - export { DashboardContainer, DashboardContainerInput, @@ -51,7 +28,6 @@ export { // Types below here can likely be made private when dashboard app moved into this NP plugin. DEFAULT_PANEL_WIDTH, DEFAULT_PANEL_HEIGHT, - GridData, } from './application'; export { DashboardConstants, createDashboardEditUrl } from './dashboard_constants'; diff --git a/src/plugins/dashboard/public/types.ts b/src/plugins/dashboard/public/types.ts index d96d2cdf75626d..21c6bbc1bfc515 100644 --- a/src/plugins/dashboard/public/types.ts +++ b/src/plugins/dashboard/public/types.ts @@ -19,14 +19,7 @@ import { Query, Filter } from 'src/plugins/data/public'; import { SavedObject as SavedObjectType, SavedObjectAttributes } from 'src/core/public'; -import { - RawSavedDashboardPanelTo60, - RawSavedDashboardPanel610, - RawSavedDashboardPanel620, - RawSavedDashboardPanel630, - RawSavedDashboardPanel640To720, - RawSavedDashboardPanel730ToLatest, -} from './bwc'; +import { SavedDashboardPanel730ToLatest } from '../common'; import { ViewMode } from './embeddable_plugin'; export interface DashboardCapabilities { @@ -83,55 +76,6 @@ export type NavAction = (anchorElement?: any) => void; */ export type SavedDashboardPanel = SavedDashboardPanel730ToLatest; -// id becomes optional starting in 7.3.0 -export type SavedDashboardPanel730ToLatest = Pick< - RawSavedDashboardPanel730ToLatest, - Exclude -> & { - readonly id?: string; - readonly type: string; -}; - -export type SavedDashboardPanel640To720 = Pick< - RawSavedDashboardPanel640To720, - Exclude -> & { - readonly id: string; - readonly type: string; -}; - -export type SavedDashboardPanel630 = Pick< - RawSavedDashboardPanel630, - Exclude -> & { - readonly id: string; - readonly type: string; -}; - -export type SavedDashboardPanel620 = Pick< - RawSavedDashboardPanel620, - Exclude -> & { - readonly id: string; - readonly type: string; -}; - -export type SavedDashboardPanel610 = Pick< - RawSavedDashboardPanel610, - Exclude -> & { - readonly id: string; - readonly type: string; -}; - -export type SavedDashboardPanelTo60 = Pick< - RawSavedDashboardPanelTo60, - Exclude -> & { - readonly id: string; - readonly type: string; -}; - export interface DashboardAppState { panels: SavedDashboardPanel[]; fullScreenMode: boolean; diff --git a/src/legacy/core_plugins/kibana/migrations/is_doc.ts b/src/plugins/dashboard/server/index.ts similarity index 66% rename from src/legacy/core_plugins/kibana/migrations/is_doc.ts rename to src/plugins/dashboard/server/index.ts index cc50dfa3b2d26d..9719586001c59c 100644 --- a/src/legacy/core_plugins/kibana/migrations/is_doc.ts +++ b/src/plugins/dashboard/server/index.ts @@ -17,15 +17,14 @@ * under the License. */ -import { Doc } from './types'; +import { PluginInitializerContext } from '../../../core/server'; +import { DashboardPlugin } from './plugin'; -export function isDoc(doc: { [key: string]: unknown } | Doc): doc is Doc { - return ( - typeof doc.id === 'string' && - typeof doc.type === 'string' && - doc.attributes !== null && - typeof doc.attributes === 'object' && - doc.references !== null && - typeof doc.references === 'object' - ); +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. + +export function plugin(initializerContext: PluginInitializerContext) { + return new DashboardPlugin(initializerContext); } + +export { DashboardPluginSetup, DashboardPluginStart } from './types'; diff --git a/src/legacy/core_plugins/kibana/migrations/types.ts b/src/plugins/dashboard/server/plugin.ts similarity index 51% rename from src/legacy/core_plugins/kibana/migrations/types.ts rename to src/plugins/dashboard/server/plugin.ts index 839f753670b20b..5d1b66002e7491 100644 --- a/src/legacy/core_plugins/kibana/migrations/types.ts +++ b/src/plugins/dashboard/server/plugin.ts @@ -17,24 +17,37 @@ * under the License. */ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SavedObjectReference } from '../../../../core/server'; +import { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '../../../core/server'; -export interface SavedObjectAttributes { - kibanaSavedObjectMeta: { - searchSourceJSON: string; - }; -} +import { dashboardSavedObjectType } from './saved_objects'; -export interface Doc { - references: SavedObjectReference[]; - attributes: Attributes; - id: string; - type: string; -} +import { DashboardPluginSetup, DashboardPluginStart } from './types'; + +export class DashboardPlugin implements Plugin { + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + this.logger.debug('dashboard: Setup'); + + core.savedObjects.registerType(dashboardSavedObjectType); + + return {}; + } + + public start(core: CoreStart) { + this.logger.debug('dashboard: Started'); + return {}; + } -export interface DocPre700 { - attributes: Attributes; - id: string; - type: string; + public stop() {} } diff --git a/src/plugins/dashboard/server/saved_objects/dashboard.ts b/src/plugins/dashboard/server/saved_objects/dashboard.ts new file mode 100644 index 00000000000000..65d5a4021f962e --- /dev/null +++ b/src/plugins/dashboard/server/saved_objects/dashboard.ts @@ -0,0 +1,67 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { SavedObjectsType } from 'kibana/server'; +import { dashboardSavedObjectTypeMigrations } from './dashboard_migrations'; + +export const dashboardSavedObjectType: SavedObjectsType = { + name: 'dashboard', + hidden: false, + namespaceType: 'single', + management: { + icon: 'dashboardApp', + defaultSearchField: 'title', + importableAndExportable: true, + getTitle(obj) { + return obj.attributes.title; + }, + getEditUrl(obj) { + return `/management/kibana/objects/savedDashboards/${encodeURIComponent(obj.id)}`; + }, + getInAppUrl(obj) { + return { + path: `/app/kibana#/dashboard/${encodeURIComponent(obj.id)}`, + uiCapabilitiesPath: 'dashboard.show', + }; + }, + }, + mappings: { + properties: { + description: { type: 'text' }, + hits: { type: 'integer' }, + kibanaSavedObjectMeta: { properties: { searchSourceJSON: { type: 'text' } } }, + optionsJSON: { type: 'text' }, + panelsJSON: { type: 'text' }, + refreshInterval: { + properties: { + display: { type: 'keyword' }, + pause: { type: 'boolean' }, + section: { type: 'integer' }, + value: { type: 'integer' }, + }, + }, + timeFrom: { type: 'keyword' }, + timeRestore: { type: 'boolean' }, + timeTo: { type: 'keyword' }, + title: { type: 'text' }, + version: { type: 'integer' }, + }, + }, + migrations: dashboardSavedObjectTypeMigrations, +}; diff --git a/src/legacy/core_plugins/kibana/migrations/migrations.test.js b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.test.ts similarity index 95% rename from src/legacy/core_plugins/kibana/migrations/migrations.test.js rename to src/plugins/dashboard/server/saved_objects/dashboard_migrations.test.ts index b02081128c8585..9829498118cc0a 100644 --- a/src/legacy/core_plugins/kibana/migrations/migrations.test.js +++ b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.test.ts @@ -17,14 +17,15 @@ * under the License. */ -import { migrations } from './migrations'; +import { SavedObjectUnsanitizedDoc } from 'kibana/server'; +import { dashboardSavedObjectTypeMigrations as migrations } from './dashboard_migrations'; describe('dashboard', () => { describe('7.0.0', () => { - const migration = migrations.dashboard['7.0.0']; + const migration = migrations['7.0.0']; test('skips error on empty object', () => { - expect(migration({})).toMatchInlineSnapshot(` + expect(migration({} as SavedObjectUnsanitizedDoc)).toMatchInlineSnapshot(` Object { "references": Array [], } @@ -329,7 +330,7 @@ Object { attributes: { panelsJSON: 123, }, - }; + } as SavedObjectUnsanitizedDoc; expect(migration(doc)).toMatchInlineSnapshot(` Object { "attributes": Object { @@ -347,7 +348,7 @@ Object { attributes: { panelsJSON: '{123abc}', }, - }; + } as SavedObjectUnsanitizedDoc; expect(migration(doc)).toMatchInlineSnapshot(` Object { "attributes": Object { @@ -365,7 +366,7 @@ Object { attributes: { panelsJSON: '{}', }, - }; + } as SavedObjectUnsanitizedDoc; expect(migration(doc)).toMatchInlineSnapshot(` Object { "attributes": Object { @@ -383,7 +384,7 @@ Object { attributes: { panelsJSON: '[{"id":"123"}]', }, - }; + } as SavedObjectUnsanitizedDoc; expect(migration(doc)).toMatchInlineSnapshot(` Object { "attributes": Object { @@ -401,7 +402,7 @@ Object { attributes: { panelsJSON: '[{"type":"visualization"}]', }, - }; + } as SavedObjectUnsanitizedDoc; expect(migration(doc)).toMatchInlineSnapshot(` Object { "attributes": Object { @@ -420,7 +421,7 @@ Object { panelsJSON: '[{"id":"1","type":"visualization","foo":true},{"id":"2","type":"visualization","bar":true}]', }, - }; + } as SavedObjectUnsanitizedDoc; const migratedDoc = migration(doc); expect(migratedDoc).toMatchInlineSnapshot(` Object { diff --git a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts new file mode 100644 index 00000000000000..7c1d0568cd3d71 --- /dev/null +++ b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts @@ -0,0 +1,117 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you 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 { get, flow } from 'lodash'; + +import { SavedObjectMigrationFn, SavedObjectUnsanitizedDoc } from 'kibana/server'; +import { migrations730 } from './migrations_730'; +import { migrateMatchAllQuery } from './migrate_match_all_query'; +import { DashboardDoc700To720 } from '../../common'; + +function migrateIndexPattern(doc: DashboardDoc700To720) { + const searchSourceJSON = get(doc, 'attributes.kibanaSavedObjectMeta.searchSourceJSON'); + if (typeof searchSourceJSON !== 'string') { + return; + } + let searchSource; + try { + searchSource = JSON.parse(searchSourceJSON); + } catch (e) { + // Let it go, the data is invalid and we'll leave it as is + return; + } + if (searchSource.index) { + searchSource.indexRefName = 'kibanaSavedObjectMeta.searchSourceJSON.index'; + doc.references.push({ + name: searchSource.indexRefName, + type: 'index-pattern', + id: searchSource.index, + }); + delete searchSource.index; + } + if (searchSource.filter) { + searchSource.filter.forEach((filterRow: any, i: number) => { + if (!filterRow.meta || !filterRow.meta.index) { + return; + } + filterRow.meta.indexRefName = `kibanaSavedObjectMeta.searchSourceJSON.filter[${i}].meta.index`; + doc.references.push({ + name: filterRow.meta.indexRefName, + type: 'index-pattern', + id: filterRow.meta.index, + }); + delete filterRow.meta.index; + }); + } + doc.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource); +} + +const migrations700: SavedObjectMigrationFn = (doc): DashboardDoc700To720 => { + // Set new "references" attribute + doc.references = doc.references || []; + + // Migrate index pattern + migrateIndexPattern(doc as DashboardDoc700To720); + // Migrate panels + const panelsJSON = get(doc, 'attributes.panelsJSON'); + if (typeof panelsJSON !== 'string') { + return doc as DashboardDoc700To720; + } + let panels; + try { + panels = JSON.parse(panelsJSON); + } catch (e) { + // Let it go, the data is invalid and we'll leave it as is + return doc as DashboardDoc700To720; + } + if (!Array.isArray(panels)) { + return doc as DashboardDoc700To720; + } + panels.forEach((panel, i) => { + if (!panel.type || !panel.id) { + return; + } + panel.panelRefName = `panel_${i}`; + doc.references!.push({ + name: `panel_${i}`, + type: panel.type, + id: panel.id, + }); + delete panel.type; + delete panel.id; + }); + doc.attributes.panelsJSON = JSON.stringify(panels); + return doc as DashboardDoc700To720; +}; + +export const dashboardSavedObjectTypeMigrations = { + /** + * We need to have this migration twice, once with a version prior to 7.0.0 once with a version + * after it. The reason for that is, that this migration has been introduced once 7.0.0 was already + * released. Thus a user who already had 7.0.0 installed already got the 7.0.0 migrations below running, + * so we need a version higher than that. But this fix was backported to the 6.7 release, meaning if we + * would only have the 7.0.1 migration in here a user on the 6.7 release will migrate their saved objects + * to the 7.0.1 state, and thus when updating their Kibana to 7.0, will never run the 7.0.0 migrations introduced + * in that version. So we apply this twice, once with 6.7.2 and once with 7.0.1 while the backport to 6.7 + * only contained the 6.7.2 migration and not the 7.0.1 migration. + */ + '6.7.2': flow(migrateMatchAllQuery), + '7.0.0': flow<(doc: SavedObjectUnsanitizedDoc) => DashboardDoc700To720>(migrations700), + '7.3.0': flow(migrations730), +}; diff --git a/src/plugins/dashboard/public/bwc/index.ts b/src/plugins/dashboard/server/saved_objects/index.ts similarity index 93% rename from src/plugins/dashboard/public/bwc/index.ts rename to src/plugins/dashboard/server/saved_objects/index.ts index d8f7b5091eb8f6..ca97b9d2a6b70f 100644 --- a/src/plugins/dashboard/public/bwc/index.ts +++ b/src/plugins/dashboard/server/saved_objects/index.ts @@ -17,4 +17,4 @@ * under the License. */ -export * from './types'; +export { dashboardSavedObjectType } from './dashboard'; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/is_dashboard_doc.ts b/src/plugins/dashboard/server/saved_objects/is_dashboard_doc.ts similarity index 70% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/is_dashboard_doc.ts rename to src/plugins/dashboard/server/saved_objects/is_dashboard_doc.ts index d8f8882a218dd6..c9b35263a549f7 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/is_dashboard_doc.ts +++ b/src/plugins/dashboard/server/saved_objects/is_dashboard_doc.ts @@ -17,8 +17,21 @@ * under the License. */ -import { DashboardDoc730ToLatest } from '../../../../../../plugins/dashboard/public'; -import { isDoc } from '../../../migrations/is_doc'; +import { SavedObjectUnsanitizedDoc } from 'kibana/server'; +import { DashboardDoc730ToLatest } from '../../common'; + +function isDoc( + doc: { [key: string]: unknown } | SavedObjectUnsanitizedDoc +): doc is SavedObjectUnsanitizedDoc { + return ( + typeof doc.id === 'string' && + typeof doc.type === 'string' && + doc.attributes !== null && + typeof doc.attributes === 'object' && + doc.references !== null && + typeof doc.references === 'object' + ); +} export function isDashboardDoc( doc: { [key: string]: unknown } | DashboardDoc730ToLatest diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_match_all_query.test.ts b/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.test.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_match_all_query.test.ts rename to src/plugins/dashboard/server/saved_objects/migrate_match_all_query.test.ts diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_match_all_query.ts b/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.ts similarity index 95% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_match_all_query.ts rename to src/plugins/dashboard/server/saved_objects/migrate_match_all_query.ts index 707aae9e5d4acc..5b8582bf821ef5 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrate_match_all_query.ts +++ b/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.ts @@ -19,7 +19,7 @@ import { SavedObjectMigrationFn } from 'kibana/server'; import { get } from 'lodash'; -import { DEFAULT_QUERY_LANGUAGE } from '../../../../../../plugins/data/common'; +import { DEFAULT_QUERY_LANGUAGE } from '../../../data/common'; export const migrateMatchAllQuery: SavedObjectMigrationFn = doc => { const searchSourceJSON = get(doc, 'attributes.kibanaSavedObjectMeta.searchSourceJSON'); diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts b/src/plugins/dashboard/server/saved_objects/migrations_730.test.ts similarity index 91% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts rename to src/plugins/dashboard/server/saved_objects/migrations_730.test.ts index 5a4970897098da..aa744324428a41 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.test.ts +++ b/src/plugins/dashboard/server/saved_objects/migrations_730.test.ts @@ -17,20 +17,18 @@ * under the License. */ -import { migrations } from '../../../migrations'; +import { dashboardSavedObjectTypeMigrations as migrations } from './dashboard_migrations'; import { migrations730 } from './migrations_730'; -import { - DashboardDoc700To720, - DashboardDoc730ToLatest, - RawSavedDashboardPanel730ToLatest, - DashboardDocPre700, -} from '../../../../../../plugins/dashboard/public'; - -const mockLogger = { - warning: () => {}, - warn: () => {}, - debug: () => {}, - info: () => {}, +import { DashboardDoc700To720, DashboardDoc730ToLatest, DashboardDocPre700 } from '../../common'; +import { RawSavedDashboardPanel730ToLatest } from '../../common'; + +const mockContext = { + log: { + warning: () => {}, + warn: () => {}, + debug: () => {}, + info: () => {}, + }, }; test('dashboard migration 7.3.0 migrates filters to query on search source', () => { @@ -53,7 +51,7 @@ test('dashboard migration 7.3.0 migrates filters to query on search source', () '[{"id":"1","type":"visualization","foo":true},{"id":"2","type":"visualization","bar":true}]', }, }; - const newDoc = migrations730(doc, mockLogger); + const newDoc = migrations730(doc, mockContext); expect(newDoc).toMatchInlineSnapshot(` Object { @@ -97,8 +95,8 @@ test('dashboard migration 7.3.0 migrates filters to query on search source when }, }; - const doc700: DashboardDoc700To720 = migrations.dashboard['7.0.0'](doc, mockLogger); - const newDoc = migrations.dashboard['7.3.0'](doc700, mockLogger); + const doc700: DashboardDoc700To720 = migrations['7.0.0'](doc); + const newDoc = migrations['7.3.0'](doc700, mockContext); const parsedSearchSource = JSON.parse(newDoc.attributes.kibanaSavedObjectMeta.searchSourceJSON); expect(parsedSearchSource.filter.length).toBe(0); @@ -129,8 +127,8 @@ test('dashboard migration works when panelsJSON is missing panelIndex', () => { }, }; - const doc700: DashboardDoc700To720 = migrations.dashboard['7.0.0'](doc, mockLogger); - const newDoc = migrations.dashboard['7.3.0'](doc700, mockLogger); + const doc700: DashboardDoc700To720 = migrations['7.0.0'](doc); + const newDoc = migrations['7.3.0'](doc700, mockContext); const parsedSearchSource = JSON.parse(newDoc.attributes.kibanaSavedObjectMeta.searchSourceJSON); expect(parsedSearchSource.filter.length).toBe(0); @@ -159,7 +157,7 @@ test('dashboard migration 7.3.0 migrates panels', () => { }, }; - const newDoc = migrations730(doc, mockLogger) as DashboardDoc730ToLatest; + const newDoc = migrations730(doc, mockContext) as DashboardDoc730ToLatest; const newPanels = JSON.parse(newDoc.attributes.panelsJSON) as RawSavedDashboardPanel730ToLatest[]; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts b/src/plugins/dashboard/server/saved_objects/migrations_730.ts similarity index 79% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts rename to src/plugins/dashboard/server/saved_objects/migrations_730.ts index 56856f7b213030..e9d483f68a5da2 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/migrations_730.ts +++ b/src/plugins/dashboard/server/saved_objects/migrations_730.ts @@ -16,26 +16,15 @@ * specific language governing permissions and limitations * under the License. */ -// This file should be moved to dashboard/server/ -// eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { SavedObjectsMigrationLogger } from 'src/core/server'; + import { inspect } from 'util'; -import { - DashboardDoc730ToLatest, - DashboardDoc700To720, -} from '../../../../../../plugins/dashboard/public'; +import { SavedObjectMigrationContext } from 'kibana/server'; +import { DashboardDoc730ToLatest } from '../../common'; import { isDashboardDoc } from './is_dashboard_doc'; import { moveFiltersToQuery } from './move_filters_to_query'; -import { migratePanelsTo730 } from './migrate_to_730_panels'; +import { migratePanelsTo730, DashboardDoc700To720 } from '../../common'; -export function migrations730( - doc: - | { - [key: string]: unknown; - } - | DashboardDoc700To720, - logger: SavedObjectsMigrationLogger -): DashboardDoc730ToLatest | { [key: string]: unknown } { +export const migrations730 = (doc: DashboardDoc700To720, { log }: SavedObjectMigrationContext) => { if (!isDashboardDoc(doc)) { // NOTE: we should probably throw an error here... but for now following suit and in the // case of errors, just returning the same document. @@ -48,7 +37,7 @@ export function migrations730( moveFiltersToQuery(searchSource) ); } catch (e) { - logger.warning( + log.warning( `Exception @ migrations730 while trying to migrate dashboard query filters!\n` + `${e.stack}\n` + `dashboard: ${inspect(doc, false, null)}` @@ -75,7 +64,7 @@ export function migrations730( delete doc.attributes.uiStateJSON; } catch (e) { - logger.warning( + log.warning( `Exception @ migrations730 while trying to migrate dashboard panels!\n` + `Error: ${e.stack}\n` + `dashboard: ${inspect(doc, false, null)}` @@ -84,4 +73,4 @@ export function migrations730( } return doc as DashboardDoc730ToLatest; -} +}; diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.test.ts b/src/plugins/dashboard/server/saved_objects/move_filters_to_query.test.ts similarity index 96% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.test.ts rename to src/plugins/dashboard/server/saved_objects/move_filters_to_query.test.ts index 621983b1ca8a51..a06f64e0f0c406 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.test.ts +++ b/src/plugins/dashboard/server/saved_objects/move_filters_to_query.test.ts @@ -17,8 +17,8 @@ * under the License. */ +import { esFilters, Filter } from 'src/plugins/data/public'; import { moveFiltersToQuery, Pre600FilterQuery } from './move_filters_to_query'; -import { esFilters, Filter } from '../../../../../../plugins/data/public'; const filter: Filter = { meta: { disabled: false, negate: false, alias: '' }, diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.ts b/src/plugins/dashboard/server/saved_objects/move_filters_to_query.ts similarity index 100% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/move_filters_to_query.ts rename to src/plugins/dashboard/server/saved_objects/move_filters_to_query.ts diff --git a/src/legacy/core_plugins/kibana/public/dashboard/migrations/index.ts b/src/plugins/dashboard/server/types.ts similarity index 78% rename from src/legacy/core_plugins/kibana/public/dashboard/migrations/index.ts rename to src/plugins/dashboard/server/types.ts index f333ce97d120f6..1151b06dbdab79 100644 --- a/src/legacy/core_plugins/kibana/public/dashboard/migrations/index.ts +++ b/src/plugins/dashboard/server/types.ts @@ -17,5 +17,7 @@ * under the License. */ -export { migrations730 } from './migrations_730'; -export { migrateMatchAllQuery } from './migrate_match_all_query'; +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DashboardPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface DashboardPluginStart {} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index fbfc0cdeaa7cf6..68463b2f442596 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -548,6 +548,8 @@ "dashboard.dashboardGrid.toast.unableToLoadDashboardDangerMessage": "ダッシュボードが読み込めません。", "dashboard.factory.displayName": "ダッシュボード", "dashboard.panel.removePanel.replacePanel": "パネルの交換", + "dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "「6.1.0」のダッシュボードの互換性のため、パネルデータを移行できませんでした。パネルには想定された列または行フィールドがありません", + "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "「6.3.0」のダッシュボードの互換性のため、パネルデータを移行できませんでした。パネルに必要なフィールドがありません: {key}", "data.aggTypes.buckets.ranges.rangesFormatMessage": "{gte} {from} と {lt} {to}", "data.common.kql.errors.endOfInputText": "インプットの終わり", "data.common.kql.errors.fieldNameText": "フィールド名", @@ -2002,8 +2004,6 @@ "kbn.context.reloadPageDescription.selectValidAnchorDocumentTextMessage": "にアクセスして有効な別のドキュメントを選択してください。", "kbn.context.unableToLoadAnchorDocumentDescription": "別のドキュメントが読み込めません", "kbn.context.unableToLoadDocumentDescription": "ドキュメントが読み込めません", - "kbn.dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "「6.1.0」のダッシュボードの互換性のため、パネルデータを移行できませんでした。パネルには想定された列または行フィールドがありません", - "kbn.dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "「6.3.0」のダッシュボードの互換性のため、パネルデータを移行できませんでした。パネルに必要なフィールドがありません: {key}", "kbn.dashboardTitle": "ダッシュボード", "kbn.devToolsTitle": "開発ツール", "kbn.discover.backToTopLinkText": "最上部へ戻る。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f64b215e68e498..0964ab53b7fee4 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -548,6 +548,8 @@ "dashboard.dashboardGrid.toast.unableToLoadDashboardDangerMessage": "无法加载仪表板。", "dashboard.factory.displayName": "仪表板", "dashboard.panel.removePanel.replacePanel": "替换面板", + "dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "无法迁移用于“6.1.0”向后兼容的面板数据,面板不包含所需的列和/或行字段", + "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "无法迁移用于“6.3.0”向后兼容的面板数据,面板不包含预期字段:{key}", "data.aggTypes.buckets.ranges.rangesFormatMessage": "{gte} {from} 和 {lt} {to}", "data.common.kql.errors.endOfInputText": "输入结束", "data.common.kql.errors.fieldNameText": "字段名称", @@ -2003,8 +2005,6 @@ "kbn.context.reloadPageDescription.selectValidAnchorDocumentTextMessage": "以选择有效地定位点文档。", "kbn.context.unableToLoadAnchorDocumentDescription": "无法加载该定位点文档", "kbn.context.unableToLoadDocumentDescription": "无法加载文档", - "kbn.dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "无法迁移用于“6.1.0”向后兼容的面板数据,面板不包含所需的列和/或行字段", - "kbn.dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "无法迁移用于“6.3.0”向后兼容的面板数据,面板不包含预期字段:{key}", "kbn.dashboardTitle": "仪表板", "kbn.devToolsTitle": "开发工具", "kbn.discover.backToTopLinkText": "返至顶部。", From a80348ee6acb054fde116d0dbcfb911865aedda4 Mon Sep 17 00:00:00 2001 From: Liza Katz Date: Wed, 22 Apr 2020 17:33:53 +0300 Subject: [PATCH 34/34] Async search observable can return a non-final response #64132 (#64155) * resolves #64132 * simplify condition * added IAsyncSearchResponse type * update and add jest tests --- .../search/async_search_strategy.test.ts | 41 ++++++++++++++++--- .../public/search/async_search_strategy.ts | 11 +++-- .../data_enhanced/public/search/types.ts | 17 +++++++- .../server/search/es_search_strategy.ts | 12 +++++- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts index 95f2c9e4770642..a7d6aa894d91db 100644 --- a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts +++ b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.test.ts @@ -45,9 +45,11 @@ describe('Async search strategy', () => { it('stops polling when the response is complete', async () => { mockSearch - .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 1 })) - .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })) - .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })); + .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 1, is_running: true, is_partial: true })) + .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false })) + .mockReturnValueOnce( + of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) + ); const asyncSearch = asyncSearchStrategyProvider({ core: mockCoreStart, @@ -67,10 +69,39 @@ describe('Async search strategy', () => { expect(mockSearch).toBeCalledTimes(2); }); + it('stops polling when the response is an error', async () => { + mockSearch + .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 1, is_running: true, is_partial: true })) + .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: true })) + .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: true })); + + const asyncSearch = asyncSearchStrategyProvider({ + core: mockCoreStart, + getSearchStrategy: jest.fn().mockImplementation(() => { + return () => { + return { + search: mockSearch, + }; + }; + }), + }); + + expect(mockSearch).toBeCalledTimes(0); + + await asyncSearch + .search(mockRequest, mockOptions) + .toPromise() + .catch(() => { + expect(mockSearch).toBeCalledTimes(2); + }); + }); + it('only sends the ID and server strategy after the first request', async () => { mockSearch - .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 1 })) - .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 2 })); + .mockReturnValueOnce(of({ id: 1, total: 2, loaded: 1, is_running: true, is_partial: true })) + .mockReturnValueOnce( + of({ id: 1, total: 2, loaded: 2, is_running: false, is_partial: false }) + ); const asyncSearch = asyncSearchStrategyProvider({ core: mockCoreStart, diff --git a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts index 6271d7fcbeaace..18b5b976b3c1b5 100644 --- a/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/public/search/async_search_strategy.ts @@ -14,7 +14,7 @@ import { SYNC_SEARCH_STRATEGY, TSearchStrategyProvider, } from '../../../../../src/plugins/data/public'; -import { IAsyncSearchRequest, IAsyncSearchOptions } from './types'; +import { IAsyncSearchRequest, IAsyncSearchOptions, IAsyncSearchResponse } from './types'; export const ASYNC_SEARCH_STRATEGY = 'ASYNC_SEARCH_STRATEGY'; @@ -52,9 +52,14 @@ export const asyncSearchStrategyProvider: TSearchStrategyProvider { + expand((response: IAsyncSearchResponse) => { + // If the response indicates of an error, stop polling and complete the observable + if (!response || (response.is_partial && !response.is_running)) { + return throwError(new AbortError()); + } + // If the response indicates it is complete, stop polling and complete the observable - if ((response.loaded ?? 0) >= (response.total ?? 0)) return EMPTY; + if (!response.is_running) return EMPTY; id = response.id; diff --git a/x-pack/plugins/data_enhanced/public/search/types.ts b/x-pack/plugins/data_enhanced/public/search/types.ts index edaaf1b22654d4..8ffc8eddda0528 100644 --- a/x-pack/plugins/data_enhanced/public/search/types.ts +++ b/x-pack/plugins/data_enhanced/public/search/types.ts @@ -4,7 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ISearchOptions, ISyncSearchRequest } from '../../../../../src/plugins/data/public'; +import { + IKibanaSearchResponse, + ISearchOptions, + ISyncSearchRequest, +} from '../../../../../src/plugins/data/public'; export interface IAsyncSearchRequest extends ISyncSearchRequest { /** @@ -19,3 +23,14 @@ export interface IAsyncSearchOptions extends ISearchOptions { */ pollInterval?: number; } + +export interface IAsyncSearchResponse extends IKibanaSearchResponse { + /** + * Indicates whether async search is still in flight + */ + is_running?: boolean; + /** + * Indicates whether the results returned are complete or partial + */ + is_partial?: boolean; +} diff --git a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts index 6b329bccab4a73..bf502889ffa4f8 100644 --- a/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts +++ b/x-pack/plugins/data_enhanced/server/search/es_search_strategy.ts @@ -23,6 +23,8 @@ import { shimHitsTotal } from './shim_hits_total'; export interface AsyncSearchResponse { id: string; + is_partial: boolean; + is_running: boolean; response: SearchResponse; } @@ -71,13 +73,19 @@ async function asyncSearch( // Wait up to 1s for the response to return const query = toSnakeCase({ waitForCompletionTimeout: '1s', ...queryParams }); - const { response, id } = (await caller( + const { id, response, is_partial, is_running } = (await caller( 'transport.request', { method, path, body, query }, options )) as AsyncSearchResponse; - return { id, rawResponse: shimHitsTotal(response), ...getTotalLoaded(response._shards) }; + return { + id, + is_partial, + is_running, + rawResponse: shimHitsTotal(response), + ...getTotalLoaded(response._shards), + }; } async function rollupSearch(

8% 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≪DP1Xk9B0 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⁣O0d;kW>w4TUJnm3u; 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 R+Rwn{_chV?ig(2Ee*!Vq^;7@= literal 0 HcmV?d00001 diff --git a/docs/siem/siem-ui.asciidoc b/docs/siem/siem-ui.asciidoc index 85253daaf29330..985138756622d2 100644 --- a/docs/siem/siem-ui.asciidoc +++ b/docs/siem/siem-ui.asciidoc @@ -35,7 +35,7 @@ image::siem/images/network-ui.png[] [float] [[detections-ui]] -=== Detections (Beta) +=== Detections (beta) The Detections feature automatically searches for threats and creates signals when they are detected. Signal detection rules define the conditions @@ -50,6 +50,22 @@ or the Detections API. [role="screenshot"] image::siem/images/detections-ui.png[] +[float] +[[cases-ui]] +=== Cases (beta) + +Cases are used to open and track security issues directly in SIEM. +Cases list the original reporter and all users who contribute to a case +(`participants`). Case comments support Markdown syntax, and allow linking to +saved Timelines. Additionally, you can send cases to external systems from +within SIEM (currently ServiceNow). + +For information about opening, updating, and closing cases, see +{siem-guide}/cases-overview.html[Cases] in the SIEM Guide. + +[role="screenshot"] +image::siem/images/cases-ui.png[] + [float] [[timelines-ui]] === Timeline From 0266a5c447321ba94c5d0dbc3821679f3689de09 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Tue, 21 Apr 2020 10:46:08 -0700 Subject: [PATCH 06/34] [Reporting] Integration polling config with client code (#63754) * source new platform for reporting ui config * fix test types * fix type check Co-authored-by: Elastic Machine --- x-pack/plugins/reporting/common/types.d.ts | 7 ++ x-pack/plugins/reporting/constants.ts | 7 -- x-pack/plugins/reporting/index.d.ts | 12 ---- .../public/components/report_listing.test.tsx | 13 ++++ .../public/components/report_listing.tsx | 12 ++-- .../reporting/public/lib/stream_handler.ts | 19 ++---- x-pack/plugins/reporting/public/plugin.tsx | 67 ++++++++++--------- .../plugins/reporting/server/config/index.ts | 1 + 8 files changed, 67 insertions(+), 71 deletions(-) create mode 100644 x-pack/plugins/reporting/common/types.d.ts diff --git a/x-pack/plugins/reporting/common/types.d.ts b/x-pack/plugins/reporting/common/types.d.ts new file mode 100644 index 00000000000000..34f0bc9ac8a366 --- /dev/null +++ b/x-pack/plugins/reporting/common/types.d.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { ConfigType } from '../server/config'; diff --git a/x-pack/plugins/reporting/constants.ts b/x-pack/plugins/reporting/constants.ts index 5756d29face12a..8079c5b1d98875 100644 --- a/x-pack/plugins/reporting/constants.ts +++ b/x-pack/plugins/reporting/constants.ts @@ -7,13 +7,6 @@ export const JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY = 'xpack.reporting.jobCompletionNotifications'; -export const JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG = { - jobCompletionNotifier: { - interval: 10000, - intervalErrorMultiplier: 5, - }, -}; - // Routes export const API_BASE_URL = '/api/reporting'; export const API_LIST_URL = `${API_BASE_URL}/jobs`; diff --git a/x-pack/plugins/reporting/index.d.ts b/x-pack/plugins/reporting/index.d.ts index 26d661e29bd946..77faf837e65058 100644 --- a/x-pack/plugins/reporting/index.d.ts +++ b/x-pack/plugins/reporting/index.d.ts @@ -4,15 +4,6 @@ * you may not use this file except in compliance with the Elastic License. */ -import { - CoreSetup, - CoreStart, - HttpSetup, - Plugin, - PluginInitializerContext, - NotificationsStart, -} from '../../../src/core/public'; - export type JobId = string; export type JobStatus = | 'completed' @@ -21,9 +12,6 @@ export type JobStatus = | 'processing' | 'failed'; -export type HttpService = HttpSetup; -export type NotificationsService = NotificationsStart; - export interface SourceJob { _id: JobId; _source: { diff --git a/x-pack/plugins/reporting/public/components/report_listing.test.tsx b/x-pack/plugins/reporting/public/components/report_listing.test.tsx index 380a3b3295b9f1..787279e6caf9b1 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.test.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.test.tsx @@ -47,12 +47,24 @@ const toasts = { addDanger: jest.fn(), } as any; +const mockPollConfig = { + jobCompletionNotifier: { + interval: 5000, + intervalErrorMultiplier: 3, + }, + jobsRefresh: { + interval: 5000, + intervalErrorMultiplier: 3, + }, +}; + describe('ReportListing', () => { it('Report job listing with some items', () => { const wrapper = mountWithIntl( @@ -74,6 +86,7 @@ describe('ReportListing', () => { } + pollConfig={mockPollConfig} redirect={jest.fn()} toasts={toasts} /> diff --git a/x-pack/plugins/reporting/public/components/report_listing.tsx b/x-pack/plugins/reporting/public/components/report_listing.tsx index 885e9577471a05..d8f9b7d37cfbf7 100644 --- a/x-pack/plugins/reporting/public/components/report_listing.tsx +++ b/x-pack/plugins/reporting/public/components/report_listing.tsx @@ -16,14 +16,15 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage, InjectedIntl, injectI18n } from '@kbn/i18n/react'; import { get } from 'lodash'; import moment from 'moment'; -import { Component, Fragment, default as React } from 'react'; +import { Component, default as React, Fragment } from 'react'; import { Subscription } from 'rxjs'; import { ApplicationStart, ToastsSetup } from 'src/core/public'; import { ILicense, LicensingPluginSetup } from '../../../licensing/public'; import { Poller } from '../../common/poller'; -import { JobStatuses, JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG } from '../../constants'; +import { JobStatuses } from '../../constants'; import { checkLicense } from '../lib/license_check'; import { JobQueueEntry, ReportingAPIClient } from '../lib/reporting_api_client'; +import { ClientConfigType } from '../plugin'; import { ReportDeleteButton, ReportDownloadButton, @@ -53,6 +54,7 @@ export interface Props { intl: InjectedIntl; apiClient: ReportingAPIClient; license$: LicensingPluginSetup['license$']; + pollConfig: ClientConfigType['poll']; redirect: ApplicationStart['navigateToApp']; toasts: ToastsSetup; } @@ -167,12 +169,10 @@ class ReportListingUi extends Component { functionToPoll: () => { return this.fetchJobs(); }, - pollFrequencyInMillis: - JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG.jobCompletionNotifier.interval, + pollFrequencyInMillis: this.props.pollConfig.jobsRefresh.interval, trailing: false, continuePollingOnError: true, - pollFrequencyErrorMultiplier: - JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG.jobCompletionNotifier.intervalErrorMultiplier, + pollFrequencyErrorMultiplier: this.props.pollConfig.jobsRefresh.intervalErrorMultiplier, }); this.poller.start(); this.licenseSubscription = this.props.license$.subscribe(this.licenseHandler); diff --git a/x-pack/plugins/reporting/public/lib/stream_handler.ts b/x-pack/plugins/reporting/public/lib/stream_handler.ts index 3c121f1712685b..eed6d5dd141e70 100644 --- a/x-pack/plugins/reporting/public/lib/stream_handler.ts +++ b/x-pack/plugins/reporting/public/lib/stream_handler.ts @@ -4,30 +4,23 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import * as Rx from 'rxjs'; import { catchError, map } from 'rxjs/operators'; -import { i18n } from '@kbn/i18n'; +import { NotificationsSetup } from 'src/core/public'; import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, JOB_STATUS_COMPLETED, JOB_STATUS_FAILED, JOB_STATUS_WARNINGS, } from '../../constants'; - -import { - JobId, - JobSummary, - JobStatusBuckets, - NotificationsService, - SourceJob, -} from '../../index.d'; - +import { JobId, JobStatusBuckets, JobSummary, SourceJob } from '../../index.d'; import { - getSuccessToast, getFailureToast, + getGeneralErrorToast, + getSuccessToast, getWarningFormulasToast, getWarningMaxSizeToast, - getGeneralErrorToast, } from '../components'; import { ReportingAPIClient } from './reporting_api_client'; @@ -47,7 +40,7 @@ function summarizeJob(src: SourceJob): JobSummary { } export class ReportingNotifierStreamHandler { - constructor(private notifications: NotificationsService, private apiClient: ReportingAPIClient) {} + constructor(private notifications: NotificationsSetup, private apiClient: ReportingAPIClient) {} /* * Use Kibana Toast API to show our messages diff --git a/x-pack/plugins/reporting/public/plugin.tsx b/x-pack/plugins/reporting/public/plugin.tsx index 08ba10ff692078..c40e7ad373eafa 100644 --- a/x-pack/plugins/reporting/public/plugin.tsx +++ b/x-pack/plugins/reporting/public/plugin.tsx @@ -4,44 +4,42 @@ * you may not use this file except in compliance with the Elastic License. */ -import * as Rx from 'rxjs'; +import { i18n } from '@kbn/i18n'; +import { I18nProvider } from '@kbn/i18n/react'; import React from 'react'; import ReactDOM from 'react-dom'; +import * as Rx from 'rxjs'; import { catchError, filter, map, mergeMap, takeUntil } from 'rxjs/operators'; -import { i18n } from '@kbn/i18n'; +import { + CoreSetup, + CoreStart, + NotificationsSetup, + Plugin, + PluginInitializerContext, +} from 'src/core/public'; import { ManagementSetup } from 'src/plugins/management/public'; -import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/public'; -import { I18nProvider } from '@kbn/i18n/react'; import { UiActionsSetup } from 'src/plugins/ui_actions/public'; - -import { ReportListing } from './components/report_listing'; -import { getGeneralErrorToast } from './components'; - -import { ReportingNotifierStreamHandler as StreamHandler } from './lib/stream_handler'; -import { ReportingAPIClient } from './lib/reporting_api_client'; -import { GetCsvReportPanelAction } from './panel_actions/get_csv_panel_action'; -import { csvReportingProvider } from './share_context_menu/register_csv_reporting'; -import { reportingPDFPNGProvider } from './share_context_menu/register_pdf_png_reporting'; - -import { LicensingPluginSetup } from '../../licensing/public'; +import { JobId, JobStatusBuckets } from '../'; import { CONTEXT_MENU_TRIGGER } from '../../../../src/plugins/embeddable/public'; -import { SharePluginSetup } from '../../../../src/plugins/share/public'; - import { FeatureCatalogueCategory, HomePublicPluginSetup, } from '../../../../src/plugins/home/public'; +import { SharePluginSetup } from '../../../../src/plugins/share/public'; +import { LicensingPluginSetup } from '../../licensing/public'; +import { ConfigType } from '../common/types'; +import { JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY } from '../constants'; +import { getGeneralErrorToast } from './components'; +import { ReportListing } from './components/report_listing'; +import { ReportingAPIClient } from './lib/reporting_api_client'; +import { ReportingNotifierStreamHandler as StreamHandler } from './lib/stream_handler'; +import { GetCsvReportPanelAction } from './panel_actions/get_csv_panel_action'; +import { csvReportingProvider } from './share_context_menu/register_csv_reporting'; +import { reportingPDFPNGProvider } from './share_context_menu/register_pdf_png_reporting'; -import { - JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG, - JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY, -} from '../constants'; - -import { JobId, JobStatusBuckets, NotificationsService } from '..'; - -const { - jobCompletionNotifier: { interval: JOBS_REFRESH_INTERVAL }, -} = JOB_COMPLETION_NOTIFICATIONS_POLLER_CONFIG; +export interface ClientConfigType { + poll: ConfigType['poll']; +} function getStored(): JobId[] { const sessionValue = sessionStorage.getItem(JOB_COMPLETION_NOTIFICATIONS_SESSION_KEY); @@ -49,7 +47,7 @@ function getStored(): JobId[] { } function handleError( - notifications: NotificationsService, + notifications: NotificationsSetup, err: Error ): Rx.Observable { notifications.toasts.addDanger( @@ -64,18 +62,19 @@ function handleError( return Rx.of({ completed: [], failed: [] }); } -export class ReportingPublicPlugin implements Plugin { +export class ReportingPublicPlugin implements Plugin { + private config: ClientConfigType; private readonly stop$ = new Rx.ReplaySubject(1); - private readonly title = i18n.translate('xpack.reporting.management.reportingTitle', { defaultMessage: 'Reporting', }); - private readonly breadcrumbText = i18n.translate('xpack.reporting.breadcrumb', { defaultMessage: 'Reporting', }); - constructor(initializerContext: PluginInitializerContext) {} + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + } public setup( core: CoreSetup, @@ -130,6 +129,7 @@ export class ReportingPublicPlugin implements Plugin { @@ -163,8 +163,9 @@ export class ReportingPublicPlugin implements Plugin { const { http, notifications } = core; const apiClient = new ReportingAPIClient(http); const streamHandler = new StreamHandler(notifications, apiClient); + const { interval } = this.config.poll.jobsRefresh; - Rx.timer(0, JOBS_REFRESH_INTERVAL) + Rx.timer(0, interval) .pipe( takeUntil(this.stop$), // stop the interval when stop method is called map(() => getStored()), // read all pending job IDs from session storage diff --git a/x-pack/plugins/reporting/server/config/index.ts b/x-pack/plugins/reporting/server/config/index.ts index f0a0a093aa8c08..a0d7618322c653 100644 --- a/x-pack/plugins/reporting/server/config/index.ts +++ b/x-pack/plugins/reporting/server/config/index.ts @@ -10,6 +10,7 @@ import { ConfigSchema, ConfigType } from './schema'; export { createConfig$ } from './create_config'; export const config: PluginConfigDescriptor = { + exposeToBrowser: { poll: true }, schema: ConfigSchema, deprecations: ({ unused }) => [ unused('capture.browser.chromium.maxScreenshotDimension'), From 5a55c9a8f6c245387f4dc0bf75e5788d1b85bf97 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Tue, 21 Apr 2020 12:47:25 -0500 Subject: [PATCH 07/34] Register uiSettings on New Platform (#64015) This now requires us to define a schema for each setting, which is a little redundant given that we also have to type the useUiSetting calls; this might be an issue between kibana-react and new UiSettings changes. --- x-pack/legacy/plugins/siem/index.ts | 113 +---------------- x-pack/plugins/siem/server/plugin.ts | 3 + x-pack/plugins/siem/server/ui_settings.ts | 141 ++++++++++++++++++++++ 3 files changed, 145 insertions(+), 112 deletions(-) create mode 100644 x-pack/plugins/siem/server/ui_settings.ts diff --git a/x-pack/legacy/plugins/siem/index.ts b/x-pack/legacy/plugins/siem/index.ts index 6e03583dda69fa..5ffaea1ee73dfb 100644 --- a/x-pack/legacy/plugins/siem/index.ts +++ b/x-pack/legacy/plugins/siem/index.ts @@ -11,24 +11,7 @@ import { Root } from 'joi'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths import { savedObjectMappings } from '../../../plugins/siem/server/saved_objects'; -import { - APP_ID, - APP_NAME, - DEFAULT_INDEX_KEY, - DEFAULT_ANOMALY_SCORE, - DEFAULT_SIEM_TIME_RANGE, - DEFAULT_SIEM_REFRESH_INTERVAL, - DEFAULT_INTERVAL_PAUSE, - DEFAULT_INTERVAL_VALUE, - DEFAULT_FROM, - DEFAULT_TO, - ENABLE_NEWS_FEED_SETTING, - NEWS_FEED_URL_SETTING, - NEWS_FEED_URL_SETTING_DEFAULT, - IP_REPUTATION_LINKS_SETTING, - IP_REPUTATION_LINKS_SETTING_DEFAULT, - DEFAULT_INDEX_PATTERN, -} from '../../../plugins/siem/common/constants'; +import { APP_ID, APP_NAME } from '../../../plugins/siem/common/constants'; import { DEFAULT_APP_CATEGORIES } from '../../../../src/core/utils'; // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -63,100 +46,6 @@ export const siem = (kibana: any) => { category: DEFAULT_APP_CATEGORIES.security, }, ], - uiSettingDefaults: { - [DEFAULT_SIEM_REFRESH_INTERVAL]: { - type: 'json', - name: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalLabel', { - defaultMessage: 'Time filter refresh interval', - }), - value: `{ - "pause": ${DEFAULT_INTERVAL_PAUSE}, - "value": ${DEFAULT_INTERVAL_VALUE} -}`, - description: i18n.translate('xpack.siem.uiSettings.defaultRefreshIntervalDescription', { - defaultMessage: - '

CZT$XzGOaws8V^6|Y%zIQQ9xFT{ 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

+fYMKRSlKw?BEKjmNqJXp)K+?4I7k*%CDl`~? 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 Ty^ Date: Tue, 21 Apr 2020 09:35:19 -0700 Subject: [PATCH 02/34] [DOCS] Add file size setting for Data Visualizer (#64006) --- docs/settings/ml-settings.asciidoc | 9 ++++++- .../ml/images/ml-data-visualizer-sample.jpg | Bin 579529 -> 355490 bytes docs/user/ml/index.asciidoc | 22 +++++++++--------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/docs/settings/ml-settings.asciidoc b/docs/settings/ml-settings.asciidoc index 6528568e868900..b71e1c672756ac 100644 --- a/docs/settings/ml-settings.asciidoc +++ b/docs/settings/ml-settings.asciidoc @@ -8,7 +8,6 @@ You do not need to configure any settings to use {kib} {ml-features}. They are enabled by default. -[float] [[general-ml-settings-kb]] ==== General {ml} settings @@ -19,3 +18,11 @@ If set to `false` in `kibana.yml`, the {ml} icon is hidden in this {kib} instance. If `xpack.ml.enabled` is set to `true` in `elasticsearch.yml`, however, you can still use the {ml} APIs. To disable {ml} entirely, see the {ref}/ml-settings.html[{es} {ml} settings]. + +[[data-visualizer-settings]] +==== {data-viz} settings + +`xpack.ml.file_data_visualizer.max_file_size`:: +Sets the file size limit when importing data in the {data-viz}. The default +value is `100MB`. The highest supported value for this setting is `1GB`. + diff --git a/docs/user/ml/images/ml-data-visualizer-sample.jpg b/docs/user/ml/images/ml-data-visualizer-sample.jpg index 6c2e018932717f478b9f92dc412d1904d52d6893..ce2bb660d7da1a3cea161afcb07e6223d77e038f 100644 GIT binary patch literal 355490 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∾l4lWCBm1k&WWD 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