From 757341c618bfbedbb2048b3fc39d90e19304eb08 Mon Sep 17 00:00:00 2001 From: a le <101848970+1aal@users.noreply.github.com> Date: Tue, 26 Dec 2023 23:32:51 +0800 Subject: [PATCH] fix: connect with wrong role after kb upgrade (#151) --- .../cli/kbcli_cluster_create_redis.md | 11 +++ pkg/cluster/charts/oceanbase-cluster.tgz | Bin 5820 -> 5821 bytes pkg/cluster/charts/redis-cluster.tgz | Bin 5312 -> 5311 bytes pkg/cluster/cluster.go | 70 ++++++++++---- pkg/cluster/cluster_chart.go | 34 +------ pkg/cluster/cluster_test.go | 16 ++-- pkg/cluster/external_charts.go | 14 +-- pkg/cluster/helper.go | 87 +++++------------- pkg/cluster/helper_test.go | 3 +- pkg/cluster/printer.go | 8 +- pkg/cluster/validate.go | 24 ++++- pkg/cmd/bench/pgbench.go | 12 +-- pkg/cmd/bench/sysbench.go | 12 +-- pkg/cmd/bench/tpcc.go | 12 +-- pkg/cmd/bench/tpch.go | 12 +-- pkg/cmd/bench/ycsb.go | 12 +-- pkg/cmd/cluster/connect.go | 18 ++-- pkg/cmd/cluster/connect_test.go | 2 +- pkg/cmd/cluster/create_subcmds.go | 44 ++++++--- pkg/cmd/cluster/describe.go | 11 ++- pkg/cmd/cluster/list_logs.go | 4 +- pkg/cmd/cluster/logs.go | 2 +- 22 files changed, 212 insertions(+), 196 deletions(-) diff --git a/docs/user_docs/cli/kbcli_cluster_create_redis.md b/docs/user_docs/cli/kbcli_cluster_create_redis.md index 2f062a6e7..95d131305 100644 --- a/docs/user_docs/cli/kbcli_cluster_create_redis.md +++ b/docs/user_docs/cli/kbcli_cluster_create_redis.md @@ -28,12 +28,23 @@ kbcli cluster create redis NAME [flags] --memory float Memory, the unit is Gi. Value range [0.5, 1000]. (default 0.5) --mode string Cluster topology mode. Legal values [standalone, replication]. (default "standalone") --monitoring-interval int The monitoring interval of cluster, 0 is disabled, the unit is second. Value range [0, 60]. + --node-port-enabled Whether NodePort service is enabled, default is true --publicly-accessible Specify whether the cluster can be accessed from the public internet. --rbac-enabled Specify whether rbac resources will be created by client, otherwise KubeBlocks server will try to create rbac resources. --replicas int The number of replicas, for standalone mode, the replicas is 1, for replication mode, the default replicas is 2. Value range [1, 5]. (default 1) + --sentinel.cpu float Sentinel component cpu cores. Value range [0.1, 8]. (default 0.2) + --sentinel.enabled Whether have sentinel component, default is true (default true) + --sentinel.memory float Sentinel component memory, the unit is Gi. Value range [0.1, 4]. (default 0.2) + --sentinel.replicas float Sentinel component replicas Value range [1, 5]. (default 3) + --sentinel.storage float Sentinel component storage size, the unit is Gi. Value range [1, 10]. (default 5) --storage float Storage size, the unit is Gi. Value range [1, 10000]. (default 20) --tenancy string The tenancy of cluster. Legal values [SharedNode, DedicatedNode]. (default "SharedNode") --termination-policy string The termination policy of cluster. Legal values [DoNotTerminate, Halt, Delete, WipeOut]. (default "Delete") + --twemproxy.cpu float twemproxy component cpu cores. Value range [0.1, 8]. (default 0.2) + --twemproxy.enabled Whether have twemproxy component, default is false + --twemproxy.memory float twemproxy component memory, the unit is Gi. Value range [0.1, 4]. (default 0.2) + --twemproxy.replicas float twemproxy component replicas Value range [1, 5]. (default 3) + --use-legacy-comp-def if useLegacyCompDef is false ,cluster will be rendered by compDef rather than componentDefRef in cluster definition --version string Cluster version. ``` diff --git a/pkg/cluster/charts/oceanbase-cluster.tgz b/pkg/cluster/charts/oceanbase-cluster.tgz index ca96b88b3dbd6e6621e589b4d02cc4952385df81..6104896ac183253dd00160e0a3884ed8498e77ab 100644 GIT binary patch delta 5814 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 AlmGw# delta 5813 zcmV;m7E0;8Exav|JAXZGbK5qP{mfsnN2haf9*d@A$xbxWxpQnc(bSeblG0wEPA>zI zD+x6PFa&5vNqfKj1^`J>B=zE#I&CA&w6TfBVs`;77QpVBdq~)j2&{QQEF?zzCleA$ zXGW&MH;+_Y*L4q@P5rOyy2XFpX1(=Iz1eCuT8)EN^WYn|-hXTz9eo4tV-c{b#6ptj z8~4F|6`A{+6cW-OF%p!sHrzBU5{B8YO{d|wj$5m{u3LBAgNEBUa9f1|*(0dw<_?_S4#%v^&?SJFexU z@FE&Y{plF8>3<2y^n|wdvcIb@%Y)zucE?*R{XKwfh*Qy#8-U z5TkfZ17OYiuQ!{G!uoHy2Z!7B{}g2hPH{xyK!O=}y{VQag=6i&U_u2@0R(7siGFfGJLSGhJ;aWoSh>Ygvy=NMzGnIno!{5-8 z>DMsgAx4s-u-jlz>+f@wxbWRzqB78^F6Tgdiy*l}p$1fQ_O&_`rVaM=wk0HCK7R?6 zx}9<#GfiGM)rtD9%~kgTRKqEDoACI{!dG2GnZz+h_Cn3CC91Wyv)j-p)J!R((|BsP zp|JHXVSoID#m|vhGJ9ptC(NTdWpdeSU;#_J>CCSaNbKn zRx>`BAh38k#0dB(w+S;20SZyrcz^#KxqJrunc77aJ^S-f&2zl5ybden<%RJIQJq}9 zTO*~Dt9Rh>X!D5yU>m6x;B}3V5oO~|7tG70QYbB@ObYczsZ|_E8U}bdveg;2RVgN8 z;jECWB9cpWA3w3Me)FR*2}7NPnV_0nj%_ z;0DqvwE<;_{spAha+gc5RFxB->$*$j7x3{q@dbQ*SLx-N{8NRuT5#uglG*uRPh4f0 z%+>u$aa9T{cY;|Vw6|PH=q6yRC3dC{LBJz8r9%IB#eK*lSSGVn4of-D4p;>UWSYea znO8S3Xbp9KLF{uOSvgVJQGar7T<9imqE^~lRhEcly7}Wv8}Sb)Z%b>$qe{V63T#p$HSQdUjPLn+X^}>$*DG>+wr*Y0(Gu+Jhrb} zs)n_OA2TB?hZO7K%P))~A#>%rOoT=mZSeYosF=i=(Tb9TB1 zo$kr`yVFkh4ZMCgfbQi0&N~;K!PzMcE}?tbt#!KJ_d4A-XBTJPfkt+5);oE7+#MXh z?wof9KPznCcLwnNWe<+w>bN)PoV+_f?!nc&-qmIQOpC3LSbr9%J{C`Tgy5qjG!P1O z-?HAZfKI7IAB0B&t@wSaH2N@BAC*O;-(*#D^-E11eVCv(2r?o}5Kj#v3G|>wNP?QA zQv@DjM6wzZ%p~;$sBI+R#20(|Mi$~gMx-_(LPCgCL~TZF~y zk3X!>pKIXbh%y8_n=_7rwxKq!*Vp@waUtj`RL+m)IywKM1HXfeV&=i&f&P(B`|)T* zKZ0GeA;E>rS3g>sz7z9cL$V%5aS+VlLrelXqUZw&LruA3{e%X$hL@@b#f4hA9#MOd z;8WC2BYzP?iNf$Zq8RuB)b5ljKD{?l0ndjsEsN7`U%{$HFGBQo9jh~f2m@5wL?iJy zQ#+DKoKy5SD&dv}0Sr-Xggy`fL=&G-yF#?-GuT|bbd*W6_(qmWZE5``5)VX%=b5Iy z{oUq6I;Sy{gF)i-jF3#*l+J~ZcO)*1D3c?wzke0AZ-rgJWjft_f>r;xFzs^Vsa8qi z^`OR5k7+VN3{*gd7_1yu4L2XuA~Sh8o1c?6PxxKmR1y!t{+A8*d;9Loh)<`S85+eZ z8V!UYa)QCs5tDsQcN;!`2Fko3_N$n3Ot)1K0t56UkIoa+PHx5|j2>scXR3~bp>v(B zQ-6o@{mk9u^XG~tzr%-^ODr&6#xf<0jM1+RX9iI^d-@pNP_NkD2(F(Hzk%qAeAX(7 zFb}rXk}`|lsivMXA(c6_NPB*1Rn6d{ViyUo$`p^8e*K6Au4YTOI5rKs%k{yowK_P8_RQ<(+4Tu>~>)z1b^im?%;j*_~OiNgRMq!0VpNX-pgQ5uHGe}Q_A4Eh=*AlFN~qSTSSpO{x4#= zIJ>y){hT1uS_ht&@R`eSfJPbT+=E~j>^Jrz^3zWLhegzd<_q2i@Ow69tsJu4Sby06 zzU-d8Ke>F@9TcRLUC88+*!7g0%h&Hu&foP1XT5%9>-i5gnV<-m(m%U0@OX#8C%-_L68CEBENiaPK+FfKy1mn_kn zYbf;iH1u&~=ae{p$mEr~hn!#ArGKC~Z29}jl#Yt^J#S%GQCnM}{7c)@f48#g{FjdQ zLtO#aoc|7v>P7#*qef%v|M4Ux@BdH2P&kVU=BBQFQsTWj-{PPlHE21<)_hD`QD^t4D7f{3s&!ZW%D&-4*6W|9WVXp ztZbNMpHkqgb;bB(eDzY-OVwXCQit=dZ+H+-@gyL0I!IM?JA0H$<*%<}M>N3PQ&>8` zb6-lnnrgH%v$;?^r@<8Bc__pM_wxj#Wb}~uKSfmHCG&8hHghg5Hh+rnLySU}zGrl5 z@{D1b5t+Irfc=Krc?uUK5%BTXAc%mEm&)NQ5Wy<;m38UU=$|D5yY9Ld)J`<^LoDA_ z_Fpt4-ebgptg-)G_n`Ft+icdi_TN*KiY-YEyRq25G;!PVr6q~dAE}RZ z>%Uc6|1H)`W0b+tdpr6QL zN~AZTY`g~%21L>ugpkNd?mJ<=wF3;t`rrc3!w5(8Bl_mm|37vexMaahM`MMCBnUBr zfHHI}=d}O6FL{L44kXVQKc4i#r;)InF_ruJ|Au_a8GefP^?(1<50mk}`d|91xMBNq zL_^|T$D#H`71j$!+=kW*XGpHC7ml2&pLs;b){FnMcHl=6Q63BEoSq5G2_ya+deU;J zk7VC~NBlR-xe*@sasTfSI#gc&`YlJ8Am7JH2C;7a*N>W|_y5-R{^v=`iu@0i2^r4m zFe1@xeHsQ6B!6yFF9fEMRR|dW(!6iW+V%e^!QgAwf4$x+-TyY-gYEi%ijwVux$y5a z)ry%3mbJ43{~eNuOkv6yl{`{b0c8@S8xrh+3seB(xk_ti$D04vNg&(c=5dv7F|CTb z&r=LgV!l}t=o?_tXlKV-8vC1TR)`)}%}N2qR}qddihs~wBvZ!@gP(>D1CKyVhz>m7 zv9i$OzW&rLbUWcfCa&_w`kH_a0|Yt(8O68<_%YDy9OHq-wP3kF~J z{&!Hc|9=|p;o(0^NRk7byk>7TC3&@2fw%%LCwTg7?~ zDTLq9N;ZtM1%4Oclen>J<`aWq$!suntEYgmNAAnn+)i1= zUj>vN=Un=fYW6DamP%&xVT6!_UB-MrM30VUa63Uc(dlvKNdY~=lmTL1V$g?C#HadR zDSrtF`SI$cLP|r<10<|UOvYr%Ggh{iD!IB!!2T4D6o8>4Gw2@5R?bkXH;H0rI^HvaQTiuPDNHGhttp1BDa(Exps+hD*LdS%zu1xGJ)k6;_W z^`~?yQ?S~Zwd@pcd|dOcXUlP(FLOLAxQFFkzjCfwH}lYi2YGSb$%pIVey^Lae-jLN zpIE?k_kV6N|7)Xu(A>WNJxS5){|!p;0v`JiM*N2Q>J-KJZTip$Aayb7gbb@QM2({*o)XwuXA!M<}ohXAAO`1XU7;9S%3ZbdL69l=<_^8i^& zR{ijfl8##gL5f(p8X# zsw59Kh3L1b0#Cg}mT!nz!vKrs5C+8ah+d!^wzH-Dk0@8}a;1MNR} z&WZn;1ZvkafjkwFpgA>E*b*1+51ifPWM7O6bcQHNVXGy#q84!C*M>>wHRI37g5iA{ zn>QO0w82)&&CV!KPx+gXukRN!@{?sr+1MFhqw2Vd;!e`_J-bY=B{mXTK!;>VY8s7} zKt>Dk{Ro9fXrfF;gnyyDFHN7~2?m zn_Rlt<4mpx%&wwnDyG+$v}`ut|8+Fry)pr=+5el3W@-O->)ZRECn?4IpJHmLRd+KR zCWSJ}GVe%QIPYH%^?AR%Ec1ui-Kx}2_KI|FR*|)c2e^_S1%I%}#XTupLBNnQ9aOcB zj@Jh6&m<=S-;}BZy!SN373Se)Q?T^-e3QO0_ZQ$cdTOqk-S>HME+;$L?Adw4nY6(q zDv3p_auUl4kLV|DcR1HClc)JaV7X!5NLr;iyDsC)WS0`{(H=U+lkt{6!%M)yAImlaPzIzYF5RN6qTv70=8<(t%8qAfOpx;zqFO~ z&nC~&B@g}XnzOKM*%1Du$fO~x?6-be^ILv+|aRGq4Co6Ik_sr{8F{fo%%eGWz>0y z-8|hT`V=qURb#Gv*{!4_$+^0kl$6~?$t)9C1x-mWOEv65HX@w_J=wbTAA-#}FDmA8 z?~{=Ib${7hVx~emS)H0`q0M57qqK{>Sl4w?;JDbu_OWQgvbp{j-UR(Pz(@E0aSz?n z`|sh=HvaobN|iH2>TkSE%g_Ch)gdDdpSCLgM03gMxd4%POY@Kid_4OBXZg3ITt;Ej zxEwc@1X|6LP^PE~ceD!1D%}IG$F9S==GYgJ>VNdbWQxVNf-EGw!sXkSL=kD>>VAiewR`aO1{*Ml}_rFh4mc0KaW1Tnus`8Jne;-Z|=|!|GgK0ivC+t9k zqjDCs+0?f_&3qLaW$Fy zizGxTlSmRq#UucTk;HSxZzgb#B$^_D1C)_>m(81{guwy4T@V380D}L1`r>(icgFY=-G{piWgDHj#34s$JR5G|>IR}ZCS&AeUsur0+F7R_aNAb-WTW05Y zrm)OVDli;d{BTXuRJFy`D#LLC(;J8_G)HoQImiW~I*(CI`BP@+{* z6XC?53xeR_0RA&W94(7~WythH*@(>z4h|~4W_rr3gH8iWmf%Kh$ugF*`He0+1|bnm zP|7Fl2orE!)kl{~7EjF*hx z9D`h7$SIL(Af6FTj4o+a;P`!xg%n|&RzqqLwLlAhBu#LWZwNP_li&bU zEBaqcfs0*8#?c&uARn=hXj?vkLF87G*Laz6_TeVPRLQB^BBqj1oQ8GU%j}ZIR*Bp3 zB?4tl85~I=VgS{!oCJnFh{8coa;SefC@4$t1>^FcrlFwmdjgW@HQ~5B6Sl*2-`Ttx z3mVf(ngPlVA2s-Yd~6N3PwSF*{TJ~9FH!irVDuqytY828Q8ey1*8kD)bhuytcac5? z0G)5mfOjU)Q9FQ1ucwB-YsG-^dC&ZL&^cD%%Fb7?Z2CKnrOC@U%P^M&i_Qd8qX3=e zQd^cdZA=+UF`~K=U62@aq+^w4nJ`J9cv}j*e#Z3sJ7nlamyp-~!OL_q)8 z8qC$1L0Y{iRYO6I<8;lEeRz{-C<51`e5@$wGN51+}jst7eB2Ya zV6EU^T5u4UUy&HAUb2SoaXE{L&^B;gp_b;pcbwiXid|p{SFIy$J>aaTI^VOVf>E5! zu3E#}0$pJr`Wj=p8=WC{nP_gA8el8N$Tv=9(XAs~bzS9?WDoIb8`9KPb*hU!jDqx2 z+>-Nu#@rp$O5FL|ua}g<{WmXzEmgHGkNzF`MusiE9q~N$^6XiWx8<5Q*K6=g<0`g+p=WoygCD;z9el-!iGheH;^%8ZTd2de*+7hyP+P`TL{?*NT z4~u`{N#C|uw&Z!;S>8s@3#@lwee{`Hpda0TN7;E8-=OPC9{&`oE>Qp7?vL}nu2et& zD{p6dFJHa==bKP|kPm=k!~I_rjZfR>fBXBtouqyU&#=@=*SWZdpI$$Q=?(ClQbOmd zSYV~NmWU=|6703W*OFGv|KAok%`g|C%p2OkhJrF$M{LlE@+w8IC8VjfdhG3-N*_SWFyyunVs-N`B@< z;#V}Tc5sc(E;8$kTRg>m@M?w%yI*r;1q;(e{TT$S1=DkCuu(FrbGo)@mSwAD(*?0- zgiqs`rW z#bOI}MOlI~=P-9`t<^1Ru2EklOeF{}H-ODC#T-d|!ID=zArz%=OvTElq7b?_IK{DK z+@lh!X=}VJiz92Dr7#uavYBous!U)oJ~{n+ktGqIV|n2ed}hyo{z6e);hGM2C!ePa zRxBs`#p2(7v8cJ(FxU`pJo58vi}RtAHo%Qll|ZJ{~Zte{k{Fa zi)0145U-ZQOd;!a>&8mQ8Cx!uz*@t`=AM`CFqH)bZ~z?7+909QIkh!^FvD>}A(__& zR#AElv{kLwz(s*eB_C4->TdVUFh(wI-^n9x**)Gu3^nnHz=#lwCnWYT4j3V zu`}%m6ojl9PiNcUkTGpv;bvjlw?gTg!%ZvH zV?j3{HXF}1rO+^-y;h9Jes0>(u#xhr&IDW=+F)=DX7w3S6^{bTWps95*EwJrGIOi=||9P9aDZP}4? z;Kn!{rqYlRg`*>XIGo#G<6#(;kTXP5I5a1T9aXx_g@h@FDVEn5Q&m?pI36CuoJr{D zMvgpZY7SD%R)yDQ^rI+Rh1`Oy!mp~96g2wAPejpS{V)PcMwu0@A*29mQqnK!s0e9x z{N9lJYExbRhYOr8$(%Bd9}veT`)@QHw&FiTgT4OWMLK|g3nV4xR7Y$uLl4&rOktXn zG$C{j8Hz8}wzLccA@WS0mVj8`G=+J}rm#dZUJyDz298rC$rXkS$%T`TXc8O%#dCA> za+q;EBOh=A*F-Mh{~d+!il#TfsII9@m_%k87k)`ju5csKopVrN1vIv30!bI!<^%!P9{Y(zJUZMBt{Y^Y9}TZNP!(31h#kr zZ*}b9@Z=L&gNw-uG8oT-;))cD)tLSXB;R`7|YQ zdb6Q*Jz5k?7e%|Or+q#}adEv@Hmou$_ntC;ghtG<>L4A)sj5~q`q+}bPrkHS|KC3t z&<6c~a?-T_25L{Z*Z;dnUo!qrdkI((d!}4eO1O2wT0Dyou+nM4u15(GHhzQqo>btN z(d6?&u=qk-M841^^|%(T#mxUUyn+G?wvKhDQOGp7!};e$?M;0fwhQ# zJpV$ebbmM60_glqGW;r+{&+p@_1fDvPaUvrI>&AHzP&?h@sQemLmM%QYVZJ^kE-0u zyfqkBNP{U`F9OCMxhrRtowANU50oBfYXj*5FMD3Q#mnr!n2=yW!GT>F(8h+lytdH| z)VwY&RYa8mVjPrl0yEB*`do=n4fpPU;>^=ao8rpU7;9TgUal@I*cahQ0T?<;gYLd; zIfj})eAf3*&tQERoi-!u?L!@5EhRb<1yk_XL}2FxLEETBWH!lfKr&mk(eRyl-#=w9 z(;EBFc???mL*D5z=%(|((|**n|4v7H|L>h7_vu7zP6B2m#ffkh7%+xj`;mly*Uj|y zw)V*Ylw~5U$E&~U>p<}R;F8c}QUvi2mRO<$Ni-?n`m{axEUudCo`Mw_icN*^HBK=S zIDA=T8>kdbaVpld`CJ1S$2RJEwiWK97S3{}y=I*kJ4MWBjm&eB;ehHdBZMs&j}xdN z5ZM!on$z9jVJ>I4oB!r9_+8(Bf^Rzii~9ZM{2vYX_kTM{dj3Dd67)wNAmi+cBx)B$ z*>!Qz2k2TH!#vK80j1<7r`lyeVj5#A_4g^l;O(pPR}=Uz#sPiIIX;GK3}V6ZG=Vvm zWxK|XQPy&(jE3;S=KpZMTD!13DZt9NSKlg)VrL>u{sG|`%8cnxun2#DtO~nf}&>fDXPCoqB5)s)MdY2fD78eXZjB60fK@kF#|ZO&6|0Y719amn-qQ1JY=r z0CBSSZo2!lwf--b=DV!`oAm!_^ZsYhk4Ag{znvu4{&V-A%BTv1pD{?DQ?=&@B%wdj zcR~WDI7WGW)24T8G1IVrRKcs(v}vX+NoMwi&X!OvYPdESm&V{Ll)tK=wZ3cXIqID< z35Oid@rM^k#tZ2D&o8L^@z=v&x~Tgx>i+%LC%@P~j{f7@j%m+2ySYwtGw4_Znnd{S zJrDteYTwupevrnQPP@3+$k22A0ls@5+BP>JUg7CCmvES3T9DO$AAcrg$EA;-zLewG z1TeRQhhmAjs54!oz)?+^XVTiN!V|KEYmZyor<2r7(E^q*w;CZEm72k3Oyz7{V; z(CiL22w|~9Q1mW;aJme|!e~tIuEOvZn*C6ww?Ld?iOm+M*dD2Ef#L0G>3ZQl*l$-Q zR7gbQEw@LT7Wggozd3UMLi_*0xOM+?I^O&L>?FC9!H)9ESPTS3YYL4l@%={mW`{UMs{6CHM^M4nqasF3C!f_+3D?V;J*BByf`)b!0!#CkG+c5$X8jc&**JiZ?*s6bB2=dQL0uwu1gzVEp=bs zAGVgn+WA3vWOw$}t6v)?YKkRlEVbxbbW?_s?$jdh8h=KbPVZ9L+}WUX0-fqh0*$aR zTad5M7fSMf?bIZ69?mbZLhPgX2aEcSD2ro>tvW3wQ#3_g-Hh&mk`|OC91CG-B2;oj zvAioyA9Ic?lGahAAh#Y1?*n?TID34rYO-v~{~g5Hd_Uq(CS1DO!wA;G^tY_0!;Xn+2*lhi!_DZYSzgG`K!wP!QFa2nlePf%But|Mt< zzkfN^`~CK`bT_j{zJNEK=H`CYK3|{CuoSQ5M*-BixFdyY2$&M8A60Fl<9h@5CCRbi z+frr0U+;#vh8%7ug00KvtKyFNO$~0VtL8PqVm|A}xgA+$yKCnyC20#GYITcN=O~v8 z#>q#2ZFhv1f3sKfw!@rZ-m14+G8;ZfC#Ys$32*C)l4nZKwZ5yueAG z;xFR=6OE(h{ck@S@85s#B>9{n3V-8OTE6l}R-26C`E&ryN7f#v=LUrJmbTxO{}JD~ zcSlYbWmCERZp=QkDzrqmY^rfatDu5^);aLz*7dWls`YxK3nru!7r8vyEuVyYT)xfQ zEk{9hAKALya{k-Mv|ncakA|ns`QIPx&wqE4R^0#E@pjEW--kms-w&4|jc;#*Ri7Sl zKRmKIlD`P8Gc@KRG)=xx`&B2rzZ>w|`_U5rCrdmZEb)D=WX;D)R(_-8v4?pyWm+@; zA1oN$#`)ih|2rP--+%2U?c=|F!T4{FJ-GX{Py4h_YtsJ(00960i*39L0GG`Za-Od0IxxU> zTm{Q{Y$jw&;G!Ejb@_jV(j1G2-T*ep z|3QB^XvqKJpg-En|6Qa5IL9-TrxMKEYx!AYiZD2Uw+kYG2te@PPhUKL@6H%sA}MjA zMYsYu$8m}{hAYGgnxor&?WhHRT6EF`H~9u}13C!~ zK((U(wHUa)3&}W|V-Vyc_91P{CoqWIYVsN{GtNHTgqSKmbz8(#5{lEXj(eG1;@B#2 z2fpk;X;Y?;q+l_CYFbVLLmouoASfx+znm^8OYjBb@}H)mpz(VGlIJz%xH}Pc!1UPJ zyc!9*rUOrWDq0Fz!%O?}t00ps(Y`SYN2tiY9?uVC5qcN|NTmvNS1E(sQ$38+Q^ zI?b)NEOFYHGL~XQbtAeUG3rRi3e7TK5}E26tyZ0?<#ADe0X~9u(b1^f8jLztOQ?}u zP+`x|E0I5|D;;44Sd5&IoY1*%;5v?0QpZT?6<%~+sDe$n)Kr+y!>Ceas$xv@WoH7v z*x%rV0!2-!8+B~%uQjTQ-NsAV>!NTKb#E6KXuh0c4s2HLT*q1wcC<93wkbuURKSRU z{;^eb`fL-Y$w$Uyq%E!qbQ7iSm+ z>BqQ##pjK+JE)bo>$hJoDVh6kUIJU9YFirpC-RL1+x~V$^UzDPXGh+aYTn$h!OxAW z0Joy_WCfk8s2o*P2JXM5u(pH0K?;;$J6!tJLh!D9Ez;I=)P2^ywHmZJWb?9r(?a~K zTlF3i|H6yDt+8xL^EzAJM#_s`??C$KGo?U(Ke~^w^ANs4)|E8=DMVeM{=40q^S-WB zxBr#5GrgCu-v0AVC_l&t=wrkEUlff`+xEZx{ohVfKZIvkYN6{~+`~_=pTqP9cupyy zb5$&`5?o6}6EO+)Qs8SztJeQ-3!G+{i%@3wb_Lk5{)eZ7lg9cVpN#wa^}mbs=~M52 zNpOy5gf=g%+Xsg*c+$JQ4L*J98k09JEX{?dKzY7_+uPEI$$%6^0W>Y?9*FAt@Y5#< z-`Pv4=5?#;M8TGxPD)Kl$&yI>x4o_OwV_TDf57{kNo<-?skqQoH8M`9Y}Yd&(0N8W z&HB~N^{)HAVrjm_XDK4fx5WZBSQK-AkRXX{MVqYrlBHAczL zoJjnN#?=X~G1x_Bop9SvaUZ;zphEB06j{c?G*N#B!D`0zSPeFEW@V>qvu0Vgnm1h# zYa@Ib$1JDvrEcicCm=LV^8`aj`!a@Ys1Ae$$9lNCva;QSy{ksn@>pv|s(SZ-;O{Ti zxyu$?h%3qxoH@qat)*7CsJTXbl`s_}yxagb#}soU@dZm>@q|#6zA+UmpNfL%-ry9+ zl5vkntd_0uvMfy2I!pCb%*$rHp{O!}!T99#??skGe2(RXQ}CH1|M?q5afNFJ++BR0 zAy~1U>^F;l`^}=xn|i`Q%iS=4Xx!jVpdU0ZYbP++#ILr>nQF7_oy-8gFA>!)f9?&o z0(0H)G{ULC-g@pGcfI1LPq0KEO7N1O2aQ3f{`@TcZ-{9$Fnv_sANumZ4bUIlGc>ossu^re!Ir~>u{qeL>U==uW)O)!-(uB30R>N+{$uWqk!p0l|l1iOW) zr4YRLRWfxW*F?sP3zm}jrs}HDA6T}}r)Zq(#Hc!nALh(zk}2 zTBt{ZZa{2So@+v(p+I}J7?1wk)S+P`=2e{uxH`1y!BM1bVPoJLSF3j9wqOb8jMC-} zhcg;K?jl|5C3|`KSCyBJU|P?9TQOjHV%tVEeZD%nPdiSl^nX5oMe#$u1KfE3chY?S zJsJ=8{{K5k9+{%1-pIwrMsAK$*wma(Em>8+HlrU!(W=fZ$g2KT)e?io*!Yns2CN@OV9_YEqBV#VKut{gB_0(b z&4J%5a$jw#%l~kJ(*&9d* z7eP2DvZw!lZ_p3I=||qv|1UBY^Pc)&@l#yUUe(YP#g}=eLs^L6Nhq$f;7K?|m%)=z zF4fvue}e;fhd5!mfFI8PDS|NL>~|c?AS4M!Jp<0!??HGaVwPZ)ld|~oPwgyM zU;jFUk}%d;{-|~TI~ou7>wg!i+y$NRPlaQT;f8u#BW>wdS^=RF^DC4d zLj*(sWlo_9VO0G3!9q@;9*PI^C81gwFedk)l{0~JoMKsvaD%Q8NzpXLw$i~tV6#X{ z;xOe~NBJ2(hz z@dV!Jte1^$7fi^PSY9)J`BZz)kZGztKqSxcG2jmw6IgrSUuAJ|i=o=}RxD#xIdtXI zl*H-HhSv3LQ7qjq+EqR6^C^mp>%FpJm07ue_mm+tVvf}S=`c=JwW86-=Jb8?rOopH z{=tAY$p4d*rv5jGqT$~DzmxPOFO*96ccU$U&d(&nuX5>+*VEpwy<_v#0o!J9+-C1PIOE577Cj z%Du!}g<%CZn6mXOVDyo@Qda3H>*(`9>3Oy~kS_3&=ha)h#Quv32^JI_*p&foY`Dv7 z8{I&y>rzuiR4E|FK^Z47<7}zzN`z{ExOW$4o>AHqSEfc-TU+u{bz#B22t^9O;87}c z_a)0w)coPIzJGcK>%-`@30bcn>IiEo(UB;ag1;sLI~D}3qZX0bB)FsUplL08pL|Bhkf7RE4;QPTPp~<8O;vX!rLSkvZn4PYGGsO#BQxQ|*mOPThXbzbZgF{5>79!rJ;s=tg7wqQI? zpawx?Efh7UyTQX;&ThB<&13L?yS@eAWdDo${pR`~o$T-bc9Qh^e}*OKk32xe*%e9D zDT=b|;-U}GwK#@(oE-y7$xTkR%Yei*##HL>Q-s0WSLd%L@L!Ar`j~Tk4A&UMg5_xf zb1chtjUJ=4o!ZVZ^)t_L05&l>ehR=w6 zS1nEJOc68vtqlPkd?`Bh)+|&9U5gHMT`&7u#rY*(QE?t;>nfTdT-B*9TwPtR?AM); zMhgXqlf8G--KVYPf3Y>+Z3oyS|4*CuKZAZW-24CSB)R&Zd;U~PRT%t?LGqlcGd~~+ z{gJ*C5-`Ov%Ik+VeOilunTDkbUbUuGGo?u~b1rm_gmO{qYlCuW6uv_Es|s4`ySknu z-YJuC$nhM1c!6ZRfX@H?g1R4nJ^ZDMx*wzN-+z7bi~Zy1Kfdjl_N=p;>ohlmj_p9B z2;aR2B7jis8ymt8(m2y;7Z)2DdX7K9cke^n=7x?}c>2vH9Hy9m7HIXypNZLV>Eov_ zpP56rx%JmjN)IR$UnC$G=5((aNkeI^+Y=7JPOgHf z_N0Qe??m@IrHC5`6g{{0?_$gQLqGFYx_#&WccAlI2mUaO3gZ*~Ct1G9XEX8vI^DIe z#S0cRr-KblSey`l6ut|bE<>>}64QICFtml{Je27p5T{sTa|9}mN9tH$XnR_^UbqkT z+f@k_647|e4c)$L4ks9{DA|kJS zO}bGORL@RtZv*$`cjLvWkq3Tn7;W|{UL#*+v9{6Mw%%(0!RHJm-=kFRdR&(_zFO+O zygzJhi8cE{cw|rZ)vI3{CTfZ$YHYRWT69x}lJ3-Y-ZlP=G@ah1vbnQC=>$5}mjoJN zVYWbD+ZRfI^zG6lbRNzxvFg}|@ej7^J9b%^CAJ#0luXeSb#*g(1WH^`l5i}9#febK z5ykSZIDO1Hu25Qsk%HWMF1!!uz3lAqy{hrDDgSq1XY>7tKN)lBY7fI)_u#JP(0JJE zF*Td*_J92v{LYbJH|+nz!LYUe_fPlspPi(p{ipbU0uC}UGS=E=eBm^@)tR6!EL}&^ z#(Dp8s?YoFW$7Mfk9+}dI?coVs&l@!&af1(rAGnOskkGCYY> z;M-zl!C&tNxdtC@$AYcP=d0q5`ArROtE=WU!D2q^#E8aoljOJmmGgaU*RfI#o!~GV?Sf7myy9BXMt(lK_-S(h84LSj z>o_uw#4939J4J{ltzsQn`!JR5rd^057w;B+ik5%)TlU`UdhxIkV%DQlkXs*_RRiXK z!O8ZrQo`1Pb-QuVn~}*q0m)Z}_Foxp=KAmV_x9hNq!stScD`Np&-dYw&G*A)NaNevVAZEb z+z*dzj^r;w>kNu+hO)Opnj@9zfu_I|X)|H%^12TOdPD_Qfgl9k^mdF*L5UYXXc z{|5^Ow{iWq;{T3E`}beFN&EP3UoigLV^8ir?bAN()0*^u0RRC1|7O1{1puA^0Ag@n AApigX diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index d1f00e6d1..dfffd853a 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -47,17 +47,25 @@ import ( // ConditionsError cluster displays this status on list cmd when the status of ApplyResources or ProvisioningStarted condition is "False". const ConditionsError = "ConditionsError" +type TypeNeed int + +const ( + NoNeed = iota + Need + Maybe +) + type GetOptions struct { - WithClusterDef bool - WithClusterVersion bool - WithConfigMap bool - WithPVC bool - WithService bool - WithSecret bool - WithPod bool - WithEvent bool - WithDataProtection bool - WithCompDef bool + WithClusterDef TypeNeed + WithClusterVersion TypeNeed + WithConfigMap TypeNeed + WithPVC TypeNeed + WithService TypeNeed + WithSecret TypeNeed + WithPod TypeNeed + WithEvent TypeNeed + WithDataProtection TypeNeed + WithCompDef TypeNeed } type ObjectsGetter struct { @@ -132,7 +140,7 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { objs.Cluster.Status.Phase = ConditionsError } // get cluster definition - if o.WithClusterDef { + if o.WithClusterDef == Need { cd := &appsv1alpha1.ClusterDefinition{} if err = getResource(types.ClusterDefGVR(), objs.Cluster.Spec.ClusterDefRef, "", cd); err != nil { return nil, err @@ -141,7 +149,7 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { } // get cluster version - if o.WithClusterVersion { + if o.WithClusterVersion == Need { v := &appsv1alpha1.ClusterVersion{} if err = getResource(types.ClusterVersionGVR(), objs.Cluster.Spec.ClusterVersionRef, "", v); err != nil { return nil, err @@ -150,35 +158,35 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { } // get services - if o.WithService { + if o.WithService == Need { if objs.Services, err = client.Services(o.Namespace).List(ctx, listOpts()); err != nil { return nil, err } } // get secrets - if o.WithSecret { + if o.WithSecret == Need { if objs.Secrets, err = client.Secrets(o.Namespace).List(ctx, listOpts()); err != nil { return nil, err } } // get configmaps - if o.WithConfigMap { + if o.WithConfigMap == Need { if objs.ConfigMaps, err = client.ConfigMaps(o.Namespace).List(ctx, listOpts()); err != nil { return nil, err } } // get PVCs - if o.WithPVC { + if o.WithPVC == Need { if objs.PVCs, err = client.PersistentVolumeClaims(o.Namespace).List(ctx, listOpts()); err != nil { return nil, err } } // get pods - if o.WithPod { + if o.WithPod == Need { if objs.Pods, err = client.Pods(o.Namespace).List(ctx, listOpts()); err != nil { return nil, err } @@ -217,7 +225,7 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { } // get events - if o.WithEvent { + if o.WithEvent == Need { // get all events of cluster if objs.Events, err = client.Events(o.Namespace).Search(scheme.Scheme, objs.Cluster); err != nil { return nil, err @@ -237,7 +245,7 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { } } - if o.WithDataProtection { + if o.WithDataProtection == Need { dpListOpts := metav1.ListOptions{ LabelSelector: fmt.Sprintf("%s=%s", constant.AppInstanceLabelKey, o.Name), @@ -261,7 +269,7 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { } } - if o.WithCompDef { + if o.WithCompDef == Need { comps := []*appsv1alpha1.ComponentDefinition{} if err = listResources(o.Dynamic, types.CompDefGVR(), "", metav1.ListOptions{}, &comps); err != nil { return nil, err @@ -275,6 +283,28 @@ func (o *ObjectsGetter) Get() (*ClusterObjects, error) { } } } + // get cluster definition + if o.WithClusterDef == Maybe { + cd := &appsv1alpha1.ClusterDefinition{} + if err = getResource(types.ClusterDefGVR(), objs.Cluster.Spec.ClusterDefRef, "", cd); err == nil { + objs.ClusterDef = cd + } + } + + if o.WithCompDef == Maybe { + comps := []*appsv1alpha1.ComponentDefinition{} + if err = listResources(o.Dynamic, types.CompDefGVR(), "", metav1.ListOptions{}, &comps); err == nil { + for _, compSpec := range objs.Cluster.Spec.ComponentSpecs { + for _, comp := range comps { + if compSpec.ComponentDef == comp.Name { + objs.CompDef = append(objs.CompDef, comp) + break + } + } + } + } + } + return objs, nil } diff --git a/pkg/cluster/cluster_chart.go b/pkg/cluster/cluster_chart.go index 4688c2c48..667f3a7da 100644 --- a/pkg/cluster/cluster_chart.go +++ b/pkg/cluster/cluster_chart.go @@ -40,11 +40,6 @@ import ( "github.com/apecloud/kbcli/pkg/util/helm" ) -const ( - templatesDir = "templates" - clusterFile = "cluster.yaml" -) - type SchemaPropName string // the common schema property name @@ -66,6 +61,9 @@ type ChartInfo struct { // ClusterDef is the cluster definition ClusterDef string + // ComponentDef refer cluster component.spec[x].ComponentDef + ComponentDef []string + // Chart is the cluster helm chart object Chart *chart.Chart @@ -169,32 +167,6 @@ func (c *ChartInfo) buildClusterSchema() error { return nil } -func (c *ChartInfo) buildClusterDef() error { - cht := c.Chart - // We use embed FS to read chart's tgz files. In embed FS, the file path format is compatible with Linux and does not change with the operating system. - // Therefore, we cannot use filepath.Join to generate different path formats for different systems, - // instead, we need to use a path format that is the same as Linux. - clusterFilePath := templatesDir + "/" + clusterFile - for _, tpl := range cht.Templates { - if tpl.Name != clusterFilePath { - continue - } - - // get cluster definition from cluster.yaml - pattern := " clusterDefinitionRef: " - str := string(tpl.Data) - start := strings.Index(str, pattern) - if start != -1 { - end := strings.IndexAny(str[start+len(pattern):], " \n") - if end != -1 { - c.ClusterDef = strings.TrimSpace(str[start+len(pattern) : start+len(pattern)+end]) - return nil - } - } - } - return fmt.Errorf("failed to find the cluster definition of %s", cht.Name()) -} - // ValidateValues validates the given values against the schema. func ValidateValues(c *ChartInfo, values map[string]interface{}) error { validateFn := func(s *spec.Schema, values map[string]interface{}) error { diff --git a/pkg/cluster/cluster_test.go b/pkg/cluster/cluster_test.go index fd7fa4244..0d712f640 100644 --- a/pkg/cluster/cluster_test.go +++ b/pkg/cluster/cluster_test.go @@ -60,14 +60,14 @@ var _ = Describe("cluster util", func() { testing.FakeClusterVersion()) getOptions := GetOptions{ - WithClusterDef: true, - WithClusterVersion: true, - WithConfigMap: true, - WithService: true, - WithSecret: true, - WithPVC: true, - WithPod: true, - WithDataProtection: true, + WithClusterDef: Need, + WithClusterVersion: Need, + WithConfigMap: Need, + WithService: Need, + WithSecret: Need, + WithPVC: Need, + WithPod: Need, + WithDataProtection: Need, } It("get cluster objects", func() { diff --git a/pkg/cluster/external_charts.go b/pkg/cluster/external_charts.go index 60ad6333f..8ca08f672 100644 --- a/pkg/cluster/external_charts.go +++ b/pkg/cluster/external_charts.go @@ -142,7 +142,7 @@ func GetChartCacheFiles() []fs.DirEntry { } func ClearCharts(c ClusterType) { - // if the fail clusterType is from external config, remove the config and the elated charts + // if the fail clusterType is from external config, remove the config and the related charts if GlobalClusterChartConfig.RemoveConfig(c) { if err := GlobalClusterChartConfig.WriteConfigs(CliClusterChartConfig); err != nil { klog.V(2).Info(fmt.Sprintf("Warning: auto clear %s config fail due to: %s\n", c, err.Error())) @@ -166,6 +166,7 @@ type TypeInstance struct { // PreCheck is used by `cluster register` command func (h *TypeInstance) PreCheck() error { + chartInfo := &ChartInfo{} // load helm chart from embed tgz file { @@ -188,16 +189,15 @@ func (h *TypeInstance) PreCheck() error { if err := chartInfo.buildClusterSchema(); err != nil { return err } - if err := chartInfo.buildClusterDef(); err != nil { - return err - } - // pre-check build sub-command flags if err := flags.BuildFlagsBySchema(&cobra.Command{}, chartInfo.Schema); err != nil { return err } - - return flags.BuildFlagsBySchema(&cobra.Command{}, chartInfo.SubSchema) + err := flags.BuildFlagsBySchema(&cobra.Command{}, chartInfo.SubSchema) + if err != nil { + return err + } + return nil } func (h *TypeInstance) loadChart() (io.ReadCloser, error) { diff --git a/pkg/cluster/helper.go b/pkg/cluster/helper.go index 6801dca91..cc8ea73ae 100644 --- a/pkg/cluster/helper.go +++ b/pkg/cluster/helper.go @@ -49,74 +49,10 @@ func GetSimpleInstanceInfos(dynamic dynamic.Interface, name, namespace string) [ // GetSimpleInstanceInfosForComponent returns simple instance info that only contains instance name and role for a component func GetSimpleInstanceInfosForComponent(dynamic dynamic.Interface, name, componentName, namespace string) []*InstanceInfo { - // first get instance info from status, using the status as a cache - if infos := getInstanceInfoFromStatus(dynamic, name, componentName, namespace); len(infos) > 0 { - return infos - } - // missed in the status, try to list all pods and build instance info return getInstanceInfoByList(dynamic, name, componentName, namespace) } -// getInstancesInfoFromCluster gets instances info from cluster status -// Deprecated: getInstanceInfoFromStatus is deprecated. getInstanceInfoByList should be used instead. -func getInstanceInfoFromStatus(dynamic dynamic.Interface, name, componentName, namespace string) []*InstanceInfo { - var infos []*InstanceInfo - cluster, err := GetClusterByName(dynamic, name, namespace) - if err != nil { - return nil - } - // traverse all components, check the workload type - for compName, c := range cluster.Status.Components { - // filter by component name - if len(componentName) > 0 && compName != componentName { - continue - } - - var info *InstanceInfo - // workload type is Consensus - if c.ConsensusSetStatus != nil { - buildInfoByStatus := func(status *appsv1alpha1.ConsensusMemberStatus) { - if status == nil { - return - } - info = &InstanceInfo{Role: status.Name, Name: status.Pod} - infos = append(infos, info) - } - - // leader must be first - buildInfoByStatus(&c.ConsensusSetStatus.Leader) - - // followers - for _, f := range c.ConsensusSetStatus.Followers { - buildInfoByStatus(&f) - } - - // learner - buildInfoByStatus(c.ConsensusSetStatus.Learner) - } - - // workload type is Replication - if c.ReplicationSetStatus != nil { - buildInfoByStatus := func(status *appsv1alpha1.ReplicationMemberStatus) { - if status == nil { - return - } - info = &InstanceInfo{Name: status.Pod} - infos = append(infos, info) - } - // primary - buildInfoByStatus(&c.ReplicationSetStatus.Primary) - - // secondaries - for _, f := range c.ReplicationSetStatus.Secondaries { - buildInfoByStatus(&f) - } - } - } - return infos -} - // getInstanceInfoByList gets instances info by listing all pods func getInstanceInfoByList(dynamic dynamic.Interface, name, componentName, namespace string) []*InstanceInfo { var infos []*InstanceInfo @@ -450,3 +386,26 @@ func GetDefaultServiceRef(cd *appsv1alpha1.ClusterDefinition) (string, error) { } return serviceRefs[0], nil } + +func GetDefaultVersionByCompDefs(dynamic dynamic.Interface, compDefs []string) (string, error) { + cv := "" + if compDefs == nil { + return "", fmt.Errorf("failed to find default cluster version referencing the nil compDefs") + } + for _, compDef := range compDefs { + comp, err := dynamic.Resource(types.CompDefGVR()).Get(context.Background(), compDef, metav1.GetOptions{}) + if err != nil { + return "", fmt.Errorf("fail to get cluster version due to: %s", err.Error()) + } + labels := comp.GetLabels() + kind := labels[constant.AppNameLabelKey] + version := labels[constant.AppVersionLabelKey] + // todo: fix cv like: mongodb-sharding-5.0, ac-mysql-8.0.30-auditlog + if cv == "" { + cv = fmt.Sprintf("%s-%s", kind, version) + } else if cv != fmt.Sprintf("%s-%s", kind, version) { + return "", fmt.Errorf("can't get the same cluster version by component definition:[%s]", strings.Join(compDefs, ",")) + } + } + return cv, nil +} diff --git a/pkg/cluster/helper_test.go b/pkg/cluster/helper_test.go index 80470bae1..2d9887065 100644 --- a/pkg/cluster/helper_test.go +++ b/pkg/cluster/helper_test.go @@ -32,7 +32,8 @@ import ( var _ = Describe("helper", func() { It("Get instance info from cluster", func() { cluster := testing.FakeCluster("test", "test") - dynamic := testing.FakeDynamicClient(cluster) + pod := testing.FakePods(1, "test", "test") + dynamic := testing.FakeDynamicClient(cluster, &pod.Items[0]) infos := GetSimpleInstanceInfos(dynamic, "test", "test") Expect(len(infos) == 1).Should(BeTrue()) }) diff --git a/pkg/cluster/printer.go b/pkg/cluster/printer.go index 3cf7ba8a5..c881f1edc 100644 --- a/pkg/cluster/printer.go +++ b/pkg/cluster/printer.go @@ -74,22 +74,22 @@ var mapTblInfo = map[PrintType]tblInfo{ } tbl.AddRow(info...) }, - getOptions: GetOptions{WithClusterDef: true, WithService: true, WithPod: true}, + getOptions: GetOptions{WithClusterDef: Maybe, WithService: Need, WithPod: Need}, }, PrintInstances: { header: []interface{}{"NAME", "NAMESPACE", "CLUSTER", "COMPONENT", "STATUS", "ROLE", "ACCESSMODE", "AZ", "CPU(REQUEST/LIMIT)", "MEMORY(REQUEST/LIMIT)", "STORAGE", "NODE", "CREATED-TIME"}, addRow: AddInstanceRow, - getOptions: GetOptions{WithClusterDef: true, WithPod: true}, + getOptions: GetOptions{WithClusterDef: Maybe, WithPod: Need}, }, PrintComponents: { header: []interface{}{"NAME", "NAMESPACE", "CLUSTER", "TYPE", "IMAGE"}, addRow: AddComponentRow, - getOptions: GetOptions{WithClusterDef: true, WithPod: true}, + getOptions: GetOptions{WithClusterDef: Maybe, WithPod: Need}, }, PrintEvents: { header: []interface{}{"NAMESPACE", "TIME", "TYPE", "REASON", "OBJECT", "MESSAGE"}, addRow: AddEventRow, - getOptions: GetOptions{WithClusterDef: true, WithPod: true, WithEvent: true}, + getOptions: GetOptions{WithClusterDef: Maybe, WithPod: Need, WithEvent: Need}, }, PrintLabels: { header: []interface{}{"NAME", "NAMESPACE"}, diff --git a/pkg/cluster/validate.go b/pkg/cluster/validate.go index 8a6b4aeec..ac0715d0a 100644 --- a/pkg/cluster/validate.go +++ b/pkg/cluster/validate.go @@ -20,9 +20,15 @@ along with this program. If not, see . package cluster import ( + "context" "fmt" + "strings" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/dynamic" + + "github.com/apecloud/kbcli/pkg/types" + "github.com/apecloud/kubeblocks/pkg/constant" ) // ValidateClusterVersion validates the cluster version. @@ -38,6 +44,22 @@ func ValidateClusterVersion(dynamic dynamic.Interface, cd string, cv string) err return nil } } - return fmt.Errorf("failed to find cluster version \"%s\"", cv) } + +func ValidateClusterVersionByComponentDef(dynamic dynamic.Interface, compDefs []string, cv string) error { + for _, compDef := range compDefs { + comp, err := dynamic.Resource(types.CompDefGVR()).Get(context.Background(), compDef, metav1.GetOptions{}) + if err != nil { + return err + } + labels := comp.GetLabels() + cvSplit := strings.Split(cv, "-") + // todo: add cv label to compDef or remove cv in the future + if labels != nil && labels[constant.AppNameLabelKey] == cvSplit[0] && labels[constant.AppVersionLabelKey] == cvSplit[1] { + continue + } + return fmt.Errorf("failed to find cluster version referencing component definition %s", compDef) + } + return nil +} diff --git a/pkg/cmd/bench/pgbench.go b/pkg/cmd/bench/pgbench.go index 76178bdac..815730f6b 100644 --- a/pkg/cmd/bench/pgbench.go +++ b/pkg/cmd/bench/pgbench.go @@ -140,12 +140,12 @@ func (o *PgBenchOptions) Complete(args []string) error { Name: o.ClusterName, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithPod: true, - WithEvent: true, - WithPVC: true, - WithDataProtection: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithPod: cluster.Need, + WithEvent: cluster.Need, + WithPVC: cluster.Need, + WithDataProtection: cluster.Need, }, } if o.ClusterObjects, err = clusterGetter.Get(); err != nil { diff --git a/pkg/cmd/bench/sysbench.go b/pkg/cmd/bench/sysbench.go index f536b34c1..1c8d2d53f 100644 --- a/pkg/cmd/bench/sysbench.go +++ b/pkg/cmd/bench/sysbench.go @@ -147,12 +147,12 @@ func (o *SysBenchOptions) Complete(args []string) error { Name: o.ClusterName, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithPod: true, - WithEvent: true, - WithPVC: true, - WithDataProtection: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithPod: cluster.Need, + WithEvent: cluster.Need, + WithPVC: cluster.Need, + WithDataProtection: cluster.Need, }, } if o.ClusterObjects, err = clusterGetter.Get(); err != nil { diff --git a/pkg/cmd/bench/tpcc.go b/pkg/cmd/bench/tpcc.go index 734012b94..c511ae662 100644 --- a/pkg/cmd/bench/tpcc.go +++ b/pkg/cmd/bench/tpcc.go @@ -152,12 +152,12 @@ func (o *TpccOptions) Complete(args []string) error { Name: o.ClusterName, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithPod: true, - WithEvent: true, - WithPVC: true, - WithDataProtection: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithPod: cluster.Need, + WithEvent: cluster.Need, + WithPVC: cluster.Need, + WithDataProtection: cluster.Need, }, } if o.ClusterObjects, err = clusterGetter.Get(); err != nil { diff --git a/pkg/cmd/bench/tpch.go b/pkg/cmd/bench/tpch.go index 9be3cb249..cbca54abc 100644 --- a/pkg/cmd/bench/tpch.go +++ b/pkg/cmd/bench/tpch.go @@ -112,12 +112,12 @@ func (o *TpchOptions) Complete(args []string) error { Name: o.ClusterName, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithPod: true, - WithEvent: true, - WithPVC: true, - WithDataProtection: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithPod: cluster.Need, + WithEvent: cluster.Need, + WithPVC: cluster.Need, + WithDataProtection: cluster.Need, }, } if o.ClusterObjects, err = clusterGetter.Get(); err != nil { diff --git a/pkg/cmd/bench/ycsb.go b/pkg/cmd/bench/ycsb.go index d3dfebe01..264d5c893 100644 --- a/pkg/cmd/bench/ycsb.go +++ b/pkg/cmd/bench/ycsb.go @@ -147,12 +147,12 @@ func (o *YcsbOptions) Complete(args []string) error { Name: o.ClusterName, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithPod: true, - WithEvent: true, - WithPVC: true, - WithDataProtection: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithPod: cluster.Need, + WithEvent: cluster.Need, + WithPVC: cluster.Need, + WithDataProtection: cluster.Need, }, } if o.ClusterObjects, err = clusterGetter.Get(); err != nil { diff --git a/pkg/cmd/cluster/connect.go b/pkg/cmd/cluster/connect.go index d5d0bb8de..7cd5b4caa 100644 --- a/pkg/cmd/cluster/connect.go +++ b/pkg/cmd/cluster/connect.go @@ -221,8 +221,8 @@ func (o *ConnectOptions) complete() error { return err } // get cluster def - if o.targetClusterDef, err = cluster.GetClusterDefByName(o.Dynamic, o.targetCluster.Spec.ClusterDefRef); err != nil { - return err + if tempClusterDef, err := cluster.GetClusterDefByName(o.Dynamic, o.targetCluster.Spec.ClusterDefRef); err == nil { + o.targetClusterDef = tempClusterDef } // 2.2 fill component name, use the first component by default @@ -285,10 +285,10 @@ func (o *ConnectOptions) getAuthInfo() (*engines.AuthInfo, error) { Name: o.clusterName, Namespace: o.Namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithSecret: true, - WithCompDef: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithSecret: cluster.Need, + WithCompDef: cluster.Maybe, }, } @@ -356,9 +356,9 @@ func (o *ConnectOptions) getConnectionInfo() (*engines.ConnectionInfo, error) { Name: o.clusterName, Namespace: o.Namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithSecret: true, + WithClusterDef: cluster.Maybe, + WithService: cluster.Need, + WithSecret: cluster.Need, }, } diff --git a/pkg/cmd/cluster/connect_test.go b/pkg/cmd/cluster/connect_test.go index 39e8ae381..ebe71b659 100644 --- a/pkg/cmd/cluster/connect_test.go +++ b/pkg/cmd/cluster/connect_test.go @@ -74,7 +74,7 @@ var _ = Describe("connection", func() { } tf.Client = tf.UnstructuredClient - tf.FakeDynamicClient = testing.FakeDynamicClient(cluster, testing.FakeClusterDef(), testing.FakeClusterVersion()) + tf.FakeDynamicClient = testing.FakeDynamicClient(cluster, testing.FakeClusterDef(), testing.FakeClusterVersion(), &pods.Items[0], &pods.Items[1], &pods.Items[2]) streams = genericiooptions.NewTestIOStreamsDiscard() }) diff --git a/pkg/cmd/cluster/create_subcmds.go b/pkg/cmd/cluster/create_subcmds.go index 82ad030b3..c8a983b12 100644 --- a/pkg/cmd/cluster/create_subcmds.go +++ b/pkg/cmd/cluster/create_subcmds.go @@ -133,11 +133,23 @@ func (o *CreateSubCmdsOptions) complete(cmd *cobra.Command) error { if !ok { return fmt.Errorf("cannot find spec in cluster object") } - clusterDef, ok := spec["clusterDefinitionRef"].(string) - if !ok { - return fmt.Errorf("cannot find clusterDefinitionRef in cluster spec") + if compSpec, ok := spec["componentSpecs"].([]interface{}); ok { + if o.chartInfo.ComponentDef == nil { + o.chartInfo.ComponentDef = []string{} + } + for i := range compSpec { + comp := compSpec[i].(map[string]interface{}) + if compDef, ok := comp["componentDef"]; ok { + o.chartInfo.ComponentDef = append(o.chartInfo.ComponentDef, compDef.(string)) + } + } + } + if clusterDef, ok := spec["clusterDefinitionRef"].(string); ok { + o.chartInfo.ClusterDef = clusterDef + } + if o.chartInfo.ClusterDef == "" && len(o.chartInfo.ComponentDef) == 0 { + return fmt.Errorf("cannot find clusterDefinitionRef in cluster spec or componentDef in componentSpecs") } - o.chartInfo.ClusterDef = clusterDef return nil } @@ -232,17 +244,24 @@ func (o *CreateSubCmdsOptions) validateVersion() error { var err error cv, ok := o.Values[cluster.VersionSchemaProp.String()].(string) if ok && cv != "" { - if err = cluster.ValidateClusterVersion(o.Dynamic, o.chartInfo.ClusterDef, cv); err != nil { - return fmt.Errorf("cluster version \"%s\" does not exist, run following command to get the available cluster versions\n\tkbcli cv list --cluster-definition=%s", - cv, o.chartInfo.ClusterDef) + if err = cluster.ValidateClusterVersion(o.Dynamic, o.chartInfo.ClusterDef, cv); err == nil { + return nil } - return nil + if err = cluster.ValidateClusterVersionByComponentDef(o.Dynamic, o.chartInfo.ComponentDef, cv); err == nil { + return nil + } + return fmt.Errorf("cluster version \"%s\" does not exist", cv) } - - cv, err = cluster.GetDefaultVersion(o.Dynamic, o.chartInfo.ClusterDef) - if err != nil { - return err + if o.chartInfo.ClusterDef != "" { + cv, _ = cluster.GetDefaultVersion(o.Dynamic, o.chartInfo.ClusterDef) } + if len(o.chartInfo.ComponentDef) != 0 { + cv, _ = cluster.GetDefaultVersionByCompDefs(o.Dynamic, o.chartInfo.ComponentDef) + } + if cv == "" { + return fmt.Errorf(": failed to find default cluster version referencing cluster definition or component definition") + } + // set cluster version o.Values[cluster.VersionSchemaProp.String()] = cv @@ -259,6 +278,7 @@ func (o *CreateSubCmdsOptions) validateVersion() error { return nil } +// getObjectsInfo returns all objects in helm charts along with their GVK information. func (o *CreateSubCmdsOptions) getObjectsInfo() ([]*objectInfo, error) { // move values that belong to sub chart to sub map values := buildHelmValues(o.chartInfo, o.Values) diff --git a/pkg/cmd/cluster/describe.go b/pkg/cmd/cluster/describe.go index 51f26b358..0cc084585 100644 --- a/pkg/cmd/cluster/describe.go +++ b/pkg/cmd/cluster/describe.go @@ -134,11 +134,12 @@ func (o *describeOptions) describeCluster(name string) error { Name: name, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithService: true, - WithPod: true, - WithPVC: true, - WithDataProtection: true, + WithClusterDef: cluster.Maybe, + WithCompDef: cluster.Maybe, + WithService: cluster.Need, + WithPod: cluster.Need, + WithPVC: cluster.Need, + WithDataProtection: cluster.Need, }, } diff --git a/pkg/cmd/cluster/list_logs.go b/pkg/cmd/cluster/list_logs.go index 56e36cc3c..bd475b8ea 100644 --- a/pkg/cmd/cluster/list_logs.go +++ b/pkg/cmd/cluster/list_logs.go @@ -128,8 +128,8 @@ func (o *ListLogsOptions) Run() error { Name: o.clusterName, Namespace: o.namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, - WithPod: true, + WithClusterDef: cluster.Maybe, + WithPod: cluster.Need, }, } dataObj, err := clusterGetter.Get() diff --git a/pkg/cmd/cluster/logs.go b/pkg/cmd/cluster/logs.go index a895accf6..85323f954 100644 --- a/pkg/cmd/cluster/logs.go +++ b/pkg/cmd/cluster/logs.go @@ -186,7 +186,7 @@ func (o *LogsOptions) complete(args []string) error { Name: o.clusterName, Namespace: o.Namespace, GetOptions: cluster.GetOptions{ - WithClusterDef: true, + WithClusterDef: cluster.Maybe, }, } obj, err := clusterGetter.Get()