From d2bdf3a9f6b830849600ba94283c0c64b74741d5 Mon Sep 17 00:00:00 2001 From: Adam Pickering Date: Thu, 14 Mar 2024 10:38:13 -0600 Subject: [PATCH] Remove portworx package (#986) --- assets/portworx/portworx-2.10.3.tgz | Bin 25701 -> 0 bytes assets/portworx/portworx-2.11.4.tgz | Bin 25704 -> 0 bytes assets/portworx/portworx-2.8.0.tgz | Bin 17475 -> 0 bytes assets/portworx/portworx-2.8.100.tgz | Bin 25603 -> 0 bytes assets/portworx/portworx-2.9.100.tgz | Bin 25601 -> 0 bytes assets/portworx/portworx-2.9.101.tgz | Bin 25613 -> 0 bytes .../portworx/portworx-essentials-2.10.3.tgz | Bin 26026 -> 0 bytes .../portworx/portworx-essentials-2.11.4.tgz | Bin 26029 -> 0 bytes .../portworx/portworx-essentials-2.9.100.tgz | Bin 25977 -> 0 bytes .../portworx/portworx-essentials/Chart.yaml | 34 - charts/portworx/portworx-essentials/README.md | 57 - .../portworx-essentials/app-readme.md | 26 - .../portworx-essentials/ci/test-values.yaml | 1 - .../portworx-essentials/questions.yml | 841 ------------ .../portworx-essentials/templates/NOTES.txt | 13 - .../templates/_helpers.tpl | 443 ------- .../px-postdelete-unlabelnode.yaml | 40 - .../pre-delete/px-predelete-nodelabel.yaml | 40 - .../templates/portworx-controller.yaml | 128 -- .../templates/portworx-crd.yaml | 1146 ----------------- .../templates/portworx-csi.yaml | 195 --- .../templates/portworx-ds.yaml | 477 ------- .../templates/portworx-essential.yaml | 19 - .../templates/portworx-rbac-config.yaml | 83 -- .../templates/portworx-service.yaml | 54 - .../templates/portworx-storageclasses.yaml | 56 - .../templates/portworx-stork.yaml | 645 ---------- .../templates/serviceaccount-hook.yaml | 42 - .../portworx/portworx-essentials/values.yaml | 151 --- charts/portworx/portworx/Chart.yaml | 32 - charts/portworx/portworx/README.md | 76 -- charts/portworx/portworx/app-readme.md | 8 - charts/portworx/portworx/ci/test-values.yaml | 1 - charts/portworx/portworx/questions.yml | 915 ------------- charts/portworx/portworx/templates/NOTES.txt | 13 - .../portworx/portworx/templates/_helpers.tpl | 443 ------- .../px-postdelete-unlabelnode.yaml | 40 - .../pre-delete/px-predelete-nodelabel.yaml | 40 - .../templates/portworx-controller.yaml | 128 -- .../portworx/templates/portworx-crd.yaml | 1146 ----------------- .../portworx/templates/portworx-csi.yaml | 195 --- .../portworx/templates/portworx-ds.yaml | 472 ------- .../templates/portworx-rbac-config.yaml | 95 -- .../portworx/templates/portworx-service.yaml | 54 - .../templates/portworx-storageclasses.yaml | 56 - .../portworx/templates/portworx-stork.yaml | 645 ---------- .../templates/serviceaccount-hook.yaml | 42 - charts/portworx/portworx/values.yaml | 149 --- index.yaml | 332 ----- .../portworx-essentials/upstream.yaml | 6 - packages/portworx/portworx/upstream.yaml | 6 - 51 files changed, 9385 deletions(-) delete mode 100644 assets/portworx/portworx-2.10.3.tgz delete mode 100644 assets/portworx/portworx-2.11.4.tgz delete mode 100644 assets/portworx/portworx-2.8.0.tgz delete mode 100644 assets/portworx/portworx-2.8.100.tgz delete mode 100644 assets/portworx/portworx-2.9.100.tgz delete mode 100644 assets/portworx/portworx-2.9.101.tgz delete mode 100644 assets/portworx/portworx-essentials-2.10.3.tgz delete mode 100644 assets/portworx/portworx-essentials-2.11.4.tgz delete mode 100644 assets/portworx/portworx-essentials-2.9.100.tgz delete mode 100644 charts/portworx/portworx-essentials/Chart.yaml delete mode 100644 charts/portworx/portworx-essentials/README.md delete mode 100644 charts/portworx/portworx-essentials/app-readme.md delete mode 100644 charts/portworx/portworx-essentials/ci/test-values.yaml delete mode 100644 charts/portworx/portworx-essentials/questions.yml delete mode 100644 charts/portworx/portworx-essentials/templates/NOTES.txt delete mode 100644 charts/portworx/portworx-essentials/templates/_helpers.tpl delete mode 100644 charts/portworx/portworx-essentials/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/hooks/pre-delete/px-predelete-nodelabel.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-controller.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-crd.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-csi.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-ds.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-essential.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-rbac-config.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-service.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-storageclasses.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/portworx-stork.yaml delete mode 100644 charts/portworx/portworx-essentials/templates/serviceaccount-hook.yaml delete mode 100644 charts/portworx/portworx-essentials/values.yaml delete mode 100644 charts/portworx/portworx/Chart.yaml delete mode 100644 charts/portworx/portworx/README.md delete mode 100644 charts/portworx/portworx/app-readme.md delete mode 100644 charts/portworx/portworx/ci/test-values.yaml delete mode 100644 charts/portworx/portworx/questions.yml delete mode 100644 charts/portworx/portworx/templates/NOTES.txt delete mode 100644 charts/portworx/portworx/templates/_helpers.tpl delete mode 100644 charts/portworx/portworx/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml delete mode 100644 charts/portworx/portworx/templates/hooks/pre-delete/px-predelete-nodelabel.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-controller.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-crd.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-csi.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-ds.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-rbac-config.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-service.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-storageclasses.yaml delete mode 100644 charts/portworx/portworx/templates/portworx-stork.yaml delete mode 100644 charts/portworx/portworx/templates/serviceaccount-hook.yaml delete mode 100644 charts/portworx/portworx/values.yaml delete mode 100644 packages/portworx/portworx-essentials/upstream.yaml delete mode 100644 packages/portworx/portworx/upstream.yaml diff --git a/assets/portworx/portworx-2.10.3.tgz b/assets/portworx/portworx-2.10.3.tgz deleted file mode 100644 index 4b7fb6815aef33003f3416d8708bececb00be5c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25701 zcmaHSQ?MvOu;j6A-ecRgZQHhO+qP}n#yz%e8+)HNc7NXdR8B`t_e4xgS65XgUK9ih zz<*r76aZ8P;)?V};xeq#9vm!&Ose$8N-P$dN*t_ms;aCqYSxwpw#FXH3U)l=Ce}6p zSKptmo9vD3(X+drP&lThWV7j=Z;4T+W-oI#UW_~E#JUZOJfBZbbifJm!3?1Ffby*y z6Pl+ivzI<{4>a21fyCkpjaS89QHxE63H$}}}OTaTww#F@nVXept@qa$mlD{}`D$gc5>qFvctSUiV}C#t){$bJE8)<#}xj z^mXk*BEna+Hhl4m}f#zPN#62N*gp%|`pc@BK5 z1I0`fJB6UFCWm;h-4BH1!^p~yft!t;;^GZAI%x-j5}c?#%y6H*;fI?e0Re&L67@Gp zsybYnNOIxzYrI|MGXtC3<4E*X2IqD zX+JQh;N9m9B2Fh3IsW|- z@T2<0JMaLRO>qZ>ggmn*1qCA}*kgdYa|dKrBM+b`4JYDH;XVd%q%i6aB!!`Wk_yC3 zOz~)QVu2SMg6knIBZSz+zLz2wz$Fg6BS%!aJUu29{U9s%_!Gd!m+cKcOel)0B0{4C z6A}&qLsV-8UxoiCAP$Ft<69-paJ(bAwvw(aZHx?n)Q~a&#PS_DeVlf3jtRfyjlQNp zwZxRz#p~8s%NZs%t{+3JytagPFMI~^5==f&RGJz%H;A>$0YC)!Es8>>5FuKA1pyfs zpmyHSf^LgOr$B^eoigU1AO1_qg3p0NmG2^r5G zDA-t&Yuyc&CboArGeXPmQ}prnF+(AKc`r*Q-k#qCZywm89~Fn!i$|F`frn16FAl?% zgD-gm^d?JF-W2k#VRPab$f9G!hBTX}m!N!X51!wh4et=-%~jcJHUbon@>1H1}K7M^D<% z&ZYSBk))-F#G~@pc)|j39is|KG2ks4iozdhg>>O?iWW_)TApQoH%ik4!@YAtRmpRl z21vpH;wEbS%c&sSzC}m{oWCPp52_TLLiC}CZubdSr|+Le{1VM)AULZj)XJPBiIRJ7 z2h~DG!fz;XBN;0LGT*a*v!EwsceRssr8)wEol!uT2?U{1C`!~G^jZ-31DI)+p-XN` zbP|AzJtDx?B2Zy~P@v(svGnC;q3MbTPz`m#=k`EobaMZkJCZC8EhkbW${sxW`7>!W z{rkqlN#ey(hO?R{up|sZOh)kOZaJ9U40bzz5iomizOqQ8`_DimJWE87V~;GI8}@)^ zWHEAyR^53NiLcJ#9RbvlAZY)hC`TFrK#Gq`#{xhF00GbAAo`CvvdR@?(=_7NZk$h= z3TZ^*CEVdK2EyX^@8i7NKPPMY z1#zep7(7wdGss zx~81pV}2#d2lS`W<;a@C=Pbqp=dSxv6M!T|XeS`Tl={!hV^M*!^jWF&siL-kf#ZvZ zJO0}|7s!_rn>hhO{1s3k{7Nfx)Q+h!;pysJ*5=l(n4hK1Bm_wB2N*vOlUmQKIG6|W~T@6!A@^P zl@4MMS|>xP-Ihj-w(Bp3)v+v5)MAs1ri9*U(vNJ{&$P!wBD|CSo_KwYH_lB(w(v#UfKMSmKC5y8f1I@3E_Qbeg>MI~-zv>3A@*@3Jx3m7>ih!bcLo z3`JbER_@bk_;}lTLxQbhh#6W%6W=@)z#IGcwTLXlVAw&uH*E#VT>TCD4*D^$_~zqw z=UuD)g}>k0dC3i26*qU&;l~sT01!Jh%NQ~Q;eY~M-nsYq8)cySJiC~y3}b8OgHXso z3gK=I5@g#eb_w`9g{}e+2PoFWVL0ZDHkGpWc}Yco)_eE)=j_iAMy!1>sAxA;NLIy; zPmD-p9Efp0nV}@+j|x{vo$eiNY0rDV(sh1#(Xok`cz-hxBopysUzAUzT_++=LHOlP zInN-$U2$V^5m|EO({WT@pG3mX!^ovH;*j9Gz4h~jpjVqU?9`PzJoa)uP$p~YB)2CX z^v${9UYrxXH)to{87yzpt&R7H&UF!B9$*|1wSSwH<+sDm_mZ6@Y47<-m4rp|Z+c^d zb=yq3FBpu>{LC&rWWcN6>F<}>+o|7Alhya3&wFB!4y!maak5=azq6bokh1nRS7kag z;9}t!`rdPQD5XfS*N!aQP+*cO-6t2ciHipUKVU9Is98RsoLub&lVpAVv=aL;A`HUa z(Qh{r&^m~E9SPRni%dpBxs9hwU~`FBr}uUaeO0SF8PIy;sHhpL;Pws>-FERgSTX`i zIIYk=N~)lo^#*es(%sf}mC!Z`V^xxZ#k-!DXzQ_;3DgptIqdevEComQ#)`$FEKd@^ z9H3>3K!@kRa{QgQv?|)Bo*jLbMNjY)Dq3;?*~9OGz4yU_IM`fg5O76`vGIBZ%GaD) z(9NDl8(oyiv8!ulKJP6Ybvg^ao_V~-6xVW~-!f?4C#XG1$4Vwki6}FqI{ISEk=doI zGj?vGp2J>Zy$!vl5_6b$E0EtMgpLO1BY`+Lu9O`|K`6MC@7c zZL{qFzHu)?uj_sgm`<Y)VR|eP8?duK!WMz_&R=O`G=ENJDp*uSZ02NLhii1|XD#0j@?dAwj~qA+h6}0X zi_9LutX;#<2n^s`xveyj?m((ptYtp0{!ijDjrw4az4hJ?3-+JO2_5|t0n*0&~ zpoE_2%1CqWF$@X=tvD4lZe$EIKqefRdn{>#w)$KpGU9URx{tN$!{v&eb()@ay-&U^ zPrg3qL6+x19}8j23t`VCc`8zTRdnConjaoM=jh7|bQe;6)v3N3dYWqv3@jxX(d)+iyED->^c7%zz$`i%2Q!4VyMHFl{V4^pp#mKD{FGTw&(oc02_>% zs;*i(NK2zDQgUf8?Iq4sX5(x^HN_>)*gv4~A7JPoK>QET_YeH7qR?V;bvzIj0Tg#LJKE%)tc&4=3qQG8%*^A?G9UTMBa--$UBSfi{?VuQipbaLD)iW1 z|H;^zK%!@9LC8j|mY}w&mZQV>txeEe5P7w+&6;KsmqQo%HLBZ`<^cn{CibhkprIdA z2X=Mvu%MX(`*tuc99ofqmr}`AUP+J~0fRtS4*&@!BQ58SnU~s&lU^?<^seLgL!3j( zo(D|z)o{*C^-vGxK#L>E0+{O7%Z=vCWC>TCzr@xwY_T%aFJgrEb5-kR%|B@hDv)nG zN_`*x7g?*8uX4M%3trzRD9oz>ll62l0+^z_Q0D_2tF>L#?+HZqmZTW$6tdBsh|LD= zCNEfnA}W;`8!R@vQRTbzXjV|4utp7~?f+odrM|-&QdA_uVs2j?r8Hh(6b5LOgR5!n z@*#Chu$sf!?v7~)Ur@L%(aZ5vt+J3_1)ZdhO`mfo=-5P96Q1mVZV$VC(JnhQ<=gG@ zL0=o@*Q?q{pTm#x-EQ58pC8j3UUj73;dIrWpM2Esfax8dHtO#vht|MvJ=*Wk%-*lH z%2!@Z@NbjmSDp>n?`hS+uQ$n8-s(TY^wy`2`ioAr|67Rmi=H*`dtCX}rw#d=*7DZ3 z1@ja1Q;8eT!rB!0yy;xf9*i;#G$h)+of{XK7 z@Kk%T*AAcJrUE|ZL*8BG$$q1!*V2gMcN7Blu9Yn#1Qa!GOA2(jRExIAXjRFgJV0a%cU z=^ghX<&yuRmLX@0s3}L0cARvxR>v!wWz)kg3kzXmnZ2=TvFyO9Zj!w5+|vu(8D6($-aV z_+*{p;JA7Dob0G^W#K)4aoD`RGIhA*KVLdp(c@RZDLbczN!F%U_-}$aVXTan|8I#~ zv5MHmD3#HPYrl%J0 z3u7U=673g)hY_r&Mxe|5!Sx`KI{NQ426)V{SpU-v_#k#IfkpP-K{T6`o#hSn3^;9 z&!4$^jKE%yY;cwHEI2s?7$WI;P$+W9cZ91;!}G|*NkJK;7(EApGC^D?8mI1)lN@gy z#kQe5GKFI3JA+o%_fR!EJ1Y6cjTDnu0*ad9j>1!fZXu_XSSbSy_LFDYkQ~>NmopQ# zu-sj+gu)C$3x|MTJ5EPyCk|tA-j>CKNGzc}5&Cq|_gkM2)(9feQ#*M{36@t;^bPjM0Y9HQr#S;Q_=_58YgIQEs_rxcg8>FotUT8-bl zTOO*--|vAP*5AV*?)SeKJ|#NaGeumIC(Aohl`%2F&K&;4#l}Df&C}9gGiyb z^MeB>j*1M+m#WhTvZ8_|NPOb^-o^KD4#X`-&%JVTu7h9;4RcUcW%u$|HJOv*WZ3Gh zHD)C{D7N%PW(^z4?-Qym#aG-l74cD>7EJCyomqp3oA;|2+SGNsNYhmYUx`43hP_b= z_`4?=8%p&IFc^p5t9;eI>+Wd4r}a|M4M{){Hfy@Y*cg)apyH8Yy@}`-C2qAe2CK~1 z#Xl>GpNO!udnQFnrfR9z!bhT(O3E*n<)_1%?$!q`L`{QF!|`Y5FmVeCTA+DD*(EVL zvl)lWn4!YrTP=W^AFe1+po=PD^4L_{zkxd#k{ci2+ z?sR9VCw%<+y1CnU^#e&}?sX9H*F=^zgR(LetT zPas@9e>Ta=M!AW%I+~Qgg8{^jH3COr?b z^g*|S^hqC`i_NEtIybr(#ZySCOPFKxq~TeuKiEjr)!ESh&gP2#!b9JlyfMfX{hHa; z{dWIWC;wiq8~m=X{5~Sc<@}QEwV%~Nvd?-mOL|zGmmw}~5o)$SzE3Rk{!Z7<@5F-h z0+)baU#YjrtQxDD`+UE^sRLQ3bahkZl3*A)6Co%Va>$XUYD$gXR;QIB7pKBXOEg*9 zN%TMxO44DFutPo1+&oTKEZ_dYAb}cP3v-x0!wC_oafRq+#y$dxvS3tv_kSSt?RSuS z@khj1SF3zIAdd6|4@y&1FUw+1a}RCzZ*qqaM-s`H(eLIiZN2AnUfkU-+$ChfAl*=` zq%wtplR=h|%ZX>{YSL*f>Xm%_kL%II;xyuW+q8 zu~D2sj*w*#$ljhym~-8_qUI25dtU6nsfQWU5#J+?2Wb zkO2^@coxuPF-?+<5Z(CsK#aqoc)@8VO*suv?wIGSvxlJO5f4e?YkCmYF*{YfLvB)7 zgQ3Y-pAUdm{-Tbw67J`N$lRtRRyZFW(p!%0)E}?xfQU${_kh8lXy6-=UY-6>A^T1R zAOx6$@MQ%S11zAzBpHUt89^J6plau);=6~b4G>DK9ghGVxZ>ZnM`I#hVmq63E?X~t z+{GM=Yyt3;Ts~SPEI;Z+kXa;tZ0Jv&ZWsWRK);kUs6im*oI9fNM$V-A2R&RZ1B626 z8gh~U)=&V!SBViwo48?#jERz}^pO`Ikl}u*+?{O0Z)-+x4uRNImBXHKZK@L~#JzKm z-CuzK_FLq<4JW1X3MqKNh(Et9(@U95&uM!E=U zJfZT)nf@&cDUwo2d{A7*Xj%tHakUBSYN>GtpZ}r48oher+r!* z0E>f$^`VeE4d3y_sF1OCD$z*P3`(+d)u0hfpJR<1bLL3DtQG{{936)$M@AO-nh?Hg zFWTRTUFa{v(b>*%STX4<$^C{zymtU4(x$4qwqh@!u|;t;i9GBos^*(#wJAN=s=D;l zRWgme>N11Ldt>^s{cYeB#lbilHgjknF(sX7?(5cweI_I|S;C3TX3hDM@)Ecfo)f@P zVwT{Pkuj%vpM>bj?9_EyP3oK0Jdz5j`SS^4domDE5(2nl#{5PUt-OSPjdhPUL`Ccv z3@H8OCsB&bW+JiXPq9A+6hbZ$zyOP}u!S?RRBcc?2(Hp#0$3_=8^$cY^l3N)4p#6Y zz!VCl5TSwMC(@EQ2L)1HvO9}U(>*n77{$B75GGLFsIyd)#p-!2$AzDQg!;umJHERX zjc?V6UCUbyTHo?Po935l)UM_IYw<{xGo~$zZWsvVsSiTFdj6fxx{A$#m||Yj2c~?X zSmeKB3ZI*^7Wo%}3*l7S@>%{hn9vAroyZ&T75!Og<|~GChDjF;*zt)?XmtmdEi($~ zvxaGpeiNbk<-d}(_BbYa3H~Z8pim?oQ_PA%`#I#iN(hMEYnVbz8nplqq(O;7fsS z-CDU0&AT7+s7nCKEp^Gk+X1x>pkgiL!%=vpi?C*YJ+Q2Aw?wYXY=JGII}9G0Ji5t)>a)8vw;W&FmOUY zgnRPazou30NNuRQRJ*H{jvv#?^9qOu0`f4No@=~@?`%7J9!jJ{+8ecK6bY4ZjKoE* zr+&mxN#MI<*%Vvbm7NYlE7gfza)7{ClG}Y55_5}y+YI*zIn)44EFl0i?vxwlYRgvnQ9OKAj@p^MR2u?xsCSgk{4-Y zD-mq))JgubbE}CV!-y5}Y>{zbgz{SM6~Khx%5$c1CVrP)noMRoK?dJ<`wsq{2p?hF#37$T58 z^{HGX5^F-KZaLLOdhfT62gCOMg@`07r8{c7jCqhx@U zIwnpN&I(e4WEDv@F<#A48)=%(mI(DX4@rvRzw&F^g5Sc98FN!Ad(?25W8yM|AB>oMd8UDMM%5A7|QHtYe)ap|*e&QL#L}Nj_tcT@=1v za7klFHkX}~k7~>@odCf~LTj1s7(!#`<*=#2HX0L30KuquB0J;xU+WeDW=6`QmmxVO zAr)|=d}hYCA_=e@{Lk0x$fsM+>XJMT7~nx86pDFh_?pV2^6V;tgTyuTdkI$%NE{;i z_LuvaoEM)JsUVv@nwUA;Gr8H6)?`Qe<*czwO20h$2s5*|9+mO2ApWX~x%2~sUID>f zvKyt{hpOWqIy`qrE}_M7xsh?_z;v1c^lZ0*jTb$427c+wD5Cu7qgye*(wJS%Am<%n z926u~_*e656L>DlCn!DSU)Z(9PTrHoIIhsC_dp1DA_Fj`NkqV8VQ3!o69{`wp*<{- zguG1XReOTZ_(Vmq)ZzGu#InTN${`;BnI8Xj~(X-{WG`5Dinfc`6qVs0omg z)CqP(NTKbq%RA5I>jP7#V_yon+Paf1^L35`?W(GrCfwGT9ID(<7>jfFC6%Q43R%2kqR_fd1Ul`Jr2#{2qFOaeeYAW=&f&dACMwPyQQS zbW$irUFH|gi07p-FLV^QP$R-`>2D8O0~7hz9ml#`Oo^ER`Gp@r0FKJfe``)tqyl^s z%RMvtcHbP55lgBya=PeoHQ=Rrv+=0(VwLn{H?0R9NpKjeKD?$yB0<~c#a*hI_e8mT zIQk2rXP>SKGFls<>&Zo^%$iY6jgcKi&RP@)Q|{@52sgDRlR+VPk-UK+h?6g?Fr9sb zfheCn$4h7fBivo*L2n}{d$Me|=ZYWh>kyzoe!j?l%G`b#b!Z*iM#E4x_S7S{2BuDZ z`uOfXf#+}Gm;Lq*j~!GnSJ&WK{;(7d?rhHC4X0n`h72aln=Eu72+-Ex;L;fLhCouW zhbbzaT8)gQBUR{7g=k^3!9cdsZxs!oc#wx9Xb&A^5X|luFJIV3qPY$U6641zo;Khd z2Sb$5vAL<}tYkXsp?7=vd2mWQNPL4M=13D;S<>}g!--#`#6pY#%_Y!0tSE_xC@rak z<7bX!-#oD#u~KY}>Q4qGZl@@3l`m4l*J}(`dk9$l7l$e);{MAJA ziW2aGLHihJ3Ir_UH@!2zs`(j*FzI^me}8q2j~M z8z5icMKW}!#AOL|EPR48MG-zvsbaWtDa;I~>It9fiZO8;Wl;7~iBn zvcX_1AMwTx?S>WF2_^V{h97PjU_7vqyJH}CMnUY10xviJ%eFBLY^LwoNZ)bhY>a}m zl`XT9x?>}2d$<1gxcztX+J8Rqe;xnR;lJj&H2Y59%hXDRC8r{H_d0!0>v4Mjq0>^u zyRg;Jb?k9`?3sKInY_K4#^`(GN|`JEA~@q5i@`^63`$>bX1YxK+ljjl{B-m44nJmf z#jpZ$WSPFroz?Z{;t=9MgJk?o5S90Lznzz|ZQ~NA#gSOR$xQ3oUnS_7QgR?McJ9*k z3kTP2TevqHqNEATRApM#x9OtHQ2X)J8IjQ-C@j4rLZUp7agGRtBat&;y)2I?bc}sG+wYvT5)MBW z&BI-qUL*jj;g13X4I3oYzBfg0Ads;8V0N@vSZ=~e%&^dTimjw(m`X(p<-lHYVOp=&6<@J;QQf4*usFn-8-Sp zHJ&89VO-OB`O9O>i3Q0}B|$Bmw*vVd2fs}Uf@`WyqnLD z=!liSJ`^Slh@m4KsL8Lq0mU+t=P?Zr5ww>ll$j}*pR(f2V|dOO&1?BeESCzDEA6<_ zYe$5fRrJHAdbUE1=H?)%j#e8=qN$bSX)R|It^p15qrQe3*1=3-E$O9cTkZP_Yf`W^=%{(MF`iaBZts}y0tA$eF)0$@pYu@FbN zMg|7MF*y%I8PaSec;iDw-XHn^k@T(-s14cKkRE2A=6I~bh-MRW!hV+xt8ot4dQCV- zVE|U7(b6a@;p&ai4)_pQG7-VW8*3O-M+uc&X9+NLaTdT7I9S*U8h1%5YJd4=JObf< zm`19eOI!LK&=H#Gt?$}BX#|1E{xl%tT0?hPvj+9zj|@oEU%&^!5z_H|U7HP{wNH(-*!X|D}ac!xER@QWxuSB>KWv-7yVjwwDXk6p0+@L^1 z5h3l%M$jZL@aTEHcWgz0U*8uvf4A3_7X2IK>}}C?XBnxq*SisgZKQC*+Ok zA$$WmOWUCIu|-Q&S$^9Is6r@v2G?L&^Q@%i*vLm1 zRsZ12$=^Ef$FrPTob4r@qD}D{o8nZD)&$M}L@TU{R@fCSF-sq*H_Th1Vm3oXt@{cm z>;HrLz+E^02XEe$+qf^Wa#Q;JbNQbeOYA=_uyG%wLq)wIpY8t`4*rC(|9B_6^F7+1 zuRe6E`hGE99YELO-LIP+59H~cRGrEZB(Khx)+~O@TPvvPsnaPsV;e1<4?a4o!^1jC zSDcK*bW=p+rO~9wByCL^XAgF^%w!K>3k17X*%M%j<(7pepUe!#_M~EC=o;#P5`2;=Hm$X$#28G zZL`(-dNlQg&4D(=(}f_9|JoLRlb@YNqVre^M~@|_p>kV5WFfCiAAD2&ZONg{GvIFt z$jmDuV2vSY1f0icm7DZ9ne;fDbXORPi8f89q|+?yq#;EbDmuSXsqW{;8A&V3yYk@w zG$@;9#0=A=7#aG)|CN3p)Wm_%x~z0!S>XhWL}Y$ns0n?5qVeX5Wx}v3Y8!Sxcht6= z1!68$H8%2fqG``2jJ0MEF?y3KOgz^ZK)S@#WSKCgj4;0O7Cz36skOU8JF;8aSeP0F zPS;xbP_nW=XPlCz4RUOnNnvpltE&1DUc%BKt3;bEofGm=Cvy@2)~v$yX`n08vvsVE zf9FBwyk-JxTY*+%5MS2Ff>keRF|$^c8_bzHRFQKi@7?;FG;hxU6Wg9`%KL-q`*FyAV=D>zHtUmi)iJ6kh-Z`3x8|=z^3xiuywj57=J2P zq*ffWvhUv!E7X0E;JB}OS)}=|-A9S3>0XM1ulAtQ;+h=5I@=gsE~9k`*H6Q``3QSm z_;Y%W1($C@Xx+5H!BSS~nrH&#mhfVi+|hRMUdw4b@@(shWn$+xzQb8xLI z@doTN%O`&d05a2nNh^kLehXv0)Q-EPu0x*gF5nc|9om0EkK8;zMMzLxZC{tb9+wD7 zsu<$aSR{l$+MN9@H55GfRAu3fb=J9~!0yyt_0F9g<#+pOztxy*zFdn+nLMl5(OASG z5ZDQkk!r03>|8W9tC=)RdqWuhlS>-qG?&-CULpn4KDnI^hn!PrGS??}{X$ek9~ts}nZu^xl@QZ%NQ(>uPnS%%Ka z4#>mWwLzM`A>xc<7z%Vv(tHbrLEwWhgbBH-I<-K&wk%%WRJtCqB8n&S?TEz0Iaa{2 zXi~rx;t(xXeCz&{y!X?j~%q&8H2#ZfU zHCD?y6#d7U;4v9^`&7&zxsI{N<~x!%zX!|wK82{za%c~ZF71Vj$KsaILHiRR4Ux;4 zypsg@Ggr7NM$Rx0E&K>hJ2X*$tMR`Vcjj6!(9i!npN!-?NtEO=6@36jyc2Cjk){xH zNmel{S+@R1FFuC}utE{>wN%g^3Mm%kv_BC=85bsMGc7yX&FjXqoF*2M5%-jKjxM=c zG&7|+R{%~R%fMqv7i64>y^2Flpl{wG2&?3x@WHVyY216WjLk^RA-azJ;A{0+jmfd< zFc-m3ZB1WiFj*3dcH=#}#&LV&{?HCN=Q2mQI@8USBkQVF@5Wnq1<=)iJUxRI&7sBz@|}{L zWzyv? zHK{kl8f`NOSnqYO|2q#u9`7O+ikgFH-kTkt5A|-AH}s>67vrv$VK)M9wfv?{Em&Iy ze=Nw9Pa`);&`XV`M8XQ*(nwkC)fD$bbuojv(tXpI>O|r8 zVtW0HEpPGgvLwF#`&Dsu0jw0r>NBxa1u3B}OkJ?KRie8GP>|5dXB$b_FcU}U zFcY%~{Pr=TN|JTj+;%r|WgzlE@ypYtAbobWp`Wct6x=)F-Qe__IbiAl5l01>urBUL z<_7X78)elw3n%2ME_kjUOk(F@kmx6qz6gaF2?!zh5fpzZm;&()=+(=I;V9CT!xfQe zBoUBx*92!;%0|tdds@$@KC2vwoXpESdzArDbp^-l%2K^9NxpTFS&~IJ!tu+(-e)m+ zb#zat8~u8u;b?C^bey=BhMF6Bw2lAvO8sNqOKN+Hq^_EV9(~bICn}8K;MBjXU!V4$ zVbQkl^Mb3t8U!=91p97~2HHCeG!molDsw`Jfw$i4_5Hrlsl`IB7XSDd=h#au!yXmb z`}a7RLV-_nomSdgj*xndM2?=Y`cL0m1CM9pZh*zx0FV260UBdV7&OGtZi=RT-xN-@ zzBBZ0`%|U-2@2NhZU6Zg+K9`>UrpYA0?8b)3~Nm5eE^Q_f@Y6e39HTX?c4Qpwa@># ze*G-*0|yT>^YX*Mxq1cv?&;|XI`un)&&7oU^8@(qV%<8CX!pN@|K@5_x!JNiN}vuN z^JlyhuAG$nM+%iW@jt}91NjE3Mz_Sey7DJe+~7X{FS2S0$zPwO=!K%J?N#;Sted=m zeDn>*HyDh}{H#6$B%s^>rzvT*`!E~3f5rz!s&4<^#C-4}HI6?iad}K}onqtyx*P%0 zXu<9QYdGL%x!b`}GgI(mFm#i-<>){)U?f7Y#WPVD70FU(UJ8QrZhnrH#(@$1xOUlv; z7Xa%1f@9UPppEdaP-;JJTLWy1L1$vgLtsdoDcb2p+&wdEuGr#>3Aw?I(#sz>sI*cM zB{&rt`HsSA^v6FaIvicNMj5EF`6O4?`rAdJu|uUJcO^5b40Z(-UyAZZktQH)w-s^q zV)#~jkCQ6X(4R(6Ni=8gUWlq!8qlQ6M#@N!KE(o+nn+=z8(B$xryl)fHMqW8LfmCw zk(STEUavl-SgA!FX5K7p@c&15pVs$=uK`VNL_ofNtuE3I))(QeQrRj2@+ouMxG98G zK_S?+-gTMw;gBSAyl|?rbU^CtIIpRk?oeio|7!=~EQiEU0`qH`G+!7!P*)wj;+mHA z(1KAG;2R+Nbma}PqYzk4DkqQgH$?kJGR(|EJ}A*GS-K<)JyN*j4(hp$qVXA6#e9>2~k#D?im?jen8F zHsO5L8|hW)Y@jW_8JsaOZmmI(AfvXb1d=jD8^ zHM`xE94HWps2~*p@ApK=pG_?khkpd^)R?xmNl+zRf98zy#@^mU)0QCO(aPsBZA9Sh za9}YaV(Qj_@$PBK6O4e9WJiR&=E|^qbo(tODhk*u_4=iJ*z(>HEoC0zb=*wDu zM%%MEjk>{Nl=WPKh3HjU&mMKvFC480vdV8HCQ+}_x2$fC!hJ8XV=oPPrQdz=cE+D} z6F<8@kEdQK-+kXhKd!&G1i71=J4*He!Se%NlLvdGv4#arrL*<&X83t83$UH?9+&H~k(W+9jN#LM{?+`8PbxG(>3B+^J9=v=^nJnBfy1BBk23=zovz*^a}enCkyjrp zo18yVaS?s*`$t_sy@U``Uusz1vCu;^4Jt3at`9U=QTW`Z38gdK<@eBrxcKLDQr` zmL;~^n4}jsxzIjSRlT#)w`ST9V4#`l+HRWbU;IT7NfTr2T^K>@c8c4sV0OGn>|yMI zMGzKtPl|D_C3^UelBc&T_ZH{`oY;*$TlUq2l+`$X!J%j653KNBTnYrw=mRJr5yYeG z!Sh$o=de&n3LRWRgWdGR9m3YC4T>lsvUY|R3CF9>>m>h#Y7hrmxvpQTMEn;2lvgO= zx8>|re?sTowA&jCJR}KI5BXvow8M1@83?^2#|Fih4e^!Ut70uF-wPURjZ1u_N2@*K z$#3T%MZR!R%h=i-C&W%*Srb$hFHE8H7D{%K+Wu)5Bg@hH&PfW;lsMci^D5nMHSEAT z?6b)%C4=s96S+NA=LVJ2@_$MsY zc1>-oRx1QKyvb|=0lg8+TzHGimD?7gd%a+H|*@H>F~lZlD!8U#>1JzO9I8OLuP1v~`oTfz79Z;QKBaTR z9eLS6-K;~ak_SyTZn&B}AM0`@vDnTkb_q*-{!k9;I7N|&^g}{hN2dm0 z`?P!3Bo>7`- z{VTGh5m{WdqggIVJn3pZAxJ}%U_X3t8LfM~;U;ug9*_r2zIjD}_;hfI{ccBYqq;LS z&)#Wtxd3Eqj>pgd0}Qz@%Px-H^(Ta?Sv@eIx{np8wMRD&1cuP0vkXUnRkO;%W@8ls zxAbA`TY+SD6Vy++(dlin9lUZ)B3PVMK{1ewF2`5}r3$;6COXjITtwJ+)LQ zYf5HN3CoQ8DlI1ouln*1)yvh;`DIho6#Vbw`P+9_Urvv!%Yj`q=R@(O$P=t4d(#V6 zv33G2-KJQDcu~)aAHEtR_#3(v_`sPM=Cdx_e`p0cKaO|1ak#)!E&W934<%%LR@sB5 z>5e&QZa2)EC%tN{HgD_(ki_h@IS=`=KgxdDd1|vx++loye)0Bp{dXXea$jh`2!Z&1 zMK%^e`qkf%iK7?q=+^D5HDA$BbhGa0^rO{o#5~bzYk~g-{5;v+oa{b6FSqj>LBYG3 z`ceV}%4k!GfH_vIXBV_hPJ+!&?F5d@f*T({3{UpM&=%R;y(ipU4H$zg=r{xbLJwJ6X##(_axi;zvy3C#(kCy}tllXwZvO6oCopD^HI0>XsWk zU5oTF0&^H5Jc2??5FL6q${en?iv={tECuxuN?n9&e`!%^YL{4e4z=}i9A`w$4?lHX z9`Kz+LVuQhJAhryGz2|83@+y$w(1hrErK*R)Q&_N7%04qgF5Y1I+Yvrfa=40kkOC? zynPk{hG5)a39A!dOSTFeGh}AAP{6UGPT=O%mt6hn+}WFANtO`%t7Uqu7ptKr*$Gu< z8i`$C9fhada>Vc7bA_SDe4uJYUs9PHRe|@(_opBd8_vs{sf+oG*J3eYvGm6Y^CV3q zWBXsO3QnbH!h+3r{3YJ4ta=666vO?nQW_`F&AJuvQl}MkT2Cpv31x7JU2wPn|7oe< z%4C^E5&tOY?#NZs6a0B5hY$0HipscBV#@c8l7BB!-6oYzV7k!4zQV}WUzo~wBf{!0 z&kD8SM0CR=)@U(NYAlV2MC+*DR~a4Bi2REoo8N0b@j2Vu(1f%1i;dCF^jJ+0-*{Ed*ZyzP0UVivukh(*IJe>{k_yIbdrul zY(jDnL^DTjd~Toefkm44Gd>WufF5M#6z8hYwc#SzBpiA?*vXeCet^t8I6bEep&BtG zXw(QLoWNa7W-Ap}QVBtOL}~7Jp=j%$Nom55t-+Z>aGPLD)2YF&6#@Hu%gAla(q~y? z6i~@vvLT?cmFwuqnK`N4pUzWC;;&sYnLqu10xcub+-6ZTq;jFEY=dLF=7TEn*aV!18S1KBQ@hB=~H4*!&$8~%d zhjO<1K!<(${XeaIQpbt!H+U|m&B+|l>U0ihaY6?)oYG0#ai7%z5550d z==O@|V?f(8GGMK9GKxUvWz+3s74FlI<)14bMLCBFN7i|iUMyb>_q&7DPJujNcm-HB z{G-X?v&1!0NX!c8zFmw;X+K zRq8kSH0l3Ftljw%xF!1k;Muc-(*1AG_n$x8>i-Y%ta?*@i8tr$i0xukSwyfF^u6uVvwty`dMKrkj#PP2Z-NV7&NWH!HPUukn z4faC=90E^Ype^xz)OiHnef<9W0?In4Y)FGd*=hhr5r`@0cod<|BXDk-EY`^zRzS~H z`V7F(7%?Cy7^-~(KJ4{E8t`K9EjQtite5w#XR;{gDM>Jybf;n#bslY$$|Q**Nn-%i zZ8W7IPt_}~a2^8icvF3NT!KHA(7nIm2cV#5CkUZciV(|&n zA@I)LgLCs@2qJp@d4@uq%sx-?WLmCi&sS4Z{VL!hD4=u17!Gxo=Cj^=0HcX)VLHn> zKjDa%sKvYBLT98#q1i!I7cBo2j(&d9n?bC00edlG>LNH2pq@xFhIkZ?c6Px}9Q~5$ zTV&eQ$xF++43dz}+SJn}Wu0Kg+f)cs-Vim*y$)w-1C)RekH?51B9u#ktCaMz)R?j$E2gr% zgU92^W0i+n=dhQIwQJ}2)`eLTp*-Ea!YWz-L=?cV3%*;Vm#*#tEFN>6k-Ji^Or!B6 zn{J9mn5Sr&D!hn>^2RMxcQP_+`e8*vIlojvb92@hlTedDF{8q)LQFm3LP{PBFokoZ z^N`yF&WT$fO_sJkPfuR%pfUt9Ciot6A>jpdHiJG#vXC$`;FV4SA4ANz>PZ|&3pFBB zl=Fpdx!j8CVb;oV33^uf9SspUJ9(_&CtR_Eleh9dmRo|82}AlI)u#x})4q8ZCiyy7 zbxATCAtoVJpxflrVkHG>65m&(DS`2)bn!@AGdWj4`o0VPMx%&ctJL;POQtjhxw%(T z(ns&xINSx#cfq0hI@rsS_H(&x zq!%GGBu!3%=O|iK2rO`LwaDjTdCAh>v+1BzpZsDv?OqQ-LIjSqjEVFupCRTd%BI|& z2`P0nnC9#UcnlUa0oRa-lvPbF5bCQZi%ZL6o&_^?fs!I>M#_4!P^qr!frPIXwCgD% z>BT6LebU*|1xIQwoc{yNO)So!yDz1izA#YEVMIc`B+8axr5y_3h*LI_FjD-$HN)zH zs5MpAuWc~>&YorV|J4RkfHd3xhtHlJmh*o+AM~GZ?f-{(T=!?IaWCFPtzKCn&3DR$ zV5)B*Ero$}x5O0A5Qby5Tl^Nr4$Dvx!vsdvJ3-SrMr8}6s`uGfYr(Bq5j@$JHw2yz zWXta2^Q`TG!(*FL5RQPt`j`2SK;XrNm1oQ9YBlqTX5olB_p)176H zrzp6Rh2EkWWs7r$I8PXI7k&$GPQSZYis@T;^ZNMo{G>%e5lq#crROwEV~Oi}FNxIL z@7IVR2BY(Q#GAV;A?6)6C4b({IY*h(*l>;ur#u2WwY^o)3Br@9@P=UEY+nt>Wp<2q zg_>z-^hL}N3|FXFrtu0@zekXZ57NBm0A?0kM%RqJI@jq>T0}N=xN$iY2pt9~NHgDEGe$5zDTs<)`pnT8+mrm?9^s28x77nn zIFCiE2HYD(P_yL;Qj!`|;-F-02wB&PJj)1a+>`bvkXpJWB5DD)XB{voU4dx!6N>MG zDVo9j5Cn}8IXXZ4VgI7^A>HGqip>irFwAj*!f^;+9YC^P#f-*?$pyJ|CxdlPX-P}+ z2@ww%j`bBmms2EPs2lkuoT5_S=FbRCi^q6ry;Wxy3o<@$Ne zl{-UFg)1H}05lF;y_KN+I2=Hdo!7EGe_SOc!6fsjI+}FcT+xE0%W0t>sP6qh;inX% zx`JtImqU8Qso$C@z@Ej4%HFk!cCsW8mbpdqN0C>XbSnSlaBWO$`I$69y zPR?F|Ff&ZPM`R+VI#*eXPQ5{k%rPjH8y$wD{e5bWL~k9cy(vLKhzM0%aw*Orq%(*~ zSFy|$TBIIo2@{e<1t#W_DqP9|sxukA$^3Y#aJL5UHm4OG{mX0E4ty8as)1ZW{yOoZ zpN1K418JD|`dL2v^>fw4FLsMdxJEy%cn8==95>hYvI(spAJm*JEf%UjgIX-7PG*+R z4Y~?0ImuZr{(YN5ua_07$m57kZ~&u>{5C%a%Kf7D^UO4aB-=1H8N<{B0w|jgjqNv| z)=i%_lR`gBr-lu1Da*LEobsa%@h&Nm60=t0AOb&x)}eQZETw}8>~A%X)|v+qc&mPF z)sOp9Kb8p`-zH+EjOOBd5hDRruD~o_NKOnRTI6b=TsOMs%Kpk{61Ad11f3uizM(QL ziYetteJ6HMha#yqj?};yZVXM_wq9NyTo`R9^>$K!LpFt(DqE96KUsxC?Ief|_Tm7r69-;%;*~m(ty4J2EBPZZ5ps?l*7uo0ri-Ki{O+ckA%o zDuTZmMR2>{Tzs}lU|qqj5?J&6j+Maee)Dfi^Vse;Z`F_Oe)D#}+4*cI^<4<_yPeeA z{pRYkH7T5hwkE~aqyXFf=IwrS;n}JLTa{qD-&|~Qs~5P+ZS{isXR8;is~7NqS{G}l z=gu{VI7%3d8V*#eQXG>>5=JxRnRo}SO!YpP$K3jRS&qvr zXKmq7c;&X%>;~2@jN&OQADnmby9=c{F^p@br=?d59}P1 z=$Fd%Q2Od8D_LZg3sDzvWMRC$tw70YS8_kP(>bauFG(e~qF3yme(9SG@2}#Uu<~h+ z*obmec^@GdBIc_>e`Vc6ke4u5H~5Bn5n`{3_nov!3u!V>IucJ_$evh38`*z>W`1mn}eL|LY~}o%_Of?&Mle=z$?yrNmUyi zSEA11^(`B^FWua*V(ta4T$f(_eCJDkGST;yulvdIXuSBxb?;9x*;q9*R+crc6|_>~ zwfgL3IxC$E>Mk&;vFt=~^|`aE*|Y52j;mo`ON%To*D^3!vNS#P>9DNSSS6F+n!U*r z53Vx|4uDzG!S-nfTS7M1Kj{>MG~_+=V(oFr@HI(>%YfD-sddA1zOX8+3uyt@ptsa= z73&u>^|{;U%QK!fH{?pBDxg5)B)SW1ef?$4P=uJXMA?p`B%Iu#6({@^GghwAtRsD8 za{|j<-~}A(S*ZWknqK-VEe>NC=sOnI#4Mncg_zivley4SIXD`GW}Zf}rs0RU4X(J7 z-Q`|5*V?>^8{$f9?Rx2RTN$;sjTF#XObH@lnA=J8a?N?7XoSJ%_n?^@1x~kn7oBBA^dv;j@F`e9+w+ zbPsF`Cc<+>5a;KNj!rb5K8QDx^QhGIGdy(xl`nEqP+sO}{k^!E;n-eh&nAdF5> z1f|JONyvv_aOk!hoqcBrhWOqwy{iShHET-^)DI|F(ZF@O5$dg8*WzS3m+t5OcgOwz z21A2{Kc)1JNdT7Q|JyrwwqMTw*Y6*0@Be>@XFX3xS)5BADONHnT|5|u9zUtg!MsSz^r$)m)l|%)9ogi9Cd`h-3iJ%_b~@(_pP~q0BKp_7A=Z=_lRGMAfO@OMN4mB$o#RtYby z<>}l_c?}PQ%A^C@MUd#!EGeQNiIp}^)>o>AWSK{g9z6p8LlcE#k`}YGqsl6jp!A&o zILlr*Lt;upJ~Tj{J{@$yiCT(Omf=z~Ugi$s0Gg0f6sAW}kRg<0Kz-m#D^L={zk;Vv z-%){{J_UbO6wYufbQO$ogg8h@h#2@+4~d``U*Gip1wzb}8M{#F7FD<)o1<`7HKvm9 z74rjjJDp1kO!`zkowTK@5<}uy94$;yox3r%QtvW4Q!kI=m@7WYXtUP^KjIkaiIMfd zkXzM$`n1|rspjwh$NnP@Dly@aUP-Xd3`THWuc{k18ELkal%G&RCJDm%J zbZl>k1jG>sKTQ!so1Iu0JM9=YJTYmg)BZlqWfG7L0y(>ya40mbjxF^VB!Ts>zt_F# zJ>mkz{vgBDeA_8Bh>1W9s!WqWB!V&wBfhfSi*Nj^7u>giX(4EOeCC*TW=^T!-=9eq zmxCdH+U#(T1LHu>7Pv=0UOau;0e8eIh-eb}Dr8xTGTwuUpniz?RUw6T4_@;WAMhH_ zB{FJ`AQ6NhKuqAV&V?n}x+In?@nQmkq{L8JH8D4WBu{>M4HsIH(>az3aJ7kD0ClxO zyJ;?A*?}2U;ZV^6WPx7k;ziK4$=~~Lib*=cX5s5}o`PeYq|`#1E2QNo8ZVU4tm(R( z-&be>)Pdk!pvi*12Eu!V)ZLXvv~0qn3*N#j1bAXn&#J81Y8A<{(W(@}P@fc-Kq*~D zbdI{6&cFWkug)V7ao`V%O?T9<0Coc=)Zh6ZS7@Q?b)EvLok*?>L}cNrTGS{?G(r&H z_!=Byg6AStA)$r*&|s1R^GRV9O_RZDpc6z8!$AqG?@PeG1ox`g6@%{4y-=!g0$0Wq|%P>f`BrHcubYSB|B}A+pOev>vC}o5$l2@Zv3I}IHS3@uz7(B{4Ss+zMJ3iB=`pp=602FLJv(;p3{U@OW{k3ysnaA17 z&ZUZw1n*<`OM*I`6DVNk)vH&pY_2kZ2G5?q1fzx298-!9<=Yp1`>k?3gM+~VFmGk= z-%HA9CNkZ`+^|ZxD}_RUbb?$xmv01+iwN(2Ge%@)|G_x+8G_*qZQKT2V*mA@A3iJD zfBT1n{?`6`h{v}7mYZ^tyCL9oEUuNVh{l+pFb%>3bdFdA7h1kS`(#+B1He-NJ|raH zWW~R#syf8P)_Bd4FxkQsPo~kr&zHp~e?Qs*FkqB(FiRqV<47M0;=4d82O#yC@?F5t zM1tGZife$RI>iBH0L>B6#kof8EuJtb-mfXU8Y{fh^J-ZmX3gb*B}6U61`D;YQ3j@q z5yN2ts_gD`5hE5*GDmD8)dk9~A__weuBEP{o7M5p=6`^D0&(H%?XeAHea@d{^S{4W&i{Py?D=;7 zKgc7OHoa7Sm*7bFn0#%Fw$DR8+5A`G0xARJVskTJKTGnz9}cSP|MUHW?fid;N2>A@ z%CO!PGYdwiW~(LNGR3rO+#g+I6QFPiV#owRtdsGQ@!~Ccz?&aVz5_JYYyYy+9Usgg z!}>H-D!$VF+$01Mghf{l)`FuZhCQOTVTv)$4Q~0bf0JRm|r?@8~r-6+!quHd}anO0PfR z@ep`vzhBk1Um}O`weDqP9#f_(NkXN{&3zM05#@g}Z-jCCc=@-?2$iZ23c(YJ<~cp) z%G15$bt@~?E- z{7ZZPBwlJq?{R^R9`7pKZI*Chyqo$%-k)whq}fsEbm&h_Az%VuH^KLnx!(<7MJmdU zy>fAWakx|v4IP8yBkk&vOswX!oau-NV`_E5sXYY7Z`1{UQv(H7bnE9nE?>EtQxBbT z?l1GSnytgkjq4 z$s99E)Y+0Uq0N%5*Ri~uR}k%m*EL$tdveautWoTzoyaNTTGVquTB(U>5|&uZEKjV+ zS~;4pOr@I6YQJF|K_NND?&`7rV!*f8VA}QU=*L`Fdrj#?IT>jZ_Flg^E%lI+n4y^g zTieZ?R5gQgRM>3f0VE*A{E9o2HVHw>Aq_LN485hDtk9&=>joTDfwzz(`dfaRnEYHI zNQmY*K*#C1mX(J6Y^*e!ID*-QOQ*+snd3NjXS1w~4&()=-(6(amStAMHC*hPb5Y>2 z()nfxBqZS|d@Nx+mfD@Vlt&61)tSd#mzj~#T$X7VMYHAmQ3)@o?)=)oJgb4KznNZr zRK3bx7dm!g4Ps%a{!J4`V05BJtTGsCU)}5#od3g8g0T31{(t{}t|)9EDE|Uh65e>p zM~DlcPEg8&B(wIj`NcG>u_ed_%O1)kI9>YY?$8y1ue0L3r$ah=q4nMBxZj+*&_Dqv^ z+59XlE}+P)pkc|7-zAy(5ed&zw2Di)JtJQg8Rqlng8X{bMhr>nC1geuBJCyJxLN(v z=JT1IYYBE82~uzM=*#dHV5$NSY(8Ro^IvaSOVvSiB?IXQE;L6>i3ezyOiF~TZhBXo zY0ny@5v37=#GbV25unDwDUMD$yRymEG(gBqLs@W8KQ7f7TOOM_>6?$ti6li&^V^`# z5LUA@qQO;9x39tz{sPcs2;`d{4`CZktC3uG|6v%OS|r%JUlJUJVRpl{;*9^g`{37& zX0a>feyX#gb)&QQjgHR#YF&CrYB!>`-$?EKZBmVGuh^WNo`GHH_DUe)Qu-JJ{gD1XmAaouUmR3H)i$h1a|*^d?q5 zJgL$7>gdOd|M-uha^=?4owltUpVX|#t(Ss1UwB(%a=bp@bD9_mU!IK89Y2lx+5gMl zx%D)TLvj3_Phr6etcK9^URLwK7Q~_jieNz6r@`Bp5>1<+#N{%deibKnojUeOL-9mY z@m0%lCJIAh9$W`(R+ zEe#No6QN~H1oiGvHQO%iEg1IJX2IU73+yczc3o&b40ajywh?vp)?78(F6wO<_4a0= z-mVMkZ5VZ3XaLle5y_U7M!jQ1UHx998f_Q#4vczdvrzBU1@#V$x-K+UQ12R1@0Kvy zF6vzv_3mb&-mMGjT^My;Xsn>#Gos!rVYFS;dob#~%|g9b7u0(&>blTaLA`H8yZEP0qnNMoKduE9dcx`k(lK2V**3;4G^!x-3&que%C9Aknsr7VNSg)Im z4TaX_pWwcu>dJfLzdhxAc?XqQV~PV0M_!@BSA$tTRr*G}{IhAvEBYelI=o`BqA8a& zmmt8NcRDl{G^>r(c6GA|VtH)l*>^QGZ9&*9gs{Y@KC)6GR|WMfDK$aWWZNY{fDoV{ zSWiM)5Fx*!mL?a|^n@s-G}UC=l{A15ppI5gLfQ}^6-!WSBBWy=M5#cjCfhDR0fYeM zr+O07fe5Ksxmgn-T>~LX;YKytcHIUb1gP57laMY%NX3H3nh5C`2vO=Cs>!y?9ls+X zJ&2Hsb%He!(l-#IlnGRmZC42ZLVy}UJqhVUgj8H!UlSn%10l-lx@xlR#dUxXU}?Rc zgbW};Dy~Yei4eD8Ktx@XR*km4CJjIWtw`6Cl5|`qOscNsR_8>va)w{CeJ(?f#O9~) zt1KH{;8*c1eyV}~L?SMc?oWOChJJ=YZiMO~yQzc|p6)G={Jo3T=#tQvF#1tVgu}xW zp9Pde54hl|_?zs>QzkONo@5WQi~0N*v@6u1?g@Q#@An*Z_Q18A?(v+4_g@yznX@OF z^J4Syq8{_$M=?cFIH&A!c5xBYljp~YS=O(uR!qa-wx`oScwHq`Mvrs0gAY)NzgXa8OZRWk{>WY5(;zJ}s>VYYTI zPUNQ2ys^3uvMeiv@v49rlPlm|Cz##?4Q1gZl4@b#f^j?OVjgGRY*NK8W0am7+vOdpkL>OB`5IiQ`hzubB@x>7gYk6Ex-dlKDU5v@MsIrsp7w*7 z66~Sy0r`PPUL7wS{~(d$hpeqm_!3M*?4e`!ZrU_CmR*_d{y6{7!Q&Zm0zwZv?RE== z5t_Y;D2>C}LGqGYa*z{a9HyfYF1)=yFNjQ8c+2D~;vc=}fnYk1h&fHScF?!c@#qk- zrV1~Ft98WboIAWZ;~kv7B>!a&&XO-}V?@JDj>X&B$w3kOTRWOtKUtGS9M7(`yKn)& zLlD#Tp2K$WV-(ZG3_n0e=U0CpIorvF@-xJatenNqzMUGBn>lvmn=$bg56F@CjDs=p zByq&0IfOM!%eqMBs>)5rb)81;MljhGJ!c&!^%TGtCBgF@j^bi@FtHz?msxa#PApT( zileKu?>8sccPH0hA1Qr0JUE#8lSld(&SSD4ke8eyRP5*8te>e9W z^o{jGDYk;AF?mf+mQI@do}uW&zr5#ImTSV*a9a9VQ{1v-@k>mSTEICgS&_-tUg8;n tFPQDjrhD1s*&A<21YG)8t6hI?pWEm5xqWVY`#%5x|NlQG%IyFS0|0Gm2bll> diff --git a/assets/portworx/portworx-2.11.4.tgz b/assets/portworx/portworx-2.11.4.tgz deleted file mode 100644 index 60c065e041cfe13886c2d5230a30ce653a8214b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25704 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 diff --git a/assets/portworx/portworx-2.8.0.tgz b/assets/portworx/portworx-2.8.0.tgz deleted file mode 100644 index 837b24b507e04ffbb58f3346e6ef46d9b017ce25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17475 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

?d; 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 z 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 diff --git a/assets/portworx/portworx-2.8.100.tgz b/assets/portworx/portworx-2.8.100.tgz deleted file mode 100644 index 8ff01b1049353a773a75708ae276213a26598565..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25603 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 y?9HM5fI~S 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 C#iL{Z diff --git a/assets/portworx/portworx-essentials-2.9.100.tgz b/assets/portworx/portworx-essentials-2.9.100.tgz deleted file mode 100644 index bcc71a116b4ef1223b1332bb391d3c59f0fc9792..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25977 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.16.0-0' - catalog.cattle.io/release-name: portworx-essentials -apiVersion: v1 -appVersion: 2.11.4 -description: A Helm chart for installing Portworx Essentials on Kubernetes. -home: https://portworx.com/ -icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png -keywords: -- Storage -- ICP -- persistent disk -- pvc -- cloud native storage -- persistent storage -- portworx -- amd64 -- portworx essentials -- free -maintainers: -- email: hadesai@purestorage.com - name: harsh-px -- email: onaumov@purestorage.com - name: trierra -- email: tasharma@purestorage.com - name: sharma-tapas -- email: dahuang@purestorage.com - name: dahuang-purestorage -name: portworx-essentials -sources: -- https://github.com/portworx/charts-rancher/tree/master/stable -version: 2.11.4 diff --git a/charts/portworx/portworx-essentials/README.md b/charts/portworx/portworx-essentials/README.md deleted file mode 100644 index a90a09b2b..000000000 --- a/charts/portworx/portworx-essentials/README.md +++ /dev/null @@ -1,57 +0,0 @@ -# Portworx Essentials -[Portworx Essentials](https://docs.portworx.com/concepts/portworx-essentials/) is a free Portworx license with limited functionality that allows you to run small production or proof-of-concept workloads. Essentials limits capacity and advanced features, but otherwise functions the same way as the fully-featured PX-Enterprise version of Portworx. - -The Portworx Essentials license requires that your clusters be connected to the internet and send usage data to PX-Central. Portworx Essentials clusters connect with PX-Central once per hour to renew license leases. Lease periods last for 24 hours, ensuring that any temporary interruptions to your connectivity do not impact your cluster. - -## **Pre-requisites** - -The minimum supported size for a Portworx cluster is three nodes. Each node must meet the following hardware, software, and network requirements: - -### Hardware & Software - -|Resource|Requirements| -|--------|------------| -|CPU|4 cores| -|RAM|4GB| -|Disk (/var)| 2GB free| -|Backing drive|8GB (minimum required) 128 GB (minimum recommended)| -|Storage drives| Minimum: 1 node with a storage drive. Storage drives must be unmounted block storage: raw disks, drive partitions, LVM, or cloud block storage. | -|Ethernet NIC card| 10 GB (recommended)| -|Linux kernel| Version 3.10 or greater.| -|Docker| Version 1.13.1 or greater.| -|Disable swap| Please disable swap on all nodes that will run the Portworx software. Ensure that the swap device is not automatically mounted on server reboot.| - -### Network -Open needed ports : TCP ports 9001-9022 and UDP port 9002 on all Portworx nodes. Also open the KVDB port. (As an example, etcd typically runs on port 2379). If you intend to use Portworx with sharedV4 volumes, you may need to open your NFS ports. - -Please read [this link](https://docs.portworx.com/concepts/portworx-essentials/) before installing to understand the pre-requisites. - -## **Limitations** -* The portworx helm chart can only be deployed in the kube-system namespace. Hence use "kube-system" in the "Target namespace" during configuration. - -## **Uninstalling the Chart** - -#### You can uninstall Portworx using one of the following methods: - -#### **1. Delete all the Kubernetes components associated with the chart and the release.** - -> **Note** > The Portworx configuration files under `/etc/pwx/` directory are preserved, and will not be deleted. - -To perform this operation simply delete the application from the Apps page - -#### **2. Wipe your Portworx installation** -> **Note** > The commands in this section are disruptive and will lead to data loss. Please use caution.. - -See more details [here](https://docs.portworx.com/portworx-install-with-kubernetes/install-px-helm/#uninstall) - -## **Documentation** -* [Portworx docs site](https://docs.portworx.com/install-with-other/rancher/rancher-2.x/#step-1-install-rancher) -* [Portworx interactive tutorials](https://docs.portworx.com/scheduler/kubernetes/px-k8s-interactive.html) - -## **Installing the Chart using the CLI** - -See the installation details [here](https://docs.portworx.com/portworx-install-with-kubernetes/install-px-helm/) - -## **Installing Portworx on AWS** - -See the installation details [here](https://docs.portworx.com/cloud-references/auto-disk-provisioning/aws) diff --git a/charts/portworx/portworx-essentials/app-readme.md b/charts/portworx/portworx-essentials/app-readme.md deleted file mode 100644 index b1e84db9a..000000000 --- a/charts/portworx/portworx-essentials/app-readme.md +++ /dev/null @@ -1,26 +0,0 @@ -# Portworx Essentials - -[Portworx Essentials](https://portworx.com/) is a free Portworx license with limited functionality that allows you to run small production or proof-of-concept workloads. Essentials limits capacity and advanced features, but otherwise functions the same way as the fully-featured PX-Enterprise version of Portworx such as - - * Run containerized stateful applications that are highly-available (HA) across multiple nodes, cloud instances, regions, data centers or even clouds - * Migrate workflows between multiple clusters running across same or hybrid clouds - * Run hyperconverged workloads where the data resides on the same host as the applications - * Have programmatic control on your storage resources - ----- -## Full Features - * Free forever - * 5 nodes - * 500 volumes - * Cloud Drive provisioning - * Failures across nodes/racks/AZ - ----- -## Limited features - * Application consistent Snapshots (5 per volume) - * Cloud Snapshots (1 per volume per day) - * BYOK Encryption (cluster key only) - * Single user cluster management UI (single user, single cluster) - -For more information [Click Here](https://portworx.com/products/features/) -The Portworx Essentials license requires that your clusters be connected to the internet and send usage data to PX-Central. Portworx Essentials clusters connect with PX-Central once per hour to renew license leases. Lease periods last for 24 hours, ensuring that any temporary interruptions to your connectivity do not impact your cluster. \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/ci/test-values.yaml b/charts/portworx/portworx-essentials/ci/test-values.yaml deleted file mode 100644 index 879bf6910..000000000 --- a/charts/portworx/portworx-essentials/ci/test-values.yaml +++ /dev/null @@ -1 +0,0 @@ -etcdType: Built-in \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/questions.yml b/charts/portworx/portworx-essentials/questions.yml deleted file mode 100644 index 9738c6c56..000000000 --- a/charts/portworx/portworx-essentials/questions.yml +++ /dev/null @@ -1,841 +0,0 @@ -categories: -- storage -namespace: kube-system -labels: - io.rancher.certified: partner -questions: - -################################### Essentials options ################################ -- variable: essentialID - type: string - required: true - default: "none" - label: "Essentials Entitlement ID" - description: "Get your free essentials entitlement ID from https://central.portworx.com/profile" - group: "license parameters" - - -################################### Storage options ################################ -- variable: environment - description: "Select your environment" - label: "Environment" - type: enum - default: "OnPrem" - required: true - group: "Storage Parameters" - options: - - "OnPrem" - - "Cloud" - -- variable: provider - show_if: "environment=Cloud" - description: "Select cloud platform" - label: "Cloud provider" - type: enum - required: true - group: "Storage Parameters" - options: - - "AWS" - - "Google cloud/GKE" - -- variable: onpremStorage - show_if: "environment=OnPrem" - type: enum - default: "Automatically scan disks" - label: "Select type of OnPrem storage" - group: "Storage Parameters" - required: true - options: - - "Automatically scan disks" - - "Manually specify disks" - -- variable: deviceConfig - show_if: "environment=Cloud" - description: "If you plan to use EC2 instance storage or plan to manage EBS volumes your own way, select 'Consume unused' or 'Use Existing disks'." - label: "Select a type of disk" - type: enum - default: "Create Using a Spec" - required: true - group: "Storage Parameters" - options: - - "Create Using a Spec" - - "Consume Unused" - - "Use Existing Disks" - - -- variable: journalDevice - description: "This allows PX to create it’s own journal partition on the best drive to absorb PX metadata writes. Journal writes are small with frequent syncs and hence a separate journal partition will enable better performance. Use value 'auto' if you want Portworx to create it's own journal partition." - type: string - label: "Journal Device" - group: "Storage Parameters" - -############ Consume unused ############## -- variable: usedrivesAndPartitions - show_if: "deviceConfig=Consume Unused||onpremStorage=Automatically scan disks" - label: "Use unmounted drives and partitions" - descrition: "Use unmounted disks even if they have a partition or filesystem on it. PX will never use a drive or partition that is mounted." - type: boolean - default: false - group: "Storage Parameters" - - -############ Use Exising Disks ############## -- variable: existingDisk1 - show_if: "deviceConfig=Use Existing Disks||onpremStorage=Manually specify disks" - label: "Drive/Device1" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk2 - show_if: "deviceConfig=Use Existing Disks||onpremStorage=Manually specify disks" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk2 - show_if: "addExistingDisk2=true" - label: "Drive/Device2" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk3 - show_if: "addExistingDisk2=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk3 - show_if: "addExistingDisk3=true" - label: "Drive/Device3" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk4 - show_if: "addExistingDisk3=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk4 - show_if: "addExistingDisk4=true" - label: "Drive/Device4" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk5 - show_if: "addExistingDisk4=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk5 - show_if: "addExistingDisk5=true" - label: "Drive/Device5" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -##################################################### Cloud ################################ - -##################################################### AWS ################################ - -### Section 1 AWS -- variable: drive_1.aws.type - show_if: "provider=AWS&&deviceConfig=Create Using a Spec" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - default: "GP2" - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_1.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_1.aws.size - show_if: "provider=AWS&&deviceConfig=Create Using a Spec" - description: "Volume size" - label: "Size" - type: int - default: 150 - required: true - group: "Storage Parameters" - -### Section 2 AWS -- variable: addEBSDrive_2 - show_if: "provider=AWS&&deviceConfig=Create Using a Spec" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_2.aws.type - show_if: "addEBSDrive_2=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_2.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_2.aws.size - show_if: "addEBSDrive_2=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - - ### Section 3 AWS -- variable: addEBSDrive_3 - show_if: "addEBSDrive_2=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_3.aws.type - show_if: "addEBSDrive_3=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_3.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_3.aws.size - show_if: "addEBSDrive_3=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -### Section 4 AWS -- variable: addEBSDrive_4 - show_if: "addEBSDrive_3=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_4.aws.type - show_if: "addEBSDrive_4=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_4.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_4.aws.size - show_if: "addEBSDrive_4=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 5 AWS -- variable: addEBSDrive_5 - show_if: "addEBSDrive_4=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_5.aws.type - show_if: "addEBSDrive_5=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_5.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_5.aws.size - show_if: "addEBSDrive_5=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 6 AWS -- variable: addEBSDrive_6 - show_if: "addEBSDrive_5=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_6.aws.type - show_if: "addEBSDrive_6=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_6.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_6.aws.size - show_if: "addEBSDrive_6=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 7 AWS -- variable: addEBSDrive_7 - show_if: "addEBSDrive_6=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_7.aws.type - show_if: "addEBSDrive_7=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_7.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_7.aws.size - show_if: "addEBSDrive_7=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 8 AWS -- variable: addEBSDrive_8 - show_if: "addEBSDrive_7=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_8.aws.type - show_if: "addEBSDrive_8=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_8.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_8.aws.size - show_if: "addEBSDrive_8=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 9 AWS -- variable: addEBSDrive_9 - show_if: "addEBSDrive_8=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_9.aws.type - show_if: "addEBSDrive_9=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_9.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_9.aws.size - show_if: "addEBSDrive_9=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 10 AWS -- variable: addEBSDrive_10 - show_if: "addEBSDrive_9=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_10.aws.type - show_if: "addEBSDrive_10=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_10.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_10.aws.size - show_if: "addEBSDrive_10=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -##################################################### GOOGLE CLOUD ################################ - -#### Section 1 GC -- variable: drive_1.gc.type - show_if: "provider=Google cloud/GKE&&deviceConfig=Create Using a Spec" - description: "Select volume type" - label: "Volume" - type: enum - default: "standard" - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_1.gc.size - show_if: "provider=Google cloud/GKE&&deviceConfig=Create Using a Spec" - description: "Volume size" - label: "Size" - type: int - default: 150 - required: true - group: "Storage Parameters" - -#### Section 2 GC -- variable: addGCDrive_2 - show_if: "provider=Google cloud/GKE&&deviceConfig=Create Using a Spec" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_2.gc.type - show_if: "addGCDrive_2=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_2.gc.size - show_if: "addGCDrive_2=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 3 GC -- variable: addGCDrive_3 - show_if: "addGCDrive_2=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_3.gc.type - show_if: "addGCDrive_3=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_3.gc.size - show_if: "addGCDrive_3=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 4 GC -- variable: addGCDrive_4 - show_if: "addGCDrive_3=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_4.gc.type - show_if: "addGCDrive_4=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_4.gc.size - show_if: "addGCDrive_4=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 5 GC -- variable: addGCDrive_5 - show_if: "addGCDrive_4=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_5.gc.type - show_if: "addGCDrive_5=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_5.gc.size - show_if: "addGCDrive_5=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 6 GC -- variable: addGCDrive_6 - show_if: "addGCDrive_5=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_6.gc.type - show_if: "addGCDrive_6=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_6.gc.size - show_if: "addGCDrive_6=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 7 GC -- variable: addGCDrive_7 - show_if: "addGCDrive_6=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_7.gc.type - show_if: "addGCDrive_6=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_7.gc.size - show_if: "addGCDrive_7=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 8 GC -- variable: addGCDrive_8 - show_if: "addGCDrive_7=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_8.gc.type - show_if: "addGCDrive_8=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_8.gc.size - show_if: "addGCDrive_8=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 9 GC -- variable: addGCDrive_9 - show_if: "addGCDrive_8=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_9.gc.type - show_if: "addGCDrive_9=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_9.gc.size - show_if: "addGCDrive_9=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 10 GC -- variable: addGCDrive_10 - show_if: "addGCDrive_9=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_10.gc.type - show_if: "addGCDrive_10=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_10.gc.size - show_if: "addGCDrive_10=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -- variable: maxStorageNodes - show_if: "environment=Cloud&&deviceConfig=Create Using a Spec" - description: "Max storage nodes per availability zone" - label: "Max storage nodes (Optional)" - type: int - group: "Storage Parameters" - -################################### Network options ################################ -- variable: dataInterface - description: "Specify your data network interface (example: `eth1`). If set to `auto`, Portworx will automatically select the first routable interface." - type: string - label: "Data Network Interface" - default: auto - group: "Network Parameters" -- variable: managementInterface - description: "Specify your management network interface (example: `eth1`). If set to `auto`, Portworx will automatically select the first routable interface." - type: string - default: auto - label: "Management Network Interface" - group: "Network Parameters" - -################################### Platform options ################################ -- variable: platformOptions - type: enum - label: "Platform" - group: "Platform Parameters" - options: - - "AKS" - - "EKS" - - "GKE" - -################################### Registry settings options ################################ -- variable: customRegistry - label: "Use a custom container registry?" - type: boolean - default: false - group: "Container Registry Parameters" - -- variable: registrySecret - show_if: "customRegistry=true" - description: "Specify a custom Kubernetes secret that will be used to authenticate with a container registry. Must be defined in kube-system namespace. (example: regcred)" - type: string - label: "Registry Kubernetes Secret" - group: "Container Registry Parameters" -- variable: customRegistryURL - show_if: "customRegistry=true" - description: "Specify a custom container registry server (including repository) that will be used instead of index.docker.io to download Docker images. (example: dockerhub.acme.net:5443 or myregistry.com/myrepository/)" - label: "Custom Registry URL" - type: string - group: "Container Registry Parameters" - - - -################################## Optional features ############################ -# TODO: Once we have a stable CSI release, we will default this to enabled -#- variable: csi -# description: "Select if you want to enable CSI (Container Storage Interface). CSI is still in ALPHA." -# type: boolean -# label: "Enable CSI" -# default: false -# required: false -# group: "Advanced parameters" - -- variable: storkVersion - default: "2.12.0" - label: "Stork version" - type: string - group: "Advanced parameters" - -- variable: envVars - label: "Environment variables" - description: "Enter your environment variables separated by semicolons (example: MYENV1=val1;MYENV2=val2). These environment variables will be exported to Portworx." - type: string - group: "Advanced parameters" - -- variable: imageVersion - default: "2.11.4" - type: string - label: Portworx version to be deployed. - group: "Advanced parameters" - -- variable: clusterName - type: string - label: Portworx cluster name - default: mycluster - group: "Advanced parameters" diff --git a/charts/portworx/portworx-essentials/templates/NOTES.txt b/charts/portworx/portworx-essentials/templates/NOTES.txt deleted file mode 100644 index ea0bb6326..000000000 --- a/charts/portworx/portworx-essentials/templates/NOTES.txt +++ /dev/null @@ -1,13 +0,0 @@ -Your Release is named {{ .Release.Name | quote }} - -Portworx Pods should be running on each node in your cluster. - -Portworx would create a unified pool of the disks attached to your Kubernetes nodes. No further action should be required and you are ready to consume Portworx Volumes as part of your application data requirements. - -For further information on usage of the Portworx, refer to following doc pages. - -- For dynamically provisioning volumes: https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html -- For preprovisioned volumes: https://docs.portworx.com/scheduler/kubernetes/preprovisioned-volumes.html -- To use Stork (Storage Orchestration Runtime for Kubernetes) for hyperconvergence and snapshots: https://docs.portworx.com/scheduler/kubernetes/stork.html -- For stateful application solutions using Portworx: https://docs.portworx.com/scheduler/kubernetes/k8s-px-app-samples.html -- For interactive tutorials on using Portworx on Kubernetes: https://docs.portworx.com/scheduler/kubernetes/px-k8s-interactive.html diff --git a/charts/portworx/portworx-essentials/templates/_helpers.tpl b/charts/portworx/portworx-essentials/templates/_helpers.tpl deleted file mode 100644 index 4367d05ea..000000000 --- a/charts/portworx/portworx-essentials/templates/_helpers.tpl +++ /dev/null @@ -1,443 +0,0 @@ -{{/* Gets the correct API Version based on the version of the cluster -*/}} - -{{- define "rbac.apiVersion" -}} -{{- if semverCompare ">= 1.8-0" .Capabilities.KubeVersion.GitVersion -}} -"rbac.authorization.k8s.io/v1" -{{- else -}} -"rbac.authorization.k8s.io/v1beta1" -{{- end -}} -{{- end -}} - - -{{- define "px.labels" -}} -chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" -heritage: {{ .Release.Service | quote }} -release: {{ .Release.Name | quote }} -{{- end -}} - -{{- define "driveOpts" }} -{{ $v := .Values.installOptions.drives | split "," }} -{{$v._0}} -{{- end -}} - -{{- define "px.kubernetesVersion" -}} -{{$version := .Capabilities.KubeVersion.GitVersion | regexFind "^v\\d+\\.\\d+\\.\\d+"}}{{$version}} -{{- end -}} - - -{{- define "px.getImage" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{- if .Values.openshiftInstall -}} - {{ cat (trim .Values.customRegistryURL) "/px-monitor" | replace " " ""}} - {{- else -}} - {{ cat (trim .Values.customRegistryURL) "/oci-monitor" | replace " " ""}} - {{- end -}} - {{- else -}} - {{- if .Values.openshiftInstall -}} - {{cat (trim .Values.customRegistryURL) "/portworx/px-monitor" | replace " " ""}} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/portworx/oci-monitor" | replace " " ""}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- if .Values.openshiftInstall -}} - {{ "registry.connect.redhat.com/portworx/px-monitor" }} - {{- else -}} - {{ "portworx/oci-monitor" }} - {{- end -}} -{{- end -}} -{{- end -}} - -{{- define "px.getStorkImage" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ cat (trim .Values.customRegistryURL) "/stork" | replace " " ""}} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/openstorage/stork" | replace " " ""}} - {{- end -}} -{{- else -}} - {{ "openstorage/stork" }} -{{- end -}} -{{- end -}} - -{{- define "px.getk8sImages" -}} -{{- $version := .Capabilities.KubeVersion.GitVersion -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ trim .Values.customRegistryURL }} - {{- else -}} - {{- if or (or (and (semverCompare ">= 1.16.14-0" $version ) (semverCompare "<=1.17.0-0" $version)) (and (semverCompare ">= 1.17.10-0" $version) (semverCompare "<=1.18.0-0" $version ))) (semverCompare ">=1.18.7-0" $version) -}} - {{cat (trim .Values.customRegistryURL) "/k8s.gcr.io" | replace " " ""}} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/gcr.io/google_containers" | replace " " ""}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- if or (or (and (semverCompare ">= 1.16.14-0" $version ) (semverCompare "<=1.17.0-0" $version)) (and (semverCompare ">= 1.17.10-0" $version) (semverCompare "<=1.18.0-0" $version ))) (semverCompare ">=1.18.7-0" $version) -}} - {{ "k8s.gcr.io" }} - {{- else -}} - {{ "gcr.io/google_containers" }} - {{- end -}} -{{- end -}} -{{- end -}} - -{{- define "px.getcsiImages" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ trim .Values.customRegistryURL }} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/quay.io/k8scsi" | replace " " ""}} - {{- end -}} -{{- else -}} - {{ "quay.io/k8scsi" }} -{{- end -}} -{{- end -}} - - -{{- define "px.getCSIProvisionerImage" -}} -{{- if semverCompare "<1.17.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "docker.io/openstorage/csi-provisioner:v1.6.1-1" }} -{{- else if semverCompare "< 1.20.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "docker.io/openstorage/csi-provisioner:v2.2.2-1" }} -{{- else -}} - {{ "docker.io/openstorage/csi-provisioner:v3.0.0-1" }} -{{- end -}} -{{- end -}} - -{{- define "px.getCSISnapshotterImage" -}} -{{- if semverCompare "<1.17.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "docker.io/openstorage/csi-snapshotter:v1.2.2-1" }} -{{- else if semverCompare "< 1.20.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.3" }} -{{- else -}} - {{ "k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1" }} -{{- end -}} -{{- end -}} - -{{- define "px.getCSISnapshotControllerImage" -}} -{{- if semverCompare "< 1.20.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "k8s.gcr.io/sig-storage/snapshot-controller:v3.0.3" }} -{{- else -}} - {{ "k8s.gcr.io/sig-storage/snapshot-controller:v4.2.1" }} -{{- end -}} -{{- end -}} - -{{- define "px.getPauseImage" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ trim .Values.customRegistryURL }} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/k8s.gcr.io" | replace " " ""}} - {{- end -}} -{{- else -}} - {{ "k8s.gcr.io" }} -{{- end -}} -{{- end -}} - -{{- define "px.registryConfigType" -}} -{{- if semverCompare ">=1.9-0" .Capabilities.KubeVersion.GitVersion -}} -".dockerconfigjson" -{{- else -}} -".dockercfg" -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for hooks -*/}} -{{- define "px.hookServiceAccount" -}} -{{- if .Values.serviceAccount.hook.create -}} - {{- printf "%s-hook" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{ default "default" .Values.serviceAccount.hook.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the cluster role to use for hooks -*/}} -{{- define "px.hookClusterRole" -}} -{{- if .Values.serviceAccount.hook.create -}} - {{- printf "%s-hook" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{ default "default" .Values.serviceAccount.hook.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the cluster role binding to use for hooks -*/}} -{{- define "px.hookClusterRoleBinding" -}} -{{- if .Values.serviceAccount.hook.create -}} - {{- printf "%s-hook" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{ default "default" .Values.serviceAccount.hook.name }} -{{- end -}} -{{- end -}} - -{{/* - String concatenation for drives in AWS section -*/}} -{{- define "px.storage" -}} -{{- $awsType1 := .Values.drive_1.aws.type -}} -{{- $awsType2 := .Values.drive_2.aws.type -}} -{{- $awsType3 := .Values.drive_3.aws.type -}} -{{- $awsType4 := .Values.drive_4.aws.type -}} -{{- $awsType5 := .Values.drive_5.aws.type -}} -{{- $awsType6 := .Values.drive_6.aws.type -}} -{{- $awsType7 := .Values.drive_7.aws.type -}} -{{- $awsType8 := .Values.drive_8.aws.type -}} -{{- $awsType9 := .Values.drive_9.aws.type -}} -{{- $awsType10 := .Values.drive_10.aws.type -}} - -{{- $awsSize1 := .Values.drive_1.aws.size -}} -{{- $awsSize2 := .Values.drive_2.aws.size -}} -{{- $awsSize3 := .Values.drive_3.aws.size -}} -{{- $awsSize4 := .Values.drive_4.aws.size -}} -{{- $awsSize5 := .Values.drive_5.aws.size -}} -{{- $awsSize6 := .Values.drive_6.aws.size -}} -{{- $awsSize7 := .Values.drive_7.aws.size -}} -{{- $awsSize8 := .Values.drive_8.aws.size -}} -{{- $awsSize9 := .Values.drive_9.aws.size -}} -{{- $awsSize10 := .Values.drive_10.aws.size -}} - -{{- $awsIops1 := .Values.drive_1.aws.iops -}} -{{- $awsIops2 := .Values.drive_2.aws.iops -}} -{{- $awsIops3 := .Values.drive_3.aws.iops -}} -{{- $awsIops4 := .Values.drive_4.aws.iops -}} -{{- $awsIops5 := .Values.drive_5.aws.iops -}} -{{- $awsIops6 := .Values.drive_6.aws.iops -}} -{{- $awsIops7 := .Values.drive_7.aws.iops -}} -{{- $awsIops8 := .Values.drive_8.aws.iops -}} -{{- $awsIops9 := .Values.drive_9.aws.iops -}} -{{- $awsIops10 := .Values.drive_10.aws.iops -}} - -{{- $gcType1 := .Values.drive_1.gc.type -}} -{{- $gcType2 := .Values.drive_2.gc.type -}} -{{- $gcType3 := .Values.drive_3.gc.type -}} -{{- $gcType4 := .Values.drive_4.gc.type -}} -{{- $gcType5 := .Values.drive_5.gc.type -}} -{{- $gcType6 := .Values.drive_6.gc.type -}} -{{- $gcType7 := .Values.drive_7.gc.type -}} -{{- $gcType8 := .Values.drive_8.gc.type -}} -{{- $gcType9 := .Values.drive_9.gc.type -}} -{{- $gcType10 := .Values.drive_10.gc.type -}} - -{{- $gcSize1 := .Values.drive_1.gc.size -}} -{{- $gcSize2 := .Values.drive_2.gc.size -}} -{{- $gcSize3 := .Values.drive_3.gc.size -}} -{{- $gcSize4 := .Values.drive_4.gc.size -}} -{{- $gcSize5 := .Values.drive_5.gc.size -}} -{{- $gcSize6 := .Values.drive_6.gc.size -}} -{{- $gcSize7 := .Values.drive_7.gc.size -}} -{{- $gcSize8 := .Values.drive_8.gc.size -}} -{{- $gcSize9 := .Values.drive_9.gc.size -}} -{{- $gcSize10 := .Values.drive_10.gc.size -}} - -{{- $usefileSystemDrive := .Values.usefileSystemDrive | default false }} -{{- $usedrivesAndPartitions := .Values.usedrivesAndPartitions | default false }} -{{- $deployEnvironmentIKS := .Capabilities.KubeVersion.GitVersion | regexMatch "IKS" }} - -{{- if eq "OnPrem" .Values.environment -}} - {{- if eq "Manually specify disks" .Values.onpremStorage }} - {{- if ne "none" .Values.existingDisk1 }} - "-s", "{{- .Values.existingDisk1 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk2 -}} - "-s", "{{- .Values.existingDisk2 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk3 -}} - "-s", "{{- .Values.existingDisk3 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk4 -}} - "-s", "{{- .Values.existingDisk4 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk5 }} - "-s", "{{- .Values.existingDisk5 }}", - {{- end }} - {{- else if eq "Automatically scan disks" .Values.onpremStorage -}} - {{- if or $usedrivesAndPartitions $deployEnvironmentIKS }} - "-f", - {{- end }} - {{- if eq $usedrivesAndPartitions true }} - "-A", - {{- else }} - "-a", - {{- end -}} - {{- end -}} - -{{- else if eq "Cloud" .Values.environment -}} - {{- if eq "Consume Unused" .Values.deviceConfig -}} - {{- if or $usedrivesAndPartitions $deployEnvironmentIKS }} - "-f", - {{- end }} - {{- if eq $usedrivesAndPartitions true }} - "-A", - {{- else }} - "-a", - {{- end -}} - {{- end }} -{{/*------------------- ----------------- Google cloud/GKE -------------- --------------- */}} - {{- if eq "Google cloud/GKE" .Values.provider -}} - {{- if eq "Use Existing Disks" .Values.deviceConfig -}} - {{- if .Values.existingDisk1 -}} - "-s", "{{- .Values.existingDisk1 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk2 -}} - "-s", "{{- .Values.existingDisk2 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk3 -}} - "-s", "{{- .Values.existingDisk3 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk4 -}} - "-s", "{{- .Values.existingDisk4 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk5 -}} - "-s", "{{- .Values.existingDisk5 -}}", - {{- end -}} - {{- else if eq "Create Using a Spec" .Values.deviceConfig -}} - {{- if $gcType1 }} - "-s", "type=pd-{{$gcType1 | lower}},size={{$gcSize1}}", - {{- end }} - {{/*------------------- DRIVE 2 --------------- */}} - {{- if $gcType2 -}} - "-s", "type=pd-{{$gcType2 | lower}},size={{$gcSize2}}", - {{- end }} - {{/*------------------- DRIVE 3 --------------- */}} - {{- if $gcType3 -}} - "-s", "type=pd-{{$gcType3 | lower}},size={{$gcSize3}}", - {{- end }} - {{/*------------------- DRIVE 4 --------------- */}} - {{- if $gcType4 -}} - "-s", "type=pd-{{$gcType4 | lower}},size={{$gcSize4}}", - {{- end }} - {{/*------------------- DRIVE 5 --------------- */}} - {{- if $gcType5 -}} - "-s", "type=pd-{{$gcType5 | lower}},size={{$gcSize5}}", - {{- end }} - {{/*------------------- DRIVE 6 --------------- */}} - {{- if $gcType6 -}} - "-s", "type=pd-{{$gcType6 | lower}},size={{$gcSize6}}", - {{- end }} - {{/*------------------- DRIVE 7 --------------- */}} - {{- if $gcType7 -}} - "-s", "type=pd-{{$gcType7 | lower}},size={{$gcSize7}}", - {{- end }} - {{/*------------------- DRIVE 8 --------------- */}} - {{- if $gcType8 -}} - "-s", "type=pd-{{$gcType8 | lower}},size={{$gcSize8}}", - {{- end }} - {{/*------------------- DRIVE 9 --------------- */}} - {{- if $gcType9 -}} - "-s", "type=pd-{{$gcType9 | lower}},size={{$gcSize9}}", - {{- end }} - {{/*------------------- DRIVE 10 --------------- */}} - {{- if $gcType10 -}} - "-s", "type=pd-{{$gcType1 | lower}},size={{$gcSize10}}", - {{- end }} - {{- end -}} -{{/*------------------- ----------------- AWS -------------- --------------- */}} - {{- else if eq "AWS" .Values.provider -}} - {{- if eq "Use Existing Disks" .Values.deviceConfig -}} - {{- if ne "none" .Values.existingDisk1 -}} - "-s", "{{ .Values.existingDisk1 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk2 -}} - "-s", "{{ .Values.existingDisk2 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk3 -}} - "-s", "{{ .Values.existingDisk3 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk4 -}} - "-s", "{{ .Values.existingDisk4 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk5 -}} - "-s", "{{ .Values.existingDisk5 }}", - {{- end -}} - {{- else if eq "Create Using a Spec" .Values.deviceConfig -}} - {{- if ne "none" $awsType1 }} - {{- if eq "GP2" $awsType1 -}} - "-s", "type={{$awsType1 | lower}},size={{$awsSize1}}", - {{- else if eq "IO1" $awsType1 -}} - "-s", "type={{$awsType1 | lower}},size={{$awsSize1}},iops={{$awsIops1}}", - {{- end }} - {{- end }} - {{/*------------------- DRIVE 2 --------------- */}} - {{- if ne "none" $awsType2 -}} - {{- if eq "GP2" $awsType2 -}} - "-s", "type={{$awsType2 | lower}},size={{$awsSize2}}", - {{- else if eq "IO1" $awsType2 -}} - "-s", "type={{$awsType2 | lower}},size={{$awsSize2}},iops={{$awsIops2}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 3 --------------- */}} - {{- if ne "none" $awsType3 }} - {{- if eq "GP2" $awsType3 -}} - "-s", "type={{$awsType3 | lower}},size={{$awsSize3}}", - {{- else if eq "IO1" $awsType3 -}} - "-s", "type={{$awsType3 | lower}},size={{$awsSize3}},iops={{$awsIops3}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 4 --------------- */}} - {{- if ne "none" $awsType4 }} - {{- if eq "GP2" $awsType4 -}} - "-s", "type={{$awsType4 | lower}},size={{$awsSize4}}", - {{- else if eq "IO1" $awsType4 -}} - "-s", "type={{$awsType4 | lower}},size={{$awsSize4}},iops={{$awsIops4}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 5 --------------- */}} - {{- if ne "none" $awsType5 }} - {{- if eq "GP2" $awsType5 -}} - "-s", "type={{$awsType5 | lower}},size={{$awsSize5}}", - {{- else if eq "IO1" $awsType5 -}} - "-s", "type={{$awsType5 | lower}},size={{$awsSize5}},iops={{$awsIops5}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 6 --------------- */}} - {{- if ne "none" $awsType6 }} - {{- if eq "GP2" $awsType6 -}} - "-s", "type={{$awsType6 | lower}},size={{$awsSize6}}", - {{- else if eq "IO1" $awsType6 -}} - "-s", "type={{$awsType6 | lower}},size={{$awsSize6}},iops={{$awsIops6}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 7 --------------- */}} - {{- if ne "none" $awsType7 }} - {{- if eq "GP2" $awsType7 -}} - "-s", "type={{$awsType7 | lower}},size={{$awsSize7}}", - {{- else if eq "IO1" $awsType7 -}} - "-s", "type={{$awsType7 | lower}},size={{$awsSize7}},iops={{$awsIops7}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 8 --------------- */}} - {{- if ne "none" $awsType8 }} - {{- if eq "GP2" $awsType8 -}} - "-s", "type={{$awsType8 | lower}},size={{$awsSize8}}", - {{- else if eq "IO1" $awsType8 -}} - "-s", "type={{$awsType8 | lower}},size={{$awsSize8}},iops={{$awsIops8}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 9 --------------- */}} - {{- if ne "none" $awsType9 }} - {{- if eq "GP2" $awsType9 -}} - "-s", "type={{$awsType9 | lower}},size={{$awsSize9}}", - {{- else if eq "IO1" $awsType9 -}} - "-s", "type={{$awsType9 | lower}},size={{$awsSize9}},iops={{$awsIops9}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 10 --------------- */}} - {{- if ne "none" $awsType10 }} - {{- if eq "GP2" $awsType10 -}} - "-s", "type={{$awsType10 | lower}},size={{$awsSize10}}", - {{- else if eq "IO1" $awsType10 -}} - "-s", "type={{$awsType10 | lower}},size={{$awsSize10}},iops={{$awsIops10}}", - {{- end -}} - {{- end }} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end }} - diff --git a/charts/portworx/portworx-essentials/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml b/charts/portworx/portworx-essentials/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml deleted file mode 100644 index 8c8efda02..000000000 --- a/charts/portworx/portworx-essentials/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -{{- $registrySecret := .Values.registrySecret | default "none" }} - -apiVersion: batch/v1 -kind: Job -metadata: - namespace: kube-system - name: px-hook-postdelete-unlabelnode - labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - annotations: - "helm.sh/hook": post-delete - "helm.sh/hook-weight": "-5" - "helm.sh/hook-delete-policy": before-hook-creation -spec: -{{ if semverCompare ">= 1.8-0" .Capabilities.KubeVersion.GitVersion }} - backoffLimit: 0 -{{ else }} - activeDeadlineSeconds: 30 -{{ end }} - template: - spec: - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - restartPolicy: Never - serviceAccountName: {{ template "px.hookServiceAccount" . }} - containers: - - name: post-delete-job - {{- if eq $customRegistryURL "none" }} - image: "lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- else}} - image: "{{ $customRegistryURL }}/lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- end}} - args: ['label','nodes','--all','px/enabled-'] diff --git a/charts/portworx/portworx-essentials/templates/hooks/pre-delete/px-predelete-nodelabel.yaml b/charts/portworx/portworx-essentials/templates/hooks/pre-delete/px-predelete-nodelabel.yaml deleted file mode 100644 index 1942bade7..000000000 --- a/charts/portworx/portworx-essentials/templates/hooks/pre-delete/px-predelete-nodelabel.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -{{- $registrySecret := .Values.registrySecret | default "none" }} - -apiVersion: batch/v1 -kind: Job -metadata: - namespace: kube-system - name: px-hook-predelete-nodelabel - labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-weight": "-5" - "helm.sh/hook-delete-policy": before-hook-creation -spec: -{{ if semverCompare ">= 1.8-0" .Capabilities.KubeVersion.GitVersion }} - backoffLimit: 0 -{{ else }} - activeDeadlineSeconds: 30 -{{ end }} - template: - spec: - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - serviceAccountName: {{ template "px.hookServiceAccount" . }} - restartPolicy: Never - containers: - - name: pre-delete-job - {{- if eq $customRegistryURL "none" }} - image: "lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- else}} - image: "{{ $customRegistryURL }}/lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- end}} - args: ['label','nodes','--all','px/enabled=remove','--overwrite'] diff --git a/charts/portworx/portworx-essentials/templates/portworx-controller.yaml b/charts/portworx/portworx-essentials/templates/portworx-controller.yaml deleted file mode 100644 index 15301f579..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-controller.yaml +++ /dev/null @@ -1,128 +0,0 @@ -{{- if or (and (.Values.openshiftInstall) (eq .Values.openshiftInstall true)) (and (.Values.AKSorEKSInstall) (eq .Values.AKSorEKSInstall true)) ((.Capabilities.KubeVersion.GitVersion | regexMatch "gke")) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: portworx-pvc-controller-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: portworx-pvc-controller-role -rules: -- apiGroups: [""] - resources: ["persistentvolumes"] - verbs: ["create","delete","get","list","update","watch"] -- apiGroups: [""] - resources: ["persistentvolumes/status"] - verbs: ["update"] -- apiGroups: [""] - resources: ["persistentvolumeclaims"] - verbs: ["get", "list", "update", "watch"] -- apiGroups: [""] - resources: ["persistentvolumeclaims/status"] - verbs: ["update"] -- apiGroups: [""] - resources: ["pods"] - verbs: ["create", "delete", "get", "list", "watch"] -- apiGroups: ["storage.k8s.io"] - resources: ["storageclasses"] - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: ["endpoints", "services"] - verbs: ["create", "delete", "get", "update"] -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: ["events"] - verbs: ["watch"] -- apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch", "update"] -- apiGroups: [""] - resources: ["serviceaccounts"] - verbs: ["get", "create"] -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "create", "update"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: portworx-pvc-controller-role-binding -subjects: -- kind: ServiceAccount - name: portworx-pvc-controller-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: portworx-pvc-controller-role - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - tier: control-plane - name: portworx-pvc-controller - namespace: kube-system -spec: - replicas: 3 - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - name: portworx-pvc-controller - tier: control-plane - spec: - {{- if not (empty .Values.registrySecret) }} - imagePullSecrets: - - name: {{ .Values.registrySecret }} - {{- end }} - containers: - - command: - - kube-controller-manager - - --leader-elect=true - - --address=0.0.0.0 - - --controllers=persistentvolume-binder,persistentvolume-expander - - --use-service-account-credentials=true - - --leader-elect-resource-lock=configmaps - image: "{{ template "px.getk8sImages" . }}/kube-controller-manager-amd64:{{ template "px.kubernetesVersion" . }}" - livenessProbe: - failureThreshold: 8 - httpGet: - host: 127.0.0.1 - path: /healthz - port: 10252 - scheme: HTTP - initialDelaySeconds: 15 - timeoutSeconds: 15 - name: portworx-pvc-controller-manager - resources: - requests: - cpu: 200m - hostNetwork: true - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "name" - operator: In - values: - - portworx-pvc-controller - topologyKey: "kubernetes.io/hostname" - serviceAccountName: portworx-pvc-controller-account -{{- end }} diff --git a/charts/portworx/portworx-essentials/templates/portworx-crd.yaml b/charts/portworx/portworx-essentials/templates/portworx-crd.yaml deleted file mode 100644 index 2811a0f8b..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-crd.yaml +++ /dev/null @@ -1,1146 +0,0 @@ -{{- if or (and (.Values.csi) (eq .Values.csi true)) (not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty))}} -{{- if (semverCompare ">= 1.17.0-0" .Capabilities.KubeVersion.GitVersion) }} -{{- if (semverCompare ">= 1.20.0-0" .Capabilities.KubeVersion.GitVersion) }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/419" - creationTimestamp: null - name: volumesnapshotclasses.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotClass - listKind: VolumeSnapshotClassList - plural: volumesnapshotclasses - singular: volumesnapshotclass - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .driver - name: Driver - type: string - - description: Determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .deletionPolicy - name: DeletionPolicy - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: VolumeSnapshotClass specifies parameters that a underlying storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses are non-namespaced - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - deletionPolicy: - description: deletionPolicy determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the storage driver that handles this VolumeSnapshotClass. Required. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - parameters: - additionalProperties: - type: string - description: parameters is a key-value map with storage driver specific parameters for creating snapshots. These values are opaque to Kubernetes. - type: object - required: - - deletionPolicy - - driver - type: object - served: true - storage: true - subresources: {} - - additionalPrinterColumns: - - jsonPath: .driver - name: Driver - type: string - - description: Determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .deletionPolicy - name: DeletionPolicy - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - # This indicates the v1beta1 version of the custom resource is deprecated. - # API requests to this version receive a warning in the server response. - deprecated: true - # This overrides the default warning returned to clients making v1beta1 API requests. - deprecationWarning: "snapshot.storage.k8s.io/v1beta1 VolumeSnapshotClass is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotClass" - schema: - openAPIV3Schema: - description: VolumeSnapshotClass specifies parameters that a underlying storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses are non-namespaced - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - deletionPolicy: - description: deletionPolicy determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the storage driver that handles this VolumeSnapshotClass. Required. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - parameters: - additionalProperties: - type: string - description: parameters is a key-value map with storage driver specific parameters for creating snapshots. These values are opaque to Kubernetes. - type: object - required: - - deletionPolicy - - driver - type: object - served: true - storage: false - subresources: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/419" - creationTimestamp: null - name: volumesnapshotcontents.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotContent - listKind: VolumeSnapshotContentList - plural: volumesnapshotcontents - singular: volumesnapshotcontent - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Represents the complete size of the snapshot in bytes - jsonPath: .status.restoreSize - name: RestoreSize - type: integer - - description: Determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .spec.deletionPolicy - name: DeletionPolicy - type: string - - description: Name of the CSI driver used to create the physical snapshot on the underlying storage system. - jsonPath: .spec.driver - name: Driver - type: string - - description: Name of the VolumeSnapshotClass to which this snapshot belongs. - jsonPath: .spec.volumeSnapshotClassName - name: VolumeSnapshotClass - type: string - - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. - jsonPath: .spec.volumeSnapshotRef.name - name: VolumeSnapshot - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: VolumeSnapshotContent represents the actual "on-disk" snapshot object in the underlying storage system - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: spec defines properties of a VolumeSnapshotContent created by the underlying storage system. Required. - properties: - deletionPolicy: - description: deletionPolicy determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. For dynamically provisioned snapshots, this field will automatically be filled in by the CSI snapshotter sidecar with the "DeletionPolicy" field defined in the corresponding VolumeSnapshotClass. For pre-existing snapshots, users MUST specify this field when creating the VolumeSnapshotContent object. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the CSI driver used to create the physical snapshot on the underlying storage system. This MUST be the same as the name returned by the CSI GetPluginName() call for that driver. Required. - type: string - source: - description: source specifies whether the snapshot is (or should be) dynamically provisioned or already exists, and just requires a Kubernetes object representation. This field is immutable after creation. Required. - properties: - snapshotHandle: - description: snapshotHandle specifies the CSI "snapshot_id" of a pre-existing snapshot on the underlying storage system for which a Kubernetes object representation was (or should be) created. This field is immutable. - type: string - volumeHandle: - description: volumeHandle specifies the CSI "volume_id" of the volume from which a snapshot should be dynamically taken from. This field is immutable. - type: string - type: object - oneOf: - - required: ["snapshotHandle"] - - required: ["volumeHandle"] - volumeSnapshotClassName: - description: name of the VolumeSnapshotClass from which this snapshot was (or will be) created. Note that after provisioning, the VolumeSnapshotClass may be deleted or recreated with different set of values, and as such, should not be referenced post-snapshot creation. - type: string - volumeSnapshotRef: - description: volumeSnapshotRef specifies the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName field must reference to this VolumeSnapshotContent's name for the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent object, name and namespace of the VolumeSnapshot object MUST be provided for binding to happen. This field is immutable after creation. Required. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - required: - - deletionPolicy - - driver - - source - - volumeSnapshotRef - type: object - status: - description: status represents the current information of a snapshot. - properties: - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it indicates the creation time is unknown. The format of this field is a Unix nanoseconds time encoded as an int64. On Unix, the command `date +%s%N` returns the current time in nanoseconds since 1970-01-01 00:00:00 UTC. - format: int64 - type: integer - error: - description: error is the last observed error during snapshot creation, if any. Upon success after retry, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - description: restoreSize represents the complete size of the snapshot in bytes. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - format: int64 - minimum: 0 - type: integer - snapshotHandle: - description: snapshotHandle is the CSI "snapshot_id" of a snapshot on the underlying storage system. If not specified, it indicates that dynamic snapshot creation has either failed or it is still in progress. - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Represents the complete size of the snapshot in bytes - jsonPath: .status.restoreSize - name: RestoreSize - type: integer - - description: Determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .spec.deletionPolicy - name: DeletionPolicy - type: string - - description: Name of the CSI driver used to create the physical snapshot on the underlying storage system. - jsonPath: .spec.driver - name: Driver - type: string - - description: Name of the VolumeSnapshotClass to which this snapshot belongs. - jsonPath: .spec.volumeSnapshotClassName - name: VolumeSnapshotClass - type: string - - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. - jsonPath: .spec.volumeSnapshotRef.name - name: VolumeSnapshot - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - # This indicates the v1beta1 version of the custom resource is deprecated. - # API requests to this version receive a warning in the server response. - deprecated: true - # This overrides the default warning returned to clients making v1beta1 API requests. - deprecationWarning: "snapshot.storage.k8s.io/v1beta1 VolumeSnapshotContent is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotContent" - schema: - openAPIV3Schema: - description: VolumeSnapshotContent represents the actual "on-disk" snapshot object in the underlying storage system - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: spec defines properties of a VolumeSnapshotContent created by the underlying storage system. Required. - properties: - deletionPolicy: - description: deletionPolicy determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. For dynamically provisioned snapshots, this field will automatically be filled in by the CSI snapshotter sidecar with the "DeletionPolicy" field defined in the corresponding VolumeSnapshotClass. For pre-existing snapshots, users MUST specify this field when creating the VolumeSnapshotContent object. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the CSI driver used to create the physical snapshot on the underlying storage system. This MUST be the same as the name returned by the CSI GetPluginName() call for that driver. Required. - type: string - source: - description: source specifies whether the snapshot is (or should be) dynamically provisioned or already exists, and just requires a Kubernetes object representation. This field is immutable after creation. Required. - properties: - snapshotHandle: - description: snapshotHandle specifies the CSI "snapshot_id" of a pre-existing snapshot on the underlying storage system for which a Kubernetes object representation was (or should be) created. This field is immutable. - type: string - volumeHandle: - description: volumeHandle specifies the CSI "volume_id" of the volume from which a snapshot should be dynamically taken from. This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: name of the VolumeSnapshotClass from which this snapshot was (or will be) created. Note that after provisioning, the VolumeSnapshotClass may be deleted or recreated with different set of values, and as such, should not be referenced post-snapshot creation. - type: string - volumeSnapshotRef: - description: volumeSnapshotRef specifies the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName field must reference to this VolumeSnapshotContent's name for the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent object, name and namespace of the VolumeSnapshot object MUST be provided for binding to happen. This field is immutable after creation. Required. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - required: - - deletionPolicy - - driver - - source - - volumeSnapshotRef - type: object - status: - description: status represents the current information of a snapshot. - properties: - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it indicates the creation time is unknown. The format of this field is a Unix nanoseconds time encoded as an int64. On Unix, the command `date +%s%N` returns the current time in nanoseconds since 1970-01-01 00:00:00 UTC. - format: int64 - type: integer - error: - description: error is the last observed error during snapshot creation, if any. Upon success after retry, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - description: restoreSize represents the complete size of the snapshot in bytes. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - format: int64 - minimum: 0 - type: integer - snapshotHandle: - description: snapshotHandle is the CSI "snapshot_id" of a snapshot on the underlying storage system. If not specified, it indicates that dynamic snapshot creation has either failed or it is still in progress. - type: string - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/419" - creationTimestamp: null - name: volumesnapshots.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshot - listKind: VolumeSnapshotList - plural: volumesnapshots - singular: volumesnapshot - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: If a new snapshot needs to be created, this contains the name of the source PVC from which this snapshot was (or will be) created. - jsonPath: .spec.source.persistentVolumeClaimName - name: SourcePVC - type: string - - description: If a snapshot already exists, this contains the name of the existing VolumeSnapshotContent object representing the existing snapshot. - jsonPath: .spec.source.volumeSnapshotContentName - name: SourceSnapshotContent - type: string - - description: Represents the minimum size of volume required to rehydrate from this snapshot. - jsonPath: .status.restoreSize - name: RestoreSize - type: string - - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. - jsonPath: .spec.volumeSnapshotClassName - name: SnapshotClass - type: string - - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot object intends to bind to. Please note that verification of binding actually requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure both are pointing at each other. Binding MUST be verified prior to usage of this object. - jsonPath: .status.boundVolumeSnapshotContentName - name: SnapshotContent - type: string - - description: Timestamp when the point-in-time snapshot was taken by the underlying storage system. - jsonPath: .status.creationTime - name: CreationTime - type: date - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: VolumeSnapshot is a user's request for either creating a point-in-time snapshot of a persistent volume, or binding to a pre-existing snapshot. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: 'spec defines the desired characteristics of a snapshot requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots Required.' - properties: - source: - description: source specifies where a snapshot will be created from. This field is immutable after creation. Required. - properties: - persistentVolumeClaimName: - description: persistentVolumeClaimName specifies the name of the PersistentVolumeClaim object representing the volume from which a snapshot should be created. This PVC is assumed to be in the same namespace as the VolumeSnapshot object. This field should be set if the snapshot does not exists, and needs to be created. This field is immutable. - type: string - volumeSnapshotContentName: - description: volumeSnapshotContentName specifies the name of a pre-existing VolumeSnapshotContent object representing an existing volume snapshot. This field should be set if the snapshot already exists and only needs a representation in Kubernetes. This field is immutable. - type: string - type: object - oneOf: - - required: ["persistentVolumeClaimName"] - - required: ["volumeSnapshotContentName"] - volumeSnapshotClassName: - description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass requested by the VolumeSnapshot. VolumeSnapshotClassName may be left nil to indicate that the default SnapshotClass should be used. A given cluster may have multiple default Volume SnapshotClasses: one default per CSI Driver. If a VolumeSnapshot does not specify a SnapshotClass, VolumeSnapshotSource will be checked to figure out what the associated CSI Driver is, and the default VolumeSnapshotClass associated with that CSI Driver will be used. If more than one VolumeSnapshotClass exist for a given CSI Driver and more than one have been marked as default, CreateSnapshot will fail and generate an event. Empty string is not allowed for this field.' - type: string - required: - - source - type: object - status: - description: status represents the current information of a snapshot. Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object. - properties: - boundVolumeSnapshotContentName: - description: 'boundVolumeSnapshotContentName is the name of the VolumeSnapshotContent object to which this VolumeSnapshot object intends to bind to. If not specified, it indicates that the VolumeSnapshot object has not been successfully bound to a VolumeSnapshotContent object yet. NOTE: To avoid possible security issues, consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object.' - type: string - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it may indicate that the creation time of the snapshot is unknown. - format: date-time - type: string - error: - description: error is the last observed error during snapshot creation, if any. This field could be helpful to upper level controllers(i.e., application controller) to decide whether they should continue on waiting for the snapshot to be created based on the type of error reported. The snapshot controller will keep retrying when an error occurrs during the snapshot creation. Upon success, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if the snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - type: string - description: restoreSize represents the minimum size of volume required to create a volume from this snapshot. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: If a new snapshot needs to be created, this contains the name of the source PVC from which this snapshot was (or will be) created. - jsonPath: .spec.source.persistentVolumeClaimName - name: SourcePVC - type: string - - description: If a snapshot already exists, this contains the name of the existing VolumeSnapshotContent object representing the existing snapshot. - jsonPath: .spec.source.volumeSnapshotContentName - name: SourceSnapshotContent - type: string - - description: Represents the minimum size of volume required to rehydrate from this snapshot. - jsonPath: .status.restoreSize - name: RestoreSize - type: string - - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. - jsonPath: .spec.volumeSnapshotClassName - name: SnapshotClass - type: string - - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot object intends to bind to. Please note that verification of binding actually requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure both are pointing at each other. Binding MUST be verified prior to usage of this object. - jsonPath: .status.boundVolumeSnapshotContentName - name: SnapshotContent - type: string - - description: Timestamp when the point-in-time snapshot was taken by the underlying storage system. - jsonPath: .status.creationTime - name: CreationTime - type: date - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - # This indicates the v1beta1 version of the custom resource is deprecated. - # API requests to this version receive a warning in the server response. - deprecated: true - # This overrides the default warning returned to clients making v1beta1 API requests. - deprecationWarning: "snapshot.storage.k8s.io/v1beta1 VolumeSnapshot is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshot" - schema: - openAPIV3Schema: - description: VolumeSnapshot is a user's request for either creating a point-in-time snapshot of a persistent volume, or binding to a pre-existing snapshot. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: 'spec defines the desired characteristics of a snapshot requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots Required.' - properties: - source: - description: source specifies where a snapshot will be created from. This field is immutable after creation. Required. - properties: - persistentVolumeClaimName: - description: persistentVolumeClaimName specifies the name of the PersistentVolumeClaim object representing the volume from which a snapshot should be created. This PVC is assumed to be in the same namespace as the VolumeSnapshot object. This field should be set if the snapshot does not exists, and needs to be created. This field is immutable. - type: string - volumeSnapshotContentName: - description: volumeSnapshotContentName specifies the name of a pre-existing VolumeSnapshotContent object representing an existing volume snapshot. This field should be set if the snapshot already exists and only needs a representation in Kubernetes. This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass requested by the VolumeSnapshot. VolumeSnapshotClassName may be left nil to indicate that the default SnapshotClass should be used. A given cluster may have multiple default Volume SnapshotClasses: one default per CSI Driver. If a VolumeSnapshot does not specify a SnapshotClass, VolumeSnapshotSource will be checked to figure out what the associated CSI Driver is, and the default VolumeSnapshotClass associated with that CSI Driver will be used. If more than one VolumeSnapshotClass exist for a given CSI Driver and more than one have been marked as default, CreateSnapshot will fail and generate an event. Empty string is not allowed for this field.' - type: string - required: - - source - type: object - status: - description: status represents the current information of a snapshot. Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object. - properties: - boundVolumeSnapshotContentName: - description: 'boundVolumeSnapshotContentName is the name of the VolumeSnapshotContent object to which this VolumeSnapshot object intends to bind to. If not specified, it indicates that the VolumeSnapshot object has not been successfully bound to a VolumeSnapshotContent object yet. NOTE: To avoid possible security issues, consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object.' - type: string - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it may indicate that the creation time of the snapshot is unknown. - format: date-time - type: string - error: - description: error is the last observed error during snapshot creation, if any. This field could be helpful to upper level controllers(i.e., application controller) to decide whether they should continue on waiting for the snapshot to be created based on the type of error reported. The snapshot controller will keep retrying when an error occurrs during the snapshot creation. Upon success, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if the snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - type: string - description: restoreSize represents the minimum size of volume required to create a volume from this snapshot. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- else }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.3.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139" - creationTimestamp: null - name: volumesnapshotclasses.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotClass - listKind: VolumeSnapshotClassList - plural: volumesnapshotclasses - singular: volumesnapshotclass - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .driver - name: Driver - type: string - - description: Determines whether a VolumeSnapshotContent created through the - VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .deletionPolicy - name: DeletionPolicy - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VolumeSnapshotClass specifies parameters that a underlying storage - system uses when creating a volume snapshot. A specific VolumeSnapshotClass - is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses - are non-namespaced - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - deletionPolicy: - description: deletionPolicy determines whether a VolumeSnapshotContent - created through the VolumeSnapshotClass should be deleted when its bound - VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". - "Retain" means that the VolumeSnapshotContent and its physical snapshot - on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent - and its physical snapshot on underlying storage system are deleted. - Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the storage driver that handles this - VolumeSnapshotClass. Required. - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - parameters: - additionalProperties: - type: string - description: parameters is a key-value map with storage driver specific - parameters for creating snapshots. These values are opaque to Kubernetes. - type: object - required: - - deletionPolicy - - driver - type: object - served: true - storage: true - subresources: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.3.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139" - creationTimestamp: null - name: volumesnapshotcontents.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotContent - listKind: VolumeSnapshotContentList - plural: volumesnapshotcontents - singular: volumesnapshotcontent - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Indicates if a snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Represents the complete size of the snapshot in bytes - jsonPath: .status.restoreSize - name: RestoreSize - type: integer - - description: Determines whether this VolumeSnapshotContent and its physical - snapshot on the underlying storage system should be deleted when its bound - VolumeSnapshot is deleted. - jsonPath: .spec.deletionPolicy - name: DeletionPolicy - type: string - - description: Name of the CSI driver used to create the physical snapshot on - the underlying storage system. - jsonPath: .spec.driver - name: Driver - type: string - - description: Name of the VolumeSnapshotClass to which this snapshot belongs. - jsonPath: .spec.volumeSnapshotClassName - name: VolumeSnapshotClass - type: string - - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent - object is bound. - jsonPath: .spec.volumeSnapshotRef.name - name: VolumeSnapshot - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VolumeSnapshotContent represents the actual "on-disk" snapshot - object in the underlying storage system - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: spec defines properties of a VolumeSnapshotContent created - by the underlying storage system. Required. - properties: - deletionPolicy: - description: deletionPolicy determines whether this VolumeSnapshotContent - and its physical snapshot on the underlying storage system should - be deleted when its bound VolumeSnapshot is deleted. Supported values - are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent - and its physical snapshot on underlying storage system are kept. - "Delete" means that the VolumeSnapshotContent and its physical snapshot - on underlying storage system are deleted. In dynamic snapshot creation - case, this field will be filled in with the "DeletionPolicy" field - defined in the VolumeSnapshotClass the VolumeSnapshot refers to. - For pre-existing snapshots, users MUST specify this field when creating - the VolumeSnapshotContent object. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the CSI driver used to create the - physical snapshot on the underlying storage system. This MUST be - the same as the name returned by the CSI GetPluginName() call for - that driver. Required. - type: string - source: - description: source specifies from where a snapshot will be created. - This field is immutable after creation. Required. - properties: - snapshotHandle: - description: snapshotHandle specifies the CSI "snapshot_id" of - a pre-existing snapshot on the underlying storage system. This - field is immutable. - type: string - volumeHandle: - description: volumeHandle specifies the CSI "volume_id" of the - volume from which a snapshot should be dynamically taken from. - This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: name of the VolumeSnapshotClass to which this snapshot - belongs. - type: string - volumeSnapshotRef: - description: volumeSnapshotRef specifies the VolumeSnapshot object - to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName - field must reference to this VolumeSnapshotContent's name for the - bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent - object, name and namespace of the VolumeSnapshot object MUST be - provided for binding to happen. This field is immutable after creation. - Required. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - required: - - deletionPolicy - - driver - - source - - volumeSnapshotRef - type: object - status: - description: status represents the current information of a snapshot. - properties: - creationTime: - description: creationTime is the timestamp when the point-in-time - snapshot is taken by the underlying storage system. In dynamic snapshot - creation case, this field will be filled in with the "creation_time" - value returned from CSI "CreateSnapshotRequest" gRPC call. For a - pre-existing snapshot, this field will be filled with the "creation_time" - value returned from the CSI "ListSnapshots" gRPC call if the driver - supports it. If not specified, it indicates the creation time is - unknown. The format of this field is a Unix nanoseconds time encoded - as an int64. On Unix, the command `date +%s%N` returns the current - time in nanoseconds since 1970-01-01 00:00:00 UTC. - format: int64 - type: integer - error: - description: error is the latest observed error during snapshot creation, - if any. - properties: - message: - description: 'message is a string detailing the encountered error - during snapshot creation if specified. NOTE: message may be - logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used - to restore a volume. In dynamic snapshot creation case, this field - will be filled in with the "ready_to_use" value returned from CSI - "CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, - this field will be filled with the "ready_to_use" value returned - from the CSI "ListSnapshots" gRPC call if the driver supports it, - otherwise, this field will be set to "True". If not specified, it - means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - description: restoreSize represents the complete size of the snapshot - in bytes. In dynamic snapshot creation case, this field will be - filled in with the "size_bytes" value returned from CSI "CreateSnapshotRequest" - gRPC call. For a pre-existing snapshot, this field will be filled - with the "size_bytes" value returned from the CSI "ListSnapshots" - gRPC call if the driver supports it. When restoring a volume from - this snapshot, the size of the volume MUST NOT be smaller than the - restoreSize if it is specified, otherwise the restoration will fail. - If not specified, it indicates that the size is unknown. - format: int64 - minimum: 0 - type: integer - snapshotHandle: - description: snapshotHandle is the CSI "snapshot_id" of a snapshot - on the underlying storage system. If not specified, it indicates - that dynamic snapshot creation has either failed or it is still - in progress. - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.3.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139" - creationTimestamp: null - name: volumesnapshots.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshot - listKind: VolumeSnapshotList - plural: volumesnapshots - singular: volumesnapshot - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Indicates if a snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Name of the source PVC from where a dynamically taken snapshot - will be created. - jsonPath: .spec.source.persistentVolumeClaimName - name: SourcePVC - type: string - - description: Name of the VolumeSnapshotContent which represents a pre-provisioned - snapshot. - jsonPath: .spec.source.volumeSnapshotContentName - name: SourceSnapshotContent - type: string - - description: Represents the complete size of the snapshot. - jsonPath: .status.restoreSize - name: RestoreSize - type: string - - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. - jsonPath: .spec.volumeSnapshotClassName - name: SnapshotClass - type: string - - description: The name of the VolumeSnapshotContent to which this VolumeSnapshot - is bound. - jsonPath: .status.boundVolumeSnapshotContentName - name: SnapshotContent - type: string - - description: Timestamp when the point-in-time snapshot is taken by the underlying - storage system. - jsonPath: .status.creationTime - name: CreationTime - type: date - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VolumeSnapshot is a user's request for either creating a point-in-time - snapshot of a persistent volume, or binding to a pre-existing snapshot. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: 'spec defines the desired characteristics of a snapshot requested - by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots - Required.' - properties: - source: - description: source specifies where a snapshot will be created from. - This field is immutable after creation. Required. - properties: - persistentVolumeClaimName: - description: persistentVolumeClaimName specifies the name of the - PersistentVolumeClaim object in the same namespace as the VolumeSnapshot - object where the snapshot should be dynamically taken from. - This field is immutable. - type: string - volumeSnapshotContentName: - description: volumeSnapshotContentName specifies the name of a - pre-existing VolumeSnapshotContent object. This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: 'volumeSnapshotClassName is the name of the VolumeSnapshotClass - requested by the VolumeSnapshot. If not specified, the default snapshot - class will be used if one exists. If not specified, and there is - no default snapshot class, dynamic snapshot creation will fail. - Empty string is not allowed for this field. TODO(xiangqian): a webhook - validation on empty string. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes' - type: string - required: - - source - type: object - status: - description: 'status represents the current information of a snapshot. - NOTE: status can be modified by sources other than system controllers, - and must not be depended upon for accuracy. Controllers should only - use information from the VolumeSnapshotContent object after verifying - that the binding is accurate and complete.' - properties: - boundVolumeSnapshotContentName: - description: 'boundVolumeSnapshotContentName represents the name of - the VolumeSnapshotContent object to which the VolumeSnapshot object - is bound. If not specified, it indicates that the VolumeSnapshot - object has not been successfully bound to a VolumeSnapshotContent - object yet. NOTE: Specified boundVolumeSnapshotContentName alone - does not mean binding is valid. Controllers MUST always verify - bidirectional binding between VolumeSnapshot and VolumeSnapshotContent - to avoid possible security issues.' - type: string - creationTime: - description: creationTime is the timestamp when the point-in-time - snapshot is taken by the underlying storage system. In dynamic snapshot - creation case, this field will be filled in with the "creation_time" - value returned from CSI "CreateSnapshotRequest" gRPC call. For a - pre-existing snapshot, this field will be filled with the "creation_time" - value returned from the CSI "ListSnapshots" gRPC call if the driver - supports it. If not specified, it indicates that the creation time - of the snapshot is unknown. - format: date-time - type: string - error: - description: error is the last observed error during snapshot creation, - if any. This field could be helpful to upper level controllers(i.e., - application controller) to decide whether they should continue on - waiting for the snapshot to be created based on the type of error - reported. - properties: - message: - description: 'message is a string detailing the encountered error - during snapshot creation if specified. NOTE: message may be - logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used - to restore a volume. In dynamic snapshot creation case, this field - will be filled in with the "ready_to_use" value returned from CSI - "CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, - this field will be filled with the "ready_to_use" value returned - from the CSI "ListSnapshots" gRPC call if the driver supports it, - otherwise, this field will be set to "True". If not specified, it - means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - type: string - description: restoreSize represents the complete size of the snapshot - in bytes. In dynamic snapshot creation case, this field will be - filled in with the "size_bytes" value returned from CSI "CreateSnapshotRequest" - gRPC call. For a pre-existing snapshot, this field will be filled - with the "size_bytes" value returned from the CSI "ListSnapshots" - gRPC call if the driver supports it. When restoring a volume from - this snapshot, the size of the volume MUST NOT be smaller than the - restoreSize if it is specified, otherwise the restoration will fail. - If not specified, it indicates that the size is unknown. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end}} -{{- end}} -{{- end}} \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/templates/portworx-csi.yaml b/charts/portworx/portworx-essentials/templates/portworx-csi.yaml deleted file mode 100644 index b3b543483..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-csi.yaml +++ /dev/null @@ -1,195 +0,0 @@ -{{- if or (and (.Values.csi) (eq .Values.csi true)) (not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty))}} -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: px-csi-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-csi-role -rules: -- apiGroups: ["extensions"] - resources: ["podsecuritypolicies"] - resourceNames: ["privileged"] - verbs: ["use"] -- apiGroups: ["apiextensions.k8s.io"] - resources: ["customresourcedefinitions"] - verbs: ["*"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: ["persistentvolumes"] - verbs: ["get", "list", "watch", "create", "delete", "update", "patch"] -- apiGroups: [""] - resources: ["persistentvolumeclaims"] - verbs: ["get", "list", "watch", "update"] -- apiGroups: [""] - resources: ["persistentvolumeclaims/status"] - verbs: ["update", "patch"] -- apiGroups: [""] - resources: ["pods"] - verbs: ["get", "list", "watch"] -- apiGroups: ["storage.k8s.io"] - resources: ["storageclasses"] - verbs: ["get", "list", "watch"] -- apiGroups: ["storage.k8s.io"] - resources: ["volumeattachments"] - verbs: ["get", "list", "watch", "update", "patch"] -- apiGroups: ["storage.k8s.io"] - resources: ["csistoragecapacities"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] -- apiGroups: ["apps"] - resources: ["replicasets"] - verbs: ["get"] -- apiGroups: [""] - resources: ["events"] - verbs: ["list", "watch", "create", "update", "patch"] -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list"] -- apiGroups: ["snapshot.storage.k8s.io"] - resources: ["volumesnapshots", "volumesnapshotcontents", "volumesnapshotclasses", "volumesnapshots/status", "volumesnapshotcontents/status"] - verbs: ["create", "get", "list", "watch", "update", "delete"] -- apiGroups: ["csi.storage.k8s.io"] - resources: ["csinodeinfos"] - verbs: ["get", "list", "watch", "update"] -- apiGroups: ["storage.k8s.io"] - resources: ["csinodes"] - verbs: ["get", "list", "watch", "update"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] -- apiGroups: ["csi.storage.k8s.io"] - resources: ["csidrivers"] - verbs: ["create", "delete"] -- apiGroups: [""] - resources: ["endpoints"] - verbs: ["get", "watch", "list", "delete", "update", "create"] -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "watch", "list", "delete", "update", "create"] -- apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["*"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-csi-role-binding -subjects: -- kind: ServiceAccount - name: px-csi-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: px-csi-role - apiGroup: rbac.authorization.k8s.io ---- -kind: Service -apiVersion: v1 -metadata: - name: px-csi-service - namespace: kube-system -spec: - clusterIP: None ---- -kind: Deployment -apiVersion: apps/v1 -metadata: - name: px-csi-ext - namespace: kube-system -spec: - selector: - matchLabels: - app: px-csi-driver - replicas: 1 - template: - metadata: - labels: - app: px-csi-driver - spec: - serviceAccount: px-csi-account - containers: - - name: csi-external-provisioner - imagePullPolicy: Always - image: {{ template "px.getCSIProvisionerImage" . }} - args: - - "--v=3" - - "--csi-address=$(ADDRESS)" - {{- if semverCompare "<1.17.0-0" .Capabilities.KubeVersion.GitVersion }} - - "--provisioner=pxd.portworx.com" - - "--enable-leader-election" - - "--leader-election-type={{if and (semverCompare ">=1.13.0-0" .Capabilities.KubeVersion.GitVersion) (semverCompare "<1.14.0-0" .Capabilities.KubeVersion.GitVersion) }}endpoints{{else}}leases{{end}}" - {{- else }} - - "--leader-election=true" - - "--default-fstype=ext4" - {{- end }} - env: - - name: ADDRESS - value: /csi/csi.sock - securityContext: - privileged: true - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- if semverCompare ">=1.12.0-0" .Capabilities.KubeVersion.GitVersion }} - - name: csi-snapshotter - imagePullPolicy: Always - image: {{ template "px.getCSISnapshotterImage" . }} - args: - - "--v=3" - - "--csi-address=$(ADDRESS)" - - "--leader-election=true" - {{if and (semverCompare ">=1.13.0-0" .Capabilities.KubeVersion.GitVersion) (semverCompare "<1.14.0-0" .Capabilities.KubeVersion.GitVersion) }} - - "--leader-election-type=configmaps" - {{- end}} - env: - - name: ADDRESS - value: /csi/csi.sock - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- end }} - {{- if semverCompare ">=1.17.0-0" .Capabilities.KubeVersion.GitVersion }} - - name: csi-snapshot-controller - imagePullPolicy: Always - image: {{ template "px.getCSISnapshotControllerImage" . }} - args: - - "--v=3" - - "--leader-election=true" - env: - - name: ADDRESS - value: /csi/csi.sock - securityContext: - privileged: true - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- end }} - {{- if semverCompare ">=1.16.0-0" .Capabilities.KubeVersion.GitVersion }} - - name: csi-resizer - imagePullPolicy: Always - image: k8s.gcr.io/sig-storage/csi-resizer:v1.3.0 - args: - - "--v=3" - - "--csi-address=$(ADDRESS)" - - "--leader-election=true" - env: - - name: ADDRESS - value: /csi/csi.sock - securityContext: - privileged: true - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- end }} - volumes: - - name: socket-dir - hostPath: - path: /var/lib/kubelet/plugins/pxd.portworx.com - type: DirectoryOrCreate -{{- end }} \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/templates/portworx-ds.yaml b/charts/portworx/portworx-essentials/templates/portworx-ds.yaml deleted file mode 100644 index 8c8209ea2..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-ds.yaml +++ /dev/null @@ -1,477 +0,0 @@ -{{/* Setting defaults if they are omitted. */}} -{{- $deployEnvironmentIKS := .Capabilities.KubeVersion.GitVersion | regexMatch "IKS" }} -{{- $usefileSystemDrive := .Values.usefileSystemDrive | default false }} -{{- $usedrivesAndPartitions := .Values.usedrivesAndPartitions | default false }} -{{- $secretType := .Values.secretType | default "k8s" }} -{{- $journalDevice := .Values.journalDevice | default "none" }} -{{- $maxStorageNodes := .Values.maxStorageNodes | default "none" }} -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -{{- $registrySecret := .Values.registrySecret | default "none" }} - -{{- $dataInterface := .Values.dataInterface | default "none" }} -{{- $managementInterface := .Values.managementInterface | default "none" }} -{{- $essentialSecretID := .Values.essentialID | default "none" }} - -{{- $envVars := .Values.envVars | default "none" }} -{{- $isCoreOS := .Values.isTargetOSCoreOS | default false }} - -{{- $pksInstall := .Values.pksInstall | default false }} -{{- $internalKVDB := .Values.etcdType | default "none" }} -{{- $csi := .Values.csi | default (not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty)) }} - -{{- $etcdCredentials := .Values.etcd.credentials | default "none:none" }} -{{- $etcdCertPath := .Values.etcd.ca | default "none" }} -{{- $etcdCA := .Values.etcd.ca | default "none" }} -{{- $etcdCert := .Values.etcd.cert | default "none" }} -{{- $etcdKey := .Values.etcd.key | default "none" }} -{{- $consulToken := .Values.consul.token | default "none" }} -{{- $misc := .Values.misc | default "" | split " " }} -{{- $etcdEndPoints := .Values.kvdb }} - -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: portworx - namespace: kube-system - labels: - name: portworx -spec: - minReadySeconds: 0 - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - selector: - matchLabels: - name: portworx - app: portworx - template: - metadata: - labels: - app: portworx - name: portworx - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: px/enabled - operator: NotIn - values: - - "false" - {{- if and (.Values.openshiftInstall) (eq .Values.openshiftInstall true)}} - - key: openshift-infra - operator: DoesNotExist - {{- else if or (not .Values.deployOnMaster) (eq .Values.deployOnMaster false)}} - - key: node-role.kubernetes.io/master - operator: DoesNotExist - {{- end }} - hostNetwork: true - hostPID: true - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - containers: - # {{ template "px.getImage"}} - - name: portworx - image: {{ template "px.getImage" . }}:{{ required "A valid Image tag is required in the SemVer format" .Values.imageVersion }} - terminationMessagePath: "/tmp/px-termination-log" - imagePullPolicy: Always - args: - [ - {{ include "px.storage" . | indent 0 }} - {{- with .Values -}} - {{- if eq "Built-in" $internalKVDB }} - "-b", - {{- end -}} - - {{- if ne $journalDevice "none" }} - "-j", "{{ $journalDevice }}", - {{- end -}} - - {{- if $etcdEndPoints -}} - "-k", "{{ regexReplaceAllLiteral "(;)" .kvdb "," }}", - {{- else }} - {{- if ne "Built-in" $internalKVDB }} - {{- if eq "US region" .region }} - "-k", "etcd:http://px-etcd1.portworx.com:2379,etcd:http://px-etcd2.portworx.com:2379,etcd:http://px-etcd3.portworx.com:2379", - {{- else if eq "EU region" .region }} - "-k", "etcd:http://px-eu-etcd1.portworx.com:2379,etcd:http://px-eu-etcd2.portworx.com:2379,etcd:http://px-eu-etcd3.portworx.com:2379", - {{- else }} - "{{ required "A valid kvdb url is required." .kvdb }}" - {{- end -}} - {{- end -}} - {{- end -}} - "-c", "{{ required "Clustername cannot be empty" .clusterName }}", - - {{- if ne $secretType "none" }} - "-secret_type", "{{ $secretType }}", - {{- else }} - {{- if $deployEnvironmentIKS }} - "-secret_type", "ibm-kp", - {{- end -}} - {{- end -}} - - {{- if and (ne $dataInterface "none") (ne $dataInterface "auto")}} - "-d", "{{ $dataInterface }}", - {{- end -}} - - {{- if and (ne $managementInterface "none") (ne $managementInterface "auto") }} - "-m", "{{ $managementInterface }}", - {{- end -}} - - {{- if ne $etcdCredentials "none:none" }} - "-userpwd", "{{ $etcdCredentials }}", - {{- end -}} - - {{- if ne $etcdCA "none" }} - "-ca", "/etc/pwx/etcdcerts/{{ $etcdCA }}", - {{- end -}} - - {{- if ne $etcdCert "none" }} - "-cert", "/etc/pwx/etcdcerts/{{ $etcdCert }}", - {{- end -}} - - {{- if ne $etcdKey "none" }} - "-key", "/etc/pwx/etcdcerts/{{ $etcdKey }}", - {{- end -}} - - {{- if ne $consulToken "none" }} - "-acltoken", "{{ $consulToken }}", - {{- end -}} - - {{- if .misc }} - {{- range $index, $name := $misc }} - "{{ $name }}", - {{- end }} - {{ end -}} - - {{- if ne $essentialSecretID "none" }} - "--oem", "esse", - {{ end -}} - "-marketplace_name","rancher_catalog", - "-x", "kubernetes" - {{- end -}} - ] - env: - - name: "PX_TEMPLATE_VERSION" - value: "v2" - {{ if not (eq $envVars "none") }} - {{- $vars := $envVars | split ";" }} - {{- range $key, $val := $vars }} - {{- $envVariable := $val | split "=" }} - - name: {{ $envVariable._0 | trim | quote }} - value: {{ $envVariable._1 | trim | quote }} - {{ end }} - {{- end }} - - {{- if not (eq $registrySecret "none") }} - - name: REGISTRY_CONFIG - valueFrom: - secretKeyRef: - {{- if (semverCompare ">=1.9-0" .Capabilities.KubeVersion.GitVersion) or (.Values.openshiftInstall and semverCompare ">=1.8-0" .Capabilities.KubeVersion.GitVersion) }} - key: ".dockerconfigjson" - {{- else }} - key: ".dockercfg" - {{- end }} - name: "{{ $registrySecret }}" - {{- end }} - - {{- if eq $pksInstall true }} - - name: "PRE-EXEC" - value: "if [ ! -x /bin/systemctl ]; then apt-get update; apt-get install -y systemd; fi" - {{- end }} - - {{- if eq $csi true }} - - name: CSI_ENDPOINT - value: unix:///var/lib/kubelet/plugins/pxd.portworx.com/csi.sock - {{- end }} - - livenessProbe: - periodSeconds: 30 - initialDelaySeconds: 840 # allow image pull in slow networks - httpGet: - host: 127.0.0.1 - path: /status - port: 9001 - readinessProbe: - periodSeconds: 10 - httpGet: - host: 127.0.0.1 - {{- if eq (.Values.deploymentType | upper | lower) "oci" }} - path: /health - port: 9015 - {{- else }} - path: /v1/cluster/nodehealth - port: 9001 - {{- end}} - securityContext: - privileged: true - volumeMounts: - {{- if not (eq $etcdCertPath "none") }} - - mountPath: /etc/pwx/etcdcerts - name: etcdcerts - {{- end }} - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - - name: containerd-k3s - mountPath: /run/containerd/containerd.sock - {{- end }} - - name: dockersock - mountPath: /var/run/docker.sock - - name: containerdsock - mountPath: /run/containerd - - name: etcpwx - mountPath: /etc/pwx - - name: cores - mountPath: /var/cores - {{- if eq (.Values.deploymentType | upper | lower) "oci" }} - - name: optpwx - mountPath: /opt/pwx - - name: sysdmount - mountPath: /etc/systemd/system - - name: journalmount1 - mountPath: /var/run/log - readOnly: true - - name: journalmount2 - mountPath: /var/log - readOnly: true - - name: dbusmount - mountPath: /var/run/dbus - - name: hostproc - mountPath: /host_proc - {{- else if eq (.Values.deploymentType | upper | lower) "docker" }} - - name: dev - mountPath: /dev - - name: optpwx - mountPath: /export_bin - - name: dockerplugins - mountPath: /run/docker/plugins - - name: hostproc - mountPath: /hostproc - {{- if semverCompare "< 1.10-0" .Capabilities.KubeVersion.GitVersion }} - - name: libosd - mountPath: /var/lib/osd:shared - {{- if (.Values.openshiftInstall) and (eq .Values.openshiftInstall true)}} - - name: kubelet - mountPath: /var/lib/origin/openshift.local.volumes:shared - {{- else }} - - name: kubelet - mountPath: /var/lib/kubelet:shared - {{- end }} - - {{- else }} - - name: libosd - mountPath: /var/lib/osd - mountPropagation: "Bidirectional" - {{- if (.Values.openshiftInstall) and (eq .Values.openshiftInstall true)}} - - name: kubelet - mountPath: /var/lib/origin/openshift.local.volumes - mountPropagation: "Bidirectional" - {{- else }} - - name: kubelet - mountPath: /var/lib/kubelet - mountPropagation: "Bidirectional" - {{- end }} - - {{- end }} - - {{- if eq $isCoreOS true}} - - name: src - mountPath: /lib/modules - {{- else }} - - name: src - mountPath: /usr/src - {{- end }} - {{- end }} - - {{- if eq $csi true }} - - name: csi-node-driver-registrar - imagePullPolicy: Always - {{- if eq $customRegistryURL "none" }} - image: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0" - {{- else }} - image: "{{ $customRegistryURL }}/k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0" - {{- end}} - args: - - "--v=5" - - "--csi-address=$(ADDRESS)" - - "--kubelet-registration-path=/var/lib/kubelet/plugins/pxd.portworx.com/csi.sock" - env: - - name: ADDRESS - value: /csi/csi.sock - - name: KUBE_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - volumeMounts: - - name: csi-driver-path - mountPath: /csi - - name: registration-dir - mountPath: /registration - {{- end }} - - restartPolicy: Always - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - tolerations: - - key: node-role.kubernetes.io/master - effect: NoSchedule - {{- end }} - serviceAccountName: px-account - volumes: - {{- if ne $etcdCertPath "none" }} - - name: etcdcerts - secret: - secretName: px-etcd-certs - items: - - key: "{{ $etcdCA }}" - path: "{{ $etcdCA }}" - - key: "{{ $etcdCert }}" - path: "{{ $etcdCert }}" - - key: "{{ $etcdKey }}" - path: "{{ $etcdKey }}" - {{- end}} - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - - name: containerd-k3s - hostPath: - path: /run/k3s/containerd/containerd.sock - {{- end }} - - name: dockersock - hostPath: - path: {{if eq $pksInstall true}}/var/vcap/sys/run/docker/docker.sock{{else}}/var/run/docker.sock{{end}} - - name: containerdsock - hostPath: - path: {{if eq $pksInstall true}}/var/vcap/sys/run/containerd{{else}}/run/containerd{{end}} - {{- if eq $csi true}} - - name: csi-driver-path - hostPath: - path: /var/lib/kubelet/plugins/pxd.portworx.com - type: DirectoryOrCreate - - name: registration-dir - hostPath: - path: /var/lib/kubelet/plugins_registry - type: DirectoryOrCreate - {{- end}} - - name: etcpwx - hostPath: - path: /etc/pwx - - name: cores - hostPath: - path: {{if eq $pksInstall true }}/var/vcap/store/cores{{else}}/var/cores{{end}} - {{- if eq (.Values.deploymentType | upper | lower) "oci" }} - - name: optpwx - hostPath: - path: {{if eq $pksInstall true }}/var/vcap/store/opt/pwx{{else}}/opt/pwx{{end}} - - name: sysdmount - hostPath: - path: /etc/systemd/system - - name: journalmount1 - hostPath: - path: /var/run/log - - name: journalmount2 - hostPath: - path: /var/log - - name: dbusmount - hostPath: - path: /var/run/dbus - - name: hostproc - hostPath: - path: /proc - {{- else if eq (.Values.deploymentType | upper | lower) "docker" }} - - name: libosd - hostPath: - path: /var/lib/osd - - name: optpwx - hostPath: - path: /opt/pwx/bin - - name: dev - hostPath: - path: /dev - {{- if (.Values.openshiftInstall) and (eq .Values.openshiftInstall true)}} - - name: kubelet - hostPath: - path: /var/lib/origin/openshift.local.volumes - {{- else }} - - name: kubelet - hostPath: - path: /var/lib/kubelet - {{- end }} - {{- if eq $isCoreOS true}} - - name: src - hostPath: - path: /lib/modules - {{- else }} - - name: src - hostPath: - path: /usr/src - {{- end }} - - name: dockerplugins - hostPath: - path: /run/docker/plugins - - name: hostproc - hostPath: - path: /proc - {{- end }} ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: portworx-api - namespace: kube-system - labels: - name: portworx-api -spec: - selector: - matchLabels: - name: portworx-api - minReadySeconds: 0 - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 100% - template: - metadata: - labels: - name: portworx-api - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: px/enabled - operator: NotIn - values: - - "false" - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - - key: node-role.kubernetes.io/master - operator: DoesNotExist - {{- end }} - hostNetwork: true - hostPID: false - containers: - - name: portworx-api - image: "{{ template "px.getPauseImage" . }}/pause:3.1" - imagePullPolicy: Always - readinessProbe: - periodSeconds: 10 - httpGet: - host: 127.0.0.1 - path: /status - port: 9001 - restartPolicy: Always - serviceAccountName: px-account -{{- if eq $csi true }} ---- -apiVersion: storage.k8s.io/v1 -kind: CSIDriver -metadata: - name: "pxd.portworx.com" -spec: - attachRequired: false - podInfoOnMount: true - volumeLifecycleModes: - - Persistent - - Ephemeral -{{- end}} \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/templates/portworx-essential.yaml b/charts/portworx/portworx-essentials/templates/portworx-essential.yaml deleted file mode 100644 index 6decc3047..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-essential.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- $essentialSecretID := .Values.essentialID | default "none" }} -{{- if ne $essentialSecretID "none" -}} -apiVersion: v1 -kind: Secret -metadata: - name: px-essential - namespace: kube-system - labels: - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" -type: Opaque -data: - px-essen-user-id: {{ $essentialSecretID | b64enc }} - px-osb-endpoint: aHR0cHM6Ly9weGVzc2VudGlhbHMucG9ydHdvcnguY29tL29zYi9iaWxsaW5nL3YxL3JlZ2lzdGVy - px-essen-market-place: cmFuY2hlci1tYXJrZXRwbGFjZQ== -{{- end -}} \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/templates/portworx-rbac-config.yaml b/charts/portworx/portworx-essentials/templates/portworx-rbac-config.yaml deleted file mode 100644 index 468b6dada..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-rbac-config.yaml +++ /dev/null @@ -1,83 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: portworx ---- -kind: Role -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-role - namespace: portworx -rules: - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "create", "update", "patch", "delete"] ---- -kind: RoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-role-binding - namespace: portworx -subjects: - - kind: ServiceAccount - name: px-account - namespace: kube-system -roleRef: - kind: Role - name: px-role - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: px-account - namespace: kube-system ---- - -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: node-get-put-list-role -rules: -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["watch", "get", "update", "list"] -- apiGroups: [""] - resources: ["pods"] - verbs: ["delete", "get", "list", "watch", "update"] -- apiGroups: [""] - resources: ["persistentvolumeclaims", "persistentvolumes"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "list", "update", "create"] -- apiGroups: ["extensions"] - resources: ["podsecuritypolicies"] - resourceNames: ["privileged"] - verbs: ["use"] -- apiGroups: ["portworx.io"] - resources: ["volumeplacementstrategies"] - verbs: ["get", "list"] -- apiGroups: ["stork.libopenstorage.org"] - resources: ["backuplocations"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["events"] - verbs: ["create"] ---- - -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: node-role-binding -subjects: -- kind: ServiceAccount - name: px-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: node-get-put-list-role - apiGroup: rbac.authorization.k8s.io diff --git a/charts/portworx/portworx-essentials/templates/portworx-service.yaml b/charts/portworx/portworx-essentials/templates/portworx-service.yaml deleted file mode 100644 index 8d3ac159d..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-service.yaml +++ /dev/null @@ -1,54 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: portworx-service - namespace: kube-system - labels: - name: portworx -spec: - selector: - name: portworx - type: ClusterIP - ports: - - name: px-api - protocol: TCP - port: 9001 - targetPort: 9001 - - name: px-kvdb - protocol: TCP - port: 9019 - targetPort: 9019 - - name: px-sdk - protocol: TCP - port: 9020 - targetPort: 9020 - - name: px-rest-gateway - protocol: TCP - port: 9021 - targetPort: 9021 ---- -kind: Service -apiVersion: v1 -metadata: - name: portworx-api - namespace: kube-system - labels: - name: portworx-api -spec: - selector: - name: portworx-api - type: ClusterIP - ports: - - name: px-api - protocol: TCP - port: 9001 - targetPort: 9001 - - name: px-sdk - protocol: TCP - port: 9020 - targetPort: 9020 - - name: px-rest-gateway - protocol: TCP - port: 9021 - targetPort: 9021 ---- diff --git a/charts/portworx/portworx-essentials/templates/portworx-storageclasses.yaml b/charts/portworx/portworx-essentials/templates/portworx-storageclasses.yaml deleted file mode 100644 index b430fee8f..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-storageclasses.yaml +++ /dev/null @@ -1,56 +0,0 @@ -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-db-sc -provisioner: kubernetes.io/portworx-volume -parameters: - repl: "3" - io_profile: "db" ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-db2-sc -provisioner: kubernetes.io/portworx-volume -parameters: - repl: "3" - block_size: "512b" - io_profile: "db" ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-shared-sc -provisioner: kubernetes.io/portworx-volume -parameters: - repl: "3" - shared: "true" ---- -# -# NULL StorageClass that documents all possible -# Portworx StorageClass parameters -# -# Please refer to : https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html -# -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-null-sc - annotations: - params/docs: 'https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html' - params/fs: "Filesystem to be laid out: none|xfs|ext4 " - params/block_size: "Block size" - params/repl: "Replication factor for the volume: 1|2|3" - params/shared: "Flag to create a globally shared namespace volume which can be used by multiple pods : true|false" - params/priority_io: "IO Priority: low|medium|high" - params/io_profile: "IO Profile can be used to override the I/O algorithm Portworx uses for the volumes. Supported values are [db](/maintain/performance/tuning.html#db), [sequential](/maintain/performance/tuning.html#sequential), [random](/maintain/performance/tuning.html#random), [cms](/maintain/performance/tuning.html#cms)" - params/group: "The group a volume should belong too. Portworx will restrict replication sets of volumes of the same group on different nodes. If the force group option 'fg' is set to true, the volume group rule will be strictly enforced. By default, it's not strictly enforced." - params/fg: "This option enforces volume group policy. If a volume belonging to a group cannot find nodes for it's replication sets which don't have other volumes of same group, the volume creation will fail." - params/label: "List of comma-separated name=value pairs to apply to the Portworx volume" - params/nodes: "Comma-separated Portworx Node ID's to use for replication sets of the volume" - params/aggregation_level: "Specifies the number of replication sets the volume can be aggregated from" - params/snap_schedule: "Snapshot schedule. Following are the accepted formats: periodic=_mins_,_snaps-to-keep_ daily=_hh:mm_,_snaps-to-keep_ weekly=_weekday@hh:mm_,_snaps-to-keep_ monthly=_day@hh:mm_,_snaps-to-keep_ _snaps-to-keep_ is optional. Periodic, Daily, Weekly and Monthly keep last 5, 7, 5 and 12 snapshots by default respectively" - params/sticky: "Flag to create sticky volumes that cannot be deleted until the flag is disabled" - params/journal: "Flag to indicate if you want to use journal device for the volume's metadata. This will use the journal device that you used when installing Portworx. As of PX version 1.3, it is recommended to use a journal device to absorb PX metadata writes" -provisioner: kubernetes.io/portworx-volume -parameters: diff --git a/charts/portworx/portworx-essentials/templates/portworx-stork.yaml b/charts/portworx/portworx-essentials/templates/portworx-stork.yaml deleted file mode 100644 index 77449b394..000000000 --- a/charts/portworx/portworx-essentials/templates/portworx-stork.yaml +++ /dev/null @@ -1,645 +0,0 @@ -{{- if and (.Values.stork) (eq .Values.stork true)}} - {{- $isCoreOS := .Values.isTargetOSCoreOS | default false }} - {{- $customRegistryURL := .Values.customRegistryURL | default "none" }} - {{- $registrySecret := .Values.registrySecret | default "none" }} - -apiVersion: v1 -kind: ConfigMap -metadata: - name: stork-config - namespace: kube-system -data: - policy.cfg: |- - { - "kind": "Policy", - "apiVersion": "v1", -{{- if semverCompare "< 1.10-0" .Capabilities.KubeVersion.GitVersion }} - "predicates": [ -{{- if semverCompare "< 1.9-0" .Capabilities.KubeVersion.GitVersion }} - {"name": "NoVolumeNodeConflict"}, -{{- end}} - {"name": "MaxAzureDiskVolumeCount"}, - {"name": "NoVolumeZoneConflict"}, - {"name": "PodToleratesNodeTaints"}, - {"name": "CheckNodeMemoryPressure"}, - {"name": "MaxEBSVolumeCount"}, - {"name": "MaxGCEPDVolumeCount"}, - {"name": "MatchInterPodAffinity"}, - {"name": "NoDiskConflict"}, - {"name": "GeneralPredicates"}, - {"name": "CheckNodeDiskPressure"} - ], - "priorities": [ - {"name": "NodeAffinityPriority", "weight": 1}, - {"name": "TaintTolerationPriority", "weight": 1}, - {"name": "SelectorSpreadPriority", "weight": 1}, - {"name": "InterPodAffinityPriority", "weight": 1}, - {"name": "LeastRequestedPriority", "weight": 1}, - {"name": "BalancedResourceAllocation", "weight": 1}, - {"name": "NodePreferAvoidPodsPriority", "weight": 1} - ], -{{- end}} - "extenders": [ - { - "urlPrefix": "http://stork-service.kube-system:8099", - "apiVersion": "v1beta1", - "filterVerb": "filter", - "prioritizeVerb": "prioritize", - "weight": 5, - "enableHttps": false, - "nodeCacheCapable": false - } - ] - } ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: stork-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-role -rules: - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-role-binding -subjects: - - kind: ServiceAccount - name: stork-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: stork-role - apiGroup: rbac.authorization.k8s.io ---- -kind: Service -apiVersion: v1 -metadata: - name: stork-service - namespace: kube-system -spec: - selector: - name: stork - ports: - - name: extender - protocol: TCP - port: 8099 - targetPort: 8099 - - name: webhook - protocol: TCP - port: 443 - targetPort: 443 ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: volumeplacementstrategies.portworx.io -spec: - group: portworx.io - versions: - - name: v1beta2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - description: The desired spec of the volume placement strategy - properties: - replicaAffinity: - type: array - description: Allows you to specify a rule which creates an affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the replica affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - replicaAntiAffinity: - type: array - description: Allows you to specify a rule that creates an anti-affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica anti affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - required: - - topologyKey - volumeAffinity: - type: array - description: Allows you to colocate volumes by specifying rules that place replicas of a volume together with those of another volume for which the specified labels match - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - volumeAntiAffinity: - type: array - description: Allows you to specify dissociation rules between 2 or more volumes that match the given labels - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume anti affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - - name: v1beta1 - served: false - storage: false - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - description: The desired spec of the volume placement strategy - properties: - replicaAffinity: - type: array - description: Allows you to specify a rule which creates an affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the replica affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - replicaAntiAffinity: - type: array - description: Allows you to specify a rule that creates an anti-affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica anti affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - required: - - topologyKey - volumeAffinity: - type: array - description: Allows you to colocate volumes by specifying rules that place replicas of a volume together with those of another volume for which the specified labels match - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - volumeAntiAffinity: - type: array - description: Allows you to specify dissociation rules between 2 or more volumes that match the given labels - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume anti affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - scope: Cluster - names: - plural: volumeplacementstrategies - singular: volumeplacementstrategy - kind: VolumePlacementStrategy - shortNames: - - vps - - vp ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - tier: control-plane - name: stork - namespace: kube-system -spec: - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - replicas: 3 - selector: - matchLabels: - name: stork - tier: control-plane - template: - metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - name: stork - tier: control-plane - spec: - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - containers: - - command: - - /stork - - --driver=pxd - - --verbose - - --leader-elect=true - - --webhook-controller=false - imagePullPolicy: Always - image: {{ template "px.getStorkImage" . }}:{{ required "A valid Image tag is required in the SemVer format" .Values.storkVersion }} - resources: - requests: - cpu: '0.1' - name: stork - hostPID: false - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "name" - operator: In - values: - - stork - topologyKey: "kubernetes.io/hostname" - serviceAccountName: stork-account ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: stork-snapshot-sc -provisioner: stork-snapshot ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: stork-scheduler-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-scheduler-role -rules: - - apiGroups: [""] - resources: ["endpoints"] - verbs: ["get", "update"] - - apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "list", "watch"] - - apiGroups: ["", "events.k8s.io"] - resources: ["events"] - verbs: ["create", "patch", "update"] - - apiGroups: [""] - resources: ["endpoints"] - verbs: ["create"] - - apiGroups: [""] - resourceNames: ["kube-scheduler"] - resources: ["endpoints"] - verbs: ["delete", "get", "patch", "update"] - - apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["pods"] - verbs: ["delete", "get", "list", "watch"] - - apiGroups: [""] - resources: ["bindings", "pods/binding"] - verbs: ["create"] - - apiGroups: [""] - resources: ["pods/status"] - verbs: ["patch", "update"] - - apiGroups: [""] - resources: ["replicationcontrollers", "services"] - verbs: ["get", "list", "watch"] - - apiGroups: ["apps", "extensions"] - resources: ["replicasets"] - verbs: ["get", "list", "watch"] - - apiGroups: ["apps"] - resources: ["statefulsets"] - verbs: ["get", "list", "watch"] - - apiGroups: ["policy"] - resources: ["poddisruptionbudgets"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["persistentvolumeclaims", "persistentvolumes"] - verbs: ["get", "list", "watch"] - - apiGroups: ["storage.k8s.io"] - resources: ["storageclasses", "csinodes", "csidrivers", "csistoragecapacities"] - verbs: ["get", "list", "watch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create", "update", "get", "list", "watch"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-scheduler-role-binding -subjects: - - kind: ServiceAccount - name: stork-scheduler-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: stork-scheduler-role - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - component: scheduler - tier: control-plane - name: stork-scheduler - namespace: kube-system -spec: - replicas: 3 - selector: - matchLabels: - component: scheduler - tier: control-plane - template: - metadata: - labels: - component: scheduler - tier: control-plane - name: stork-scheduler - spec: - containers: - - command: - - /usr/local/bin/kube-scheduler - - --address=0.0.0.0 - - --leader-elect=true - - --scheduler-name=stork - - --policy-configmap=stork-config - - --policy-configmap-namespace=kube-system - - --lock-object-name=stork-scheduler - image: "{{ template "px.getk8sImages" . }}/kube-scheduler-amd64:v1.21.4" - livenessProbe: - httpGet: - path: /healthz - port: 10251 - initialDelaySeconds: 15 - name: stork-scheduler - readinessProbe: - httpGet: - path: /healthz - port: 10251 - resources: - requests: - cpu: '0.1' - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "name" - operator: In - values: - - stork-scheduler - topologyKey: "kubernetes.io/hostname" - hostPID: false - serviceAccountName: stork-scheduler-account - {{- end }} diff --git a/charts/portworx/portworx-essentials/templates/serviceaccount-hook.yaml b/charts/portworx/portworx-essentials/templates/serviceaccount-hook.yaml deleted file mode 100644 index 9f4f0defd..000000000 --- a/charts/portworx/portworx-essentials/templates/serviceaccount-hook.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "px.hookServiceAccount" . }} - namespace: kube-system - annotations: - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook": "post-install,pre-delete,post-delete" - labels: - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - annotations: - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook": "post-install,pre-delete,post-delete" - name: {{ template "px.hookClusterRole" . }} -rules: -- apiGroups: [""] - resources: ["nodes"] - verbs: ["patch", "get", "update", "list"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - annotations: - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook": "post-install,pre-delete,post-delete" - name: {{ template "px.hookClusterRoleBinding" . }} -subjects: -- kind: ServiceAccount - name: {{ template "px.hookServiceAccount" . }} - namespace: kube-system -roleRef: - kind: ClusterRole - name: {{ template "px.hookClusterRole" . }} - apiGroup: rbac.authorization.k8s.io \ No newline at end of file diff --git a/charts/portworx/portworx-essentials/values.yaml b/charts/portworx/portworx-essentials/values.yaml deleted file mode 100644 index fccdf27b3..000000000 --- a/charts/portworx/portworx-essentials/values.yaml +++ /dev/null @@ -1,151 +0,0 @@ -# Please uncomment and specify values for these options as per your requirements. -kvdb: -ownEtcdOption: none -etcdAuth: none -etcdType: "Built-in" # KVDB type - -etcd: - credentials: none:none # Username and password for ETCD authentication in the form user:password - ca: none # Name of CA file for ETCD authentication. server.ca - cert: none # Name of certificate for ETCD authentication. Should be server.crt - key: none # Name of certificate key for ETCD authentication Should be server.key -consul: - token: none # ACL token value used for Consul authentication. (example: 398073a8-5091-4d9c-871a-bbbeb030d1f6) -region: none # US or EU regions for Portworx hosted etcds - -dataInterface: none # Name of the interface -managementInterface: none # Name of the interface -platformOptions: none # AKS, EKS or GKE platforms - -customRegistryURL: -registrySecret: - -clusterName: mycluster # This is the default. please change it to your cluster name. -secretType: k8s # Defaults to None, but can be AWS / KVDB / Vault. -envVars: none # NOTE: This is a ";" seperated list of environment variables. For eg: MYENV1=myvalue1;MYENV2=myvalue2 -stork: true # Use Stork https://docs.portworx.com/scheduler/kubernetes/stork.html for hyperconvergence. -storkVersion: 2.12.0 - -deployOnMaster: false # For POC only -csi: false # Enable CSI - -openshiftInstall: false -AKSorEKSInstall: false -serviceAccount: - hook: - create: true - name: - -deploymentType: oci # accepts "oci" or "docker" -imageType: none # -imageVersion: 2.11.4 # Version of the PX Image. - -result: none -environment: none -onpremStorage: none - -maxStorageNodes: none -journalDevice: none - -usefileSystemDrive: false # true/false Instructs PX to use an unmounted Drive even if it has a filesystem. -usedrivesAndPartitions: false # Use unmounted disks even if they have a partition or filesystem on it. PX will never use a drive or partition that is mounted. (useDrivesAndPartitions) - -provider: none -deviceConfig: none -essentialID: none - -drive_1: - aws: - type: none - size: none - iops: none - gc: - type: standard - size: 1000 - -drive_2: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_3: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_4: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_5: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_6: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_7: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_8: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_9: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_10: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -existingDisk1: none -existingDisk2: none -existingDisk3: none -existingDisk4: none -existingDisk5: none diff --git a/charts/portworx/portworx/Chart.yaml b/charts/portworx/portworx/Chart.yaml deleted file mode 100644 index f3972eabb..000000000 --- a/charts/portworx/portworx/Chart.yaml +++ /dev/null @@ -1,32 +0,0 @@ -annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/kube-version: '>=1.16.0-0' - catalog.cattle.io/release-name: portworx -apiVersion: v1 -appVersion: 2.11.4 -description: A Helm chart for installing Portworx on Kubernetes. -home: https://portworx.com/ -icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png -keywords: -- Storage -- ICP -- persistent disk -- pvc -- cloud native storage -- persistent storage -- portworx -- amd64 -maintainers: -- email: hadesai@purestorage.com - name: harsh-px -- email: onaumov@purestorage.com - name: trierra -- email: tasharma@purestorage.com - name: sharma-tapas -- email: dahuang@purestorage.com - name: dahuang-purestorage -name: portworx -sources: -- https://github.com/portworx/charts-rancher/tree/master/stable -version: 2.11.4 diff --git a/charts/portworx/portworx/README.md b/charts/portworx/portworx/README.md deleted file mode 100644 index 76066d7e2..000000000 --- a/charts/portworx/portworx/README.md +++ /dev/null @@ -1,76 +0,0 @@ -# Portworx - -## **Pre-requisites** - -Use this Helm chart to deploy [Portworx](https://portworx.com/) and [Stork](https://docs.portworx.com/scheduler/kubernetes/stork.html) to your Kubernetes cluster. - -Prerequisites - -Refer to the [Install Portworx on Kubernetes via Helm](https://docs.portworx.com/portworx-install-with-kubernetes/install-px-helm/#pre-requisites) page for the list of prerequisites. - -## **Limitations** -* The portworx helm chart can only be deployed in the kube-system namespace. Hence use "kube-system" in the "Target namespace" during configuration. - -## **Uninstalling the Chart** - -#### You can uninstall Portworx using one of the following methods: - -#### **1. Delete all the Kubernetes components associated with the chart and the release.** - -> **Note** > The Portworx configuration files under `/etc/pwx/` directory are preserved, and will not be deleted. - -To perform this operation simply delete the application from the Apps page - -#### **2. Wipe your Portworx installation** -> **Note** > The commands in this section are disruptive and will lead to data loss. Please use caution.. - -See more details [here](https://docs.portworx.com/portworx-install-with-kubernetes/install-px-helm/#uninstall) - -## **Documentation** -* [Portworx docs site](https://docs.portworx.com/install-with-other/rancher/rancher-2.x/#step-1-install-rancher) -* [Portworx interactive tutorials](https://docs.portworx.com/scheduler/kubernetes/px-k8s-interactive.html) - -## **Installing the Chart using the CLI** - -See the installation details [here](https://docs.portworx.com/portworx-install-with-kubernetes/install-px-helm/) - -## **Installing Portworx on AWS** - -See the installation details [here](https://docs.portworx.com/cloud-references/auto-disk-provisioning/aws) - -## ** Giving your etcd certificates to Portworx using Kubernetes Secrets.** -This is the recommended way of providing etcd certificates, as the certificates will be automatically available to the new nodes joining the cluster - -* Create Kubernetes secret -* Copy all your etcd certificates and key in a directory etcd-secrets/ to create a Kubernetes secret from it. Make sure the file names are the same as you gave above. - -``` -# ls -1 etcd-secrets/ -etcd-ca.crt -etcd.crt -etcd.key -``` - -* Use kubectl to create the secret named px-etcd-certs from the above files: -``` -# kubectl -n kube-system create secret generic px-etcd-certs --from-file=etcd-secrets/ -``` - -* Notice that the secret has 3 keys etcd-ca.crt, etcd.crt and etcd.key, corresponding to file names in the etcd-secrets folder. We will use these keys in the Portworx spec file to reference the certificates. - -``` -# kubectl -n kube-system describe secret px-etcd-certs -Name: px-etcd-certs -Namespace: kube-system -Labels: -Annotations: - -Type: Opaque - -Data -==== -etcd-ca.crt: 1679 bytes -etcd.crt: 1680 bytes -etcd.key: 414 bytes -``` -Once above secret is created, proceed to the next steps. diff --git a/charts/portworx/portworx/app-readme.md b/charts/portworx/portworx/app-readme.md deleted file mode 100644 index ae8bbe96f..000000000 --- a/charts/portworx/portworx/app-readme.md +++ /dev/null @@ -1,8 +0,0 @@ -# Portworx - -[Portworx](https://portworx.com/) is a software defined storage overlay that allows you to - - * Run containerized stateful applications that are highly-available (HA) across multiple nodes, cloud instances, regions, data centers or even clouds - * Migrate workflows between multiple clusters running across same or hybrid clouds - * Run hyperconverged workloads where the data resides on the same host as the applications - * Have programmatic control on your storage resources \ No newline at end of file diff --git a/charts/portworx/portworx/ci/test-values.yaml b/charts/portworx/portworx/ci/test-values.yaml deleted file mode 100644 index 879bf6910..000000000 --- a/charts/portworx/portworx/ci/test-values.yaml +++ /dev/null @@ -1 +0,0 @@ -etcdType: Built-in \ No newline at end of file diff --git a/charts/portworx/portworx/questions.yml b/charts/portworx/portworx/questions.yml deleted file mode 100644 index 81d648973..000000000 --- a/charts/portworx/portworx/questions.yml +++ /dev/null @@ -1,915 +0,0 @@ -categories: -- storage -namespace: kube-system -labels: - io.rancher.certified: partner -questions: - -################################### KVDB options ################################ -- variable: etcdType - label: "Select ETCD" - type: enum - required: true - group: "Key value store parameters (Required)" - options: - - "Provide your own etcd" - - "Built-in" - -# ------ "Provide your own etcd" ------ -- variable: ownEtcdOption - show_if: "etcdType=Provide your own etcd" - label: "Select one of 2 options for your ETCD cluster" - type: enum - required: true - group: "Key value store parameters (Required)" - options: - - "Your etcd details" - - "Portworx hosted (for PoCs only)" - -- variable: etcdAuth - show_if: "ownEtcdOption=Your etcd details&&etcdType=Provide your own etcd" - label: "Select an auth option for your ETCD cluster" - type: enum - default: "Disable HTTPS" - required: true - group: "Key value store parameters (Required)" - options: - - "Disable HTTPS" - - "Certificate Auth" - - "Password Auth" - -- variable: region - show_if: "ownEtcdOption=Portworx hosted (for PoCs only)" - label: "Select region" - type: enum - required: true - group: "Key value store parameters (Required)" - options: - - "US region" - - "EU region" - -# kvdb endpoint -- variable: kvdb - show_if: "ownEtcdOption=Your etcd details" - description: "Enter your etcd or Consul endpoints separated by semicolons. Use the following as an example: etcd://myetc1.company.com:2379;etcd://myetc2.company.com.2379. Note: If the `etcdAuth` key is set to 'Disable HTTPS', you must provide HTTP endpoints." - type: string - label: "Endpoint address" - required: true - group: "Key value store parameters (Required)" - -- variable: etcd.ca - show_if: "etcdAuth=Certificate Auth" - description: "Name of CA file for ETCD authentication. Example: etcd-ca.crt. Follow https://docs.portworx.com/scheduler/kubernetes/etcd-certs-using-secrets.html to create a Kubernetes secret for the etcd certs." - type: string - required: true - label: "ETCD CA file" - group: "Key value store security Parameters (Details in README)" - -- variable: etcd.cert - show_if: "etcdAuth=Certificate Auth" - description: "Name of certificate for ETCD authentication. Example: etcd.crt" - type: string - required: true - label: "ETCD cert file" - group: "Key value store security Parameters (Details in README)" - -- variable: etcd.key - show_if: "etcdAuth=Certificate Auth" - description: "Name of certificate key for ETCD authentication Example: etcd.key" - type: string - required: true - label: "ETCD cert key file" - group: "Key value store security Parameters (Details in README)" - -- variable: etcd.credentials - show_if: "etcdAuth=Password Auth" - description: "Username and password for ETCD authentication in the form user:password. Not needed if using certificates." - type: string - required: true - label: "ETCD credentials" - group: "Key value store security Parameters (Details in README)" - -################################### Storage options ################################ -- variable: environment - description: "Select your environment" - label: "Environment" - type: enum - default: "OnPrem" - required: true - group: "Storage Parameters" - options: - - "OnPrem" - - "Cloud" - -- variable: provider - show_if: "environment=Cloud" - description: "Select cloud platform" - label: "Cloud provider" - type: enum - required: true - group: "Storage Parameters" - options: - - "AWS" - - "Google cloud/GKE" - -- variable: onpremStorage - show_if: "environment=OnPrem" - type: enum - default: "Automatically scan disks" - label: "Select type of OnPrem storage" - group: "Storage Parameters" - required: true - options: - - "Automatically scan disks" - - "Manually specify disks" - -- variable: deviceConfig - show_if: "environment=Cloud" - description: "If you plan to use EC2 instance storage or plan to manage EBS volumes your own way, select 'Consume unused' or 'Use Existing disks'." - label: "Select a type of disk" - type: enum - default: "Create Using a Spec" - required: true - group: "Storage Parameters" - options: - - "Create Using a Spec" - - "Consume Unused" - - "Use Existing Disks" - - -- variable: journalDevice - description: "This allows PX to create it’s own journal partition on the best drive to absorb PX metadata writes. Journal writes are small with frequent syncs and hence a separate journal partition will enable better performance. Use value 'auto' if you want Portworx to create it's own journal partition." - type: string - label: "Journal Device" - group: "Storage Parameters" - -############ Consume unused ############## -- variable: usedrivesAndPartitions - show_if: "deviceConfig=Consume Unused||onpremStorage=Automatically scan disks" - label: "Use unmounted drives and partitions" - descrition: "Use unmounted disks even if they have a partition or filesystem on it. PX will never use a drive or partition that is mounted." - type: boolean - default: false - group: "Storage Parameters" - - -############ Use Exising Disks ############## -- variable: existingDisk1 - show_if: "deviceConfig=Use Existing Disks||onpremStorage=Manually specify disks" - label: "Drive/Device1" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk2 - show_if: "deviceConfig=Use Existing Disks||onpremStorage=Manually specify disks" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk2 - show_if: "addExistingDisk2=true" - label: "Drive/Device2" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk3 - show_if: "addExistingDisk2=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk3 - show_if: "addExistingDisk3=true" - label: "Drive/Device3" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk4 - show_if: "addExistingDisk3=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk4 - show_if: "addExistingDisk4=true" - label: "Drive/Device4" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -- variable: addExistingDisk5 - show_if: "addExistingDisk4=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: existingDisk5 - show_if: "addExistingDisk5=true" - label: "Drive/Device5" - description: "Enter the block/device name; eg: /dev/sda" - type: string - required: true - group: "Storage Parameters" - -##################################################### Cloud ################################ - -##################################################### AWS ################################ - -### Section 1 AWS -- variable: drive_1.aws.type - show_if: "provider=AWS&&deviceConfig=Create Using a Spec" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - default: "GP2" - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_1.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_1.aws.size - show_if: "provider=AWS&&deviceConfig=Create Using a Spec" - description: "Volume size" - label: "Size" - type: int - default: 150 - required: true - group: "Storage Parameters" - -### Section 2 AWS -- variable: addEBSDrive_2 - show_if: "provider=AWS&&deviceConfig=Create Using a Spec" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_2.aws.type - show_if: "addEBSDrive_2=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_2.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_2.aws.size - show_if: "addEBSDrive_2=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - - ### Section 3 AWS -- variable: addEBSDrive_3 - show_if: "addEBSDrive_2=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_3.aws.type - show_if: "addEBSDrive_3=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_3.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_3.aws.size - show_if: "addEBSDrive_3=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -### Section 4 AWS -- variable: addEBSDrive_4 - show_if: "addEBSDrive_3=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_4.aws.type - show_if: "addEBSDrive_4=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_4.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_4.aws.size - show_if: "addEBSDrive_4=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 5 AWS -- variable: addEBSDrive_5 - show_if: "addEBSDrive_4=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_5.aws.type - show_if: "addEBSDrive_5=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_5.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_5.aws.size - show_if: "addEBSDrive_5=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 6 AWS -- variable: addEBSDrive_6 - show_if: "addEBSDrive_5=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_6.aws.type - show_if: "addEBSDrive_6=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_6.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_6.aws.size - show_if: "addEBSDrive_6=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 7 AWS -- variable: addEBSDrive_7 - show_if: "addEBSDrive_6=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_7.aws.type - show_if: "addEBSDrive_7=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_7.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_7.aws.size - show_if: "addEBSDrive_7=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 8 AWS -- variable: addEBSDrive_8 - show_if: "addEBSDrive_7=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_8.aws.type - show_if: "addEBSDrive_8=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_8.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_8.aws.size - show_if: "addEBSDrive_8=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 9 AWS -- variable: addEBSDrive_9 - show_if: "addEBSDrive_8=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_9.aws.type - show_if: "addEBSDrive_9=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_9.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_9.aws.size - show_if: "addEBSDrive_9=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -### Section 10 AWS -- variable: addEBSDrive_10 - show_if: "addEBSDrive_9=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_10.aws.type - show_if: "addEBSDrive_10=true" - description: "Select the type of EBS volume" - label: "EBS volume" - type: enum - required: true - show_subquestion_if: "IO1" - group: "Storage Parameters" - options: - - "GP2" - - "IO1" - subquestions: - - variable: drive_10.aws.iops - required: true - description: "*IOPS required from EBS volume" - type: int - label: IOPS - -- variable: drive_10.aws.size - show_if: "addEBSDrive_10=true" - description: "Volume size" - label: "Size" - required: true - type: int - group: "Storage Parameters" - -##################################################### GOOGLE CLOUD ################################ - -#### Section 1 GC -- variable: drive_1.gc.type - show_if: "provider=Google cloud/GKE&&deviceConfig=Create Using a Spec" - description: "Select volume type" - label: "Volume" - type: enum - default: "standard" - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_1.gc.size - show_if: "provider=Google cloud/GKE&&deviceConfig=Create Using a Spec" - description: "Volume size" - label: "Size" - type: int - default: 150 - required: true - group: "Storage Parameters" - -#### Section 2 GC -- variable: addGCDrive_2 - show_if: "provider=Google cloud/GKE&&deviceConfig=Create Using a Spec" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_2.gc.type - show_if: "addGCDrive_2=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_2.gc.size - show_if: "addGCDrive_2=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 3 GC -- variable: addGCDrive_3 - show_if: "addGCDrive_2=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_3.gc.type - show_if: "addGCDrive_3=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_3.gc.size - show_if: "addGCDrive_3=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 4 GC -- variable: addGCDrive_4 - show_if: "addGCDrive_3=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_4.gc.type - show_if: "addGCDrive_4=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_4.gc.size - show_if: "addGCDrive_4=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 5 GC -- variable: addGCDrive_5 - show_if: "addGCDrive_4=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_5.gc.type - show_if: "addGCDrive_5=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_5.gc.size - show_if: "addGCDrive_5=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 6 GC -- variable: addGCDrive_6 - show_if: "addGCDrive_5=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_6.gc.type - show_if: "addGCDrive_6=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_6.gc.size - show_if: "addGCDrive_6=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 7 GC -- variable: addGCDrive_7 - show_if: "addGCDrive_6=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_7.gc.type - show_if: "addGCDrive_6=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_7.gc.size - show_if: "addGCDrive_7=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 8 GC -- variable: addGCDrive_8 - show_if: "addGCDrive_7=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_8.gc.type - show_if: "addGCDrive_8=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_8.gc.size - show_if: "addGCDrive_8=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 9 GC -- variable: addGCDrive_9 - show_if: "addGCDrive_8=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_9.gc.type - show_if: "addGCDrive_9=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_9.gc.size - show_if: "addGCDrive_9=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -#### Section 10 GC -- variable: addGCDrive_10 - show_if: "addGCDrive_9=true" - label: "Add another drive?" - type: boolean - default: false - group: "Storage Parameters" - -- variable: drive_10.gc.type - show_if: "addGCDrive_10=true" - description: "Select volume type" - label: "Volume" - type: enum - required: true - group: "Storage Parameters" - options: - - "standard" - - "ssd" - -- variable: drive_10.gc.size - show_if: "addGCDrive_10=true" - description: "Volume size" - label: "Size" - type: int - required: true - group: "Storage Parameters" - -- variable: maxStorageNodes - show_if: "environment=Cloud&&deviceConfig=Create Using a Spec" - description: "Max storage nodes per availability zone" - label: "Max storage nodes (Optional)" - type: int - group: "Storage Parameters" - -################################### Network options ################################ -- variable: dataInterface - description: "Specify your data network interface (example: `eth1`). If set to `auto`, Portworx will automatically select the first routable interface." - type: string - label: "Data Network Interface" - default: auto - group: "Network Parameters" -- variable: managementInterface - description: "Specify your management network interface (example: `eth1`). If set to `auto`, Portworx will automatically select the first routable interface." - type: string - default: auto - label: "Management Network Interface" - group: "Network Parameters" - -################################### Platform options ################################ -- variable: platformOptions - type: enum - label: "Platform" - group: "Platform Parameters" - options: - - "AKS" - - "EKS" - - "GKE" - -################################### Registry settings options ################################ -- variable: customRegistry - label: "Use a custom container registry?" - type: boolean - default: false - group: "Container Registry Parameters" - -- variable: registrySecret - show_if: "customRegistry=true" - description: "Specify a custom Kubernetes secret that will be used to authenticate with a container registry. Must be defined in kube-system namespace. (example: regcred)" - type: string - label: "Registry Kubernetes Secret" - group: "Container Registry Parameters" -- variable: customRegistryURL - show_if: "customRegistry=true" - description: "Specify a custom container registry server (including repository) that will be used instead of index.docker.io to download Docker images. (example: dockerhub.acme.net:5443 or myregistry.com/myrepository/)" - label: "Custom Registry URL" - type: string - group: "Container Registry Parameters" - - - -################################## Optional features ############################ -# TODO: Once we have a stable CSI release, we will default this to enabled -#- variable: csi -# description: "Select if you want to enable CSI (Container Storage Interface). CSI is still in ALPHA." -# type: boolean -# label: "Enable CSI" -# default: false -# required: false -# group: "Advanced parameters" - -- variable: storkVersion - default: "2.12.0" - label: "Stork version" - type: string - group: "Advanced parameters" - -- variable: envVars - label: "Environment variables" - description: "Enter your environment variables separated by semicolons (example: API_SERVER=http://lighthouse-new.portworx.com;MYENV1=val1;MYENV2=val2). These environment variables will be exported to Portworx." - type: string - group: "Advanced parameters" - -- variable: imageVersion - default: "2.11.4" - type: string - label: Portworx version to be deployed. - group: "Advanced parameters" - -- variable: clusterName - type: string - label: Portworx cluster name - default: mycluster - group: "Advanced parameters" diff --git a/charts/portworx/portworx/templates/NOTES.txt b/charts/portworx/portworx/templates/NOTES.txt deleted file mode 100644 index ea0bb6326..000000000 --- a/charts/portworx/portworx/templates/NOTES.txt +++ /dev/null @@ -1,13 +0,0 @@ -Your Release is named {{ .Release.Name | quote }} - -Portworx Pods should be running on each node in your cluster. - -Portworx would create a unified pool of the disks attached to your Kubernetes nodes. No further action should be required and you are ready to consume Portworx Volumes as part of your application data requirements. - -For further information on usage of the Portworx, refer to following doc pages. - -- For dynamically provisioning volumes: https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html -- For preprovisioned volumes: https://docs.portworx.com/scheduler/kubernetes/preprovisioned-volumes.html -- To use Stork (Storage Orchestration Runtime for Kubernetes) for hyperconvergence and snapshots: https://docs.portworx.com/scheduler/kubernetes/stork.html -- For stateful application solutions using Portworx: https://docs.portworx.com/scheduler/kubernetes/k8s-px-app-samples.html -- For interactive tutorials on using Portworx on Kubernetes: https://docs.portworx.com/scheduler/kubernetes/px-k8s-interactive.html diff --git a/charts/portworx/portworx/templates/_helpers.tpl b/charts/portworx/portworx/templates/_helpers.tpl deleted file mode 100644 index 892bc3257..000000000 --- a/charts/portworx/portworx/templates/_helpers.tpl +++ /dev/null @@ -1,443 +0,0 @@ -{{/* Gets the correct API Version based on the version of the cluster -*/}} - -{{- define "rbac.apiVersion" -}} -{{- if semverCompare ">= 1.8-0" .Capabilities.KubeVersion.GitVersion -}} -"rbac.authorization.k8s.io/v1" -{{- else -}} -"rbac.authorization.k8s.io/v1beta1" -{{- end -}} -{{- end -}} - - -{{- define "px.labels" -}} -chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" -heritage: {{ .Release.Service | quote }} -release: {{ .Release.Name | quote }} -{{- end -}} - -{{- define "driveOpts" }} -{{ $v := .Values.installOptions.drives | split "," }} -{{$v._0}} -{{- end -}} - -{{- define "px.kubernetesVersion" -}} -{{$version := .Capabilities.KubeVersion.GitVersion | regexFind "^v\\d+\\.\\d+\\.\\d+"}}{{$version}} -{{- end -}} - - -{{- define "px.getImage" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{- if .Values.openshiftInstall -}} - {{ cat (trim .Values.customRegistryURL) "/px-monitor" | replace " " ""}} - {{- else -}} - {{ cat (trim .Values.customRegistryURL) "/oci-monitor" | replace " " ""}} - {{- end -}} - {{- else -}} - {{- if .Values.openshiftInstall -}} - {{cat (trim .Values.customRegistryURL) "/portworx/px-monitor" | replace " " ""}} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/portworx/oci-monitor" | replace " " ""}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- if .Values.openshiftInstall -}} - {{ "registry.connect.redhat.com/portworx/px-monitor" }} - {{- else -}} - {{ "portworx/oci-monitor" }} - {{- end -}} -{{- end -}} -{{- end -}} - -{{- define "px.getStorkImage" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ cat (trim .Values.customRegistryURL) "/stork" | replace " " ""}} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/openstorage/stork" | replace " " ""}} - {{- end -}} -{{- else -}} - {{ "openstorage/stork" }} -{{- end -}} -{{- end -}} - -{{- define "px.getk8sImages" -}} -{{- $version := .Capabilities.KubeVersion.GitVersion -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ trim .Values.customRegistryURL }} - {{- else -}} - {{- if or (or (and (semverCompare ">= 1.16.14-0" $version ) (semverCompare "<=1.17.0-0" $version)) (and (semverCompare ">= 1.17.10" $version) (semverCompare "<=1.18.0-0" $version ))) (semverCompare ">=1.18.7-0" $version) -}} - {{cat (trim .Values.customRegistryURL) "/k8s.gcr.io" | replace " " ""}} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/gcr.io/google_containers" | replace " " ""}} - {{- end -}} - {{- end -}} -{{- else -}} - {{- if or (or (and (semverCompare ">= 1.16.14-0" $version ) (semverCompare "<=1.17.0-0" $version)) (and (semverCompare ">= 1.17.10-0" $version) (semverCompare "<=1.18.0-0" $version ))) (semverCompare ">=1.18.7-0" $version) -}} - {{ "k8s.gcr.io" }} - {{- else -}} - {{ "gcr.io/google_containers" }} - {{- end -}} -{{- end -}} -{{- end -}} - -{{- define "px.getcsiImages" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ trim .Values.customRegistryURL }} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/quay.io/k8scsi" | replace " " ""}} - {{- end -}} -{{- else -}} - {{ "quay.io/k8scsi" }} -{{- end -}} -{{- end -}} - - -{{- define "px.getCSIProvisionerImage" -}} -{{- if semverCompare "<1.17.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "docker.io/openstorage/csi-provisioner:v1.6.1-1" }} -{{- else if semverCompare "< 1.20.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "docker.io/openstorage/csi-provisioner:v2.2.2-1" }} -{{- else -}} - {{ "docker.io/openstorage/csi-provisioner:v3.0.0-1" }} -{{- end -}} -{{- end -}} - -{{- define "px.getCSISnapshotterImage" -}} -{{- if semverCompare "<1.17.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "docker.io/openstorage/csi-snapshotter:v1.2.2-1" }} -{{- else if semverCompare "< 1.20.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "k8s.gcr.io/sig-storage/csi-snapshotter:v3.0.3" }} -{{- else -}} - {{ "k8s.gcr.io/sig-storage/csi-snapshotter:v4.2.1" }} -{{- end -}} -{{- end -}} - -{{- define "px.getCSISnapshotControllerImage" -}} -{{- if semverCompare "< 1.20.0-0" .Capabilities.KubeVersion.GitVersion -}} - {{ "k8s.gcr.io/sig-storage/snapshot-controller:v3.0.3" }} -{{- else -}} - {{ "k8s.gcr.io/sig-storage/snapshot-controller:v4.2.1" }} -{{- end -}} -{{- end -}} - -{{- define "px.getPauseImage" -}} -{{- if (.Values.customRegistryURL) -}} - {{- if (eq "/" (.Values.customRegistryURL | regexFind "/")) -}} - {{ trim .Values.customRegistryURL }} - {{- else -}} - {{cat (trim .Values.customRegistryURL) "/k8s.gcr.io" | replace " " ""}} - {{- end -}} -{{- else -}} - {{ "k8s.gcr.io" }} -{{- end -}} -{{- end -}} - -{{- define "px.registryConfigType" -}} -{{- if semverCompare ">=1.9-0" .Capabilities.KubeVersion.GitVersion -}} -".dockerconfigjson" -{{- else -}} -".dockercfg" -{{- end -}} -{{- end -}} - -{{/* -Create the name of the service account to use for hooks -*/}} -{{- define "px.hookServiceAccount" -}} -{{- if .Values.serviceAccount.hook.create -}} - {{- printf "%s-hook" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{ default "default" .Values.serviceAccount.hook.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the cluster role to use for hooks -*/}} -{{- define "px.hookClusterRole" -}} -{{- if .Values.serviceAccount.hook.create -}} - {{- printf "%s-hook" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{ default "default" .Values.serviceAccount.hook.name }} -{{- end -}} -{{- end -}} - -{{/* -Create the name of the cluster role binding to use for hooks -*/}} -{{- define "px.hookClusterRoleBinding" -}} -{{- if .Values.serviceAccount.hook.create -}} - {{- printf "%s-hook" .Chart.Name | replace "+" "_" | trunc 63 | trimSuffix "-" -}} -{{- else -}} - {{ default "default" .Values.serviceAccount.hook.name }} -{{- end -}} -{{- end -}} - -{{/* - String concatenation for drives in AWS section -*/}} -{{- define "px.storage" -}} -{{- $awsType1 := .Values.drive_1.aws.type -}} -{{- $awsType2 := .Values.drive_2.aws.type -}} -{{- $awsType3 := .Values.drive_3.aws.type -}} -{{- $awsType4 := .Values.drive_4.aws.type -}} -{{- $awsType5 := .Values.drive_5.aws.type -}} -{{- $awsType6 := .Values.drive_6.aws.type -}} -{{- $awsType7 := .Values.drive_7.aws.type -}} -{{- $awsType8 := .Values.drive_8.aws.type -}} -{{- $awsType9 := .Values.drive_9.aws.type -}} -{{- $awsType10 := .Values.drive_10.aws.type -}} - -{{- $awsSize1 := .Values.drive_1.aws.size -}} -{{- $awsSize2 := .Values.drive_2.aws.size -}} -{{- $awsSize3 := .Values.drive_3.aws.size -}} -{{- $awsSize4 := .Values.drive_4.aws.size -}} -{{- $awsSize5 := .Values.drive_5.aws.size -}} -{{- $awsSize6 := .Values.drive_6.aws.size -}} -{{- $awsSize7 := .Values.drive_7.aws.size -}} -{{- $awsSize8 := .Values.drive_8.aws.size -}} -{{- $awsSize9 := .Values.drive_9.aws.size -}} -{{- $awsSize10 := .Values.drive_10.aws.size -}} - -{{- $awsIops1 := .Values.drive_1.aws.iops -}} -{{- $awsIops2 := .Values.drive_2.aws.iops -}} -{{- $awsIops3 := .Values.drive_3.aws.iops -}} -{{- $awsIops4 := .Values.drive_4.aws.iops -}} -{{- $awsIops5 := .Values.drive_5.aws.iops -}} -{{- $awsIops6 := .Values.drive_6.aws.iops -}} -{{- $awsIops7 := .Values.drive_7.aws.iops -}} -{{- $awsIops8 := .Values.drive_8.aws.iops -}} -{{- $awsIops9 := .Values.drive_9.aws.iops -}} -{{- $awsIops10 := .Values.drive_10.aws.iops -}} - -{{- $gcType1 := .Values.drive_1.gc.type -}} -{{- $gcType2 := .Values.drive_2.gc.type -}} -{{- $gcType3 := .Values.drive_3.gc.type -}} -{{- $gcType4 := .Values.drive_4.gc.type -}} -{{- $gcType5 := .Values.drive_5.gc.type -}} -{{- $gcType6 := .Values.drive_6.gc.type -}} -{{- $gcType7 := .Values.drive_7.gc.type -}} -{{- $gcType8 := .Values.drive_8.gc.type -}} -{{- $gcType9 := .Values.drive_9.gc.type -}} -{{- $gcType10 := .Values.drive_10.gc.type -}} - -{{- $gcSize1 := .Values.drive_1.gc.size -}} -{{- $gcSize2 := .Values.drive_2.gc.size -}} -{{- $gcSize3 := .Values.drive_3.gc.size -}} -{{- $gcSize4 := .Values.drive_4.gc.size -}} -{{- $gcSize5 := .Values.drive_5.gc.size -}} -{{- $gcSize6 := .Values.drive_6.gc.size -}} -{{- $gcSize7 := .Values.drive_7.gc.size -}} -{{- $gcSize8 := .Values.drive_8.gc.size -}} -{{- $gcSize9 := .Values.drive_9.gc.size -}} -{{- $gcSize10 := .Values.drive_10.gc.size -}} - -{{- $usefileSystemDrive := .Values.usefileSystemDrive | default false }} -{{- $usedrivesAndPartitions := .Values.usedrivesAndPartitions | default false }} -{{- $deployEnvironmentIKS := .Capabilities.KubeVersion.GitVersion | regexMatch "IKS" }} - -{{- if eq "OnPrem" .Values.environment -}} - {{- if eq "Manually specify disks" .Values.onpremStorage }} - {{- if ne "none" .Values.existingDisk1 }} - "-s", "{{- .Values.existingDisk1 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk2 -}} - "-s", "{{- .Values.existingDisk2 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk3 -}} - "-s", "{{- .Values.existingDisk3 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk4 -}} - "-s", "{{- .Values.existingDisk4 }}", - {{- end }} - {{- if ne "none" .Values.existingDisk5 }} - "-s", "{{- .Values.existingDisk5 }}", - {{- end }} - {{- else if eq "Automatically scan disks" .Values.onpremStorage -}} - {{- if or $usedrivesAndPartitions $deployEnvironmentIKS }} - "-f", - {{- end }} - {{- if eq $usedrivesAndPartitions true }} - "-A", - {{- else }} - "-a", - {{- end -}} - {{- end -}} - -{{- else if eq "Cloud" .Values.environment -}} - {{- if eq "Consume Unused" .Values.deviceConfig -}} - {{- if or $usedrivesAndPartitions $deployEnvironmentIKS }} - "-f", - {{- end }} - {{- if eq $usedrivesAndPartitions true }} - "-A", - {{- else }} - "-a", - {{- end -}} - {{- end }} -{{/*------------------- ----------------- Google cloud/GKE -------------- --------------- */}} - {{- if eq "Google cloud/GKE" .Values.provider -}} - {{- if eq "Use Existing Disks" .Values.deviceConfig -}} - {{- if .Values.existingDisk1 -}} - "-s", "{{- .Values.existingDisk1 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk2 -}} - "-s", "{{- .Values.existingDisk2 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk3 -}} - "-s", "{{- .Values.existingDisk3 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk4 -}} - "-s", "{{- .Values.existingDisk4 -}}", - {{- end -}} - {{- if ne "none" .Values.existingDisk5 -}} - "-s", "{{- .Values.existingDisk5 -}}", - {{- end -}} - {{- else if eq "Create Using a Spec" .Values.deviceConfig -}} - {{- if $gcType1 }} - "-s", "type=pd-{{$gcType1 | lower}},size={{$gcSize1}}", - {{- end }} - {{/*------------------- DRIVE 2 --------------- */}} - {{- if $gcType2 -}} - "-s", "type=pd-{{$gcType2 | lower}},size={{$gcSize2}}", - {{- end }} - {{/*------------------- DRIVE 3 --------------- */}} - {{- if $gcType3 -}} - "-s", "type=pd-{{$gcType3 | lower}},size={{$gcSize3}}", - {{- end }} - {{/*------------------- DRIVE 4 --------------- */}} - {{- if $gcType4 -}} - "-s", "type=pd-{{$gcType4 | lower}},size={{$gcSize4}}", - {{- end }} - {{/*------------------- DRIVE 5 --------------- */}} - {{- if $gcType5 -}} - "-s", "type=pd-{{$gcType5 | lower}},size={{$gcSize5}}", - {{- end }} - {{/*------------------- DRIVE 6 --------------- */}} - {{- if $gcType6 -}} - "-s", "type=pd-{{$gcType6 | lower}},size={{$gcSize6}}", - {{- end }} - {{/*------------------- DRIVE 7 --------------- */}} - {{- if $gcType7 -}} - "-s", "type=pd-{{$gcType7 | lower}},size={{$gcSize7}}", - {{- end }} - {{/*------------------- DRIVE 8 --------------- */}} - {{- if $gcType8 -}} - "-s", "type=pd-{{$gcType8 | lower}},size={{$gcSize8}}", - {{- end }} - {{/*------------------- DRIVE 9 --------------- */}} - {{- if $gcType9 -}} - "-s", "type=pd-{{$gcType9 | lower}},size={{$gcSize9}}", - {{- end }} - {{/*------------------- DRIVE 10 --------------- */}} - {{- if $gcType10 -}} - "-s", "type=pd-{{$gcType1 | lower}},size={{$gcSize10}}", - {{- end }} - {{- end -}} -{{/*------------------- ----------------- AWS -------------- --------------- */}} - {{- else if eq "AWS" .Values.provider -}} - {{- if eq "Use Existing Disks" .Values.deviceConfig -}} - {{- if ne "none" .Values.existingDisk1 -}} - "-s", "{{ .Values.existingDisk1 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk2 -}} - "-s", "{{ .Values.existingDisk2 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk3 -}} - "-s", "{{ .Values.existingDisk3 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk4 -}} - "-s", "{{ .Values.existingDisk4 }}", - {{- end -}} - {{- if ne "none" .Values.existingDisk5 -}} - "-s", "{{ .Values.existingDisk5 }}", - {{- end -}} - {{- else if eq "Create Using a Spec" .Values.deviceConfig -}} - {{- if ne "none" $awsType1 }} - {{- if eq "GP2" $awsType1 -}} - "-s", "type={{$awsType1 | lower}},size={{$awsSize1}}", - {{- else if eq "IO1" $awsType1 -}} - "-s", "type={{$awsType1 | lower}},size={{$awsSize1}},iops={{$awsIops1}}", - {{- end }} - {{- end }} - {{/*------------------- DRIVE 2 --------------- */}} - {{- if ne "none" $awsType2 -}} - {{- if eq "GP2" $awsType2 -}} - "-s", "type={{$awsType2 | lower}},size={{$awsSize2}}", - {{- else if eq "IO1" $awsType2 -}} - "-s", "type={{$awsType2 | lower}},size={{$awsSize2}},iops={{$awsIops2}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 3 --------------- */}} - {{- if ne "none" $awsType3 }} - {{- if eq "GP2" $awsType3 -}} - "-s", "type={{$awsType3 | lower}},size={{$awsSize3}}", - {{- else if eq "IO1" $awsType3 -}} - "-s", "type={{$awsType3 | lower}},size={{$awsSize3}},iops={{$awsIops3}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 4 --------------- */}} - {{- if ne "none" $awsType4 }} - {{- if eq "GP2" $awsType4 -}} - "-s", "type={{$awsType4 | lower}},size={{$awsSize4}}", - {{- else if eq "IO1" $awsType4 -}} - "-s", "type={{$awsType4 | lower}},size={{$awsSize4}},iops={{$awsIops4}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 5 --------------- */}} - {{- if ne "none" $awsType5 }} - {{- if eq "GP2" $awsType5 -}} - "-s", "type={{$awsType5 | lower}},size={{$awsSize5}}", - {{- else if eq "IO1" $awsType5 -}} - "-s", "type={{$awsType5 | lower}},size={{$awsSize5}},iops={{$awsIops5}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 6 --------------- */}} - {{- if ne "none" $awsType6 }} - {{- if eq "GP2" $awsType6 -}} - "-s", "type={{$awsType6 | lower}},size={{$awsSize6}}", - {{- else if eq "IO1" $awsType6 -}} - "-s", "type={{$awsType6 | lower}},size={{$awsSize6}},iops={{$awsIops6}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 7 --------------- */}} - {{- if ne "none" $awsType7 }} - {{- if eq "GP2" $awsType7 -}} - "-s", "type={{$awsType7 | lower}},size={{$awsSize7}}", - {{- else if eq "IO1" $awsType7 -}} - "-s", "type={{$awsType7 | lower}},size={{$awsSize7}},iops={{$awsIops7}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 8 --------------- */}} - {{- if ne "none" $awsType8 }} - {{- if eq "GP2" $awsType8 -}} - "-s", "type={{$awsType8 | lower}},size={{$awsSize8}}", - {{- else if eq "IO1" $awsType8 -}} - "-s", "type={{$awsType8 | lower}},size={{$awsSize8}},iops={{$awsIops8}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 9 --------------- */}} - {{- if ne "none" $awsType9 }} - {{- if eq "GP2" $awsType9 -}} - "-s", "type={{$awsType9 | lower}},size={{$awsSize9}}", - {{- else if eq "IO1" $awsType9 -}} - "-s", "type={{$awsType9 | lower}},size={{$awsSize9}},iops={{$awsIops9}}", - {{- end -}} - {{- end }} - {{/*------------------- DRIVE 10 --------------- */}} - {{- if ne "none" $awsType10 }} - {{- if eq "GP2" $awsType10 -}} - "-s", "type={{$awsType10 | lower}},size={{$awsSize10}}", - {{- else if eq "IO1" $awsType10 -}} - "-s", "type={{$awsType10 | lower}},size={{$awsSize10}},iops={{$awsIops10}}", - {{- end -}} - {{- end }} - {{- end -}} - {{- end -}} - {{- end -}} -{{- end }} - diff --git a/charts/portworx/portworx/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml b/charts/portworx/portworx/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml deleted file mode 100644 index 8c8efda02..000000000 --- a/charts/portworx/portworx/templates/hooks/post-delete/px-postdelete-unlabelnode.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -{{- $registrySecret := .Values.registrySecret | default "none" }} - -apiVersion: batch/v1 -kind: Job -metadata: - namespace: kube-system - name: px-hook-postdelete-unlabelnode - labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - annotations: - "helm.sh/hook": post-delete - "helm.sh/hook-weight": "-5" - "helm.sh/hook-delete-policy": before-hook-creation -spec: -{{ if semverCompare ">= 1.8-0" .Capabilities.KubeVersion.GitVersion }} - backoffLimit: 0 -{{ else }} - activeDeadlineSeconds: 30 -{{ end }} - template: - spec: - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - restartPolicy: Never - serviceAccountName: {{ template "px.hookServiceAccount" . }} - containers: - - name: post-delete-job - {{- if eq $customRegistryURL "none" }} - image: "lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- else}} - image: "{{ $customRegistryURL }}/lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- end}} - args: ['label','nodes','--all','px/enabled-'] diff --git a/charts/portworx/portworx/templates/hooks/pre-delete/px-predelete-nodelabel.yaml b/charts/portworx/portworx/templates/hooks/pre-delete/px-predelete-nodelabel.yaml deleted file mode 100644 index 1942bade7..000000000 --- a/charts/portworx/portworx/templates/hooks/pre-delete/px-predelete-nodelabel.yaml +++ /dev/null @@ -1,40 +0,0 @@ -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -{{- $registrySecret := .Values.registrySecret | default "none" }} - -apiVersion: batch/v1 -kind: Job -metadata: - namespace: kube-system - name: px-hook-predelete-nodelabel - labels: - heritage: {{.Release.Service | quote }} - release: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - annotations: - "helm.sh/hook": pre-delete - "helm.sh/hook-weight": "-5" - "helm.sh/hook-delete-policy": before-hook-creation -spec: -{{ if semverCompare ">= 1.8-0" .Capabilities.KubeVersion.GitVersion }} - backoffLimit: 0 -{{ else }} - activeDeadlineSeconds: 30 -{{ end }} - template: - spec: - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - serviceAccountName: {{ template "px.hookServiceAccount" . }} - restartPolicy: Never - containers: - - name: pre-delete-job - {{- if eq $customRegistryURL "none" }} - image: "lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- else}} - image: "{{ $customRegistryURL }}/lachlanevenson/k8s-kubectl:{{ template "px.kubernetesVersion" . }}" - {{- end}} - args: ['label','nodes','--all','px/enabled=remove','--overwrite'] diff --git a/charts/portworx/portworx/templates/portworx-controller.yaml b/charts/portworx/portworx/templates/portworx-controller.yaml deleted file mode 100644 index 15301f579..000000000 --- a/charts/portworx/portworx/templates/portworx-controller.yaml +++ /dev/null @@ -1,128 +0,0 @@ -{{- if or (and (.Values.openshiftInstall) (eq .Values.openshiftInstall true)) (and (.Values.AKSorEKSInstall) (eq .Values.AKSorEKSInstall true)) ((.Capabilities.KubeVersion.GitVersion | regexMatch "gke")) }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: portworx-pvc-controller-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: portworx-pvc-controller-role -rules: -- apiGroups: [""] - resources: ["persistentvolumes"] - verbs: ["create","delete","get","list","update","watch"] -- apiGroups: [""] - resources: ["persistentvolumes/status"] - verbs: ["update"] -- apiGroups: [""] - resources: ["persistentvolumeclaims"] - verbs: ["get", "list", "update", "watch"] -- apiGroups: [""] - resources: ["persistentvolumeclaims/status"] - verbs: ["update"] -- apiGroups: [""] - resources: ["pods"] - verbs: ["create", "delete", "get", "list", "watch"] -- apiGroups: ["storage.k8s.io"] - resources: ["storageclasses"] - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: ["endpoints", "services"] - verbs: ["create", "delete", "get", "update"] -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: ["events"] - verbs: ["watch"] -- apiGroups: [""] - resources: ["events"] - verbs: ["create", "patch", "update"] -- apiGroups: [""] - resources: ["serviceaccounts"] - verbs: ["get", "create"] -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "create", "update"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: portworx-pvc-controller-role-binding -subjects: -- kind: ServiceAccount - name: portworx-pvc-controller-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: portworx-pvc-controller-role - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - tier: control-plane - name: portworx-pvc-controller - namespace: kube-system -spec: - replicas: 3 - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - template: - metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - name: portworx-pvc-controller - tier: control-plane - spec: - {{- if not (empty .Values.registrySecret) }} - imagePullSecrets: - - name: {{ .Values.registrySecret }} - {{- end }} - containers: - - command: - - kube-controller-manager - - --leader-elect=true - - --address=0.0.0.0 - - --controllers=persistentvolume-binder,persistentvolume-expander - - --use-service-account-credentials=true - - --leader-elect-resource-lock=configmaps - image: "{{ template "px.getk8sImages" . }}/kube-controller-manager-amd64:{{ template "px.kubernetesVersion" . }}" - livenessProbe: - failureThreshold: 8 - httpGet: - host: 127.0.0.1 - path: /healthz - port: 10252 - scheme: HTTP - initialDelaySeconds: 15 - timeoutSeconds: 15 - name: portworx-pvc-controller-manager - resources: - requests: - cpu: 200m - hostNetwork: true - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "name" - operator: In - values: - - portworx-pvc-controller - topologyKey: "kubernetes.io/hostname" - serviceAccountName: portworx-pvc-controller-account -{{- end }} diff --git a/charts/portworx/portworx/templates/portworx-crd.yaml b/charts/portworx/portworx/templates/portworx-crd.yaml deleted file mode 100644 index 2811a0f8b..000000000 --- a/charts/portworx/portworx/templates/portworx-crd.yaml +++ /dev/null @@ -1,1146 +0,0 @@ -{{- if or (and (.Values.csi) (eq .Values.csi true)) (not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty))}} -{{- if (semverCompare ">= 1.17.0-0" .Capabilities.KubeVersion.GitVersion) }} -{{- if (semverCompare ">= 1.20.0-0" .Capabilities.KubeVersion.GitVersion) }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/419" - creationTimestamp: null - name: volumesnapshotclasses.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotClass - listKind: VolumeSnapshotClassList - plural: volumesnapshotclasses - singular: volumesnapshotclass - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .driver - name: Driver - type: string - - description: Determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .deletionPolicy - name: DeletionPolicy - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: VolumeSnapshotClass specifies parameters that a underlying storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses are non-namespaced - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - deletionPolicy: - description: deletionPolicy determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the storage driver that handles this VolumeSnapshotClass. Required. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - parameters: - additionalProperties: - type: string - description: parameters is a key-value map with storage driver specific parameters for creating snapshots. These values are opaque to Kubernetes. - type: object - required: - - deletionPolicy - - driver - type: object - served: true - storage: true - subresources: {} - - additionalPrinterColumns: - - jsonPath: .driver - name: Driver - type: string - - description: Determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .deletionPolicy - name: DeletionPolicy - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - # This indicates the v1beta1 version of the custom resource is deprecated. - # API requests to this version receive a warning in the server response. - deprecated: true - # This overrides the default warning returned to clients making v1beta1 API requests. - deprecationWarning: "snapshot.storage.k8s.io/v1beta1 VolumeSnapshotClass is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotClass" - schema: - openAPIV3Schema: - description: VolumeSnapshotClass specifies parameters that a underlying storage system uses when creating a volume snapshot. A specific VolumeSnapshotClass is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses are non-namespaced - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - deletionPolicy: - description: deletionPolicy determines whether a VolumeSnapshotContent created through the VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the storage driver that handles this VolumeSnapshotClass. Required. - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - parameters: - additionalProperties: - type: string - description: parameters is a key-value map with storage driver specific parameters for creating snapshots. These values are opaque to Kubernetes. - type: object - required: - - deletionPolicy - - driver - type: object - served: true - storage: false - subresources: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/419" - creationTimestamp: null - name: volumesnapshotcontents.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotContent - listKind: VolumeSnapshotContentList - plural: volumesnapshotcontents - singular: volumesnapshotcontent - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Represents the complete size of the snapshot in bytes - jsonPath: .status.restoreSize - name: RestoreSize - type: integer - - description: Determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .spec.deletionPolicy - name: DeletionPolicy - type: string - - description: Name of the CSI driver used to create the physical snapshot on the underlying storage system. - jsonPath: .spec.driver - name: Driver - type: string - - description: Name of the VolumeSnapshotClass to which this snapshot belongs. - jsonPath: .spec.volumeSnapshotClassName - name: VolumeSnapshotClass - type: string - - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. - jsonPath: .spec.volumeSnapshotRef.name - name: VolumeSnapshot - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: VolumeSnapshotContent represents the actual "on-disk" snapshot object in the underlying storage system - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: spec defines properties of a VolumeSnapshotContent created by the underlying storage system. Required. - properties: - deletionPolicy: - description: deletionPolicy determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. For dynamically provisioned snapshots, this field will automatically be filled in by the CSI snapshotter sidecar with the "DeletionPolicy" field defined in the corresponding VolumeSnapshotClass. For pre-existing snapshots, users MUST specify this field when creating the VolumeSnapshotContent object. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the CSI driver used to create the physical snapshot on the underlying storage system. This MUST be the same as the name returned by the CSI GetPluginName() call for that driver. Required. - type: string - source: - description: source specifies whether the snapshot is (or should be) dynamically provisioned or already exists, and just requires a Kubernetes object representation. This field is immutable after creation. Required. - properties: - snapshotHandle: - description: snapshotHandle specifies the CSI "snapshot_id" of a pre-existing snapshot on the underlying storage system for which a Kubernetes object representation was (or should be) created. This field is immutable. - type: string - volumeHandle: - description: volumeHandle specifies the CSI "volume_id" of the volume from which a snapshot should be dynamically taken from. This field is immutable. - type: string - type: object - oneOf: - - required: ["snapshotHandle"] - - required: ["volumeHandle"] - volumeSnapshotClassName: - description: name of the VolumeSnapshotClass from which this snapshot was (or will be) created. Note that after provisioning, the VolumeSnapshotClass may be deleted or recreated with different set of values, and as such, should not be referenced post-snapshot creation. - type: string - volumeSnapshotRef: - description: volumeSnapshotRef specifies the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName field must reference to this VolumeSnapshotContent's name for the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent object, name and namespace of the VolumeSnapshot object MUST be provided for binding to happen. This field is immutable after creation. Required. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - required: - - deletionPolicy - - driver - - source - - volumeSnapshotRef - type: object - status: - description: status represents the current information of a snapshot. - properties: - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it indicates the creation time is unknown. The format of this field is a Unix nanoseconds time encoded as an int64. On Unix, the command `date +%s%N` returns the current time in nanoseconds since 1970-01-01 00:00:00 UTC. - format: int64 - type: integer - error: - description: error is the last observed error during snapshot creation, if any. Upon success after retry, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - description: restoreSize represents the complete size of the snapshot in bytes. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - format: int64 - minimum: 0 - type: integer - snapshotHandle: - description: snapshotHandle is the CSI "snapshot_id" of a snapshot on the underlying storage system. If not specified, it indicates that dynamic snapshot creation has either failed or it is still in progress. - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Represents the complete size of the snapshot in bytes - jsonPath: .status.restoreSize - name: RestoreSize - type: integer - - description: Determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .spec.deletionPolicy - name: DeletionPolicy - type: string - - description: Name of the CSI driver used to create the physical snapshot on the underlying storage system. - jsonPath: .spec.driver - name: Driver - type: string - - description: Name of the VolumeSnapshotClass to which this snapshot belongs. - jsonPath: .spec.volumeSnapshotClassName - name: VolumeSnapshotClass - type: string - - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. - jsonPath: .spec.volumeSnapshotRef.name - name: VolumeSnapshot - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - # This indicates the v1beta1 version of the custom resource is deprecated. - # API requests to this version receive a warning in the server response. - deprecated: true - # This overrides the default warning returned to clients making v1beta1 API requests. - deprecationWarning: "snapshot.storage.k8s.io/v1beta1 VolumeSnapshotContent is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshotContent" - schema: - openAPIV3Schema: - description: VolumeSnapshotContent represents the actual "on-disk" snapshot object in the underlying storage system - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: spec defines properties of a VolumeSnapshotContent created by the underlying storage system. Required. - properties: - deletionPolicy: - description: deletionPolicy determines whether this VolumeSnapshotContent and its physical snapshot on the underlying storage system should be deleted when its bound VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent and its physical snapshot on underlying storage system are deleted. For dynamically provisioned snapshots, this field will automatically be filled in by the CSI snapshotter sidecar with the "DeletionPolicy" field defined in the corresponding VolumeSnapshotClass. For pre-existing snapshots, users MUST specify this field when creating the VolumeSnapshotContent object. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the CSI driver used to create the physical snapshot on the underlying storage system. This MUST be the same as the name returned by the CSI GetPluginName() call for that driver. Required. - type: string - source: - description: source specifies whether the snapshot is (or should be) dynamically provisioned or already exists, and just requires a Kubernetes object representation. This field is immutable after creation. Required. - properties: - snapshotHandle: - description: snapshotHandle specifies the CSI "snapshot_id" of a pre-existing snapshot on the underlying storage system for which a Kubernetes object representation was (or should be) created. This field is immutable. - type: string - volumeHandle: - description: volumeHandle specifies the CSI "volume_id" of the volume from which a snapshot should be dynamically taken from. This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: name of the VolumeSnapshotClass from which this snapshot was (or will be) created. Note that after provisioning, the VolumeSnapshotClass may be deleted or recreated with different set of values, and as such, should not be referenced post-snapshot creation. - type: string - volumeSnapshotRef: - description: volumeSnapshotRef specifies the VolumeSnapshot object to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName field must reference to this VolumeSnapshotContent's name for the bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent object, name and namespace of the VolumeSnapshot object MUST be provided for binding to happen. This field is immutable after creation. Required. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of an entire object, this string should contain a valid JSON/Go field access statement, such as desiredState.manifest.containers[2]. For example, if the object reference is to a container within a pod, this would take on a value like: "spec.containers{name}" (where "name" refers to the name of the container that triggered the event) or if no container name is specified "spec.containers[2]" (container with index 2 in this pod). This syntax is chosen only to have some well-defined way of referencing a part of an object. TODO: this design is not final and this field is subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - required: - - deletionPolicy - - driver - - source - - volumeSnapshotRef - type: object - status: - description: status represents the current information of a snapshot. - properties: - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it indicates the creation time is unknown. The format of this field is a Unix nanoseconds time encoded as an int64. On Unix, the command `date +%s%N` returns the current time in nanoseconds since 1970-01-01 00:00:00 UTC. - format: int64 - type: integer - error: - description: error is the last observed error during snapshot creation, if any. Upon success after retry, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - description: restoreSize represents the complete size of the snapshot in bytes. In dynamic snapshot creation case, this field will be filled in by the CSI snapshotter sidecar with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - format: int64 - minimum: 0 - type: integer - snapshotHandle: - description: snapshotHandle is the CSI "snapshot_id" of a snapshot on the underlying storage system. If not specified, it indicates that dynamic snapshot creation has either failed or it is still in progress. - type: string - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.4.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/419" - creationTimestamp: null - name: volumesnapshots.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshot - listKind: VolumeSnapshotList - plural: volumesnapshots - singular: volumesnapshot - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: If a new snapshot needs to be created, this contains the name of the source PVC from which this snapshot was (or will be) created. - jsonPath: .spec.source.persistentVolumeClaimName - name: SourcePVC - type: string - - description: If a snapshot already exists, this contains the name of the existing VolumeSnapshotContent object representing the existing snapshot. - jsonPath: .spec.source.volumeSnapshotContentName - name: SourceSnapshotContent - type: string - - description: Represents the minimum size of volume required to rehydrate from this snapshot. - jsonPath: .status.restoreSize - name: RestoreSize - type: string - - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. - jsonPath: .spec.volumeSnapshotClassName - name: SnapshotClass - type: string - - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot object intends to bind to. Please note that verification of binding actually requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure both are pointing at each other. Binding MUST be verified prior to usage of this object. - jsonPath: .status.boundVolumeSnapshotContentName - name: SnapshotContent - type: string - - description: Timestamp when the point-in-time snapshot was taken by the underlying storage system. - jsonPath: .status.creationTime - name: CreationTime - type: date - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1 - schema: - openAPIV3Schema: - description: VolumeSnapshot is a user's request for either creating a point-in-time snapshot of a persistent volume, or binding to a pre-existing snapshot. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: 'spec defines the desired characteristics of a snapshot requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots Required.' - properties: - source: - description: source specifies where a snapshot will be created from. This field is immutable after creation. Required. - properties: - persistentVolumeClaimName: - description: persistentVolumeClaimName specifies the name of the PersistentVolumeClaim object representing the volume from which a snapshot should be created. This PVC is assumed to be in the same namespace as the VolumeSnapshot object. This field should be set if the snapshot does not exists, and needs to be created. This field is immutable. - type: string - volumeSnapshotContentName: - description: volumeSnapshotContentName specifies the name of a pre-existing VolumeSnapshotContent object representing an existing volume snapshot. This field should be set if the snapshot already exists and only needs a representation in Kubernetes. This field is immutable. - type: string - type: object - oneOf: - - required: ["persistentVolumeClaimName"] - - required: ["volumeSnapshotContentName"] - volumeSnapshotClassName: - description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass requested by the VolumeSnapshot. VolumeSnapshotClassName may be left nil to indicate that the default SnapshotClass should be used. A given cluster may have multiple default Volume SnapshotClasses: one default per CSI Driver. If a VolumeSnapshot does not specify a SnapshotClass, VolumeSnapshotSource will be checked to figure out what the associated CSI Driver is, and the default VolumeSnapshotClass associated with that CSI Driver will be used. If more than one VolumeSnapshotClass exist for a given CSI Driver and more than one have been marked as default, CreateSnapshot will fail and generate an event. Empty string is not allowed for this field.' - type: string - required: - - source - type: object - status: - description: status represents the current information of a snapshot. Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object. - properties: - boundVolumeSnapshotContentName: - description: 'boundVolumeSnapshotContentName is the name of the VolumeSnapshotContent object to which this VolumeSnapshot object intends to bind to. If not specified, it indicates that the VolumeSnapshot object has not been successfully bound to a VolumeSnapshotContent object yet. NOTE: To avoid possible security issues, consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object.' - type: string - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it may indicate that the creation time of the snapshot is unknown. - format: date-time - type: string - error: - description: error is the last observed error during snapshot creation, if any. This field could be helpful to upper level controllers(i.e., application controller) to decide whether they should continue on waiting for the snapshot to be created based on the type of error reported. The snapshot controller will keep retrying when an error occurrs during the snapshot creation. Upon success, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if the snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - type: string - description: restoreSize represents the minimum size of volume required to create a volume from this snapshot. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} - - additionalPrinterColumns: - - description: Indicates if the snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: If a new snapshot needs to be created, this contains the name of the source PVC from which this snapshot was (or will be) created. - jsonPath: .spec.source.persistentVolumeClaimName - name: SourcePVC - type: string - - description: If a snapshot already exists, this contains the name of the existing VolumeSnapshotContent object representing the existing snapshot. - jsonPath: .spec.source.volumeSnapshotContentName - name: SourceSnapshotContent - type: string - - description: Represents the minimum size of volume required to rehydrate from this snapshot. - jsonPath: .status.restoreSize - name: RestoreSize - type: string - - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. - jsonPath: .spec.volumeSnapshotClassName - name: SnapshotClass - type: string - - description: Name of the VolumeSnapshotContent object to which the VolumeSnapshot object intends to bind to. Please note that verification of binding actually requires checking both VolumeSnapshot and VolumeSnapshotContent to ensure both are pointing at each other. Binding MUST be verified prior to usage of this object. - jsonPath: .status.boundVolumeSnapshotContentName - name: SnapshotContent - type: string - - description: Timestamp when the point-in-time snapshot was taken by the underlying storage system. - jsonPath: .status.creationTime - name: CreationTime - type: date - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - # This indicates the v1beta1 version of the custom resource is deprecated. - # API requests to this version receive a warning in the server response. - deprecated: true - # This overrides the default warning returned to clients making v1beta1 API requests. - deprecationWarning: "snapshot.storage.k8s.io/v1beta1 VolumeSnapshot is deprecated; use snapshot.storage.k8s.io/v1 VolumeSnapshot" - schema: - openAPIV3Schema: - description: VolumeSnapshot is a user's request for either creating a point-in-time snapshot of a persistent volume, or binding to a pre-existing snapshot. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: 'spec defines the desired characteristics of a snapshot requested by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots Required.' - properties: - source: - description: source specifies where a snapshot will be created from. This field is immutable after creation. Required. - properties: - persistentVolumeClaimName: - description: persistentVolumeClaimName specifies the name of the PersistentVolumeClaim object representing the volume from which a snapshot should be created. This PVC is assumed to be in the same namespace as the VolumeSnapshot object. This field should be set if the snapshot does not exists, and needs to be created. This field is immutable. - type: string - volumeSnapshotContentName: - description: volumeSnapshotContentName specifies the name of a pre-existing VolumeSnapshotContent object representing an existing volume snapshot. This field should be set if the snapshot already exists and only needs a representation in Kubernetes. This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: 'VolumeSnapshotClassName is the name of the VolumeSnapshotClass requested by the VolumeSnapshot. VolumeSnapshotClassName may be left nil to indicate that the default SnapshotClass should be used. A given cluster may have multiple default Volume SnapshotClasses: one default per CSI Driver. If a VolumeSnapshot does not specify a SnapshotClass, VolumeSnapshotSource will be checked to figure out what the associated CSI Driver is, and the default VolumeSnapshotClass associated with that CSI Driver will be used. If more than one VolumeSnapshotClass exist for a given CSI Driver and more than one have been marked as default, CreateSnapshot will fail and generate an event. Empty string is not allowed for this field.' - type: string - required: - - source - type: object - status: - description: status represents the current information of a snapshot. Consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object. - properties: - boundVolumeSnapshotContentName: - description: 'boundVolumeSnapshotContentName is the name of the VolumeSnapshotContent object to which this VolumeSnapshot object intends to bind to. If not specified, it indicates that the VolumeSnapshot object has not been successfully bound to a VolumeSnapshotContent object yet. NOTE: To avoid possible security issues, consumers must verify binding between VolumeSnapshot and VolumeSnapshotContent objects is successful (by validating that both VolumeSnapshot and VolumeSnapshotContent point at each other) before using this object.' - type: string - creationTime: - description: creationTime is the timestamp when the point-in-time snapshot is taken by the underlying storage system. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "creation_time" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "creation_time" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. If not specified, it may indicate that the creation time of the snapshot is unknown. - format: date-time - type: string - error: - description: error is the last observed error during snapshot creation, if any. This field could be helpful to upper level controllers(i.e., application controller) to decide whether they should continue on waiting for the snapshot to be created based on the type of error reported. The snapshot controller will keep retrying when an error occurrs during the snapshot creation. Upon success, this error field will be cleared. - properties: - message: - description: 'message is a string detailing the encountered error during snapshot creation if specified. NOTE: message may be logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if the snapshot is ready to be used to restore a volume. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "ready_to_use" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "ready_to_use" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it, otherwise, this field will be set to "True". If not specified, it means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - type: string - description: restoreSize represents the minimum size of volume required to create a volume from this snapshot. In dynamic snapshot creation case, this field will be filled in by the snapshot controller with the "size_bytes" value returned from CSI "CreateSnapshot" gRPC call. For a pre-existing snapshot, this field will be filled with the "size_bytes" value returned from the CSI "ListSnapshots" gRPC call if the driver supports it. When restoring a volume from this snapshot, the size of the volume MUST NOT be smaller than the restoreSize if it is specified, otherwise the restoration will fail. If not specified, it indicates that the size is unknown. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - required: - - spec - type: object - served: true - storage: false - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- else }} -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.3.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139" - creationTimestamp: null - name: volumesnapshotclasses.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotClass - listKind: VolumeSnapshotClassList - plural: volumesnapshotclasses - singular: volumesnapshotclass - scope: Cluster - versions: - - additionalPrinterColumns: - - jsonPath: .driver - name: Driver - type: string - - description: Determines whether a VolumeSnapshotContent created through the - VolumeSnapshotClass should be deleted when its bound VolumeSnapshot is deleted. - jsonPath: .deletionPolicy - name: DeletionPolicy - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VolumeSnapshotClass specifies parameters that a underlying storage - system uses when creating a volume snapshot. A specific VolumeSnapshotClass - is used by specifying its name in a VolumeSnapshot object. VolumeSnapshotClasses - are non-namespaced - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - deletionPolicy: - description: deletionPolicy determines whether a VolumeSnapshotContent - created through the VolumeSnapshotClass should be deleted when its bound - VolumeSnapshot is deleted. Supported values are "Retain" and "Delete". - "Retain" means that the VolumeSnapshotContent and its physical snapshot - on underlying storage system are kept. "Delete" means that the VolumeSnapshotContent - and its physical snapshot on underlying storage system are deleted. - Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the storage driver that handles this - VolumeSnapshotClass. Required. - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - parameters: - additionalProperties: - type: string - description: parameters is a key-value map with storage driver specific - parameters for creating snapshots. These values are opaque to Kubernetes. - type: object - required: - - deletionPolicy - - driver - type: object - served: true - storage: true - subresources: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.3.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139" - creationTimestamp: null - name: volumesnapshotcontents.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshotContent - listKind: VolumeSnapshotContentList - plural: volumesnapshotcontents - singular: volumesnapshotcontent - scope: Cluster - versions: - - additionalPrinterColumns: - - description: Indicates if a snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Represents the complete size of the snapshot in bytes - jsonPath: .status.restoreSize - name: RestoreSize - type: integer - - description: Determines whether this VolumeSnapshotContent and its physical - snapshot on the underlying storage system should be deleted when its bound - VolumeSnapshot is deleted. - jsonPath: .spec.deletionPolicy - name: DeletionPolicy - type: string - - description: Name of the CSI driver used to create the physical snapshot on - the underlying storage system. - jsonPath: .spec.driver - name: Driver - type: string - - description: Name of the VolumeSnapshotClass to which this snapshot belongs. - jsonPath: .spec.volumeSnapshotClassName - name: VolumeSnapshotClass - type: string - - description: Name of the VolumeSnapshot object to which this VolumeSnapshotContent - object is bound. - jsonPath: .spec.volumeSnapshotRef.name - name: VolumeSnapshot - type: string - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VolumeSnapshotContent represents the actual "on-disk" snapshot - object in the underlying storage system - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: spec defines properties of a VolumeSnapshotContent created - by the underlying storage system. Required. - properties: - deletionPolicy: - description: deletionPolicy determines whether this VolumeSnapshotContent - and its physical snapshot on the underlying storage system should - be deleted when its bound VolumeSnapshot is deleted. Supported values - are "Retain" and "Delete". "Retain" means that the VolumeSnapshotContent - and its physical snapshot on underlying storage system are kept. - "Delete" means that the VolumeSnapshotContent and its physical snapshot - on underlying storage system are deleted. In dynamic snapshot creation - case, this field will be filled in with the "DeletionPolicy" field - defined in the VolumeSnapshotClass the VolumeSnapshot refers to. - For pre-existing snapshots, users MUST specify this field when creating - the VolumeSnapshotContent object. Required. - enum: - - Delete - - Retain - type: string - driver: - description: driver is the name of the CSI driver used to create the - physical snapshot on the underlying storage system. This MUST be - the same as the name returned by the CSI GetPluginName() call for - that driver. Required. - type: string - source: - description: source specifies from where a snapshot will be created. - This field is immutable after creation. Required. - properties: - snapshotHandle: - description: snapshotHandle specifies the CSI "snapshot_id" of - a pre-existing snapshot on the underlying storage system. This - field is immutable. - type: string - volumeHandle: - description: volumeHandle specifies the CSI "volume_id" of the - volume from which a snapshot should be dynamically taken from. - This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: name of the VolumeSnapshotClass to which this snapshot - belongs. - type: string - volumeSnapshotRef: - description: volumeSnapshotRef specifies the VolumeSnapshot object - to which this VolumeSnapshotContent object is bound. VolumeSnapshot.Spec.VolumeSnapshotContentName - field must reference to this VolumeSnapshotContent's name for the - bidirectional binding to be valid. For a pre-existing VolumeSnapshotContent - object, name and namespace of the VolumeSnapshot object MUST be - provided for binding to happen. This field is immutable after creation. - Required. - properties: - apiVersion: - description: API version of the referent. - type: string - fieldPath: - description: 'If referring to a piece of an object instead of - an entire object, this string should contain a valid JSON/Go - field access statement, such as desiredState.manifest.containers[2]. - For example, if the object reference is to a container within - a pod, this would take on a value like: "spec.containers{name}" - (where "name" refers to the name of the container that triggered - the event) or if no container name is specified "spec.containers[2]" - (container with index 2 in this pod). This syntax is chosen - only to have some well-defined way of referencing a part of - an object. TODO: this design is not final and this field is - subject to change in the future.' - type: string - kind: - description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - name: - description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names' - type: string - namespace: - description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/' - type: string - resourceVersion: - description: 'Specific resourceVersion to which this reference - is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency' - type: string - uid: - description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids' - type: string - type: object - required: - - deletionPolicy - - driver - - source - - volumeSnapshotRef - type: object - status: - description: status represents the current information of a snapshot. - properties: - creationTime: - description: creationTime is the timestamp when the point-in-time - snapshot is taken by the underlying storage system. In dynamic snapshot - creation case, this field will be filled in with the "creation_time" - value returned from CSI "CreateSnapshotRequest" gRPC call. For a - pre-existing snapshot, this field will be filled with the "creation_time" - value returned from the CSI "ListSnapshots" gRPC call if the driver - supports it. If not specified, it indicates the creation time is - unknown. The format of this field is a Unix nanoseconds time encoded - as an int64. On Unix, the command `date +%s%N` returns the current - time in nanoseconds since 1970-01-01 00:00:00 UTC. - format: int64 - type: integer - error: - description: error is the latest observed error during snapshot creation, - if any. - properties: - message: - description: 'message is a string detailing the encountered error - during snapshot creation if specified. NOTE: message may be - logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used - to restore a volume. In dynamic snapshot creation case, this field - will be filled in with the "ready_to_use" value returned from CSI - "CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, - this field will be filled with the "ready_to_use" value returned - from the CSI "ListSnapshots" gRPC call if the driver supports it, - otherwise, this field will be set to "True". If not specified, it - means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - description: restoreSize represents the complete size of the snapshot - in bytes. In dynamic snapshot creation case, this field will be - filled in with the "size_bytes" value returned from CSI "CreateSnapshotRequest" - gRPC call. For a pre-existing snapshot, this field will be filled - with the "size_bytes" value returned from the CSI "ListSnapshots" - gRPC call if the driver supports it. When restoring a volume from - this snapshot, the size of the volume MUST NOT be smaller than the - restoreSize if it is specified, otherwise the restoration will fail. - If not specified, it indicates that the size is unknown. - format: int64 - minimum: 0 - type: integer - snapshotHandle: - description: snapshotHandle is the CSI "snapshot_id" of a snapshot - on the underlying storage system. If not specified, it indicates - that dynamic snapshot creation has either failed or it is still - in progress. - type: string - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] - ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - annotations: - controller-gen.kubebuilder.io/version: v0.3.0 - api-approved.kubernetes.io: "https://github.com/kubernetes-csi/external-snapshotter/pull/139" - creationTimestamp: null - name: volumesnapshots.snapshot.storage.k8s.io -spec: - group: snapshot.storage.k8s.io - names: - kind: VolumeSnapshot - listKind: VolumeSnapshotList - plural: volumesnapshots - singular: volumesnapshot - scope: Namespaced - versions: - - additionalPrinterColumns: - - description: Indicates if a snapshot is ready to be used to restore a volume. - jsonPath: .status.readyToUse - name: ReadyToUse - type: boolean - - description: Name of the source PVC from where a dynamically taken snapshot - will be created. - jsonPath: .spec.source.persistentVolumeClaimName - name: SourcePVC - type: string - - description: Name of the VolumeSnapshotContent which represents a pre-provisioned - snapshot. - jsonPath: .spec.source.volumeSnapshotContentName - name: SourceSnapshotContent - type: string - - description: Represents the complete size of the snapshot. - jsonPath: .status.restoreSize - name: RestoreSize - type: string - - description: The name of the VolumeSnapshotClass requested by the VolumeSnapshot. - jsonPath: .spec.volumeSnapshotClassName - name: SnapshotClass - type: string - - description: The name of the VolumeSnapshotContent to which this VolumeSnapshot - is bound. - jsonPath: .status.boundVolumeSnapshotContentName - name: SnapshotContent - type: string - - description: Timestamp when the point-in-time snapshot is taken by the underlying - storage system. - jsonPath: .status.creationTime - name: CreationTime - type: date - - jsonPath: .metadata.creationTimestamp - name: Age - type: date - name: v1beta1 - schema: - openAPIV3Schema: - description: VolumeSnapshot is a user's request for either creating a point-in-time - snapshot of a persistent volume, or binding to a pre-existing snapshot. - properties: - apiVersion: - description: 'APIVersion defines the versioned schema of this representation - of an object. Servers should convert recognized schemas to the latest - internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' - type: string - kind: - description: 'Kind is a string value representing the REST resource this - object represents. Servers may infer this from the endpoint the client - submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' - type: string - spec: - description: 'spec defines the desired characteristics of a snapshot requested - by a user. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshots#volumesnapshots - Required.' - properties: - source: - description: source specifies where a snapshot will be created from. - This field is immutable after creation. Required. - properties: - persistentVolumeClaimName: - description: persistentVolumeClaimName specifies the name of the - PersistentVolumeClaim object in the same namespace as the VolumeSnapshot - object where the snapshot should be dynamically taken from. - This field is immutable. - type: string - volumeSnapshotContentName: - description: volumeSnapshotContentName specifies the name of a - pre-existing VolumeSnapshotContent object. This field is immutable. - type: string - type: object - volumeSnapshotClassName: - description: 'volumeSnapshotClassName is the name of the VolumeSnapshotClass - requested by the VolumeSnapshot. If not specified, the default snapshot - class will be used if one exists. If not specified, and there is - no default snapshot class, dynamic snapshot creation will fail. - Empty string is not allowed for this field. TODO(xiangqian): a webhook - validation on empty string. More info: https://kubernetes.io/docs/concepts/storage/volume-snapshot-classes' - type: string - required: - - source - type: object - status: - description: 'status represents the current information of a snapshot. - NOTE: status can be modified by sources other than system controllers, - and must not be depended upon for accuracy. Controllers should only - use information from the VolumeSnapshotContent object after verifying - that the binding is accurate and complete.' - properties: - boundVolumeSnapshotContentName: - description: 'boundVolumeSnapshotContentName represents the name of - the VolumeSnapshotContent object to which the VolumeSnapshot object - is bound. If not specified, it indicates that the VolumeSnapshot - object has not been successfully bound to a VolumeSnapshotContent - object yet. NOTE: Specified boundVolumeSnapshotContentName alone - does not mean binding is valid. Controllers MUST always verify - bidirectional binding between VolumeSnapshot and VolumeSnapshotContent - to avoid possible security issues.' - type: string - creationTime: - description: creationTime is the timestamp when the point-in-time - snapshot is taken by the underlying storage system. In dynamic snapshot - creation case, this field will be filled in with the "creation_time" - value returned from CSI "CreateSnapshotRequest" gRPC call. For a - pre-existing snapshot, this field will be filled with the "creation_time" - value returned from the CSI "ListSnapshots" gRPC call if the driver - supports it. If not specified, it indicates that the creation time - of the snapshot is unknown. - format: date-time - type: string - error: - description: error is the last observed error during snapshot creation, - if any. This field could be helpful to upper level controllers(i.e., - application controller) to decide whether they should continue on - waiting for the snapshot to be created based on the type of error - reported. - properties: - message: - description: 'message is a string detailing the encountered error - during snapshot creation if specified. NOTE: message may be - logged, and it should not contain sensitive information.' - type: string - time: - description: time is the timestamp when the error was encountered. - format: date-time - type: string - type: object - readyToUse: - description: readyToUse indicates if a snapshot is ready to be used - to restore a volume. In dynamic snapshot creation case, this field - will be filled in with the "ready_to_use" value returned from CSI - "CreateSnapshotRequest" gRPC call. For a pre-existing snapshot, - this field will be filled with the "ready_to_use" value returned - from the CSI "ListSnapshots" gRPC call if the driver supports it, - otherwise, this field will be set to "True". If not specified, it - means the readiness of a snapshot is unknown. - type: boolean - restoreSize: - type: string - description: restoreSize represents the complete size of the snapshot - in bytes. In dynamic snapshot creation case, this field will be - filled in with the "size_bytes" value returned from CSI "CreateSnapshotRequest" - gRPC call. For a pre-existing snapshot, this field will be filled - with the "size_bytes" value returned from the CSI "ListSnapshots" - gRPC call if the driver supports it. When restoring a volume from - this snapshot, the size of the volume MUST NOT be smaller than the - restoreSize if it is specified, otherwise the restoration will fail. - If not specified, it indicates that the size is unknown. - pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ - x-kubernetes-int-or-string: true - type: object - required: - - spec - type: object - served: true - storage: true - subresources: - status: {} -status: - acceptedNames: - kind: "" - plural: "" - conditions: [] - storedVersions: [] -{{- end}} -{{- end}} -{{- end}} \ No newline at end of file diff --git a/charts/portworx/portworx/templates/portworx-csi.yaml b/charts/portworx/portworx/templates/portworx-csi.yaml deleted file mode 100644 index b3b543483..000000000 --- a/charts/portworx/portworx/templates/portworx-csi.yaml +++ /dev/null @@ -1,195 +0,0 @@ -{{- if or (and (.Values.csi) (eq .Values.csi true)) (not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty))}} -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -apiVersion: v1 -kind: ServiceAccount -metadata: - name: px-csi-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-csi-role -rules: -- apiGroups: ["extensions"] - resources: ["podsecuritypolicies"] - resourceNames: ["privileged"] - verbs: ["use"] -- apiGroups: ["apiextensions.k8s.io"] - resources: ["customresourcedefinitions"] - verbs: ["*"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] -- apiGroups: [""] - resources: ["persistentvolumes"] - verbs: ["get", "list", "watch", "create", "delete", "update", "patch"] -- apiGroups: [""] - resources: ["persistentvolumeclaims"] - verbs: ["get", "list", "watch", "update"] -- apiGroups: [""] - resources: ["persistentvolumeclaims/status"] - verbs: ["update", "patch"] -- apiGroups: [""] - resources: ["pods"] - verbs: ["get", "list", "watch"] -- apiGroups: ["storage.k8s.io"] - resources: ["storageclasses"] - verbs: ["get", "list", "watch"] -- apiGroups: ["storage.k8s.io"] - resources: ["volumeattachments"] - verbs: ["get", "list", "watch", "update", "patch"] -- apiGroups: ["storage.k8s.io"] - resources: ["csistoragecapacities"] - verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] -- apiGroups: ["apps"] - resources: ["replicasets"] - verbs: ["get"] -- apiGroups: [""] - resources: ["events"] - verbs: ["list", "watch", "create", "update", "patch"] -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list"] -- apiGroups: ["snapshot.storage.k8s.io"] - resources: ["volumesnapshots", "volumesnapshotcontents", "volumesnapshotclasses", "volumesnapshots/status", "volumesnapshotcontents/status"] - verbs: ["create", "get", "list", "watch", "update", "delete"] -- apiGroups: ["csi.storage.k8s.io"] - resources: ["csinodeinfos"] - verbs: ["get", "list", "watch", "update"] -- apiGroups: ["storage.k8s.io"] - resources: ["csinodes"] - verbs: ["get", "list", "watch", "update"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] -- apiGroups: ["csi.storage.k8s.io"] - resources: ["csidrivers"] - verbs: ["create", "delete"] -- apiGroups: [""] - resources: ["endpoints"] - verbs: ["get", "watch", "list", "delete", "update", "create"] -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "watch", "list", "delete", "update", "create"] -- apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["*"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-csi-role-binding -subjects: -- kind: ServiceAccount - name: px-csi-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: px-csi-role - apiGroup: rbac.authorization.k8s.io ---- -kind: Service -apiVersion: v1 -metadata: - name: px-csi-service - namespace: kube-system -spec: - clusterIP: None ---- -kind: Deployment -apiVersion: apps/v1 -metadata: - name: px-csi-ext - namespace: kube-system -spec: - selector: - matchLabels: - app: px-csi-driver - replicas: 1 - template: - metadata: - labels: - app: px-csi-driver - spec: - serviceAccount: px-csi-account - containers: - - name: csi-external-provisioner - imagePullPolicy: Always - image: {{ template "px.getCSIProvisionerImage" . }} - args: - - "--v=3" - - "--csi-address=$(ADDRESS)" - {{- if semverCompare "<1.17.0-0" .Capabilities.KubeVersion.GitVersion }} - - "--provisioner=pxd.portworx.com" - - "--enable-leader-election" - - "--leader-election-type={{if and (semverCompare ">=1.13.0-0" .Capabilities.KubeVersion.GitVersion) (semverCompare "<1.14.0-0" .Capabilities.KubeVersion.GitVersion) }}endpoints{{else}}leases{{end}}" - {{- else }} - - "--leader-election=true" - - "--default-fstype=ext4" - {{- end }} - env: - - name: ADDRESS - value: /csi/csi.sock - securityContext: - privileged: true - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- if semverCompare ">=1.12.0-0" .Capabilities.KubeVersion.GitVersion }} - - name: csi-snapshotter - imagePullPolicy: Always - image: {{ template "px.getCSISnapshotterImage" . }} - args: - - "--v=3" - - "--csi-address=$(ADDRESS)" - - "--leader-election=true" - {{if and (semverCompare ">=1.13.0-0" .Capabilities.KubeVersion.GitVersion) (semverCompare "<1.14.0-0" .Capabilities.KubeVersion.GitVersion) }} - - "--leader-election-type=configmaps" - {{- end}} - env: - - name: ADDRESS - value: /csi/csi.sock - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- end }} - {{- if semverCompare ">=1.17.0-0" .Capabilities.KubeVersion.GitVersion }} - - name: csi-snapshot-controller - imagePullPolicy: Always - image: {{ template "px.getCSISnapshotControllerImage" . }} - args: - - "--v=3" - - "--leader-election=true" - env: - - name: ADDRESS - value: /csi/csi.sock - securityContext: - privileged: true - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- end }} - {{- if semverCompare ">=1.16.0-0" .Capabilities.KubeVersion.GitVersion }} - - name: csi-resizer - imagePullPolicy: Always - image: k8s.gcr.io/sig-storage/csi-resizer:v1.3.0 - args: - - "--v=3" - - "--csi-address=$(ADDRESS)" - - "--leader-election=true" - env: - - name: ADDRESS - value: /csi/csi.sock - securityContext: - privileged: true - volumeMounts: - - name: socket-dir - mountPath: /csi - {{- end }} - volumes: - - name: socket-dir - hostPath: - path: /var/lib/kubelet/plugins/pxd.portworx.com - type: DirectoryOrCreate -{{- end }} \ No newline at end of file diff --git a/charts/portworx/portworx/templates/portworx-ds.yaml b/charts/portworx/portworx/templates/portworx-ds.yaml deleted file mode 100644 index 89eb4f516..000000000 --- a/charts/portworx/portworx/templates/portworx-ds.yaml +++ /dev/null @@ -1,472 +0,0 @@ -{{/* Setting defaults if they are omitted. */}} -{{- $deployEnvironmentIKS := .Capabilities.KubeVersion.GitVersion | regexMatch "IKS" }} -{{- $usefileSystemDrive := .Values.usefileSystemDrive | default false }} -{{- $usedrivesAndPartitions := .Values.usedrivesAndPartitions | default false }} -{{- $secretType := .Values.secretType | default "k8s" }} -{{- $journalDevice := .Values.journalDevice | default "none" }} -{{- $maxStorageNodes := .Values.maxStorageNodes | default "none" }} -{{- $customRegistryURL := .Values.customRegistryURL | default "none" }} -{{- $registrySecret := .Values.registrySecret | default "none" }} - -{{- $dataInterface := .Values.dataInterface | default "none" }} -{{- $managementInterface := .Values.managementInterface | default "none" }} - -{{- $envVars := .Values.envVars | default "none" }} -{{- $isCoreOS := .Values.isTargetOSCoreOS | default false }} - -{{- $pksInstall := .Values.pksInstall | default false }} -{{- $internalKVDB := .Values.etcdType | default "none" }} -{{- $csi := .Values.csi | default (not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty)) }} - -{{- $etcdCredentials := .Values.etcd.credentials | default "none:none" }} -{{- $etcdCertPath := .Values.etcd.ca | default "none" }} -{{- $etcdCA := .Values.etcd.ca | default "none" }} -{{- $etcdCert := .Values.etcd.cert | default "none" }} -{{- $etcdKey := .Values.etcd.key | default "none" }} -{{- $consulToken := .Values.consul.token | default "none" }} -{{- $misc := .Values.misc | default "" | split " " }} -{{- $etcdEndPoints := .Values.kvdb }} - -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: portworx - namespace: kube-system - labels: - name: portworx -spec: - minReadySeconds: 0 - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 1 - selector: - matchLabels: - name: portworx - app: portworx - template: - metadata: - labels: - app: portworx - name: portworx - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: px/enabled - operator: NotIn - values: - - "false" - {{- if and (.Values.openshiftInstall) (eq .Values.openshiftInstall true)}} - - key: openshift-infra - operator: DoesNotExist - {{- else if or (not .Values.deployOnMaster) (eq .Values.deployOnMaster false)}} - - key: node-role.kubernetes.io/master - operator: DoesNotExist - {{- end }} - hostNetwork: true - hostPID: true - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - containers: - # {{ template "px.getImage"}} - - name: portworx - image: {{ template "px.getImage" . }}:{{ required "A valid Image tag is required in the SemVer format" .Values.imageVersion }} - terminationMessagePath: "/tmp/px-termination-log" - imagePullPolicy: Always - args: - [ - {{ include "px.storage" . | indent 0 }} - {{- with .Values -}} - {{- if eq "Built-in" $internalKVDB }} - "-b", - {{- end -}} - - {{- if ne $journalDevice "none" }} - "-j", "{{ $journalDevice }}", - {{- end -}} - - {{- if $etcdEndPoints -}} - "-k", "{{ regexReplaceAllLiteral "(;)" .kvdb "," }}", - {{- else }} - {{- if ne "Built-in" $internalKVDB }} - {{- if eq "US region" .region }} - "-k", "etcd:http://px-etcd1.portworx.com:2379,etcd:http://px-etcd2.portworx.com:2379,etcd:http://px-etcd3.portworx.com:2379", - {{- else if eq "EU region" .region }} - "-k", "etcd:http://px-eu-etcd1.portworx.com:2379,etcd:http://px-eu-etcd2.portworx.com:2379,etcd:http://px-eu-etcd3.portworx.com:2379", - {{- else }} - "{{ required "A valid kvdb url is required." .kvdb }}" - {{- end -}} - {{- end -}} - {{- end -}} - "-c", "{{ required "Clustername cannot be empty" .clusterName }}", - - {{- if ne $secretType "none" }} - "-secret_type", "{{ $secretType }}", - {{- else }} - {{- if $deployEnvironmentIKS }} - "-secret_type", "ibm-kp", - {{- end -}} - {{- end -}} - - {{- if and (ne $dataInterface "none") (ne $dataInterface "auto")}} - "-d", "{{ $dataInterface }}", - {{- end -}} - - {{- if and (ne $managementInterface "none") (ne $managementInterface "auto") }} - "-m", "{{ $managementInterface }}", - {{- end -}} - - {{- if ne $etcdCredentials "none:none" }} - "-userpwd", "{{ $etcdCredentials }}", - {{- end -}} - - {{- if ne $etcdCA "none" }} - "-ca", "/etc/pwx/etcdcerts/{{ $etcdCA }}", - {{- end -}} - - {{- if ne $etcdCert "none" }} - "-cert", "/etc/pwx/etcdcerts/{{ $etcdCert }}", - {{- end -}} - - {{- if ne $etcdKey "none" }} - "-key", "/etc/pwx/etcdcerts/{{ $etcdKey }}", - {{- end -}} - - {{- if ne $consulToken "none" }} - "-acltoken", "{{ $consulToken }}", - {{- end -}} - - {{- if .misc }} - {{- range $index, $name := $misc }} - "{{ $name }}", - {{- end }} - {{ end -}} - - "-x", "kubernetes" - {{- end -}} - ] - env: - - name: "PX_TEMPLATE_VERSION" - value: "v2" - {{ if not (eq $envVars "none") }} - {{- $vars := $envVars | split ";" }} - {{- range $key, $val := $vars }} - {{- $envVariable := $val | split "=" }} - - name: {{ $envVariable._0 | trim | quote }} - value: {{ $envVariable._1 | trim | quote }} - {{ end }} - {{- end }} - - {{- if not (eq $registrySecret "none") }} - - name: REGISTRY_CONFIG - valueFrom: - secretKeyRef: - {{- if (semverCompare ">=1.9-0" .Capabilities.KubeVersion.GitVersion) or (.Values.openshiftInstall and semverCompare ">=1.8-0" .Capabilities.KubeVersion.GitVersion) }} - key: ".dockerconfigjson" - {{- else }} - key: ".dockercfg" - {{- end }} - name: "{{ $registrySecret }}" - {{- end }} - - {{- if eq $pksInstall true }} - - name: "PRE-EXEC" - value: "if [ ! -x /bin/systemctl ]; then apt-get update; apt-get install -y systemd; fi" - {{- end }} - - {{- if eq $csi true }} - - name: CSI_ENDPOINT - value: unix:///var/lib/kubelet/plugins/pxd.portworx.com/csi.sock - {{- end }} - - livenessProbe: - periodSeconds: 30 - initialDelaySeconds: 840 # allow image pull in slow networks - httpGet: - host: 127.0.0.1 - path: /status - port: 9001 - readinessProbe: - periodSeconds: 10 - httpGet: - host: 127.0.0.1 - {{- if eq (.Values.deploymentType | upper | lower) "oci" }} - path: /health - port: 9015 - {{- else }} - path: /v1/cluster/nodehealth - port: 9001 - {{- end}} - securityContext: - privileged: true - volumeMounts: - {{- if not (eq $etcdCertPath "none") }} - - mountPath: /etc/pwx/etcdcerts - name: etcdcerts - {{- end }} - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - - name: containerd-k3s - mountPath: /run/containerd/containerd.sock - {{- end }} - - name: dockersock - mountPath: /var/run/docker.sock - - name: containerdsock - mountPath: /run/containerd - - name: etcpwx - mountPath: /etc/pwx - - name: cores - mountPath: /var/cores - {{- if eq (.Values.deploymentType | upper | lower) "oci" }} - - name: optpwx - mountPath: /opt/pwx - - name: sysdmount - mountPath: /etc/systemd/system - - name: journalmount1 - mountPath: /var/run/log - readOnly: true - - name: journalmount2 - mountPath: /var/log - readOnly: true - - name: dbusmount - mountPath: /var/run/dbus - - name: hostproc - mountPath: /host_proc - {{- else if eq (.Values.deploymentType | upper | lower) "docker" }} - - name: dev - mountPath: /dev - - name: optpwx - mountPath: /export_bin - - name: dockerplugins - mountPath: /run/docker/plugins - - name: hostproc - mountPath: /hostproc - {{- if semverCompare "< 1.10-0" .Capabilities.KubeVersion.GitVersion }} - - name: libosd - mountPath: /var/lib/osd:shared - {{- if (.Values.openshiftInstall) and (eq .Values.openshiftInstall true)}} - - name: kubelet - mountPath: /var/lib/origin/openshift.local.volumes:shared - {{- else }} - - name: kubelet - mountPath: /var/lib/kubelet:shared - {{- end }} - - {{- else }} - - name: libosd - mountPath: /var/lib/osd - mountPropagation: "Bidirectional" - {{- if (.Values.openshiftInstall) and (eq .Values.openshiftInstall true)}} - - name: kubelet - mountPath: /var/lib/origin/openshift.local.volumes - mountPropagation: "Bidirectional" - {{- else }} - - name: kubelet - mountPath: /var/lib/kubelet - mountPropagation: "Bidirectional" - {{- end }} - - {{- end }} - - {{- if eq $isCoreOS true}} - - name: src - mountPath: /lib/modules - {{- else }} - - name: src - mountPath: /usr/src - {{- end }} - {{- end }} - - {{- if eq $csi true }} - - name: csi-node-driver-registrar - imagePullPolicy: Always - {{- if eq $customRegistryURL "none" }} - image: "k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0" - {{- else }} - image: "{{ $customRegistryURL }}/k8s.gcr.io/sig-storage/csi-node-driver-registrar:v2.1.0" - {{- end}} - args: - - "--v=5" - - "--csi-address=$(ADDRESS)" - - "--kubelet-registration-path=/var/lib/kubelet/plugins/pxd.portworx.com/csi.sock" - env: - - name: ADDRESS - value: /csi/csi.sock - - name: KUBE_NODE_NAME - valueFrom: - fieldRef: - fieldPath: spec.nodeName - volumeMounts: - - name: csi-driver-path - mountPath: /csi - - name: registration-dir - mountPath: /registration - {{- end }} - - restartPolicy: Always - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - tolerations: - - key: node-role.kubernetes.io/master - effect: NoSchedule - {{- end }} - serviceAccountName: px-account - volumes: - {{- if ne $etcdCertPath "none" }} - - name: etcdcerts - secret: - secretName: px-etcd-certs - items: - - key: "{{ $etcdCA }}" - path: "{{ $etcdCA }}" - - key: "{{ $etcdCert }}" - path: "{{ $etcdCert }}" - - key: "{{ $etcdKey }}" - path: "{{ $etcdKey }}" - {{- end}} - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - - name: containerd-k3s - hostPath: - path: /run/k3s/containerd/containerd.sock - {{- end }} - - name: dockersock - hostPath: - path: {{if eq $pksInstall true}}/var/vcap/sys/run/docker/docker.sock{{else}}/var/run/docker.sock{{end}} - - name: containerdsock - hostPath: - path: {{if eq $pksInstall true}}/var/vcap/sys/run/containerd{{else}}/run/containerd{{end}} - {{- if eq $csi true}} - - name: csi-driver-path - hostPath: - path: /var/lib/kubelet/plugins/pxd.portworx.com - type: DirectoryOrCreate - - name: registration-dir - hostPath: - path: /var/lib/kubelet/plugins_registry - type: DirectoryOrCreate - {{- end}} - - name: etcpwx - hostPath: - path: /etc/pwx - - name: cores - hostPath: - path: {{if eq $pksInstall true }}/var/vcap/store/cores{{else}}/var/cores{{end}} - {{- if eq (.Values.deploymentType | upper | lower) "oci" }} - - name: optpwx - hostPath: - path: {{if eq $pksInstall true }}/var/vcap/store/opt/pwx{{else}}/opt/pwx{{end}} - - name: sysdmount - hostPath: - path: /etc/systemd/system - - name: journalmount1 - hostPath: - path: /var/run/log - - name: journalmount2 - hostPath: - path: /var/log - - name: dbusmount - hostPath: - path: /var/run/dbus - - name: hostproc - hostPath: - path: /proc - {{- else if eq (.Values.deploymentType | upper | lower) "docker" }} - - name: libosd - hostPath: - path: /var/lib/osd - - name: optpwx - hostPath: - path: /opt/pwx/bin - - name: dev - hostPath: - path: /dev - {{- if (.Values.openshiftInstall) and (eq .Values.openshiftInstall true)}} - - name: kubelet - hostPath: - path: /var/lib/origin/openshift.local.volumes - {{- else }} - - name: kubelet - hostPath: - path: /var/lib/kubelet - {{- end }} - {{- if eq $isCoreOS true}} - - name: src - hostPath: - path: /lib/modules - {{- else }} - - name: src - hostPath: - path: /usr/src - {{- end }} - - name: dockerplugins - hostPath: - path: /run/docker/plugins - - name: hostproc - hostPath: - path: /proc - {{- end }} ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: portworx-api - namespace: kube-system - labels: - name: portworx-api -spec: - selector: - matchLabels: - name: portworx-api - minReadySeconds: 0 - updateStrategy: - type: RollingUpdate - rollingUpdate: - maxUnavailable: 100% - template: - metadata: - labels: - name: portworx-api - spec: - affinity: - nodeAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - nodeSelectorTerms: - - matchExpressions: - - key: px/enabled - operator: NotIn - values: - - "false" - {{- if not (.Capabilities.KubeVersion.GitVersion | toString | regexFind "(k3s|rke2)" | empty) }} - - key: node-role.kubernetes.io/master - operator: DoesNotExist - {{- end }} - hostNetwork: true - hostPID: false - containers: - - name: portworx-api - image: "{{ template "px.getPauseImage" . }}/pause:3.1" - imagePullPolicy: Always - readinessProbe: - periodSeconds: 10 - httpGet: - host: 127.0.0.1 - path: /status - port: 9001 - restartPolicy: Always - serviceAccountName: px-account -{{- if eq $csi true }} ---- -apiVersion: storage.k8s.io/v1 -kind: CSIDriver -metadata: - name: "pxd.portworx.com" -spec: - attachRequired: false - podInfoOnMount: true - volumeLifecycleModes: - - Persistent - - Ephemeral -{{- end}} \ No newline at end of file diff --git a/charts/portworx/portworx/templates/portworx-rbac-config.yaml b/charts/portworx/portworx/templates/portworx-rbac-config.yaml deleted file mode 100644 index e426182a8..000000000 --- a/charts/portworx/portworx/templates/portworx-rbac-config.yaml +++ /dev/null @@ -1,95 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - name: portworx ---- -kind: Role -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-role - namespace: portworx -rules: - - apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list", "create", "update", "patch", "delete"] ---- -kind: RoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: px-role-binding - namespace: portworx -subjects: - - kind: ServiceAccount - name: px-account - namespace: kube-system -roleRef: - kind: Role - name: px-role - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: px-account - namespace: kube-system ---- - -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: node-get-put-list-role -rules: -- apiGroups: [""] - resources: ["secrets"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["nodes"] - verbs: ["watch", "get", "update", "list"] -- apiGroups: [""] - resources: ["pods"] - verbs: ["delete", "get", "list", "watch", "update"] -- apiGroups: [""] - resources: ["persistentvolumeclaims", "persistentvolumes"] - verbs: ["get", "list"] -- apiGroups: ["storage.k8s.io"] - resources: ["storageclasses"] - verbs: ["get", "list"] -- apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "list", "update", "create"] -- apiGroups: [""] - resources: ["services"] - verbs: ["get", "list", "create", "update", "delete"] -- apiGroups: [""] - resources: ["endpoints"] - verbs: ["get", "list", "create", "update", "delete"] -- apiGroups: ["extensions"] - resources: ["podsecuritypolicies"] - resourceNames: ["privileged"] - verbs: ["use"] -- apiGroups: ["portworx.io"] - resources: ["volumeplacementstrategies"] - verbs: ["get", "list"] -- apiGroups: ["stork.libopenstorage.org"] - resources: ["backuplocations"] - verbs: ["get", "list"] -- apiGroups: ["core.libopenstorage.org"] - resources: ["*"] - verbs: ["*"] -- apiGroups: [""] - resources: ["events"] - verbs: ["create"] ---- - -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: node-role-binding -subjects: -- kind: ServiceAccount - name: px-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: node-get-put-list-role - apiGroup: rbac.authorization.k8s.io diff --git a/charts/portworx/portworx/templates/portworx-service.yaml b/charts/portworx/portworx/templates/portworx-service.yaml deleted file mode 100644 index 8d3ac159d..000000000 --- a/charts/portworx/portworx/templates/portworx-service.yaml +++ /dev/null @@ -1,54 +0,0 @@ -kind: Service -apiVersion: v1 -metadata: - name: portworx-service - namespace: kube-system - labels: - name: portworx -spec: - selector: - name: portworx - type: ClusterIP - ports: - - name: px-api - protocol: TCP - port: 9001 - targetPort: 9001 - - name: px-kvdb - protocol: TCP - port: 9019 - targetPort: 9019 - - name: px-sdk - protocol: TCP - port: 9020 - targetPort: 9020 - - name: px-rest-gateway - protocol: TCP - port: 9021 - targetPort: 9021 ---- -kind: Service -apiVersion: v1 -metadata: - name: portworx-api - namespace: kube-system - labels: - name: portworx-api -spec: - selector: - name: portworx-api - type: ClusterIP - ports: - - name: px-api - protocol: TCP - port: 9001 - targetPort: 9001 - - name: px-sdk - protocol: TCP - port: 9020 - targetPort: 9020 - - name: px-rest-gateway - protocol: TCP - port: 9021 - targetPort: 9021 ---- diff --git a/charts/portworx/portworx/templates/portworx-storageclasses.yaml b/charts/portworx/portworx/templates/portworx-storageclasses.yaml deleted file mode 100644 index b430fee8f..000000000 --- a/charts/portworx/portworx/templates/portworx-storageclasses.yaml +++ /dev/null @@ -1,56 +0,0 @@ -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-db-sc -provisioner: kubernetes.io/portworx-volume -parameters: - repl: "3" - io_profile: "db" ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-db2-sc -provisioner: kubernetes.io/portworx-volume -parameters: - repl: "3" - block_size: "512b" - io_profile: "db" ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-shared-sc -provisioner: kubernetes.io/portworx-volume -parameters: - repl: "3" - shared: "true" ---- -# -# NULL StorageClass that documents all possible -# Portworx StorageClass parameters -# -# Please refer to : https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html -# -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: portworx-null-sc - annotations: - params/docs: 'https://docs.portworx.com/scheduler/kubernetes/dynamic-provisioning.html' - params/fs: "Filesystem to be laid out: none|xfs|ext4 " - params/block_size: "Block size" - params/repl: "Replication factor for the volume: 1|2|3" - params/shared: "Flag to create a globally shared namespace volume which can be used by multiple pods : true|false" - params/priority_io: "IO Priority: low|medium|high" - params/io_profile: "IO Profile can be used to override the I/O algorithm Portworx uses for the volumes. Supported values are [db](/maintain/performance/tuning.html#db), [sequential](/maintain/performance/tuning.html#sequential), [random](/maintain/performance/tuning.html#random), [cms](/maintain/performance/tuning.html#cms)" - params/group: "The group a volume should belong too. Portworx will restrict replication sets of volumes of the same group on different nodes. If the force group option 'fg' is set to true, the volume group rule will be strictly enforced. By default, it's not strictly enforced." - params/fg: "This option enforces volume group policy. If a volume belonging to a group cannot find nodes for it's replication sets which don't have other volumes of same group, the volume creation will fail." - params/label: "List of comma-separated name=value pairs to apply to the Portworx volume" - params/nodes: "Comma-separated Portworx Node ID's to use for replication sets of the volume" - params/aggregation_level: "Specifies the number of replication sets the volume can be aggregated from" - params/snap_schedule: "Snapshot schedule. Following are the accepted formats: periodic=_mins_,_snaps-to-keep_ daily=_hh:mm_,_snaps-to-keep_ weekly=_weekday@hh:mm_,_snaps-to-keep_ monthly=_day@hh:mm_,_snaps-to-keep_ _snaps-to-keep_ is optional. Periodic, Daily, Weekly and Monthly keep last 5, 7, 5 and 12 snapshots by default respectively" - params/sticky: "Flag to create sticky volumes that cannot be deleted until the flag is disabled" - params/journal: "Flag to indicate if you want to use journal device for the volume's metadata. This will use the journal device that you used when installing Portworx. As of PX version 1.3, it is recommended to use a journal device to absorb PX metadata writes" -provisioner: kubernetes.io/portworx-volume -parameters: diff --git a/charts/portworx/portworx/templates/portworx-stork.yaml b/charts/portworx/portworx/templates/portworx-stork.yaml deleted file mode 100644 index 77449b394..000000000 --- a/charts/portworx/portworx/templates/portworx-stork.yaml +++ /dev/null @@ -1,645 +0,0 @@ -{{- if and (.Values.stork) (eq .Values.stork true)}} - {{- $isCoreOS := .Values.isTargetOSCoreOS | default false }} - {{- $customRegistryURL := .Values.customRegistryURL | default "none" }} - {{- $registrySecret := .Values.registrySecret | default "none" }} - -apiVersion: v1 -kind: ConfigMap -metadata: - name: stork-config - namespace: kube-system -data: - policy.cfg: |- - { - "kind": "Policy", - "apiVersion": "v1", -{{- if semverCompare "< 1.10-0" .Capabilities.KubeVersion.GitVersion }} - "predicates": [ -{{- if semverCompare "< 1.9-0" .Capabilities.KubeVersion.GitVersion }} - {"name": "NoVolumeNodeConflict"}, -{{- end}} - {"name": "MaxAzureDiskVolumeCount"}, - {"name": "NoVolumeZoneConflict"}, - {"name": "PodToleratesNodeTaints"}, - {"name": "CheckNodeMemoryPressure"}, - {"name": "MaxEBSVolumeCount"}, - {"name": "MaxGCEPDVolumeCount"}, - {"name": "MatchInterPodAffinity"}, - {"name": "NoDiskConflict"}, - {"name": "GeneralPredicates"}, - {"name": "CheckNodeDiskPressure"} - ], - "priorities": [ - {"name": "NodeAffinityPriority", "weight": 1}, - {"name": "TaintTolerationPriority", "weight": 1}, - {"name": "SelectorSpreadPriority", "weight": 1}, - {"name": "InterPodAffinityPriority", "weight": 1}, - {"name": "LeastRequestedPriority", "weight": 1}, - {"name": "BalancedResourceAllocation", "weight": 1}, - {"name": "NodePreferAvoidPodsPriority", "weight": 1} - ], -{{- end}} - "extenders": [ - { - "urlPrefix": "http://stork-service.kube-system:8099", - "apiVersion": "v1beta1", - "filterVerb": "filter", - "prioritizeVerb": "prioritize", - "weight": 5, - "enableHttps": false, - "nodeCacheCapable": false - } - ] - } ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: stork-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-role -rules: - - apiGroups: ["*"] - resources: ["*"] - verbs: ["*"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-role-binding -subjects: - - kind: ServiceAccount - name: stork-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: stork-role - apiGroup: rbac.authorization.k8s.io ---- -kind: Service -apiVersion: v1 -metadata: - name: stork-service - namespace: kube-system -spec: - selector: - name: stork - ports: - - name: extender - protocol: TCP - port: 8099 - targetPort: 8099 - - name: webhook - protocol: TCP - port: 443 - targetPort: 443 ---- -apiVersion: apiextensions.k8s.io/v1 -kind: CustomResourceDefinition -metadata: - name: volumeplacementstrategies.portworx.io -spec: - group: portworx.io - versions: - - name: v1beta2 - served: true - storage: true - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - description: The desired spec of the volume placement strategy - properties: - replicaAffinity: - type: array - description: Allows you to specify a rule which creates an affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the replica affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - replicaAntiAffinity: - type: array - description: Allows you to specify a rule that creates an anti-affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica anti affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - required: - - topologyKey - volumeAffinity: - type: array - description: Allows you to colocate volumes by specifying rules that place replicas of a volume together with those of another volume for which the specified labels match - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - volumeAntiAffinity: - type: array - description: Allows you to specify dissociation rules between 2 or more volumes that match the given labels - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume anti affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - - name: v1beta1 - served: false - storage: false - schema: - openAPIV3Schema: - type: object - required: - - spec - properties: - spec: - type: object - description: The desired spec of the volume placement strategy - properties: - replicaAffinity: - type: array - description: Allows you to specify a rule which creates an affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the replica affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - replicaAntiAffinity: - type: array - description: Allows you to specify a rule that creates an anti-affinity for replicas within a volume - items: - type: object - properties: - affected_replicas: - type: integer - description: The number of volume replicas affected by the replica anti affinity - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - required: - - topologyKey - volumeAffinity: - type: array - description: Allows you to colocate volumes by specifying rules that place replicas of a volume together with those of another volume for which the specified labels match - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - volumeAntiAffinity: - type: array - description: Allows you to specify dissociation rules between 2 or more volumes that match the given labels - items: - type: object - properties: - enforcement: - type: string - enum: - - required - - preferred - description: Specifies if the given rule is required (hard) or preferred (soft) - topologyKey: - type: string - minLength: 1 - description: Key for the node label that the system uses to denote a topology domain. The key can be for any node label that is present on the Kubernetes node. - matchExpressions: - description: Expression to use for the volume anti affinity rule - type: array - items: - type: object - properties: - key: - type: string - minLength: 1 - operator: - type: string - enum: - - In - - NotIn - - Exists - - DoesNotExist - - Lt - - Gt - description: The logical operator to use for comparing the key and values in the match expression - values: - type: array - items: - type: string - required: - - key - - operator - required: - - matchExpressions - scope: Cluster - names: - plural: volumeplacementstrategies - singular: volumeplacementstrategy - kind: VolumePlacementStrategy - shortNames: - - vps - - vp ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - tier: control-plane - name: stork - namespace: kube-system -spec: - strategy: - rollingUpdate: - maxSurge: 1 - maxUnavailable: 1 - type: RollingUpdate - replicas: 3 - selector: - matchLabels: - name: stork - tier: control-plane - template: - metadata: - annotations: - scheduler.alpha.kubernetes.io/critical-pod: "" - labels: - name: stork - tier: control-plane - spec: - {{- if not (eq $registrySecret "none") }} - imagePullSecrets: - - name: {{ $registrySecret }} - {{- end }} - containers: - - command: - - /stork - - --driver=pxd - - --verbose - - --leader-elect=true - - --webhook-controller=false - imagePullPolicy: Always - image: {{ template "px.getStorkImage" . }}:{{ required "A valid Image tag is required in the SemVer format" .Values.storkVersion }} - resources: - requests: - cpu: '0.1' - name: stork - hostPID: false - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "name" - operator: In - values: - - stork - topologyKey: "kubernetes.io/hostname" - serviceAccountName: stork-account ---- -kind: StorageClass -apiVersion: storage.k8s.io/v1 -metadata: - name: stork-snapshot-sc -provisioner: stork-snapshot ---- -apiVersion: v1 -kind: ServiceAccount -metadata: - name: stork-scheduler-account - namespace: kube-system ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-scheduler-role -rules: - - apiGroups: [""] - resources: ["endpoints"] - verbs: ["get", "update"] - - apiGroups: [""] - resources: ["configmaps"] - verbs: ["get", "list", "watch"] - - apiGroups: ["", "events.k8s.io"] - resources: ["events"] - verbs: ["create", "patch", "update"] - - apiGroups: [""] - resources: ["endpoints"] - verbs: ["create"] - - apiGroups: [""] - resourceNames: ["kube-scheduler"] - resources: ["endpoints"] - verbs: ["delete", "get", "patch", "update"] - - apiGroups: [""] - resources: ["nodes"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["pods"] - verbs: ["delete", "get", "list", "watch"] - - apiGroups: [""] - resources: ["bindings", "pods/binding"] - verbs: ["create"] - - apiGroups: [""] - resources: ["pods/status"] - verbs: ["patch", "update"] - - apiGroups: [""] - resources: ["replicationcontrollers", "services"] - verbs: ["get", "list", "watch"] - - apiGroups: ["apps", "extensions"] - resources: ["replicasets"] - verbs: ["get", "list", "watch"] - - apiGroups: ["apps"] - resources: ["statefulsets"] - verbs: ["get", "list", "watch"] - - apiGroups: ["policy"] - resources: ["poddisruptionbudgets"] - verbs: ["get", "list", "watch"] - - apiGroups: [""] - resources: ["persistentvolumeclaims", "persistentvolumes"] - verbs: ["get", "list", "watch"] - - apiGroups: ["storage.k8s.io"] - resources: ["storageclasses", "csinodes", "csidrivers", "csistoragecapacities"] - verbs: ["get", "list", "watch"] - - apiGroups: ["coordination.k8s.io"] - resources: ["leases"] - verbs: ["create", "update", "get", "list", "watch"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - name: stork-scheduler-role-binding -subjects: - - kind: ServiceAccount - name: stork-scheduler-account - namespace: kube-system -roleRef: - kind: ClusterRole - name: stork-scheduler-role - apiGroup: rbac.authorization.k8s.io ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - labels: - component: scheduler - tier: control-plane - name: stork-scheduler - namespace: kube-system -spec: - replicas: 3 - selector: - matchLabels: - component: scheduler - tier: control-plane - template: - metadata: - labels: - component: scheduler - tier: control-plane - name: stork-scheduler - spec: - containers: - - command: - - /usr/local/bin/kube-scheduler - - --address=0.0.0.0 - - --leader-elect=true - - --scheduler-name=stork - - --policy-configmap=stork-config - - --policy-configmap-namespace=kube-system - - --lock-object-name=stork-scheduler - image: "{{ template "px.getk8sImages" . }}/kube-scheduler-amd64:v1.21.4" - livenessProbe: - httpGet: - path: /healthz - port: 10251 - initialDelaySeconds: 15 - name: stork-scheduler - readinessProbe: - httpGet: - path: /healthz - port: 10251 - resources: - requests: - cpu: '0.1' - affinity: - podAntiAffinity: - requiredDuringSchedulingIgnoredDuringExecution: - - labelSelector: - matchExpressions: - - key: "name" - operator: In - values: - - stork-scheduler - topologyKey: "kubernetes.io/hostname" - hostPID: false - serviceAccountName: stork-scheduler-account - {{- end }} diff --git a/charts/portworx/portworx/templates/serviceaccount-hook.yaml b/charts/portworx/portworx/templates/serviceaccount-hook.yaml deleted file mode 100644 index 758863039..000000000 --- a/charts/portworx/portworx/templates/serviceaccount-hook.yaml +++ /dev/null @@ -1,42 +0,0 @@ -apiVersion: v1 -kind: ServiceAccount -metadata: - name: {{ template "px.hookServiceAccount" . }} - namespace: kube-system - annotations: - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook": "post-install,pre-delete,post-delete" - labels: - heritage: {{ .Release.Service }} - release: {{ .Release.Name }} - app.kubernetes.io/managed-by: {{.Release.Service | quote }} - app.kubernetes.io/instance: {{.Release.Name | quote }} - chart: "{{.Chart.Name}}-{{.Chart.Version}}" ---- -kind: ClusterRole -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - annotations: - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook": "post-install,pre-delete,post-delete" - name: {{ template "px.hookClusterRole" . }} -rules: -- apiGroups: [""] - resources: ["nodes"] - verbs: ["patch", "get", "update", "list"] ---- -kind: ClusterRoleBinding -apiVersion: {{ template "rbac.apiVersion" . }} -metadata: - annotations: - "helm.sh/hook-delete-policy": before-hook-creation - "helm.sh/hook": "post-install,pre-delete,post-delete" - name: {{ template "px.hookClusterRoleBinding" . }} -subjects: -- kind: ServiceAccount - name: {{ template "px.hookServiceAccount" . }} - namespace: kube-system -roleRef: - kind: ClusterRole - name: {{ template "px.hookClusterRole" . }} - apiGroup: rbac.authorization.k8s.io diff --git a/charts/portworx/portworx/values.yaml b/charts/portworx/portworx/values.yaml deleted file mode 100644 index b76e5d40c..000000000 --- a/charts/portworx/portworx/values.yaml +++ /dev/null @@ -1,149 +0,0 @@ -# Please uncomment and specify values for these options as per your requirements. -kvdb: -ownEtcdOption: none -etcdAuth: none -etcdType: none # KVDB type - -etcd: - credentials: none:none # Username and password for ETCD authentication in the form user:password - ca: none # Name of CA file for ETCD authentication. server.ca - cert: none # Name of certificate for ETCD authentication. Should be server.crt - key: none # Name of certificate key for ETCD authentication Should be server.key -consul: - token: none # ACL token value used for Consul authentication. (example: 398073a8-5091-4d9c-871a-bbbeb030d1f6) -region: none # US or EU regions for Portworx hosted etcds - -dataInterface: none # Name of the interface -managementInterface: none # Name of the interface -platformOptions: none # AKS, EKS or GKE platforms - -customRegistryURL: -registrySecret: - -clusterName: mycluster # This is the default. please change it to your cluster name. -secretType: k8s # Defaults to None, but can be AWS / KVDB / Vault. -envVars: none # NOTE: This is a ";" seperated list of environment variables. For eg: MYENV1=myvalue1;MYENV2=myvalue2 -stork: true # Use Stork https://docs.portworx.com/scheduler/kubernetes/stork.html for hyperconvergence. -storkVersion: 2.12.0 - -deployOnMaster: false # For POC only -csi: false # Enable CSI -openshiftInstall: false -AKSorEKSInstall: false -serviceAccount: - hook: - create: true - name: - -deploymentType: oci # accepts "oci" or "docker" -imageType: none # -imageVersion: 2.11.4 # Version of the PX Image. - -result: none -environment: none -onpremStorage: none - -maxStorageNodes: none -journalDevice: none - -usefileSystemDrive: false # true/false Instructs PX to use an unmounted Drive even if it has a filesystem. -usedrivesAndPartitions: false # Use unmounted disks even if they have a partition or filesystem on it. PX will never use a drive or partition that is mounted. (useDrivesAndPartitions) - -provider: none -deviceConfig: none - -drive_1: - aws: - type: none - size: none - iops: none - gc: - type: standard - size: 1000 - -drive_2: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_3: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_4: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_5: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_6: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_7: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_8: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_9: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -drive_10: - aws: - type: none - size: none - iops: none - gc: - type: none - size: none - -existingDisk1: none -existingDisk2: none -existingDisk3: none -existingDisk4: none -existingDisk5: none diff --git a/index.yaml b/index.yaml index a623faded..dcc8dd5d9 100644 --- a/index.yaml +++ b/index.yaml @@ -54209,338 +54209,6 @@ entries: urls: - assets/portshift-operator/portshift-operator-0.1.000.tgz version: 0.1.000 - portworx: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/kube-version: '>=1.16.0-0' - catalog.cattle.io/release-name: portworx - apiVersion: v1 - appVersion: 2.11.4 - created: "2022-11-02T15:38:11.94506-04:00" - description: A Helm chart for installing Portworx on Kubernetes. - digest: 7ca56fde1664c1bfdb062a1d1482d93c795efabe21d36702023f39059e50eaf5 - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-2.11.4.tgz - version: 2.11.4 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/kube-version: '>=1.16.0-0' - catalog.cattle.io/release-name: portworx - apiVersion: v1 - appVersion: 2.10.3 - created: "2022-08-22T20:51:51.539418-04:00" - description: A Helm chart for installing Portworx on Kubernetes. - digest: 972319508ca97f9ece382c1688dbbdd0f69611c883186560e5964c92f8c781ee - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-2.10.3.tgz - version: 2.10.3 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/release-name: portworx - apiVersion: v1 - appVersion: "2.9" - created: "2022-06-16T14:25:31.633584-04:00" - description: A Helm chart for installing Portworx on Kubernetes. - digest: a44698f46c5b43abf1b69cbf0ba278db7a5f3962e20b0feedec078fef07fbc79 - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - kubeVersion: '>=1.16.0-0' - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-2.9.101.tgz - version: 2.9.101 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/release-name: portworx - apiVersion: v1 - appVersion: 2.9.1 - created: "2022-04-12T23:42:58.45929058-06:00" - description: A Helm chart for installing Portworx on Kubernetes. - digest: 139b59da3fcef4600a624effd3f1db9355299ddb18ddd99dfb47a2ba58643c0e - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - kubeVersion: '>=1.16.0' - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-2.9.100.tgz - version: 2.9.100 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/release-name: portworx - apiVersion: v1 - appVersion: "2.8" - created: "2021-12-03T16:12:21.938192593-07:00" - description: A Helm chart for installing Portworx on Kubernetes. - digest: fb91976efad7934229cc1bf943bd95c73bff4a843524abddbfc232471d62daf6 - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - kubeVersion: '>=1.16.0' - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-2.8.100.tgz - version: 2.8.100 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx - catalog.cattle.io/release-name: portworx - apiVersion: v1 - appVersion: "2.8" - created: "2021-10-18T16:40:31.81601163-06:00" - description: A Helm chart for installing Portworx on Kubernetes. - digest: 4adfeefffca1f87f88a0003811dbac0d1446370c910c9dc7961de0a1a16f29fa - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - kubeVersion: '>=1.16.0' - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx - sources: - - https://github.com/portworx/helm - urls: - - assets/portworx/portworx-2.8.0.tgz - version: 2.8.0 - portworx-essentials: - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx Essentials - catalog.cattle.io/kube-version: '>=1.16.0-0' - catalog.cattle.io/release-name: portworx-essentials - apiVersion: v1 - appVersion: 2.11.4 - created: "2022-11-02T15:38:11.950909-04:00" - description: A Helm chart for installing Portworx Essentials on Kubernetes. - digest: 69c3db6382d1dd68ce919ebce2c0117cab478c211514a9ebc9b26a6f6dc36a0c - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - - portworx essentials - - free - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx-essentials - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-essentials-2.11.4.tgz - version: 2.11.4 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx Essentials - catalog.cattle.io/kube-version: '>=1.16.0-0' - catalog.cattle.io/release-name: portworx-essentials - apiVersion: v1 - appVersion: 2.10.3 - created: "2022-08-22T20:52:42.575195-04:00" - description: A Helm chart for installing Portworx Essentials on Kubernetes. - digest: 28f1d3f4050b724e55dc04eca426fefce90c52372bee8b203a4b5fd89bf31b7e - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - - portworx essentials - - free - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx-essentials - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-essentials-2.10.3.tgz - version: 2.10.3 - - annotations: - catalog.cattle.io/certified: partner - catalog.cattle.io/display-name: Portworx Essentials - catalog.cattle.io/release-name: portworx-essentials - apiVersion: v1 - appVersion: "2.9" - created: "2022-06-08T18:39:47.60312875-06:00" - description: A Helm chart for installing Portworx Essentials on Kubernetes. - digest: dd8a4cac44e1c5f68f4568abcc76c6e7600a1ecb9a8ec345723f061cbfcbefc6 - home: https://portworx.com/ - icon: https://raw.githubusercontent.com/portworx/helm/master/doc/media/k8s-porx.png - keywords: - - Storage - - ICP - - persistent disk - - pvc - - cloud native storage - - persistent storage - - portworx - - amd64 - - portworx essentials - - free - kubeVersion: '>=1.16.0-0' - maintainers: - - email: hadesai@purestorage.com - name: harsh-px - - email: onaumov@purestorage.com - name: trierra - - email: tasharma@purestorage.com - name: sharma-tapas - - email: dahuang@purestorage.com - name: dahuang-purestorage - name: portworx-essentials - sources: - - https://github.com/portworx/charts-rancher/tree/master/stable - urls: - - assets/portworx/portworx-essentials-2.9.100.tgz - version: 2.9.100 postgresql: - annotations: catalog.cattle.io/certified: partner diff --git a/packages/portworx/portworx-essentials/upstream.yaml b/packages/portworx/portworx-essentials/upstream.yaml deleted file mode 100644 index ec6cc17b5..000000000 --- a/packages/portworx/portworx-essentials/upstream.yaml +++ /dev/null @@ -1,6 +0,0 @@ -HelmRepo: https://raw.githubusercontent.com/portworx/charts-rancher/master/stable -HelmChart: portworx-essentials -Vendor: Portworx -DisplayName: Portworx Essentials -ChartMetadata: - kubeVersion: '>=1.16.0-0' diff --git a/packages/portworx/portworx/upstream.yaml b/packages/portworx/portworx/upstream.yaml deleted file mode 100644 index f919b28f7..000000000 --- a/packages/portworx/portworx/upstream.yaml +++ /dev/null @@ -1,6 +0,0 @@ -HelmRepo: https://raw.githubusercontent.com/portworx/charts-rancher/master/stable -HelmChart: portworx -Vendor: Portworx -DisplayName: Portworx -ChartMetadata: - kubeVersion: '>=1.16.0-0'